hibitの技術系メモ

数学とか3Dとか翻訳とか

PythonとHerokuを使ってTwitterBotを作りました(ソースコード以外編)

 突然ですが先日、以下のようなBotを作成しました。

twitter.com

 Beat Saberという音ゲーについての情報提供を目的にしたもので、タイムラインの情報から以下の内容を自動的につぶやきます。

  • 現在配信中と思われるtwitchチャンネルを複窓で表示するためのURL
  • 一定時間ごとに投稿されたビーセイのハッシュタグがついたツイート(だいたい動画)をまとめてリツイート

 Botを作るにあたって手順や参考にしたページ、躓いた点などをまとめておきたいと思います。同じ内容を扱った記事は複数ありますが、(作成中の私と同じように)初めて作業する人だと既存の記事で想定していないようなポイントに躓いたりするものなので、何らかの形でそういった方々の助けになればと思います。

 一応備忘録がわりに説明文を加えていますが、もしプログラムを触ったことがない*1人が何もインストールされていない状態から始めるとしたら最低限の手順書になるように書きました。OSはWindows 10 64bitを前提としていますが、もし手順を参考にされる方がいればOS等は適宜読み替えてください。

目次

Botアカウントの作成

f:id:hibit_at:20190728214538p:plain

やること:TwitterBot用の新アカウント作成

 何はともあれアカウント登録。

APIキーの取得(Twitter開発者登録)

f:id:hibit_at:20190728214616p:plain

やること:ここで登録&作文

 ここから開発者っぽい領域に入っていきます。Twitterのアカウントとは別に、Twitterのdeveloper(開発者)としての登録をします。開発者になるとAPIキーというものをもらえます。

 APIキーについての詳しい説明は省きますが(というか私も詳細をわかっていない)、普段はTwitterのアプリやWebブラウザを通してしか見られないツイート内容やフォロワー数といったデータを、直接もらったり操作したりするためのパスワードのようなものです。これによってBotに色々させることができます。もちろん、誰にでもそんなパスワードを渡したら悪用されて危険なので、信頼できる作文を書ける開発者にのみ渡されます。

 そう、APIキーをもらうためには作文poemが必要なのです。それも英語の!(一応日本語でもできるらしいです)

参考記事

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita

 なお注意点として、APIキーで操作できるアカウントはログインしているアカウントのみです。つまりBotを操作するためには、Botのアカウントを作成して、そのアカウントでDevelopersサイトにログインしてDeveloperの申請を行わなければなりません。

 私は最初これに気づかず(気づけよ)作文を2回やるハメになりました。なお、2回とも認証は一瞬(本当に数秒レベル)で降りました。審査に一週間かかるという噂はなんだったのか。

Pythonのインストール

f:id:hibit_at:20190728214820p:plain

やること:ここでインストール

 無事にAPIキーが取得できたら、いよいよそれを用いて実際にTwitterを内部的にアレコレするプログラムを作っていきます。その気になればどの言語でもできるんでしょうけど、Pythonが色々ライブラリも揃っていて情報も豊富なのでそれを使っていきます。上のURLには最新のPythonが公開されているはずなので、クリックした先にある「Windows x86-64 web-based installer」でインストーラがダウンロードできます。

f:id:hibit_at:20190728215011p:plain

 なお注意事項として、Pythonをインストールする時の注意点として、環境変数チェックボックスを入れましょう。これがないとコマンドプロンプトpythonpipといったコマンドが使えません。特にpipが使えないのは致命的です。

参考記事

Pythonインストール(Win10)編 - Qiita

Pathを通すとは、環境変数とは - Qiita

Pythonモジュールのインストール

やること:コマンドプロンプトで以下のコマンド

pip install requests_oauthlib

 Pythonは色々なことができるプログラム言語ですが(わかったようなことを言う)、Python自体にそのすべての機能が備わっている訳ではありません。色々な機能を持ったモジュール(部品)として公開されており、プログラムごとに必要な機能を応じてインポートする必要があります。また、標準ライブラリに含まれていない機能は必要に応じてダウンロードしインストールする必要があります。

 例えば今回のBotでは、APITwitterに投げてデータを受け取る……という操作を行いますが、このような機能はPythonに備え付けられていませんし、まさかフルスクラッチでかける訳がありません。なので、外部プログラム(モジュール)を利用してそれを簡単にできるようにします。

 で、このモジュール、結構いっぱいあります。今回のBotだけでも以下のモジュールが必要になりました。

  • json --- JSON エンコーダおよびデコーダAPIを通したやりとりは基本的にjsonというフォーマットのデータになるため、これが必要です。
  • sys --- システムパラメータと関数。絵文字のエンコードに使います。
  • codecs --- codec レジストリと基底クラス。絵文字のエンコードに使います。
  • datetime --- 基本的な日付型および時間型。完成したプログラムには使いませんが、デバッグの時に使いました。
  • requests_oauthlib --- OAuth認証のためのライブラリ。これがないとTwitterとのデータのやりとりができません。これだけは別途インストールが必要。

