Tweepyで雑にTwitter botを作ってみた


n番煎じの内容ですが、TweepyでTwitter botを作ってみたので、備忘録として調べて実装したことをまとめておきます。ここに載っているのはめちゃくちゃ初歩的で雑な実装のbotになります。

準備

  1. まずはtweepyをインストールしておきます。
    pipが入っていれば、pip install tweepyとかでできます。

  2. Twitter Application Management にログインしておきます。

    • まず、自分のTwitterアカウントの携帯電話番号を登録していなければします。Webからするなら設定のモバイルのところからできますが、すでに他の垢で使っている電話番号を使う時はスマホのアプリからした方が良いみたいです。
    • "Create New App" をクリックし、必要事項を入力します。
    • "Key and Access Token" タブをクリックし、次の4つのキーを取得しておきます。
      • Consumer Key
      • Consumer Secret
      • Access Token
      • Access Token Secret

とりあえず呟いてみる

まずは世界に挨拶しておきました。

tweet.py
import tweepy

# 先ほど取得した各種キーを代入する
CK="CONSUMER_KEY"
CS="CONSUMER_SECRET"
AT="ACCESS_TOKEN"
AS="ACCESS_SECRET"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

# ツイート
api.update_status("Hello World!")

このコードを実行するとTwitter Application Managementに登録したアカウントでHello World!がツイートされます。

Tweepyを使えば、api.update_status("任意の文字列")で任意の文字列を呟くことができます。便利ですね。

タイムラインを取得する

タイムラインを取得するコードを書いてみます。
今回はUser Streamsを使います。
User streamsはいつものタイムラインをほぼリアルタイムで取得することができる便利なAPIです。しかし、もうすぐ廃止されてしまうそうなので、代替案を考えなければいけませんね。。。(廃止時期については6/20と言われていましたが延期になったみたいです。)

とりあえず今回はUser Streamsを使って書いてみました。

timeline.py
import tweepy

# 先ほど取得した各種キーを代入する
CK="CONSUMER_KEY"
CS="CONSUMER_SECRET"
AT="ACCESS_TOKEN"
AS="ACCESS_SECRET"

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

        # ツイートを取得
        def on_status(self, status):

            # ユーザーネームとユーザーIDを表示
            print(status.user.name + "  @" + str(status.user.screen_name)
            # ツイートの内容を表示
            print(status.text)
            # 分かりやすいように線を入れる
            print("-----------------------")               
            return True

    # エラー時の処理
    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True

listener = Listener()
stream = tweepy.Stream(auth, listener, secure=True)
stream.userstream()

これを実行するとターミナル上でTwitterのタイムラインを見ることができます。

Tweepyには様々なメゾットが用意されています。そのメゾットを使うことによって簡単にツイートの情報を取ってくることができます。今回は次のメソッドを使いました。
status.user.name ・・・ ユーザーネーム。名前。
status.user.screen_name ・・・ ユーザーID。
status.text ・・・ ツイート内容。

特定の文字列に反応するbotを作る

ここまでできたら後は簡単です。
今回は、ツイート内容から条件分岐させて特定の文字列が含まれていた場合リプライを返すbotを作ってみました。
今回は"おみくじ"という文字列に反応しておみくじ結果を返すbotにしました。

bot.py
import tweepy
import random

# https://apps.twitter.com/ にアクセスし各種キーを取得する
# " "内には取得した各種キーを代入する
CK = "CONSUMER_KEY"
CS = "CONSUMER_SECRET"
AT = "ACCESS_TOKEN"
AS = "ACCESS_SECRET"

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

text_list = ["凶", "吉", "小吉", "中吉", "大吉"]  # ここに返信する文字列をいくつか入れて置く

class Listener(tweepy.StreamListener):

    # ツイートを取得
    def on_status(self, status):
        # リツイートや引用リツイートは除外する
        if (not status.retweeted) and ("RT @" not in status.text):
            # "おみくじ"という文字列がツイートに含まれていた場合
            if "おみくじ" in status.text:
                # ツイートを用意
                tweet = "@" + str(status.user.screen_name) + "\n" + random.choice(text_list)

                # ツイートする
                api.update_status(tweet, status.id)

                # 確認のためターミナルに出力
                print(status.user.name + "\n" + status.text)
                print("-> " + tweet)
                print("----------------")

        return True

    # エラー時の処理
    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True

    # タイムアウトした時の処理。サーバーなどで動かす時は必要。
    def on_timeout(self):
        print('Timeout...')
        return True

listener = Listener()
stream = tweepy.Stream(auth, listener, secure=True)
stream.userstream()

今回は先に返信する文字列をいくつか決め、text_listに格納しておき、その中からrandom.choice(text_list)でランダムに選ぶようにしました。

今回はリプライなので、
api.update_status(tweet, status.id) のように第2引数にstatus.idメソッドを使ってツイートに付いているIDを指定します。

たったこれだけでbotができちゃいます。
ただ、このbotはとても簡易的なbotなので、より複雑な内容を返すのであればその処理を別のスクリプトに分けたりするといいいみたいです。

おまけ

Tweepyには他にも便利な関数やメソッドがあります。
例えば、api.create_favorite(status.id)で指定したツイートIDのツイートをいいねしたり、api.retweet(status.id)でをリツイートすることができます。便利ですね。

参考