「Twython」でラズベリーパイからツイート投稿、後編です!
今回も引き続き、ラズベリーパイ公式サイトのドキュメントに沿って進めていきます。ランダムな文字列の投稿、画像付きの投稿、そしてストリーミングAPIとの連携という3本立てでお送りいたします。
この記事では、OSは2017-11-29リリース版の「Raspbian Stretch with desktop」を、ラズベリーパイ本体は「Raspberry Pi2 Model B」を使用しています。
前編はこちら→第66回「Twythonを使ってラズベリーパイからツイート投稿!(前編)」
ランダムなツイートを投稿する
7ページ目の「Tweet random messages」は、Pythonの「random」モジュールを使用して、ランダムなメッセージを投稿するプログラムが紹介されています。
random_tweet.py
import random from twython import Twython from auth import ( consumer_key, consumer_secret, access_token, access_token_secret ) twitter = Twython( consumer_key, consumer_secret, access_token, access_token_secret ) messages = [ "Hello world", "Hi there", "What's up?", "How's it going?", "Have you been here before?", "Get a hair cut!", ] message = random.choice(messages) twitter.update_status(status=message) print("Tweeted: %s" % message)
デフォルトの「 /home/pi/ 」ディレクトリに、「random_tweet.py」というファイル名で保存しました。
3行目で呼び出している「auth」モジュールは、前回作成した「auth.py」で、Twitterアプリで作成した「Consumer Key (API Key)」「Consumer Secret (API Secret)」「Access Toke」「Access Token Secret」の4つの値をまとめたものです。「random_tweet.py」と同じディレクトリに用意しておきましょう。
auth.py
consumer_key = 'ABCDEFGHIJKLKMNOPQRSTUVWXYZ' consumer_secret = '1234567890ABCDEFGHIJKLMNOPQRSTUVXYZ' access_token = 'ZYXWVUTSRQPONMLKJIHFEDCBA' access_token_secret = '0987654321ZYXWVUTSRQPONMLKJIHFEDCBA'
※各値は、Twitter Appsで取得したものと置き換えてください。
2~15行目は、前回の記事の最後で作ったツイート投稿プログラム(twitter.py)と同じです。
1行目に「import random」を追加し、乱数を使用できるようにしました。17~24行目で、6つのメッセージを配列に格納し、25行目で、その中から1つを選択させています。
「How’s it going?」と出力されました。「messages」変数(配列)の4番目に格納されている文字列ですね。
実際の投稿を見てみると、「How’s it going?」が投稿されているのが確認できます。
ランダムな投稿ではありますが、連続して同じ文字列が選ばれてしまった場合、Twitter側の制限でエラーになってしまうことがあります。その場合は、少し時間をあけてから再度試すか、全く同じ文字列が投稿されないように調整(たとえば時刻を文字列に含めるなど)して投稿することで解決できます。
画像と一緒に投稿!
8ページ目の「Tweet a picture」は、画像付きで投稿する方法が記載されています。
プログラムを実行する前に、適当な画像を用意しておきましょう。今回は、ドキュメントに合わせて、 「 /home/pi/Downloads/ 」ディレクトリに「image.png」を準備しました。
from twython import Twython from auth import ( consumer_key, consumer_secret, access_token, access_token_secret ) twitter = Twython( consumer_key, consumer_secret, access_token, access_token_secret ) message = "Hello world - here's a picture!" with open('/home/pi/Downloads/raspberry.png', 'rb') as photo: twitter.update_status_with_media(status=message, media=photo) print("Tweeted: %s" % message)
変更点は17~8行目。「update_status」に代わって「update_status_with_media」で投稿しています。
こちらが実行結果です。なにやら警告文が表示されてしまいました……
調べてみると、「update_status_with_media」関数は、現在非推奨になっているようでした。
非推奨ではありますが、ツイートの投稿は無事に行われていました。
とはいえ、非推奨の方法を使うのは少し気になりますね……ということで、Twython公式サイトのマニュアルを参考に、プログラムを書き直してみました!
from twython import Twython from auth import ( consumer_key, consumer_secret, access_token, access_token_secret ) twitter = Twython( consumer_key, consumer_secret, access_token, access_token_secret ) message = "Hello world - here's a picture!" photo = open('/home/pi/Downloads/raspberry.png','rb') response = twitter.upload_media(media=photo) twitter.update_status(status=message, media_ids=[response['media_id']]) print("Tweeted: %s" % message)
マニュアルの「Updating Status with Image」の項を参考に、ツイート投稿部分の処理を変更しています。
「update_status」関数に、画像のパラメータを追加する方法を試してみたところ、今度はエラー無く投稿することができました!(投稿内容は、図4と同じです)
ツイートをリアルタイムで取得!
最後は9ページ目、「Test the Twython Streamer」です!
今度はツイートの「投稿」ではなく、投稿されたツイートの「取得」を行ってみましょう。
ドキュメントのサンプルを参考に、少しカスタマイズしたプログラムソースがこちらです。
from twython import TwythonStreamer from auth import ( consumer_key, consumer_secret, access_token, access_token_secret ) class MyStreamer(TwythonStreamer): def on_success(self, data): if 'text' in data: username = data['user']['screen_name'] tweet = data['text'] date = data['created_at'] print("%s @%s: %s" % (date,username, tweet)) print("----------") stream = MyStreamer( consumer_key, consumer_secret, access_token, access_token_secret ) stream.statuses.filter(track='#raspberrypi')
まず、1行目のimport文が違います。今までのサンプルプログラムはすべて「Twython」クラスをインポートしていましたが、ここでは「TwythonStreamer」に変更されています。
「TwythonStreamer」は、TwitterのストリーミングAPIを使用するためのクラスです。
Streaming message types — Twitter Developers
9~16行目では、「MyStreamer」というクラスを宣言しています。ここで、ツイートが見つかったときのアクションを指定します。
上記のプログラムソースでは、ツイート本文の他に、日付、アカウント名、区切り線を一緒に出力するようにカスタマイズしました。
18~24行目で、新たに作成した「MyStreamer」クラスのインスタンスを作成し、「#raspberrypi」の含まれるツイートに限定してトラッキングを開始しています。
ツイートが見つかると、このように出力されます。プログラムを停止するまで取得し続けます。
(大文字小文字は区別されないようでした)
実際にTwitterにアクセスして、検索結果を確認してみましょう。
多少のタイムラグが出ることもありますが、概ねリアルタイムで取得できていることが確認できると思います。
まとめ
2回にわたり、「Twython」の使い方をお送りいたしました。Twitterの投稿も検索も、とても簡単に実装することができましたね!
Pythonがベースになっていることで、部品を使った電子工作にも導入しやすいのではないでしょうか。APIを介する内部的な処理と、目で見える形に外部出力する部分を、「Twython」がうまく橋渡ししてくれるように思いました。
撮影した写真を定期的に投稿したり、特定のキーワードに関するツイートがあったときにアクションを起こすなど、今まで学んだ内容の組み合わせで、いろいろなものが作れそうです!(定点カメラと組み合わせて、Twitter連携のライブカメラなんてどうでしょうか?)