Python用Twitter APIラッパーTweepyでツイートを取得してみた(Python3でTwitterのデータを取得する)が、このときに取得したのは過去のツイート。Twitter APIにはリアルタイムにツイートを取得できるStreaming APIがあり、Tweepyでもそれを利用できる。例えば、スマホから自分宛にTwitterのダイレクトメッセージを送ると、そのメッセージをRaspberry Piでリアルタイムに受け取ることができる。この機能を利用して、Twitterを使ってRaspberry Piを再起動してみる。
Raspberry PiとRaspbian Jessie。
Twitter APIの利用に必要なAPIキーとトークン、それにTweepyのインストールについてはPython3でTwitterのデータを取得するを参照。
TweepyでStreaming APIを使うサンプルコードはStreaming With Tweepyにあり、ツイートを取得するならサンプルの方法で問題ないが、ダイレクトメッセージを受け取るにはon_statusではなくon_dataメソッドを使う。自分宛てにダイレクトメッセージで再起動コマンドを送り、Raspberry Piでコマンドを受信したら再起動する。
上記コードをRaspberry PiのPython3で実行し、スマホのTwitterから自分宛に「reboot」と送信する。すると、Raspberry Piから「The system is going down for reboot!」というダイレクトメッセージが送信され、Raspberry Piが再起動する。
User Streamの取得方法は、今後Streaming APIからAccount Activity APIに変わるらしい(Streaming APIs)。Tweepyが対応するかは不明なので、しばらくしたらTweepyを使わない方法を考える必要があるかもしれない。
ターミナルから実行した場合、ターミナルを閉じるとPython3のプロセスが終了してしまう。nohupコマンドを使うとターミナルが閉じても実行し続けることができる。
Raspberry PiとPython3でPCを起動するにあるWOL用のマジックパケットを送信するPythonコードを使うと、Twitterのダイレクトメッセージを使ってRaspberry PiからPCを起動させることもできる。
環境
Raspberry PiとRaspbian Jessie。
事前準備
Twitter APIの利用に必要なAPIキーとトークン、それにTweepyのインストールについてはPython3でTwitterのデータを取得するを参照。
コーディング
TweepyでStreaming APIを使うサンプルコードはStreaming With Tweepyにあり、ツイートを取得するならサンプルの方法で問題ないが、ダイレクトメッセージを受け取るにはon_statusではなくon_dataメソッドを使う。自分宛てにダイレクトメッセージで再起動コマンドを送り、Raspberry Piでコマンドを受信したら再起動する。
import os import json import tweepy # Twitter APIの認証情報 # Twitterの開発者向けのページで取得したキーとトークンを使う CONSUMER_KEY = 'Consumer Key' CONSUMER_SECRET = 'Consumer Secret' ACCESS_TOKEN = 'Access Token' ACCESS_TOKEN_SECRET = 'Access Token Secret' class MyStreamListener(tweepy.StreamListener): """ Streaming APIで取得したデータを処理するクラス """ """ def on_status(self, status): #on_statusでツイートは取得できるが、Direct Messageはできない print('@{} {}'.format(status.author.screen_name, status.text)) """ def on_data(self, status): # Direct Messageはon_dataでないと取得できない # Direct Messageのみを処理する if 'direct_message' in status: # JSONから辞書型に変換 dm = json.loads(status)['direct_message'] # 送信者と受信者の一致をチェック # 他人からのDirect Messageに反応しないようにするため if dm['sender_screen_name'] == dm['recipient_screen_name']: print('DM: {} from @{}'.format(dm['text'], dm['sender_screen_name'])) # rebootを受信したら再起動する if dm['text'] == 'reboot': # Direct Messageを送信 api = tweepy.API(auth) api.send_direct_message(screen_name=dm['sender_screen_name'], text='The system is going down for reboot!') # OSを再起動 os.system('sudo reboot') def on_error(self, status_code): # Twitter APIの使用制限を超えた場合 if status_code == 420: print('Error code: {}'.format(status_code)) # Falseを返すとstreamを切断する return False def on_timeout(self): print('Timeout') # Trueを返すとstreamを切断しない return True # 認証情報の設定 auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) # Streamオブジェクトの作成 stream = tweepy.Stream(auth, MyStreamListener()) # User Streamを取得 stream.userstream()
Twitterからコマンドを送ってRaspberry Piを再起動してみる
上記コードをRaspberry PiのPython3で実行し、スマホのTwitterから自分宛に「reboot」と送信する。すると、Raspberry Piから「The system is going down for reboot!」というダイレクトメッセージが送信され、Raspberry Piが再起動する。
注意事項
User Streamの取得方法は、今後Streaming APIからAccount Activity APIに変わるらしい(Streaming APIs)。Tweepyが対応するかは不明なので、しばらくしたらTweepyを使わない方法を考える必要があるかもしれない。
バックグランド実行
ターミナルから実行した場合、ターミナルを閉じるとPython3のプロセスが終了してしまう。nohupコマンドを使うとターミナルが閉じても実行し続けることができる。
おまけ
Raspberry PiとPython3でPCを起動するにあるWOL用のマジックパケットを送信するPythonコードを使うと、Twitterのダイレクトメッセージを使ってRaspberry PiからPCを起動させることもできる。
0 件のコメント:
コメントを投稿