ひさくんガチ恋bot自動化進捗(2)

ついに twitterAPI を手に入れたのでbotを自動化しました。

前回の記事(下記)からの進捗に加えて、試行錯誤した点をまとめておきます。
smooth-pudding.hatenablog.com

前回からの進捗

  • twitterAPI の取得

... twitter 公式と英語でメールでやりとりしました。2往復してやっと許可されました。やったぜ

... API を使って実際に動かしながらデバッグしました。動かしてみると見つかるバグもいくつかありました。一部後ほど紹介します。

  • Heroku を用いた自動化

...API Key の類を環境変数に設定して自動実行しました。今のところ元気に動いています。

試行錯誤した点

ガチ恋」ツイートであるかどうかの判定の部分に一番骨を折りました。少し紹介します。
ガチ恋」を含むツイートである判定をする is_gachikoi メソッドは最終的に次の定義になりました:

def is_gachikoi(status):
    text = status.text
    return ("ガチ恋" in text) and ("@" not in text)

ツイートの文面に「ガチ恋」が含まれていて「@」が含まれていない、という条件です。「リプライじゃない」っていう判定のほうがスマートだと思いますが、書き方がすぐには見つからなかったのでこう書いてます。いい方法が見つかったら書き換えます。当初は status.user.screen_name=="hisagrmf" という条件も入れていたのですが、どうやら status.user は RT した人の情報になるようで、全く意味をなさない条件になっていたため外しました。
ひさくんはガチ恋しているときにしか「ガチ恋」と言わないわけではないので、上の条件だとちょっと拾いすぎになります。そこでガチ恋eeになっているツイートを判定する is_fascinator メソッドでうまくカバーするようにしています。
具体的には次の実装になりました。

def is_fascinator(status):
    status_rt = status.retweeted_status
    return (status_rt is not None) and \
        (status_rt.media is not None)

status.retweeted_status は「RTのときのみ None でなくなり、RTされたツイートの status が入る」という property です。さらに status.retweeted_status.media は「RT元のツイートに添付されているメディア(画像とか)のリスト」を表す property です。まとめると「RTであって、元ツイートに media がくっついてる」という条件です。結構厳しい条件なので、今のところ問題なさそうです。実は当初は status.text[:4]=="RT @" や status.media is not None としていたのですが、微妙に条件に漏れるものがあり、試行錯誤の結果上記の実装になりました。
以上を組み合わせて

  1. 新しい方からツイートを検索して is_gachikoi(status)=True となるツイートを探す
  2. その直前で is_fascinator(status)=True となるツイートを探す
  3. 最終的に前者は ふぁぼ, 後者は RT する

という処理を実装しました。

今後の方針

とりあえず動いたのである意味やることが無いのですが・・・過去に RT/fav しそびれたツイートを掘り起こすような処理ができないかちょっと考えてみています。Rate Limit 超えないかだけが怖いのでそこは注意してやります。

蛇足

ちゃんと動作確認するユーザー(?)の鑑