たまめ的生活記録

日々で思ったこととか、技術的なこととか。

むきりょくbotを復活させた。【Python: ツイート編】

高校生の頃に作って、TwitterAPI仕様が変わり止まっていたむきりょくbotを5年ぶりに再稼働させました。
前回の記事はこちら。

june06-lifelog.hatenablog.com

セリフの登録

むきりょくbotむきりょくかん。さんの作品に登場するキャラクターのセリフや文章を呟くbotです。そのためにはセリフがないと始まりません。 セリフしかもつ必要はないので、今回は単純にテキストファイルで保持するようにしました。以下のように、1行につき1つのセリフが書かれているイメージです。

吾輩は猫である。名前はまだない。(吾輩は猫である/夏目漱石)
クラムボンは笑ったよ。(やまなし/宮沢賢治)
ある日の暮方の事である。一人の下人げにんが、羅生門らしょうもんの下で雨やみを待っていた。(羅生門/芥川龍之介)

本当はむきりょくbotを作った当時のPCにテキストファイルが残っていればよかったんですが、消失していました。仕方ないので再読を兼ねてひたすらゲームをプレイしたり、過去のツイートを遡って追加していきました。ちなみに、ツイートを遡る時はクエリで日付を指定すると便利です。

from:mukiryokuBOT until:2013-06-20 (2013年6月20日以前のむきりょくbotのツイートを取得)

セリフのランダム取得

セリフを登録したら、今度はそのセリフの中から呟くセリフを取得する必要があります。
ファイルを一度に開いてランダムに抽出すると今後セリフが膨大な数になった時とか嫌なので、いい感じのアルゴリズムをないかと探しました。するとstackoverflowにいい感じのものがあったので参考にさせていただきました(記事中の(Waterman's "Reservoir Algorithm") from Knuth's "The Art of Computer Programming")。

How do I read a random line from one file in python? - Stack Overflow

ツイート

さて、これでセリフは取得できたのであとはツイートするだけです。Tweepyではupdate_status()メソッドたったひとつでツイートできます。

import oauth # oauth認証編で作成したもの
import tweepy

def post_speech():
    api = oauth. create_twitter_api()
    speech = get_speech()
    api.update_status(speech)

def get_speech():
    ~
    Reservoir Algorithmでランダムにセリフを取得
    ~

このプログラムをtweet.pyとして保存し、シェルから実行すれば呟くことができます。

$ python tweet.py

f:id:juntama13:20190105011916j:plain:w700

次はどうせなので、何かしらエラーが起きてツイートできなくなった時にslackへ通知が来るようにします。