PythonでTwitter自動返信botを作りました。

rioです。

VTuber斑鳩ミコさんの自動返信botを実装しました。

あたかもゼロから作ったみたいな書きっぷりですが、偉大なる先人様方のお知恵を盛大に拝借申し上げておりますのでこの場でご紹介させていただくとともに深く御礼申し上げます。

いうことで、このnoteでは自動返信bot実装にあたって参考にさせていただいたブログやつまずいた点を備忘もかねてまとめておきます。

最も参考にさせていただいた偉大なる先人

コードはほぼ丸パk大いに参考にさせていただきました。ただ実行環境がラズパイだったので、Windows PC上で動かすためにそこは他の記事も参考にしています。

自動返信botの概要

毎朝ツイートされる「おはミコミコ」ツイートに「おは」を含む返信をしてもらうと、ひとり1日1回まで自動返信botが画像付きの返信をします。botは、Windows PC上でPythonで動作してます。

自動返信bot実装までにしたこと

自動返信bot実装にあたっては以下のタスクがありました。

1.Twitter API 申請
2.Windows PCにPythonをインストール
3.botをPythonでコーディング
4.テスト実行
5.タスクスケジューラ登録【正式実装】

以下、順番に見て行きます。

Twitter API 申請

正直これが一番躓いたかもしれませんね。以下の記事を参考にさせていただきました。

ベースは上記記事でOKですが、API利用用途の部分は自分で考える必要があります。API利用用途を書くにあたっては「twitter api 申請」でググって出てきたサイト10サイト分くらいは参考にさせてもらいました。

Twitter API 申請をディベロッパーページから申請したのち、メールで3往復くらいやり取りして申請が通りました。

1.ディベロッパーページから申請。
2.翌日、メールが届く。詳細を教えてくれとのこと。
3.API利用用途の詳細を返信する。
4.2時間後(!?)、メールが届く。Twitterポリシー、自動化ポリシーに反している内容の可能性であるとのこと。
5.API利用用途の詳細を修正して返信する。
6.Twitter API 利用許可のメールが届く。

ここでは4.と5.のやり取りを紹介します。まず4.でTwitter社から頂いたメールは以下。

Thanks for applying for access!

It looks like your proposed use case may be in violation of one or more sections of the Developer Agreement and Policy, Automation Rules, and/or the Twitter Rules.

As a next step please review these policies as they relate to your use case. Then, respond to this email with an updated use case that is in full compliance with Twitter policy.

Thank you for your interest in building on Twitter.


アクセス申請ありがとうございます。

提案されたユースケースは、デベロッパー契約とポリシー、オートメーションルール、および/またはTwitterルールの1つ以上のセクションに違反している可能性があるように見えます。

次のステップとして、あなたのユースケースに関連するこれらのポリシーを確認してください。その後、Twitterのポリシーに完全に準拠した最新のユースケースをこのメールに返信してください。

Twitterでの構築に興味を持っていただきありがとうございます。

Twitter オートメーションルール
https://help.twitter.com/ja/rules-and-policies/twitter-automation

Twitterは自動化ポリシーが結構厳しくて、特に返信は「自分のツイートについた返信に対して、一人に1日1回まで」みたいなことが書かれています。なのでそこをきちんと明記したら無事通りました。

Thanks for replying.

> The core use case, intent, or business purpose for your use of the Twitter APIs.
The main purpose is to learn the Twitter API and Python, not for business purposes.
I use the Twitter APIs to interact more with my followers. I will only auto-reply once to replies to tweets on my account, based on the Developer Agreement and Policy, Automation Rules, and the Twitter Rules. I do not auto-reply to random users based on keyword searches.

> If you intend to analyze Tweets, Twitter users, or their content, please share details about the analyses you plan to conduct, and the methods or techniques.
I don't use Twitter data for analysis.

> If your use involves Tweeting, Retweeting, or liking content, share how you will interact with Twitter users or their content.
I use the Tweeting to interact more with my followers. I don't use Retweeting, or liking.

> If you’ll display Twitter content off of Twitter, please explain how, and where, Tweets and Twitter content will be displayed to users of your product or service, including whether Tweets and Twitter content will be displayed at row level, or aggregated.
I don't display Twitter content off of Twitter.

Best regards.


返信ありがとうございます。

> Twitter APIを利用する際のコアとなるユースケース、意図、またはビジネス目的についてです。
主な目的はTwitter APIとPythonを学ぶことであり、ビジネス目的ではありません。
私はフォロワーとの交流を増やすためにTwitter APIを利用しています。私は、開発者規約とポリシー、自動化ルール、Twitterルールに基づいて、自分のアカウントのツイートへのリプライに一度だけ自動返信をします。 私は、キーワード検索に基づいてランダムなユーザーに自動返信はしません。

> ツイート、Twitterユーザー、またはそのコンテンツを分析する予定がある場合は、実施する予定の分析の詳細と、その方法や手法を共有してください。
Twitterのデータを分析に利用していません。

> 利用目的がツイート、リツイート、いいね!をする場合は、Twitterユーザーやそのコンテンツとどのように交流するのかを教えてください。
私はフォロワーとの交流を深めるためにTweetを利用しています。リツイート、いいね!は使いません。

> TwitterからTwitterコンテンツを表示する場合は、ツイートやTwitterコンテンツを行単位で表示するのか、集約して表示するのかなど、自社の製品やサービスのユーザーに対して、ツイートやTwitterコンテンツをどのように、どこに表示するのかを説明してください。
私はTwitterのオフではTwitterコンテンツを表示しないようにしています。

