そういやちゃんとまとまた説明を書いてないなと思ったので。
現在、Twitterで2つのbotを運用しており、それぞれ2つ、合計4つの機能を実装している。
botは全部Pythonで書いて、AWSのLambdaで定期実行している。
@Weather_markov
天気予報と自動生成ツイートの機能を実装している
天気予報
毎朝7時に、自分が住んでいる地域の天気予報を取得してリプライする。天気予報を毎朝確認するのが面倒で、じゃあTwitterで完結するようにしたらよくね?と思って開発した。自分は毎朝起きて最初にやることがスマホでTwitterを確認することなので、ついでに天気予報を確認できるのは便利。
@nemesis_namako
— こんもく (@Weather_markov) November 7, 2022
おはよう、お兄さま。
今日の天気は「晴」だよ。
最高気温は22℃で、最低気温は12℃だよ。
降水確率は、午前が0%で午後が0%だよ。
傘は要らないかな……?
今日も一緒に頑張ろうね。
また、最高/最低気温が前日より5℃以上高いor低いときは気温差が大きいことを注意喚起したり、降水確率が一定以上高いときは傘を持っていくよう推奨したりする。天気予報のbotはたくさんあるが、前日との気温差に関する機能は珍しいんじゃないかと思う。
毎日同じ文章だと飽きるので、ランダムで違う文体になるようにした。
1つめ
@nemesis_namako
— こんもく (@Weather_markov) October 6, 2022
おはよう、お兄さま。
今日の天気は「雨のち曇」だよ。
最高気温は14℃で、最低気温は13℃だよ。
降水確率は、午前が45%で午後が85%だよ。
傘を持っていった方がいいかも。
今日も一緒に頑張ろうね。
2つめ
@nemesis_namako
— こんもく (@Weather_markov) September 7, 2022
おはよ。
今日の天気は「雨時々曇」よ。
最高気温は26℃で、最低気温は23℃よ。
昨日より寒いから気をつけなさいよ。
降水確率は、午前が20%で午後が70%ね。
傘を持っていった方がいいわ。
今日も頑張りましょ!
3つめ
@nemesis_namako
— こんもく (@Weather_markov) August 24, 2022
ごきげんよう。
今日の天気は「曇」ですわ。
最高気温は27℃で、最低気温は24℃ですわね。
昨日より寒いから気をつけたほうがいいですわね。
降水確率は、午前が20%で午後が25%ですわ。
傘は要りませんわね。
今日も頑張りましょう。
4つめ
@nemesis_namako
— こんもく (@Weather_markov) October 7, 2022
おはよう。
今日の天気は「曇時々晴」だ。
最高気温は23℃で、最低気温は13℃だな。
昨日より暖かいから気をつけろ。
降水確率は、午前が0%で午後が5%だ。
傘は要らないな。
油断せずに行こう。
そのうち新しい文体を作るかも。
自動生成ツイート
毎日8時~26時に、タイムラインからツイートを取得し、それを元に新しく文章を生成してツイートする。
夜遊び禁止ですよって言ってくれる彼女が足りない。
— こんもく (@Weather_markov) December 11, 2021
ツイートの生成にはマルコフ連鎖というアルゴリズムを利用しており、平たく言うと前の単語から次の単語を予測するロジックになっている。
例えば、以下の2つのツイートがあるとする
- 今はわからないことばかりだけど信じるこの道を進むだけだ
- 消える足場に挑戦するけどすぐに下に落ちる
このとき、マルコフ連鎖では「『けど』という単語の後には、『信じるこの道を進むだけだ』が50%、『すぐに下に落ちる』が50%の確率で続いている」と解釈する。その結果、以下のようなツイートを生成する。
- 今はわからないことばかりだけどすぐに下に落ちる
たまに50%で同じ文章をツモり続けると、無限ループすることがある。
1/2で欲しいUR当たるのに夢中で髪の毛にハイライト入れるのに夢中で髪の毛にハイライト入れるのに夢中で髪の毛にハイライト入れるのに夢中で髪の毛にハイライト入れるの忘れてたけど事故ること多くて抜いた
— こんもく (@Weather_markov) January 26, 2022
日曜の朝とか平日の昼間とか、特定の人しかタイムラインにいないときはその人のツイートばっかり拾ってる。
@Stallion_Result
競馬に関するツイートをするbot
自分はウイポをやっていたので、競馬は種牡馬単位で応援することが多い。でも種牡馬の産駒成績を一つ一つ確認するのは面倒だなーと思って開発した。
土日:産駒成績のツイート
今日のキタサンブラックの産駒成績だよ(3/3)
— 種牡馬産駒成績bot (@Stallion_Result) October 30, 2022
東京11R(天皇賞(秋))
イクイノックス:Cルメ騎手
1番人気→1着!!!
阪神1R(2歳未勝利)
ラホーヤストーム:角田騎手
4番人気→9着
毎週土曜と日曜の17時に、特定の種牡馬産駒の中央競馬での成績をツイートする。現在の対象種牡馬はシルバーステート、キタサンブラック、サトノダイヤモンド、サトノクラウンで、選出基準は単なる好み・趣味。サトノクラウンはフォロワーさんの推奨だった。
今後はブリックスアンドモルタルやカリフォルニアクローム、ノーブルミッションやコントレイルも対象に追加する予定。
水曜:産駒のスタッツのツイート
シルバーステート産駒の成績だよ
— 種牡馬産駒成績bot (@Stallion_Result) November 9, 2022
■総合
リーディング:25位
勝ち上がり率:29.5% (39/132)
AEI:0.46
■3歳世代
リーディング:13位
勝ち上がり率:29.3% (27/92)
AEI:1.12
■2歳世代
リーディング:14位
勝ち上がり率:30.0% (12/40)
AEI:1.50
毎週水曜の21時に、2歳世代、3歳世代、全世代のAEIや勝ち上がり率をツイートする。対象種牡馬は↑と同じ。
さいごに
今は「2週間ごとにコンタクトレンズを交換するようリマインドしてくれるbot」の開発を考えている。要件上、完全にステートレスな実装が難しいのでFaaSで完結させるのは難しいなーと思ったり、そもそもこれTwitterのbotでやる必要あるのか?と思ったり、開発は難航しているけど、気が向いたら実装するかもしれない。