Twitterのタイムラインから特定のツイートをSlackに通知する

はじめに

今回行うのは以下の環境です。

  • CentOS 7.6
  • Node.js
  • Twitter 開発者アカウント取得済み
  • Slack Incomming Webhook設定済み

環境構築

どういう訳か自分の開発環境にNode.jsが無かったので、この際インストールすることにしました。

最新版のリポジトリをインストールします。
$ curl -sL https://rpm.nodesource.com/setup_13.x | sudo bash -
Node.jsインストール。
$ sudo yum -y install nodejs
$ node -v
v13.13.0

続けてタイムライン取得用のモジュールをインストールします。作業用ディレクトリを作成して実行すると良いと思います。※例によってGitHubリポジトリは公開しませんので…….

$ npm install twitter --save

ファイル構成は次の通りです。実際に記述する実行ファイル はindex.jsだけです。あとtimestamp.jsonに「[]」だけ記述して下さい。

$ tree --charset=C
.
|-- index.js
|-- node_modules
|   |
|   【何かたくさんある】
|-- package-lock.json
`-- timestamp.json
var fs = require('fs');
var tfile = require('./timestamp.json');
var tarray = [];
var sameflg = 0;

var Twitter = require('twitter');
var client = new Twitter({
  consumer_key: '【1】',
  consumer_secret: '【2】',
  access_token_key: '【3】',
  access_token_secret: '【4】'
});

var num = 200;
var sname = "MoviesonTV_TYO";
var params = {
	count: num
};
var msg = []

//////////////////////
// タイムライン取得 //
//////////////////////
client.get('statuses/home_timeline', params,  function(error, tweets, response) {
	if (!error) {
		for (i=0; i<num; i++) {
			if (tweets[i] && tweets[i]["user"]["screen_name"] && tweets[i]["user"]["screen_name"] == sname) {
				// 既タイムラインチェック
				for (n=0; n<tfile.length; n++) {
					if (tweets[i]["created_at"] == tfile[n]["created_at"]) {
						sameflg = 1;
					}
				}
				if (sameflg == 0) {
					var data = {created_at: tweets[i]["created_at"]};
					tarray.push(data);	//下条件判定用
					tfile.push(data);
					console.log(tweets[i]["created_at"]);
					console.log(tweets[i]["text"]);
					msg.push(tweets[i]["text"]);	//Slack送信用配列
				}
				sameflg = 0;
			}
		}
		if (tarray[0]) {
			console.log("更新するものがある");
			fs.writeFile ("./timestamp.json", JSON.stringify(tfile), function(error) {;
				if (error) {
					console.log("error");	
				}
			});
		} else {
			console.log("更新するものが無い");
		}

		///////////////////
		// Slack送信部分 //
		///////////////////
		const https = require('https');
		
		//メッセージ設定
		var str = "";
		for (m=0; m<msg.length; m++) {
			str = str + msg[m];
		}
		var data = JSON.stringify({"username":"MoviesonTV_TYO","text": str,"icon_emoji":":movie_camera:"});
		
		//オプション情報設定
		var  options = {
		    hostname: 'hooks.slack.com',
		    port: 443,
		    path: '【Incomming Webhook URL】',
		    method: 'POST',
		    headers: {
		        'Content-Type': 'application/json',
		        'Content-Length': Buffer.byteLength(data)
		    }
		};
		
		//リクエスト
		var req = https.request(options, (res) =>{
		    if(res.statusCode===200){
		        console.log("OK:"+res.statusCode);
		    }else{
		        console.log("Status Error:"+res.statusCode);
		    }
		});
		
		//そもそもなエラー時
		req.on('error',(e)=>{
		    console.error(e);
		});
		
		//データ送信
		req.write(data);
		//終わり
		req.end();
	}
});
  • 6~12行目:
    • Twitter開発者アカウントから各トークンをコピペ
  • 14行目:
    • タイムラインから取得するツイート数
  • 15行目:
    • 抽出したいユーザID
  • 72行目:
    • 送信したいSlackのWebhook URL

プログラムの概要はまずタイムラインから100件くらいツイートを引っ張ります。そしてその中から任意のユーザのみ抽出します。それをSlackに送信すると同時に、タイムスタンプを別ファイルに追記します。2回目以降記録されたタイムスタンプと同時刻のツイートはSlackに送信しないようにします。

必要ないと思いますがtimestamp.jsonの中身です。

[]

実行するとタイムスタンプが追加されていきます。

[{"created_at":"Sun Apr 19 09:00:01 +0000 2020"},{"created_at":"Sat Apr 18 21:00:06 +0000 2020"},{"created_at":"Sat Apr 18 09:00:02 +0000 2020"}]

これを定期的に実行すれば、見逃したくないツイートだけをSlackに通知出来ます。timestamp.jsonですが、これまた中身を削除するcronを実行すれば肥大化することもないと思います。以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA