Webページ更新を自動チェックして通知させよう
以前、フィロソフィーのダンスというアイドルグループのクラウドファンディングに応募する際にモタモタ迷っていたら希望のリターンが枯れたという悲劇がありました。
しかし、コンビニ支払いを指定した人が支払いをしないことでキャンセル分が出現すると予測し、自動チェックプログラムを書くことにしました。
おそらく、この手のサービスやアプリは山ほどありそうだけど、なんとなく自分で作ってみたかったのでそのメモ。
自分が狙っていたリターンは40人限定で数分で完売したものでした。そこから、キャンセルするのは多くて2,3人…と踏んだため、誰よりも早くキャンセル出現に気づく必要があります。
この「キャンセル分早い者勝ち王決定戦」は絶対に負けられない戦いです。名前がダサい。
簡単な流れ
1.ページのtextデータを保存
2.毎分更新して比較
3.内容に変更があったら通知
URLのtextデータを保存
まず、クラウドファンディングのページに行ってhtmlタグを確認します。
(なんとなくリターンの内容は隠した)
これを観てみるとわかる通り、「OUT OF STOCK」の赤文字の部分が売り切れを示しています。
ちなみに、在庫があるリターンの表示はこちらで、選択ボタンが追加されます。
つまり、「OUT OF STOCK」という文字列が「残りn人まで」に変更したら通知を促せばよいのです。
そのため、この文字列が該当する部分のclass属性を抽出して、txtファイルに保存しました。
プログラムはPythonにて実装し、使用モジュールは以下の通りです。
・ requests
・ BeautifulSoup
パースの部分はこちらを参考にしました。
https://qiita.com/itkr/items/513318a9b5b92bd56185
import requests import bs4 def get_website(): url = 'hoge' file = 'hoge.txt' res = requests.get(url) res.raise_for_status() soup = bs4.BeautifulSoup(res.text,'html.parser')# Parser elems = soup.select('.limited.rfloat') # class要素の取得 str_elems = str(elems) # stringに変換 try: f = open(file) old_elems = f.read() except: old_elems = ' ' if(str_elems == old_elems): return False else: f = open(file, 'w') # 上書きする f.writelines(str_elems) f.close() return True if __name__ == "__main__": if(get_website()): #slackに通知する
思ったよりめちゃくちゃ簡単に書けました。
txtファイルにいちいち書き出さないようにするとか、改善点はありますがとりあえず要件を満たしたものができたので満足。
2.毎分更新して比較
スクリプトを自前サーバに置いて、crontabにて毎分実行させました。
* * * * * python3 check.py
3.内容に変更があったら通知
保存したtxtファイルと、新しく取得したtxtファイルの内容が異なっていたらslack botにて通知を促すことにしました。
Slack通知は以下参考。
PythonでSlackに投稿する
使用感
わりと幅広くclassを指定してしまったせいか、頻繁に通知が来ました。結構うるさい。
と最初は思っていましたが、それも2、3日で慣れてそれよりかちゃんとシステムが動いていてwebページを監視しているのがなんか楽しかった。
結果
コンビニ支払い選択者の支払い期限が3/10 23:59:59だったので次の日あたりに通知が来るかな、と考えていたのですが見事3/11の13:50あたりに通知が来て2枠キャンセル分の余りが出ました。無事買えて、胸をなでおろす。