できること

第67回「Twythonを使ってラズベリーパイからツイート投稿!(後編)」

raspberrypi67_main

「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つを選択させています。

raspberrypi67_img01

図1

「How’s it going?」と出力されました。「messages」変数(配列)の4番目に格納されている文字列ですね。

raspberrypi67_img02

図2

実際の投稿を見てみると、「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」で投稿しています。

raspberrypi67_img03

図3

こちらが実行結果です。なにやら警告文が表示されてしまいました……
調べてみると、「update_status_with_media」関数は、現在非推奨になっているようでした。

raspberrypi67_img04

図4

非推奨ではありますが、ツイートの投稿は無事に行われていました。

とはいえ、非推奨の方法を使うのは少し気になりますね……ということで、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」の含まれるツイートに限定してトラッキングを開始しています。

raspberrypi67_img05

図5

ツイートが見つかると、このように出力されます。プログラムを停止するまで取得し続けます。
(大文字小文字は区別されないようでした)

「#raspberrypi」のツイートを検索

実際にTwitterにアクセスして、検索結果を確認してみましょう。
多少のタイムラグが出ることもありますが、概ねリアルタイムで取得できていることが確認できると思います。

 

まとめ

2回にわたり、「Twython」の使い方をお送りいたしました。Twitterの投稿も検索も、とても簡単に実装することができましたね!
Pythonがベースになっていることで、部品を使った電子工作にも導入しやすいのではないでしょうか。APIを介する内部的な処理と、目で見える形に外部出力する部分を、「Twython」がうまく橋渡ししてくれるように思いました。

撮影した写真を定期的に投稿したり、特定のキーワードに関するツイートがあったときにアクションを起こすなど、今まで学んだ内容の組み合わせで、いろいろなものが作れそうです!(定点カメラと組み合わせて、Twitter連携のライブカメラなんてどうでしょうか?)

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

高専ロボコン2018解剖計画