Pythonプログラムの作成

やること:ソースコードをかく

ソースコードについては近日中にQiitaに公開し解説も加えるつもりです。目下、機能改良&コード整理中なので……。

 いよいよプログラムを書いていきます。プログラムを書くことはそれこそメモ帳でもできますが、エディタを使った方がインデント(プログラムの入れ子関係を示すための文頭開始位置)を自動で揃えてくれたり、シンタックスハイライト(要素ごとに色を変えてプログラムを読みやすくする)をしてくれたりするので、その方が書きやすいでしょう。私はPythonとセットになっている純正のエディタで特に不満がなかったのでそれで書いていました。

ローカル環境での自動化

f:id:hibit_at:20190728221341p:plain

やること:Windowsタスクスケジューラーでタスクの設定

 無事に、BotにツイートをさせるPythonプログラムがかけました。原理上は人間がこれを注意深く時計を見ながら10分に1回ダブルクリックをすれば定期ツイートをしてくれるBotBotじゃねえ)が実現しますが、とてもそんなことはやっていられないのでプログラムにやらせましょう。

 幸い、Windowsにはタスクスケジューラーという備え付けのプログラムがあり、これは定期的に指定したプログラムを実行してくれるというまさにうってつけのものです。

参考記事

タスクスケジューラにpythonを登録する方法(引数付実行) - Qiita

 これで自動化完了! 10分に1回、PC上でPythonファイルが走るようになります……が、毎回Pythonが立ち上がるのは正直目障りです。そして何よりPCを起動し続けていなければなりません。真の自動化のためには、自分のPCとは無縁なところでTwitterAPIを送り続けるような仕組みが必要になりそうです。

 そのための仮想環境を提供するサービスが、次に説明するHerokuになります。

Herokuのアカウント作成

f:id:hibit_at:20190728221506p:plain

やること:ここでアカウント登録した後、ここCLIをインストール

 Twitterとかと違ってややとっつきづらいサイトですが、まあ登録していきましょう。このサービスの中にさっきのパイソンファイルを置いて実行してもらう、ということになるのですが、ドラッグ&ドロップとかをするわけではなく操作は基本的にコマンドで行います。開発者はコマンドを使うものなのです。慣れない人は頑張りましょう。

f:id:hibit_at:20190728222156p:plain

 また、先程のpipと同じく、Windowsコマンドプロンプトにherokuを扱うための命令一式をインストールする必要があります。それがCLIです。インストールしていきます。

Gitのインストール

f:id:hibit_at:20190728222034p:plain

やること:ここでインストール

 更にややこしいのですが、Herokuのファイルを管理するためにはGitというシステムを使う必要があるので、それも別途コマンドラインにインストールする必要があります。さっきからインストールするものばかりですね。

参考記事:

自分用 Git For Windowsのインストール手順 - Qiita

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_folderapplication_nameは自分のアプリの名前に変えてください。

 これでようやくHeroku上にPythonファイル(やその他設定ファイル)を送るための準備が整いました。ローカルで作業用のフォルダを用意して、いろいろファイルを用意して(このあたりの詳細は参考記事を見てください)Herokuにpush(ローカルの作業内容をインターネット上の大本に反映させること)します。Heroku上でプログラムが動く状態にすることをデプロイと言いますが、これでデプロイ完了です。

 なお注意点として、Pythonをデプロイする際には、Python用のビルドパックというものを設定する必要があります。ブラウザから設定することもできますが、コマンドでも設定できるので、上のコマンドではそれも一括してやっています。

 私はこのデプロイを通すときに何回やってもエラーが出てデプロイできなかったので困り果てていましたが、知人に相談したところ 「requirements.txt」の名前を「requirement.txt」にしていたということが発覚しました。お恥ずかしい……。これも誰かの参考になるかもしれないので言いますが。

参考記事

簡単!Herokuで動くTwitter botをPythonで実装する - Qiita

Herokuスケジューラの設定

f:id:hibit_at:20190728222521p:plain

やること:HerokuスケジューラでPythonファイルを定期的に実行するようにする

 長かった戦いにも終わりが訪れようとしています。後はHeroku上のスケジューラで、デプロイしたプログラムを定期的に走らせるようにすれば自動Botの完成です。Herokuにはスケジューラというアドオンがあるので、それを設定します。Herokuのブラウザでも設定できますが、以下のコマンドでも開くことができます。

 なお、Herokuスケジューラは無料のアドオンですが一応クレジットカードを登録する必要があります。

f:id:hibit_at:20190728222625p:plain

 これで定期的に自動ツイートするBotが完成しました!

*1:コマンドプロンプトの説明はないですが、もし知らなければググってください