Subscribed unsubscribe Subscribe Subscribe

自動mention系Twitter botを復活させる

以前にいくつかTwitter botを作っていて。

どちらも「フォロワーの発言から特定の語が含まれているTweetを拾って、replyする」という機能を持つもの。
これを実現するために、フォローされたら自動でフォロー返しをして、GET statuses/home_timelineを定期的に叩いたり、 User streams でフォロワーの発言を収集していた。
しかし数ヶ月前に@genkidashitebotがAPI Key Restrictionを食らってしまい、ちょっと調べてみたところfollow/unfollowの自動化は禁止事項となっているらしい(知らなかった)。

となると、自動フォロー返しなどをせずにフォロワーの発言を拾ってくる必要がある…。無理なんじゃないかとしばらく諦めていたけど、REST APIを駆使することである程度実現できるのでは、と思い至った。

GET followers/listを使うとfollowersのuser情報に付随して最新のtweetが1件含まれて返ってくる。これらを集約すればfollowersのタイムライン的なものが得られる。ただ、これは1回あたり200件が取得上限で、cursorを使って遡っていっても3000 followersくらいいるとそこまでで15分の枠を使い切ってしまう。

followersが多いときに使えるのがGET followers/idsGET users/lookup。followers/idsではfollowersの「IDだけ」を1回で最大5,000件取得できる。ので数万followersいても数回のリクエストですべて取得できる。そしてusers/lookupにはそのIDをカンマ連結したパラメータでリクエストすることで最大100件のuser情報を得ることができる。


ということで、これらを使えば「全followersのIDを取得し、それらのuser情報と最新のTweetを1件取得」できるので、これを定期的に実行することで(連続でTweetされたときなど ある程度の取りこぼしは出るものの)フォロワーの発言だけで構成されるタイムラインを得ることができる。

そしてusers/lookupなんかはcursorを含まない独立のリクエストになるので(可能か否かだけで言えば)並行で処理することもできる。
ので「定期的にフォロワーのタイムラインを取得し、特定の条件に合致したもの自動でmentionを送る」という機能を持つフレームワーク的なものを書いた。goで。

で、それを使って停止された自動mention系botを再始動させてみた。

Goで全裸 というのは以前に書いていたのだけど、形態素解析kagome がけっこうアップデートされていたのでそれに合わせてちょっと直した。外部辞書も利用できるようになっているようなのでいつかは NEologd 辞書を使うようにしたりして全裸にする精度を上げたい気持ちはある。


botともherokuで動かしてみていて、経過観察しているところ。このまま放置していても動き続けてくれるといいなぁ…。