完成品
本投稿をするに至った経緯
先月からGAE(python)を仕事で使う機会が増えてきたけど、一からGAE(python)を使ってちゃんとしたアプリを作った試しがありませんでした(helloworldや公式チュートリアルに載ってるguestbookくらいしかなかった)。そこで、せっかくだしTwitter BOTを作ってみようと思いました(バッチ機能とか理解が薄かったため)。
内容は、League of Legendsと呼ばれる海外の有名なゲームにおいて、登録されたユーザーが最近対戦した試合に参加していた他のサモナーネームを自動でTwitterに投稿するBOTです。TwitterのOAuth認証はtweepyを使い、League of Legendsの試合結果やサモナー名は、RIOT APIで取得して結果をndbに格納しています。
実装にあたっての手順
- Tweepyを使ってTwitterのOAuth認証を行なって、そのあとにmodelUserにTwitterのアクセストークンなどの情報を格納する
- /registrationのフォーム画面にて自分のサモナーネームを登録し、RIOT APIを経由して取得したサモナーネームやアカウントIdなどをmodelTaskに格納する
- taskqueue(push)を使って、modelTaskに含まれるaccountIdを使って直近の試合において参加したサモナーの名前をAPIから引っ張ってきて、その参加者を4名だけTwitterで自動投稿させる
しかし、上記の項目を実装するにあたって参考になるGAE(python)の実装例がほとんどないorあってもバージョンなどが古すぎて動作しない場合が多く、非常に苦労しました汗
そこで、今回は参考文献に余りあるほどの参考URLを載せました...!取り敢えず、自分がつまづいたところは全て網羅しているつもりなので、ぜひ参考にしていただければと思います。
また、Githubに実際の完成品のソースコードと使い方を載せてあるので、取り敢えず挙動確認がしたい方はGithubのREADMEを参考にして勉強などに役立てて頂けたらと思います。
参考文献
「今回のBOTを作成する上で参考にした主なサイト」
GAE/P+Tweepy+RIOT APIでTwitter BOTサービスを作る!(前編)
GAE/P+Tweepy+RIOT APIでTwitter BOTサービスを作る!(後編)
「TwitterやRIOT APIのアクセスキーなどの取得方法」
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報
「Tweepyのインストール方法に苦戦した時に見たサイト」
Google App EngineのTwitter BotをFlaskとTweepyで作る
「GAE上でサードパーティのpythonライブラリを導入するための方法Tips」
Google App Engine (Python) においてサードパーティ・ライブラリを利用する方法
GAE/Py で "ImportError: No module named _winreg"が発生する 原因と解決策
setup.cfgを入れないと、libフォルダにpip installしてもエラーが吐くことが示されているスタックオーバーフロー
GAEに組み込みで入っているサードパーティライブラリ一覧表(app.yamlで入れられるライブラリ)
requirement.txtにまとめて記述してpip installしたい人はこちらを参考にしてください
「実装する上で苦戦した時に助けになったサイト」
requests関連の挙動エラーは、requests_toolbelt.adapters.appengine入れれば解決する
TweepyのOAuth1a認証を実践するときに参考にしたURL
バッチ処理のときに同じツイートは連続で自動ツイートできなくてエラーを吐くので、検証のときに注意
「TwitterのOAuth認証について知りたい方」
一番分かりやすい OAuth の説明
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
まとめ
今回は、GAE(python)を使ってTwitter BOTを作成してみました。実装例が余りなかったこともあり、taskqueueやndb周りの細かい仕様などは公式のリファレンスと格闘しながらでしたが、なんとか実装までできました。
もしも仕事や趣味でGAE(python)を使う機会がある方は、ぜひこちらを参考にして実装を進めて理解を深めていただけたらと思います。研修用にもぜひ活用してください(Githubからクローンするときはぜひstarをつけて下さい!)
初期実装が終わった際に思った感想
- ルーティングはroutes.pyで一つのファイルにまとめるべきだった
- memcacheを使ってもよかったかもしれない
- フロント画面を綺麗にしたかった
- ndb周りの理解が思った以上に不十分だった