たそぶろぐ。

ゆるゆると続けるつもりのブログ

Node.jsでTwitter APIを叩いた話(2018年版)

最近このブログの更新頻度低すぎてアレ。
今回は1ヵ月半ぶりとなるJavaScriptの話。

諸事情でTwitterAPIをゴニョゴニョすることになったので、備忘録程度にまとめておく。先駆者は沢山いるし、ドキュメントも日本語訳されたものがあったので非常に助かった。ありがとうございます。

何をやるのか

Node.jsからTwitter APIを叩く。
これを用いて、ツイートしたりタイムラインを取得したりする。

環境

OS : Windows10 Home
エディタ : Atom(極論言えば何でもいい)
あと実行はコマンドプロンプトでやる。

環境構築

Node.jsを使うので、インストールする。(編集時点ではLTS最新版は8.11.2)
Node.js

Puppeteerの記事には載せていなかったが、Node.jsをインストールするとnpmも一緒にインストールされる。このnpmを用いることで、パッケージをインストールすることができる。

インストール後、一応バージョンを確認しておく。コマンドプロンプトに以下のように入力し実行。

node -v
npm -v

それぞれバージョンが出るはず。

今回Twitter APIを叩く上で利用するのは"twitter"というモジュールなので、これもインストールする。

npm install twitter


アクセストークン等の取得

次に、ログインを行うためのアクセストークン等を取得する。まずは以下にアクセス。
https://apps.twitter.com/
Twitterアカウントがない場合はあらかじめ作っておく。

アプリケーションを今までに1つも作っていない場合は、ページのど真ん中にある"Create New App"と書かれたボタンをクリックする。(それ以降はページの右上に移動する)

すると、こんな画面に移動する。

f:id:nandpazmk:20180531165308p:plain

Nameにはアプリケーション名、Descriptionにはアプリケーションの説明、Websiteには自身のウェブサイトのURLを入力する。ウェブサイトは自身のTwitterアカウントとかでもいいと思う。Callback URLsは空欄のままでおk。

入力が完了したら、下部にある規約を確認して"Create your Twitter application"ボタンをクリック。
これでアプリケーションが作成できた。


ここからアクセストークン等の取得に入る。
"keys and Access Tokens"タブを開き、"Consumer Key (API key)"と"Consumer Secret (API Secret)"の値をメモする。
なお、"Consumer Secret (API Secret)"の値は他人に知られないようにしなければならないので注意が必要だ。

f:id:nandpazmk:20180531192801p:plain


次に、アクセス権限を変更する。"Permissions"タブを開き、"Access"にある選択肢の中から"Read, Write and Access direct messages"を選択することで、一番強い権限を持つことができる。権限は用途によって使い分ける。

f:id:nandpazmk:20180531173314p:plain


"keys and Access Tokens"タブに戻る。
画面下部、"Token Actions"内の"Create my access token"ボタンをクリックすると、"Access Token"と"Access Token Secret"を取得できる。これらの値もメモしておく。
こちらも同様に、"Access Token Secret"の値は他人に知られないようにする。
万が一知られてしまった場合は、取得した4つの値を即座にRegenerateすること。

f:id:nandpazmk:20180531193931p:plain

これでアクセストークンの取得は完了。

APIを叩く

本題。JavaScriptを利用してAPIを叩き、様々なデータを取得してみる。

アクセストークンをjson形式で保存する

先ほど取得したアクセストークン等をjsonファイルに保存する。プログラムにそのまま書いてもいいが、別で用意しておいた方がプログラムを見やすくなると思う。名前は適当につけてよい。今回は"secret.json"という名前で保存した。
あとスマホからだとプログラムがめっちゃ見づらいので、PCからの閲覧を推奨。

secret.json

{
  "consumer_key"        :"先ほど取得したConsumer Key(API key)の値",
  "consumer_secret"     :"先ほど取得したConsumer Secret(API Secret)の値",
  "access_token_key"    :"先ほど取得したAccess Tokenの値",
  "access_token_secret" :"先ほど取得したAccess Token Secretの値"
}


雛形ファイルの作成

以降の全てのプログラムの共通部分を記述したファイルを作成する。ファイル名は適当につける。
まあぶっちゃけコピペすればいいだけなので作らなくてもいい。
あと今回はjsonの入出力を行うので、fsモジュールも使用する。

const twitter = require("twitter");
const fs = require("fs");

const client = new twitter(JSON.parse(fs.readFileSync("secret.json","utf-8")));

あと、確認用としてjsonを読み込んで出力させるためのファイルも作っておく。
とりあえず、

const fs = require("fs");

とだけ記述しておく。
名前は readjson.js としておいた。

ツイートする

statusの値にツイートしたい内容を入れて実行

tweet.js

/*
~共通部分~
*/
client.post('statuses/update', {status: 'ツイートしたい内容'}, function(error, tweet, response){
    if (!error) {
      console.log(tweet);
    } else {
      console.log('error');
    }
});

なお、実行する際はファイルを保存しているディレクトリに移動し、以下のように入力する。

node tweet.js

実行するとツイートの詳細情報がベロベロと吐き出される。ここでエラーが出ていなければツイートされているはずだ。
また、このツイートのviaは登録したアプリケーション名となる。

