Twitterのプロテイン配布bot

Twitterで、フォローしているユーザのツイートの特定のワードに反応して、
リプライを送るbotの作り方について。

最近、Twitter、というかSNS全般に疲れを感じ、特に見なくなってしまったのだが、
そうなってくるとプロテインを配布する業務を自動化しないといけない。

マインクラフト用に作成したTwitterBot用アカウントが以前からあり、
先日マインクラフト用サーバを止めてしまい、仕事がなくなってしまったため、プロテイン配布の仕事を与えた。

botは以下のコードで動いている。

#!/bin/python3
# -*- coding: utf-8 -*-

import minecraftbotkey
import twitter

CK = minecraftbotkey.CONSUMER_KEY
CS = minecraftbotkey.CONSUMER_SECRET
AT = minecraftbotkey.ACCESS_TOKEN
AS = minecraftbotkey.ACCESS_TOKEN_SECRET

t = twitter.Api(consumer_key=CK, consumer_secret=CS, access_token_key=AT, access_token_secret=AS)

message="( `・ω・´)つ[プロテイン]"
words = ["反応", "する", "文字列"]

# 自身のホーム画面から10件取得
tl = t.GetHomeTimeline(count=10)
for tweet in tl:
    # リツイートは無視
    if tweet.text[:2] == "RT":
        continue
    if any(( s in tweet.text) for s in words):
        # 特定IDに対してリプライを送る
       t.PostUpdate(status=message, in_reply_to_status_id=tweet.id, auto_populate_reply_metadata=True)

pythonはTwitterAPIが簡単に使えるライブラリがあるので、
まずはそれを実行するサーバにpipで入れる。

pip install twitter

ライブラリについては、以下がリファレンスになる。
https://python-twitter.readthedocs.io/en/latest/index.html

なお、TwitterはAPIを使うにあたり、申請が必要になる。
申請方法は調べればたくさん資料が出てくるので、それに従って行えば良い。
申請が完了すると、APIのキー情報と、アクセストークン情報が発行されるため、
それを用いて認証を行う。

コード解説。
import minecraftbotkey
APIのキー情報とアクセストークン情報が入っているファイルを読み込んでいる。
import twitter
pipで入れたtwitterのライブラリのインポート

t = twitter.Api(consumer_key=CK, consumer_secret=CS, access_token_key=AT, access_token_secret=AS)
APIのキー情報とアクセストークン情報を用いて、認証。APIを使えるようにする。

tl = t.GetHomeTimeline(count=10)
GetHomeTimelineメソッドは自分のタイムラインを取得できる。
(=自分のフォローユーザのツイートの取得ができる)
countでその数を指定できる。上記では10件取得する。
APIに制限があるため、countの数を大きくしすぎたり、
このツールを連打するようなことをすれば、API制限に引っかかって処理ができなくなる。

for tweet in tl:
ツイートを1件ずつ処理する。

1件に含まれるデータは以下の感じである。
(自分のツイートを取得した結果)

