hiyamgyyy

学生がやったことのメモとかいろいろ

Webページ更新を自動チェックして通知させよう

以前、フィロソフィーのダンスというアイドルグループのクラウドファンディングに応募する際にモタモタ迷っていたら希望のリターンが枯れたという悲劇がありました。
しかし、コンビニ支払いを指定した人が支払いをしないことでキャンセル分が出現すると予測し、自動チェックプログラムを書くことにしました。

おそらく、この手のサービスやアプリは山ほどありそうだけど、なんとなく自分で作ってみたかったのでそのメモ。

自分が狙っていたリターンは40人限定で数分で完売したものでした。そこから、キャンセルするのは多くて2,3人…と踏んだため、誰よりも早くキャンセル出現に気づく必要があります。
この「キャンセル分早い者勝ち王決定戦」は絶対に負けられない戦いです。名前がダサい。

簡単な流れ

1.ページのtextデータを保存
2.毎分更新して比較
3.内容に変更があったら通知

URLのtextデータを保存

まず、クラウドファンディングのページに行ってhtmlタグを確認します。

f:id:shin_nandesu:20180526185245p:plain

(なんとなくリターンの内容は隠した)

これを観てみるとわかる通り、「OUT OF STOCK」の赤文字の部分が売り切れを示しています。

ちなみに、在庫があるリターンの表示はこちらで、選択ボタンが追加されます。

f:id:shin_nandesu:20180526185527j:plain

つまり、「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に投稿する

完成

以上をもって、webページの指定部分が更新されたらSlackに通知されるプログラムができました。

f:id:shin_nandesu:20180526173808p:plain

こんな感じで通知が来るし、スマホにもプッシュ通知がきます。嬉しい。

使用感

わりと幅広くclassを指定してしまったせいか、頻繁に通知が来ました。結構うるさい。
と最初は思っていましたが、それも2、3日で慣れてそれよりかちゃんとシステムが動いていてwebページを監視しているのがなんか楽しかった。

結果

コンビニ支払い選択者の支払い期限が3/10 23:59:59だったので次の日あたりに通知が来るかな、と考えていたのですが見事3/11の13:50あたりに通知が来て2枠キャンセル分の余りが出ました。無事買えて、胸をなでおろす。

f:id:shin_nandesu:20180526221237j:plain

なんだろう、パトロンになりましたのパワーワード感。

終わりに

とりあえず要件を満たすものをエイヤと作ってみた結果、キャンセル分のリターンを獲得してパトロンになることができました。
今はこのプログラムを拡張してロシアW杯の準決勝のチケットをキャンセル待ちしています。同じことを考えている人が世界には山ほどいそうなので、毎秒スクリプト回すとかしてなんとかチケットを勝ち取りたいです。