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 件のコメント:
コメントを投稿