[node.js]Twitterのタイムラインを取得する
ちょっと必要になったのでnode.jsでバッチを書いた。
はじめにベアラートークンを取得する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
var request = require('request'); function getBearerToken() { var api_key = '' // Consumer Key (API Key) var api_secret = '' // Consumer Secret (API Secret) var credential = (new Buffer(api_key + ":" + api_secret)).toString('base64') var api_url = "https://api.twitter.com/oauth2/token" ///HTTPヘッダーを定義 var headers = { 'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8', 'Authorization':' Basic ' + credential } //HTTPオプションを定義 var options = { url: api_url, method: 'POST', headers: headers, form: {"grant_type":"client_credentials"} } return new Promise(function(resolve, reject){ //リクエスト送信 request(options, function (error, response, body) { if(error){ reject(new Error(error.message)); } resolve(body) }) }) } getBearerToken().then(console.log) |
ちなみに、ベアラーとは運搬者といった意味があるらしい。つまりクリスタルベアラーは「クリスタルを運ぶ者」という意味。取得したベアラートークンを使ってユーザータイムラインを読み込む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
var request = require('request'); var fs = require('fs') //ユーザータイムラインをダウンロードする function pLoadTweet(tweetOption) { var bearer_token = "" //ここに取得したベアラートークンを記述する //twiiter api url var api_url = "https://api.twitter.com/1.1/statuses/user_timeline.json" //apiに指定するオプションの初期値 var api_param = { screen_name:"@_shimizu", count:200, page:null, since_id:null, max_id:null, trim_user:true, contributor_details:false, exclude_replies:false, include_rts:false } //引数が指定されている場合、api_paramを上書きする if(tweetOption) Object.keys(tweetOption).forEach(function(key){ api_param[key] = tweetOption[key] }) //オブジェクトをGETリクエストのパラメーター形式に変換する var api_param_str = Object.keys(api_param) .filter(function(key){ return api_param[key]!=null }) //nullが指定されている項目は省く .map(function(key){ return key+"="+ api_param[key] }).join("&") ///HTTPヘッダーを定義 var headers = { 'Authorization':' Bearer ' + bearer_token } //HTTPオプションを定義 var options = { url: api_url + "?" + api_param_str, method: 'GET', headers: headers, json: true, } return new Promise(function(resolve, reject){ //リクエスト送信 request(options, function (error, response, body) { if(error) reject(new Error(error.message)) if(response.headers['x-rate-limit-limit'] < 1){ reject(new Error("リクエスト制限を超えました")) } resolve(body) }) }) } //ファイル書き込み function pWriteFile(file, str) { return new Promise(function(resolve, reject){ fs.writeFile(file, str, 'utf-8', function (err) { var resolve = {} if (err) { reject(new Error(err)) } else { resolve({success:true}) } }) }) } //2リクエスト、最新400tweetを取得 var p1 = pLoadTweet({page:1}) var p2 = pLoadTweet({page:2}) //全てのプロミスが終了したらファイルに書き込む Promise.all([p1, p2]).then(function(values) { var flatten = Array.prototype.concat.apply([], values) var output = JSON.stringify(flatten) pWriteFile("user_timeline.json", output).then(function(){ console.log("load sucess") }) }); |
user_timeline.jsonにユーザーのタイムラインデータが保存される。
whileで回して10秒ごとに取得したりしている。
1 |
while true; do node getUserTimeline.js ;sleep 10 ; done & |
[補足]
コードを一部書き換えてAWS Lambda で動かすことにした。
以前は、通常の方法では定期実行できなかったが、いつの間にかできるようになっていたらしい。
久々に使ってみてLambdaの便利さに感動したので、そのうち記事にするかもしれない。