Twitterから水温グラフを確認する
https://scrapbox.io/files/617d58a8920c77001dc386d5.png
こんな感じ
https://scrapbox.io/files/61bdf2a3ec4bb700207001c7.png
前提条件
このページは以下がそれぞれ実現できていることを前提とする
システム構成図内「Twitter API」
システム構成図
システム構成図.icon
要件
Twitter経由で最新の水温グラフを取得できる
仕様
仕様1:特定のTwitterアカウントに「graph」とメンションするとリプライで最新の水温グラフが返ってくる
設計
流れは以下の通り
10分おきに水温計測&最新の水温グラフ更新
TwitterBotが「graph」コマンドを受け付けられるようにする
「graph」コマンドに対して最新の水温グラフの画像をリプライで返す
10分おきに水温計測&最新の水温グラフ更新
TwitterBotが「graph」コマンドを受け付けられるようにする
「graph」コマンドに対して最新の水温グラフの画像をリプライで返す
TwitterBotにオレオレコマンドを追加する
table:「graph」コマンド
形式 @xxx graph
応答 コマンド受信時の最新のグラフ画像
TwitterBotの現在の実装が以下のようになっていることを確認する
code:tweet_listener.py
while True:
try:
myStreamListener = MyStreamListener()
myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener)
except KeyboardInterrupt:
sys.exit()
except:
pass
MyStreamListenerクラスの内容については省略している
track=['@Asyley_aqua ']としている部分を各自bot用のアカウント名に読み替える
この状態であれば、まずは@Asyley_aquaへの全てのメンションに反応することができる
ここからさらに@Asyley_aqua graphというメンションだけに反応し、グラフ画像をリプライするようにMyStreamListenerクラスのon_status()を以下のように実装する
code:tweet_listener.py
import re
class MyStreamListener(tweepy.StreamListener):
def on_status(self, status):
if re.match(r'@Asyley_aqua graph.*', status.text):
reply_text = '@' + status.user.screen_name
api.update_with_media(status=reply_text, in_reply_to_status_id=status.id, filename='グラフ画像のパス')
filenameには10分おきに出力、更新されている水温グラフ画像へのファイルパスを指定する
本来、反応すべきメンションは@Asyley_aqua graphに完全に一致するツイートだけであるべきだが、ツイッターの仕様上、短期間での同じ内容のツイートが重複して行えないため、上記では反応する条件となる正規表現をr'@Asyley_aqua graph.*'としており、@Asyley_aqua graph2などのようにgraphの後ろに添え字など何らかの文字列が付いていても許容するようにした
これにより、「graph」コマンドをbotにメンションすると、その時点での最新の水温グラフ画像がリプライにて受け取れる
完了 ⇒仕様1:特定のTwitterアカウントに「graph」とメンションするとリプライで最新の水温グラフが返ってくる
テロ対策
これをそのまま本番投入すると第三者に悪用され、大量のリプライを送信させられたりするので以下を参考に対策すること