PythonとHerokuを使ってTwitterBotを作りました(ソースコード以外編)
突然ですが先日、以下のようなBotを作成しました。
Beat Saberという音ゲーについての情報提供を目的にしたもので、タイムラインの情報から以下の内容を自動的につぶやきます。
Botを作るにあたって手順や参考にしたページ、躓いた点などをまとめておきたいと思います。同じ内容を扱った記事は複数ありますが、(作成中の私と同じように)初めて作業する人だと既存の記事で想定していないようなポイントに躓いたりするものなので、何らかの形でそういった方々の助けになればと思います。
一応備忘録がわりに説明文を加えていますが、もしプログラムを触ったことがない*1人が何もインストールされていない状態から始めるとしたら最低限の手順書になるように書きました。OSはWindows 10 64bitを前提としていますが、もし手順を参考にされる方がいればOS等は適宜読み替えてください。
目次
- 目次
- Botアカウントの作成
- APIキーの取得(Twitter開発者登録)
- Pythonのインストール
- Pythonモジュールのインストール
- Pythonプログラムの作成
- ローカル環境での自動化
- Herokuのアカウント作成
- Gitのインストール
- Herokuへのデプロイ
- Herokuスケジューラの設定
Botアカウントの作成
何はともあれアカウント登録。
APIキーの取得(Twitter開発者登録)
やること:ここで登録&作文
ここから開発者っぽい領域に入っていきます。Twitterのアカウントとは別に、Twitterのdeveloper(開発者)としての登録をします。開発者になるとAPIキーというものをもらえます。
APIキーについての詳しい説明は省きますが(というか私も詳細をわかっていない)、普段はTwitterのアプリやWebブラウザを通してしか見られないツイート内容やフォロワー数といったデータを、直接もらったり操作したりするためのパスワードのようなものです。これによってBotに色々させることができます。もちろん、誰にでもそんなパスワードを渡したら悪用されて危険なので、信頼できる作文を書ける開発者にのみ渡されます。
そう、APIキーをもらうためには
参考記事
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita
なお注意点として、APIキーで操作できるアカウントはログインしているアカウントのみです。つまりBotを操作するためには、Botのアカウントを作成して、そのアカウントでDevelopersサイトにログインしてDeveloperの申請を行わなければなりません。
私は最初これに気づかず(気づけよ)作文を2回やるハメになりました。なお、2回とも認証は一瞬(本当に数秒レベル)で降りました。審査に一週間かかるという噂はなんだったのか。
Pythonのインストール
やること:ここでインストール
無事にAPIキーが取得できたら、いよいよそれを用いて実際にTwitterを内部的にアレコレするプログラムを作っていきます。その気になればどの言語でもできるんでしょうけど、Pythonが色々ライブラリも揃っていて情報も豊富なのでそれを使っていきます。上のURLには最新のPythonが公開されているはずなので、クリックした先にある「Windows x86-64 web-based installer」でインストーラがダウンロードできます。
なお注意事項として、Pythonをインストールする時の注意点として、環境変数にチェックボックスを入れましょう。これがないとコマンドプロンプトでpython
やpip
といったコマンドが使えません。特にpip
が使えないのは致命的です。
参考記事
Pythonモジュールのインストール
やること:コマンドプロンプトで以下のコマンド
pip install requests_oauthlib
Pythonは色々なことができるプログラム言語ですが(わかったようなことを言う)、Python自体にそのすべての機能が備わっている訳ではありません。色々な機能を持ったモジュール(部品)として公開されており、プログラムごとに必要な機能を応じてインポートする必要があります。また、標準ライブラリに含まれていない機能は必要に応じてダウンロードしインストールする必要があります。
例えば今回のBotでは、APIをTwitterに投げてデータを受け取る……という操作を行いますが、このような機能はPythonに備え付けられていませんし、まさかフルスクラッチでかける訳がありません。なので、外部プログラム(モジュール)を利用してそれを簡単にできるようにします。
で、このモジュール、結構いっぱいあります。今回のBotだけでも以下のモジュールが必要になりました。
json
--- JSON エンコーダおよびデコーダ。APIを通したやりとりは基本的にjsonというフォーマットのデータになるため、これが必要です。sys
--- システムパラメータと関数。絵文字のエンコードに使います。codecs
--- codec レジストリと基底クラス。絵文字のエンコードに使います。datetime
--- 基本的な日付型および時間型。完成したプログラムには使いませんが、デバッグの時に使いました。requests_oauthlib
--- OAuth認証のためのライブラリ。これがないとTwitterとのデータのやりとりができません。これだけは別途インストールが必要。
Pythonプログラムの作成
やること:ソースコードをかく
ソースコードについては近日中にQiitaに公開し解説も加えるつもりです。目下、機能改良&コード整理中なので……。
いよいよプログラムを書いていきます。プログラムを書くことはそれこそメモ帳でもできますが、エディタを使った方がインデント(プログラムの入れ子関係を示すための文頭開始位置)を自動で揃えてくれたり、シンタックスハイライト(要素ごとに色を変えてプログラムを読みやすくする)をしてくれたりするので、その方が書きやすいでしょう。私はPythonとセットになっている純正のエディタで特に不満がなかったのでそれで書いていました。
ローカル環境での自動化
やること:Windowsタスクスケジューラーでタスクの設定
無事に、BotにツイートをさせるPythonプログラムがかけました。原理上は人間がこれを注意深く時計を見ながら10分に1回ダブルクリックをすれば定期ツイートをしてくれるBot(Botじゃねえ)が実現しますが、とてもそんなことはやっていられないのでプログラムにやらせましょう。
幸い、Windowsにはタスクスケジューラーという備え付けのプログラムがあり、これは定期的に指定したプログラムを実行してくれるというまさにうってつけのものです。
参考記事
これで自動化完了! 10分に1回、PC上でPythonファイルが走るようになります……が、毎回Pythonが立ち上がるのは正直目障りです。そして何よりPCを起動し続けていなければなりません。真の自動化のためには、自分のPCとは無縁なところでTwitterにAPIを送り続けるような仕組みが必要になりそうです。
そのための仮想環境を提供するサービスが、次に説明するHerokuになります。
Herokuのアカウント作成
やること:ここでアカウント登録した後、ここでCLIをインストール
Twitterとかと違ってややとっつきづらいサイトですが、まあ登録していきましょう。このサービスの中にさっきのパイソンファイルを置いて実行してもらう、ということになるのですが、ドラッグ&ドロップとかをするわけではなく操作は基本的にコマンドで行います。開発者はコマンドを使うものなのです。慣れない人は頑張りましょう。
また、先程のpipと同じく、Windowsのコマンドプロンプトにherokuを扱うための命令一式をインストールする必要があります。それがCLIです。インストールしていきます。
Gitのインストール
やること:ここでインストール
更にややこしいのですが、Herokuのファイルを管理するためにはGitというシステムを使う必要があるので、それも別途コマンドラインにインストールする必要があります。さっきからインストールするものばかりですね。
参考記事:
Herokuへのデプロイ
やること:専用のフォルダを作成し、コマンドプロンプトで以下のコマンド
mkdir application_folder
でフォルダを作成し、Pythonファイルやその他設定ファイルを格納
cd application_folder git init git add. git commit -m "commit" heroku login heroku create application_name heroku buildpacks:set heroku/python git push heroku master
※もし実際に上の手順をされる方がいたら、application_folder
、application_name
は自分のアプリの名前に変えてください。
これでようやくHeroku上にPythonファイル(やその他設定ファイル)を送るための準備が整いました。ローカルで作業用のフォルダを用意して、いろいろファイルを用意して(このあたりの詳細は参考記事を見てください)Herokuにpush(ローカルの作業内容をインターネット上の大本に反映させること)します。Heroku上でプログラムが動く状態にすることをデプロイと言いますが、これでデプロイ完了です。
なお注意点として、Pythonをデプロイする際には、Python用のビルドパックというものを設定する必要があります。ブラウザから設定することもできますが、コマンドでも設定できるので、上のコマンドではそれも一括してやっています。
私はこのデプロイを通すときに何回やってもエラーが出てデプロイできなかったので困り果てていましたが、知人に相談したところ 「requirements.txt」の名前を「requirement.txt」にしていたということが発覚しました。お恥ずかしい……。これも誰かの参考になるかもしれないので言いますが。
参考記事
Herokuスケジューラの設定
やること:HerokuスケジューラでPythonファイルを定期的に実行するようにする
長かった戦いにも終わりが訪れようとしています。後はHeroku上のスケジューラで、デプロイしたプログラムを定期的に走らせるようにすれば自動Botの完成です。Herokuにはスケジューラというアドオンがあるので、それを設定します。Herokuのブラウザでも設定できますが、以下のコマンドでも開くことができます。
なお、Herokuスケジューラは無料のアドオンですが一応クレジットカードを登録する必要があります。
これで定期的に自動ツイートするBotが完成しました!