{"created_at": "Mon Aug 10 07:00:46 +0000 2020", "hashtags": [], "id": 1292717510907670529, "id_str": "1292717510907670529", "lang": "ja", "source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>", "text": "\u30c6\u30b9\u30c8\u30c4\u30a4\u30fc\u30c8", "urls": [], "user": {"created_at": "Sat Feb 20 00:33:27 +0000 2010", "description": "\u8da3\u5473\u306f\u65c5\u3001\u30c6\u30cb\u30b9\u3001\u30b5\u30d0\u30b2\u3001\u30d4\u30a2\u30ce\u3001\u30d0\u30f3\u30c9\u6d3b\u52d5\u3001\u30b5\u30fc\u30d0\u3044\u3058\u308a\u3001\u96fb\u5b50\u5de5\u4f5c\u3001\u30ab\u30e1\u30e9\u3001\u767b\u5c71\u3001\u30ad\u30e3\u30f3\u30d7\u3001\u91e3\u308a\u3001\u6620\u753b\u3001\u8aad\u66f8\u3001\u304a\u9152\u3001\u30e9\u30f3\u30cb\u30f3\u30b0\u3001\u30b5\u30a4\u30af\u30ea\u30f3\u30b0\u3001\u7b4b\u30c8\u30ec\u3001\u30b3\u30fc\u30d2\u30fc\u3001etc..\u3084\u308a\u305f\u3044\u3053\u3068\u591a\u3059\u304e\u3066\u6642\u9593\u8db3\u308a\u306a\u3044\u3002 \u30b9\u30c8\u30ec\u30b9\u304c\u8caf\u307e\u308b\u3068\u767a\u8a00\u304c\u5897\u3048\u307e\u3059\u3002\u3059\u307f\u307e\u305b\u3093\u3002", "favourites_count": 390, "followers_count": 77, "following": true, "friends_count": 56, "geo_enabled": true, "id": 115797667, "id_str": "115797667", "listed_count": 7, "name": "po\u035cp\u0355py@", "profile_background_color": "B2DFDA", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme13/bg.gif", "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme13/bg.gif", "profile_banner_url": "https://pbs.twimg.com/profile_banners/115797667/1511411760", "profile_image_url": "http://pbs.twimg.com/profile_images/1164479568524091392/D7lieRFu_normal.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1164479568524091392/D7lieRFu_normal.jpg", "profile_link_color": "4A913C", "profile_sidebar_border_color": "EEEEEE", "profile_sidebar_fill_color": "FFFFFF", "profile_text_color": "333333", "profile_use_background_image": true, "screen_name": "poppyhi", "statuses_count": 20855, "url": "https://t.co/ayvioJmzFJ"}, "user_mentions": []}

"description"がプロフィール情報だったり、毎回色々と情報を取得している。
"text"が肝心なツイート内容である。
(一応取得データについては隠さねばならないデータは含まれていないため、
 まるまる公開している。)

    if tweet.text[:2] == "RT":
        continue

取得内容としては、フォローユーザのツイートの他、リツイートまで取得される。
"いいね"については取得されない。
リツイートについては、テキストの先頭に"RT"の文字が入る仕様になっているため、
RTに対しては反応しないようにしている。

    if any(( s in tweet.text) for s in words):
        # 特定IDに対してリプライを送る
       t.PostUpdate(status=message, in_reply_to_status_id=tweet.id, auto_populate_reply_metadata=True)

words = ["反応", "する", "文字列"]で反応する文字列を決め、
ツイート内容に文字列が含まれていないか比較し、文字列が含まれていた場合に
リプライの処理を行う。
(なんとなく面白みがかけると思ったので、反応する文字については実物から改変した)

       t.PostUpdate(status=message, in_reply_to_status_id=tweet.id, auto_populate_reply_metadata=True)

PostUpdateが主にツイートで使うメソッドである。
status=messageの"message"が送る文字列となり、
message="( `・ω・´)つ[プロテイン]" で定義した文字列が送られる。

ツイートにはすべてIDが振られており、そのIDを指定してあげることで、
リプライができる。
in_reply_to_status_id=tweet.idでリプライ対象ツイートのIDを指定している。

auto_populate_reply_metadataについては、リファレンスにある通り、

auto_populate_reply_metadata (bool, optional) – Automatically include the @usernames of the users mentioned or participating in the tweet to which this tweet is in reply.

Trueに指定してあげると、@usernamesが自動でついてくれる。
Twitterの仕様として、@ユーザ名をツイートに入れてあげると、そのユーザに対してメッセージが送れる。
auto_populate_reply_metadateをTrueとし、@ユーザ名を自動で含めさせることで、
リプライとしている。

あとは、サーバでこのコードを定期的に実行してあげればbotの完成である。

こんな感じで、たった数行で特定ワードに反応してリプライを送るbotというのは作れてしまう。
今回はリプライbotとしたが、ツイートからは色々な情報を取得できるし、
自分のフォローしているユーザのツイート以外にも、Twiter全体の検索結果を取得したりもできたりと、アイデアがあれば色んなことができてしまう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です