Twythonでラズベリーパイからツイートしよう(後編)

はじめに

本記事はこちらの続きとなります。
mugeek.hatenablog.com

今回は実際にPythonでコードを書いて、ラズベリーパイからツイートしてみましょう!

5. Pythonでツイート投稿

まず、Python 3 IDLE を開きます。
新規ファイルを開き、APIキーとアクセストークンの計4つを入力します。

consumer_key        = '(自身のAPI key)'
consumer_secret     = '(自身のAPI secret key)'
access_token        = '(自身のAccess token)'
access_token_secret = '(自身のAccess token secret)'

 
シングルクォーテーションの中には、Twitterアプリケーション作成時に確認したそれぞれの値を入力します。入力後、auth.py という名前でファイルを保存します。

保存したら、別の新規ファイルを開きます。
twythonモジュールをインポートし、Twythonクラスを作成するコマンドをファイルの先頭に入力します。

from twython import Twython

  
その下にauth.pyからAPIキーやアクセストークンの変数をインポートするコマンドを書きます。

from auth import (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

 
なお、Pythonではインデント(字下げ)が構造そのものを意味します。同じ数の空白分インデントされた部分を一つのブロックとみなすので、インデントは揃える必要があります。

APIキーとアクセストークンを使用したTwitter APIとの接続を確立するために、下記のコマンドを追記します。

twitter = Twython (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

 
その次に、ツイートしたい内容を変数名"message"に代入しましょう。
ツイートを投稿するには、update_status()関数を使用します。括弧内にあるパラメータ"status"は必須項目です。
コマンドの実行結果をターミナル上でも把握できるよう、print()関数も追加します。

message = "Hello world from Raspberry Pi!"
twitter.update_status(status=message)
print("Tweeted: " + message)

 
ここまで書いたら、ファイルをtwitter.pyという名前で保存します。auth.pyと同じディレクトリに保存しておきましょう。

twitter.pyファイルの内容をまとめると以下のようになります。

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 from Raspberry Pi!"
twitter.update_status(status=message)
print("Tweeted: " + message)

 
ファイルを保存したら、コマンドを実行するためにF5を押しましょう。
LXTerminalに下記のようなメッセージが表示されます。

f:id:mugeek:20190610224339p:plain
 
それでは、自分のTwitterアカウントのタイムラインも見てましょう。
ツイートが投稿されていたら成功です!
f:id:mugeek:20190610224443p:plain
 
なお、Twitterは同じ内容で連続してツイートできない仕様になっています。もし続けてコマンドを実行したい場合は、別の内容でツイートしてみて下さい。

6. メッセージをランダムに投稿

次はメッセージをランダムに投稿してみましょう。

まずrandomモジュールをインポートします。

import random

 
ツイートしたい内容を配列に追加します。今回は日本語の内容も入れてみました。

messages = [
    "おはようございます",
    "今日も一日がんばりましょう!",
    "プログラミング勉強中",
    "お腹がへった",
    "タピオカを飲みたいな",
    "Hello World",
]

 
配列の中からランダムにメッセージを取り出す関数が"random.choice"となります。

message = random.choice(messages)

 
以上を踏まえてコードを書くと、最終的に以下のようになります。

from twython import Twython
import random
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",
]

message = random.choice(messages)
twitter.update_status(status=message)
print("Tweeted: " + message)

 
ファイルを保存したうえで、試しに2回続けて実行してみましょう。
f:id:mugeek:20190616150141p:plain
 
ターミナル上では成功しています。
実際にタイムラインを見てみると・・・

f:id:mugeek:20190616150210p:plain
 
f:id:mugeek:20190616150220p:plain
 
きちんとツイートが投稿されていることを確認できました!

7. 画像を投稿

続いては、画像付きでツイートする方法です。

まず、ツイートしたい画像を用意し、pythonのプログラムファイルが保存されているディレクトリ内にその画像も格納します。

今回はメッセージと画像をセットで投稿します。

message = "Hello world - here's a picture!"
image = open('image.jpg', 'rb')

 
変数"message"には投稿したい内容を入力します。

また、画像を読み込むにはopen関数を使用します。
open関数の引数は、open(filename, mode)となっており、第一引数でファイル名、第二引数でファイルの操作方法を指定します。

上のサンプルコードでは、第一引数の箇所で画像名をimage.jpgとしています。
第二引数については初見では分かりづらいのですが、「r = 読み込み用に開く、b = バイナリモードで開く」と指定しています。
第二引数の詳細については、下記のサイトの説明が分かりやすいと思いますので、興味のある方はご覧ください。
dot-blog.jp

Twitterで画像を投稿するためには、まずその画像をTwitterにアップロードする必要があります。画像をアップロードするには、upload_media()関数を使用します。

response = twitter.upload_media(media=image)
media_id = [response['media_id']]

 
この関数は必ず"media_id"の値を返します。画像を投稿する際はこの値を使用するので、変数"media_id"に代入しておきます。

参考までに、Twitterの公式ページにはmedia/uploadのレファレンスがあります。
developer.twitter.com

上記をまとめると、コードは以下の内容となります。

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!"

image = open('image.jpg', 'rb')
response = twitter.upload_media(media=image)
media_id = [response['media_id']]
twitter.update_status(status=message, media_ids=media_id)
print("Tweeted: " + message)

 
ファイルを保存して実行してみましょう。
タイムラインに画像付きのツイートが表示されていれば成功です!
f:id:mugeek:20190616154902p:plain
  

8. 特定のキーワードを含むツイートを取得

最後に、特定のキーワードを含むツイートを取得するプログラムを作成します。

今回はこれまでと異なり、TwythonStreamerクラスをインポートします。

from twython import TwythonStreamer

 
特定のキーワードを含むツイートを見つけたときのアクションを指定するために、TwythonStreamerクラスを継承したMyStreamerクラスを作成します。
実際のアクションの内容はon_success()メソッドで指定します。今回はユーザー名とツイートの内容を出力する内容となっています。

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            username = data['user']['screen_name']
            tweet = data['text']
            print("@{}: {}".format(username, tweet))

 
MyStreamerクラスの定義が完了したら、MyStreamerクラスのインスタンスを作成します。 
statuses.filter()のtrack変数にはトラッキングしたいキーワードを記載します。今回は #Raspberrypi を含むツイートの取得を行います。

stream = MyStreamer(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
stream.statuses.filter(track='#Raspberrypi')

 
以上の内容をまとめると、下記のようなプログラムになります。

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']
            print("@{}: {}".format(username, tweet))

stream = MyStreamer(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
stream.statuses.filter(track='#Raspberrypi')

 
ファイルを保存して実行してみましょう。
ターミナル上に取得したツイートが表示され始めたら成功です!
f:id:mugeek:20190616165935p:plain
 
なお、トラッキングは「Ctrl + C」で止めることができます。

まとめ

今回はTwitterAPIを使って、ツイートを投稿したり、特定のキーワードを含むツイートを取得するプログラムを作成しました。
TwitterAPIは上記以外にもまだまだ数多くあるようなので、他のAPIも今後使ってみたいと思います。