よろしくお願いします。

Twitter API 申請はほぼ全編英語ですが、そこはWeb翻訳を使えばさほど難しくはないです。翻訳サイトはDeepLが精度高くていいかなと思います。

無事通ったらTwitter APIの利用に必要なアクセスキーを取得します。これも以下の記事の通りです。

Windows PCにPythonをインストール

これに関しては以下記事の「Pythonモジュールのインストール」の項とそこに書いてある参考記事を参考にさせていただきました。

基本的にはインストーラを公式ページからダウンロードしてきてインストールするだけでいいのですが、ここで1個落とし穴があります。

それが「環境変数」です。環境変数にパスが通ってないとPythonを使えないのですが、インストールダイアログで出てくる「Add Python 3.7 to PATH」(Pythonを環境変数に追加する)のチェックボックスがデフォルトOFFなのに小さい!笑

そこを忘れると使えないので、そこだけ注意すればいいかなと思います。因みに確認方法ですが、Windows 10の場合はPowershellで以下のように確認。(コマンドプロンプトでもいいです)

画像1

「Python -V」のVは大文字です。「Python 3.7.4」のようにバージョンが出れば成功、「Python」としか書いてないと環境変数が通ってない可能性が高いです。

その場合はもう1回インストーラーを実行してしまってください。特に問題ないので。その時に「Add Python 3.7 to PATH」のチェックボックスを入れるのをお忘れなく。

botをPythonでコーディング

以下記事を大いに参考にさせていただきました。

pipインストールを済ませたら、コーディングです。大まかなプログラムの内容は以下です。

auth.py
アクセスキーを格納するためのPYファイル。

aisatsu.py
定期挨拶ツイート。ツイートのIDを記録する。

autoreply.py
上記のツイートについたフォロワーのリプライを取得し、まだ画像で自動返信する(すでに自動返信済みのものは飛ばす)

これを以下の流れで実行します。

1.aisatsu.pyを実行(定期挨拶ツイートをする)
2.5分おきにautoreply.pyを実行する(自動返信する)

autoreply.pyは繰り返し実行する必要があります。

この記事のすごいところは、

・返信を画像にしている、かつ画像はpasteとdrawを駆使してリプライのたびに毎回作成している
・ハンドルネームの処理が秀逸(@や絵文字以降をカットする処理が入ってる、○○さん・○○たんなどで終わるハンドルネームの場合はさんを付けないなど)

と、かなりアイディア豊富なコードだと思います。

このコードをベースにして、以下部分は自分のやりやすいように改修してます。

・メンテしやすいように設定値部分はファイル分け
・定期挨拶の文言、自動返信の画像内の文言も自由に追加削除できるようにファイル分け+ランダムで選ぶ処理を追加
・ログの出し方は自分が見やすいように調整
・画像はミコ本人に作ってもらったのと、5%の確率でレア立ち絵に置き換える処理を追加

正直元のコードが優秀すぎて今のところあまりオリジナリティを出せていません・・・

ただ今後の展望として、記事末尾に書かれていた「名前が長くなってしまった時吹き出しからはみ出しちゃう問題」は、名前の文字数でカットして改行するとか、フォントサイズをいじるとかで吹き出しに収まるようにできるといいかなと思っています。

テスト実行

挨拶ツイートだけテストしましたね。

自動返信部分は画像を書き出す処理だけ調整したらぶっつけ本番です。

返信してみた。

うまいこといってくれました。(はみ出てるけど)

タスクスケジューラ登録【正式実装】

あとはタスクスケジューラに登録です。

タスクの登録をシンプルにするために、タスク登録用に軽くPowershellスクリプトを書いています。

autoreply.ps1
# 8:00~8:30に挨拶ツイートをする
$n = Get-Random 1800
Start-Sleep $n
python "D:\Work\Python\AutoReply\aisatsu.py"

# その後12:00まで5分おき(=12回/h)に自動リプライスクリプトを叩く
for($i=0; $i -le 48; $i++) {
Start-Sleep 300
python "D:\Work\Python\AutoReply\autoreply.py"
}

最初の処理は「8:00-8:30の間のどこかでツイートする」ための処理です。このps1を8:00にセットすると、最初にsleep時間が0-30分の乱数のsleep処理が入ります。その後、5分おきにautoreply.pyを叩いています。

※上のps1だと12:00以降にもautoreply.pyが実行されちゃいますが、それはautoreply.py内に「現在時刻が返信時間内か(8:00-12:00の間か)の確認」の処理が入ってるので、12:00以降にautoreply.pyが実行されちゃっても何もしないでスクリプトが終わるようになっています。

あとはWindows PCのタスクスケジューラで以下のタスクを仕込みます。

操作
プログラムの開始

プログラム/スクリプト
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の追加 (オプション)
-Command "D:\Work\Python\AutoReply\autoreply.ps1"

これを毎日8:00に実行するように仕掛ければ、晴れて正式リリースです。

さいごに

正直先人様のお知恵におんぶにだっこなので、ここからオリジナリティを加えていきたいところですね。あと当たり前ですがこれ実行してるWindows PCが停止できないので、実行環境もクラウドにしたいです。Herokuよさそう。またなんか思いついたらnote書きます。

どこかの誰かの参考になれば幸いです。それでは。

この記事が気に入ったらサポートをしてみませんか?