概要
twitter stream apiでワールドカップのtweetをpostgreに格納してみた。
準備
nodeは必須。
npm i twitter-api-sdk
npm i pg
で、postgresqlは11だが、これは設定してあるのが前提
table名はtweetで設定、id[serial],created_at[timestamp],author_id[varchar],text[varchar]
ここまであれば、以下のファイルを次のコマンドで動かすだけ
node pgst.js
source
Tw = require('twitter-api-sdk');
client = new Tw.Client(process.env.twitter_bearer_TOKEN);
const pg = require('pg');
pgclient = new pg.Client({database: 'yourdbname'});
async function main() {
await client.tweets.addOrDeleteRules(
{
delete: {
ids: ['1595343805821358081' ,
'1595372533401866241' ]
}
}
);
const rules = await client.tweets.getRules();
console.log(rules);
const stream = client.tweets.searchStream({
"tweet.fields": ["author_id", "geo","created_at"],
});
let cc = 0;
const sql ="INSERT INTO tweet (created_at, author_id, text) VALUES ($1, $2, $3)"
await pgclient.connect();
for await (const tweet of stream) {
msg = tweet.data.text.replace(/\n/g,"");
tm = tweet.data.created_at;
aid = tweet.data.author_id;
let values = [tm,aid,msg];
//console.log("----- insert start--")
const res =await pgclient.query(sql,values);
process.stdout.write("count="+cc+" "+msg.substring(0,80)+"\r");
cc = cc+1;
}
}
main();
動作に関する条件
最初にclient.tweets.addOrDeleteRulesでルールを設定してあると、2回目に実行する場合はそれを再利用する。このため、上のコマンドではdeleteしているが最初は
add:[
{ value:'ワールドカップ -is:retweet'},
{ value:'コスタリカ戦 -is:retweet'}
]
で、設定してその後はそのまま使うということだ。
数分で1000tweetを集めたが、そんなに集めても仕方がないので、時々走らせて様子をみるが、
ABEMAと思われるauthor_idが山ほどtweetを出していて、これを削除するruleはどうするのかなあ?と思っているところ。author_idからscreen_nameを取得するのはまたapiで確認するよていだが、これを取得するように設定することもできるはずである。