はじめに
今回行うのは以下の環境です。
- 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
を実行すれば肥大化することもないと思います。以上です。