事の発端
くっそどうでもいいことだけどなんかよかった出来事を適当にトップに並べるtraPニュースサービスの登場が期待される
— なり~✌︎(˘ω˘) (@_n_ari) 2018年4月23日
たしかにあるといいな~
でも「くっそどうでもいいことだけどなんかよかった出来事」ってどうやって判定すればいいんだろう
とか思ってました。
アイデアは突然講義中に降ってきました。(ずっと考えてたわけではない)
traPニュースの実装方法考えてたけど、「報告があります」の次のツイートを拾えばいいんじゃないかっておもった
— ながてち(@syobon_titech) 2018年4月23日
traPには「あの」→「報告があります」→「(報告したいこと)」と3連ツイートをする謎の文化があります。(見た人はおめでとうございます!となるべく早く返す文化もある)
つまり、「報告があります」の次のツイートは「くっそどうでもいいことだけどなんかよかった出来事」になるということです(まあよくない出来事もあるんですけど…)
この事実に気付いてから、いかにTwitterBotとして実装できるかを考えていました。(講義聞け)
自分の頭の中で大体仕様が決まったので、昼休みに実装してみます
— ながてち (@syobon_titech) 2018年4月23日
そして昼休み、さっそく実装。
うまく動かないバグや無限ループに悩まされつつ…
あの
— すぱ(青い鳥) (@ymsk_64) 2018年4月23日
報告があります
— すぱ(青い鳥) (@ymsk_64) 2018年4月23日
仮免とれました!
— すぱ(青い鳥) (@ymsk_64) 2018年4月23日
おめでとうございます!!! #traP1news https://t.co/W9TBUPbHco
— ながてち (@syobon_titech) 2018年4月23日
完 成
し た
しくみ
ばばば~って実装したせいで仕組みをブログに残しとかないと自分が仕組みを理解できないというアレなアレになるので、メモとして残しておきます。
ちなみにソースコードはこちら(スピード実装特有のコードの汚さ)
言語はRubyです。
全体の流れ
- 1分毎に実行されることを想定
- traPのリストを読み込んで
- 「報告があります」というツイートがあったら
- そのユーザーのツイートを読み込んで「報告があります」の次のツイートを探して「おめでとうございます!」と引用リツイート
- なにもなかったらなにもないまま
これでいけたらいいんですけど、このままだと問題があって、「報告があります」のツイートを1分毎に読み込んでしまうという問題が発生します。
つまりこのままだと1分毎に「おめでとうございます!」と送るクソ害悪botになってしまう、ということです。
でも常時起動するbotとは違い、このbotは1分毎にCronで実行されることを想定してるので、どこまでTLを読み込んだのかを記録することができません。
どうすればいいかというと…
ツイートIDを記録する
ツイートIDとは、ツイートひとつひとつに割り振られる番号のことです。
(例:https://twitter.com/syobon_titech/status/988447251574833153
の988447251574833153
の部分がツイートID)
つまり、読み込んだ時点での最新のツイートIDを保存しておけば、次に読み込んだ時にそこまで読み込んだら読み込みを打ち切るようにしたら、読み込みのダブりがなくなるということです。
じゃあどうやってそのツイートID保存するのってことですが、
読み込んだツイートIDをテキストファイルとして保存するというガバガバ実装でなんとかしています。いいんだよ動けば。
これでダブり問題が解決されたわけですが、これで新たに問題がでてきます。
「報告があります」→「(報告したいこと)」が分離されたとき問題
ここくっっそ悩みました。
先ほどの実装だと、読み込みのダブりがなくなるので、「報告があります」→(次のツイートなし)の時にbotを起動してしまうと、次のツイートは「報告があります」が読み込まれないため、botがうまく動かないという状況に陥ってしまいます。
これを解決するには保存するツイートIDをどうすればいいか…ってなって頭が爆発したので、落ち着いて整理することにしました。
ケース1 : なにもないとき(「報告があります」がないとき)
本当になにもない。
最初に読み込んだIDを記録して終了。
ケース2 : 「報告があります」→ (まだツイートされてない) のとき
次の実行(1分後)に読み込まれるように、「報告があります」の1つ前のツイートIDを記録して終了。
(こうすることで次の実行で「報告があります」が読み込まれてケース3にいきます)
ケース3 : 「報告があります」→「(報告)」のツイートがあるとき
「(報告)」のツイートIDを記録する。
次の実行からは「(報告)」よりも前のツイートは読み込まれなくされるようにできます。
以上のような感じになるように頑張って実装した結果が上のソースコードです。
ぶっちゃけ自分で読んでてきもちわるい。
おしまい + 今後の展望
しばらく動かして動向をたのしんでみたいと思います。(迷惑だったらごめんなさい)
このままずっとTwitterBotとして動かそうとは考えてなく、
新生traQ(部内SNS)が完成したらチャンネル通知Botとして移植したいと考えています。
これでtraPニュースっぽくなったら面白いですね。
もっと別なtraP部員のニュースっぽいツイートが拾えるアイデアを考えるか…(いい案ください)
💩実装はやめましょう。
あああああああああああああああああああああああああああああああああああああああああああああああああ pic.twitter.com/YKxiBbA0SQ
— ながてち (@syobon_titech) 2018年4月23日