指定ユーザーのツイートを取得する。

定数paramのパラメータを変更することで、対象とするユーザーと取得するツイート数を指定できる。
今回は@tasowebというユーザーのツイートを20個取得し、結果はtimeline.jsonに格納する。

getTweets.js

/*
~共通部分~
*/
const params = {screen_name: 'tasoweb',count:20};

console.log("@" + params.screen_name);
client.get('statuses/user_timeline', params, function(error, tweets, response){
    if (!error) {
        console.log(tweets);
        fs.appendFileSync("timeline.json",JSON.stringify(tweets) + "\n","utf-8");
    }
});

readjson.js に以下を記述する。結果のうちツイート内容のみ出力。
nodeで実行するとツイートが新しい順に20個分ずらずらっと出てくる。

 const obj = JSON.parse(fs.readFileSync("timeline.json","utf-8"));
 for(let i=0;i<20;i++){
   console.log(obj[i].text + "\n");
 }


指定ユーザーがフォローしている人を取得

定数paramsでユーザーとページ(20人以上取得する場合)を指定できる。20人目以降を取得する場合は結果のnext_cursorを参照する。
結果はfriends.jsonに格納。

getFriends.js

/*
~共通部分~
*/
const params = {screen_name: 'tasoweb', cursor:-1};

console.log("@" + params.screen_name);

client.get('friends/list', params, function(error,friends,response){
  console.log(friends);
  fs.appendFileSync("friends.json",JSON.stringify(friends) + "\n","utf-8");
});

readjson.jsに以下を記述。前回記述した分はコメントアウトしておく。以降も同様。
最大20人分のスクリーンネームが出力される。

const obj = JSON.parse(fs.readFileSync("friends.json","utf-8"));
for(let i=0;i<20;i++){
  if(obj.users[i]!=undefined){
    console.log("@" + obj.users[i].screen_name);
  }
}


指定ユーザーのフォロワーを取得

フォローの取得とほぼ同じ。

getFollowers.js

/*
~共通部分~
*/
const params = {screen_name: 'tasoweb', cursor:-1};

console.log("@" + params.screen_name);

client.get('followers/list', params, function(error,followers,response){
  console.log(followers);
  fs.appendFileSync("followers.json",JSON.stringify(followers) + "\n","utf-8");
});

readjson.jsはこう。

const obj = JSON.parse(fs.readFileSync("followers.json","utf-8"));
for(let i=0;i<20;i++){
  if(obj.users[i]!=undefined){
    console.log("@" + obj.users[i].screen_name);
  }
}


ダイレクトメールの送信

定数paramsで送る相手と内容を指定。
@7nd_paz_MKに対し"てすてす~"と送信。

sendDM.js

/*
~共通部分~
*/
const params = {screen_name: '7nd_paz_MK',text:"てすてす~"};

console.log("@" + params.screen_name);

client.post('direct_messages/new', params, function(error,text,response){
  if (!error) {
      console.log(text);
  }
});


ダイレクトメールを取得する

送信があるなら受信もあるよね。今回は10件取る。

getDM.js

/*
~共通部分~
*/
const params = {count:10};

client.get('direct_messages', params, function(error,messages,response){
  if (!error) {
      console.log(messages);
      fs.appendFileSync("DM.json",JSON.stringify(messages) + "\n","utf-8");
  }
});

readjson.js。送ってきた相手のスクリーンネームも表示する。

const obj = JSON.parse(fs.readFileSync("DM.json","utf-8"));
for(let i=0;i<10;i++){
  if(obj[i]!=undefined){
    console.log("@" + obj[i].sender.screen_name + " : " + obj[i].text);
  }
}


タイムラインを取得

そのまんま。俗にTLと呼ばれているものを取得する。
定数paramのパラメータで取得ツイート数を指定できる。

getTL.js

/*
~共通部分~
*/
const params = {count:50};

status.get('statuses/home_timeline', params, function(error,tweets,response){
  if (!error) {
      console.log(tweets);
      fs.appendFileSync("hometimeline.json",JSON.stringify(tweets) + "\n","utf-8");
  }
});

readjson.js。スクリーンネームも一緒に出るようにした。

const obj = JSON.parse(fs.readFileSync("hometimeline.json","utf-8"));
for(let i=0;i<50;i++){
  console.log("@" + obj[i].user.screen_name + " : " + obj[i].text + "\n--------------------");
}


ユーザーストリーム

タイムラインを常に監視し、新しいツイートをその都度取得し表示する。
これって廃止されるやつ? それとも違うやつ?
※2018/8/26更新 多分廃止されたと思う。
※2019/1/6更新 廃止されているので利用不可。

userStream.js

/*
~共通部分~
*/
client.stream('user',
function(stream){
  stream.on('data', function(tweet){
    console.log(tweet.user.name + " @" + tweet.user.screen_name + "\n" + tweet.text + "\n-------------");
  });
  stream.on('error', function(error){
    console.log(error);
  });
});




とまあ今回はこんな感じ。
正直いってJavaScriptはまだまだにわかなのでなんか間違いとかあるかも。あと結果出力のプロセスはもうちょっといいやり方があるように感じる。
次はPuppeteerを絡めて色々やってみようと思う。