l_n_m’s diary

よわい電気系の日記(本当にただの日記)

Twitterでbot in Node.js, twitter

botづくり

突然やりたくなったのでやりました。しょうもないところで詰まりまくりましたが2時間で基本が完成。
大雑把な流れを追いつつやり方をメモがわりに残しておきます。

環境

Ubuntu14.04
Node.js 0.10.25
npm 1.3.10
TwitterAPI 1.1

install

npm install twitter

今回使ったのはこれだけ。Node.jsとnpmはinstall済みとします。
ntwitterとかいうのもあるっぽいですが、twitterの方が名前がデフォルトっぽい(偏見)のでこっち。

Twitter API認証

とりあえず登録。
Twitter Application Management
アカウントと携帯電話番号が紐つけられていないと怒られます。
携帯電話の認証をするときには、頭の「0」を抜いて、10桁を入れればいい。じゃないと認証してくれない。メッセージさえ届かなかったり。

OAuth認証

必要なのはconsumer_key, consumer_secret, access_token_key, access_token_secretの4つ。
access_tokenは画面の下の方で発行すればOK。
これらを、

var twitter = require("twitter");
var bot = new twitter({
  consumer_key: hogehoge,
  ...
});

と入れてやればOK。一部のサイトを見ていたら、Twitterにログインの上でデベロッパー用のページのURLを書いてあったりしました。それでもいいのか……

本体作成

今回使ったのはstreamAPI

bot.stream("statuses/filter", {track:"自分のアカウント名"}, function(stream){
  stream.on("data", function(data){
    var t = {status:"つぶやきたいこと", in_reply_to_status_id: data.id_str};
    client.post("statuses/update", t, function(error, tweet, response){
      if(!error) console.log("tweeted");
    });
  });
});

何がしたいの

自分宛のリプライに対して何らかの内容を返信します。リプライの内容はdataに入っているので、data.textから読み出して適当に使いましょう。

var text = data.text.replace("@垢名 ", "");

とやって自分の垢名とその直後の空白をカットして使うのがだいたいでしょうが。
statusには本文を入れます。
in_reply_to_status_idには、飛んできたリプライのステータス番号を入れます。data.idです。statusの中に、送り先のID、data.user.screen_nameが入っていないとこの値は無視され、返信ではなくただのリプライとなるので注意。

var message = "@" + data.user.screen_name + " メッセージ";
var t = {status: message, in_reply_to_status_id: data.id_str};

とかして使いました。

落とし穴

さて、実はdata.idを入れても返信してくれません。上では「id_str」となっています。こっちは大丈夫。
jsの仕様上、data.idが大きすぎて扱えないらしい。雑魚か。なので、文字列として突っ込んであげれば大丈夫。
余談ですが、data.idとdata.id_strはちょっとだけ値がずれているんですよね。なんなんだろう。
あと、phpならdata.idをそのまま入れても大丈夫らしい。phpよくわかりませんけど。

どこを見ればいいのさ

公式ドキュメントでも見ましょう。
つぶやきたいならupdate
POST statuses/update | Twitter Developers
streamingAPI、タイムライン上を検索する方法については
Streaming API request parameters | Twitter Developers
そのほかのドキュメントを検索したいならここ
Search | Twitter Developers

こちらを主に参考にしました。
Node.jsで作るTwitter通知アプリケーション〈Node.jsシリーズ vol.3〉 - Tech Blog - Recruit Lifestyle Engineer

その他の問題

一部のページでは、bot.updateStatusとかいうメソッドを呼んでいましたが、has no methodと怒られました。たぶん記事が古かったんだと思います。TwitterAPI1.0だったのかしら。
というわけでどうやればつぶやけるのかについてはちょっと調べるのに手間取りました。結局postすることに。
よくわからないモジュールを使いたくない、自分でAPIを直に叩きたい、という人は頑張ってください_(:3 」∠ )_
自分でOAuthの認証やらhttpリクエストやら書かないといけないのでたぶん面倒です。
あと、鍵垢のツイートは取得できないらしい。なんか上手くデータ取れないんだけどもしかして……と思って鍵を外したら動きました。クソ。たぶん鍵垢でも取得する方法があるんでしょうけど、今はそこまでやる気が湧かない。

振り返り

時間かかりすぎた。全部で2時間は流石に……30分くらいで出来ると見積もっていたので。
トラブル

  • 携帯電話の紐付けが出来ない(頭の0を抜いて入力)
  • データが取得出来ない(鍵を外した)
  • in_reply_status_idが動かない(メッセージに相手のアカウント名を入れる、data.id_strの方を使う)

テストをいっぱいしたい人なのでTLがぐっちゃぐちゃになって友達にうるせぇって怒られました。気をつけましょうね(反省したとは言っていない)。

またやる気が湧いたら、今度は天気予報なんかを実装します。とは言っても気象庁か何処かのサイトからデータ取ってきてつぶやくだけですが。
あとスケジュール機能。mongodbか何かと一緒に動かせばすぐ出来そうです。