要点 


AWSJPが定期的に新規登録キャンペーンをツイッター上で告知しているため、キャンペーンのビックウェーブの乗り遅れることがないよう、キャンペーンの告知を検知して通知する簡単なコードを書きました。

はじめに 


HerokuやGCPの個人アカウントは元々持っているのですが、仕事で利用していたAWSの個人アカウントは持っていませんでした。AWSは使用無料枠が豊富ですし、AWSの普及度合いは高くて再び仕事で触る可能性がとても高いです。そこで個人利用するためのアカウントを作成することにしました。

TwitterのAWSJPのアカウントは定期的に新規登録キャンペーンをしており、25ドルなどクーポンを発行しています。せっかくならその機会に登録した方が得なのですが、キャンペーン期間は2日と短く、アカウントをあまりウォッチしていないので割と見逃しやすいです。

そこで定期的にAWSJPの発言を確認して、キャンペーン開始ツイートらしさが一定の閾値を超えたら通知するようなコードを用意しました。

通知は自分の中で一番気が付きやすいTwitterアカウントでセルフメンションを行う形にしました。

やり方 

スケジューリング 


cronで行いました。リポジトリを公開する予定だったので、cronを使わなくてもPythonだけで完結できるscriptも一応用意しました。そのscriptではscheduleを利用しました。

重複通知の制御 


定期的にポーリングを行い確認をするため、既に自身に対して通知したかを知る術がなければ、何度も通知してしまうことになります。通知をしたかを判断する方法としてデータストアに通知情報を保存するという方法が考えられますが、わざわざこのために自身でデータストア(状態)は持ちたくありませんでした。そのため、通知先のログで既報か確認して重複通知をしないようにしました。

閾値の設定 


キャンペンアカウントが投稿するツイートの表記揺れや誤検知が怖かったため、閾値を設けてその値を超えているか確認しました。閾値はシンプルで、W_c = { w | 以前のキャンペーンツイートに含まれていた目ぼしい単語} を用意しておき、新しく投稿されたツイートにW_cの単語がn個 (n < |W_c|)以上含まれているか、直感的にnを決めて確認しました。

主要外部ライブラリ 


fullname star star/day created_at updated_at license language description url
psf/requests 40,029 12.81 2011-02-13 2019-09-04 Other Python Python HTTP Requests for Humans™ ✨🍰✨ link
tweepy/tweepy 6,213 1.67 2009-07-06 2019-09-04 MIT License Python Twitter for Python! link
dbader/schedule 6,530 2.84 2013-05-19 2019-09-04 MIT License Python Python job scheduling for humans. link

おわりに 


TwitterのAWSが告知するキャンペーンに乗り遅れる事が無いよう、コードを書いて対応しました。

感想ですが、Pythonに付属されているConfigParserが意外と不便でした。Argparseがかなり便利だったため同様の使い勝手を期待していたのですが、機能性が設定ファイルからデータを取得する部分にしか強みがありませんでした。

バリデーションなどが行えず、リスト形式のデータを取得する際にはソースコード側で文字列のsplitメソッドを呼ぶ必要があります。特にiniフォーマットに拘りがなければ、tomlやyamlといったフォーマットで別ライブラリを利用したほうが良かったなと感じます。