ワクチン予約のキャンセル通知システム作ってみた
目的!
- コロナワクチン予約をキャンセル待ちしたい!
使ったもの
やったこと
予約はいっぱいだったので、たまにキャンセルが出て一瞬予約できるっぽい > それを検知してみる! ワクチン予約サイトを定期的にチェックして、空きが出たらslackに通知する仕組みを作る!
準備
使った環境などを雑に並べる
ざっくり処理の抜粋&説明
※とりあえず通知まで行くために、エラー処理やsleep処理はだいぶ適当
headlessブラウザで実行
option = Options() option.add_argument('--headless') driver = webdriver.Chrome(chrome_driver_path, options=option) driver.get(target_url)
自分のワクチン番号&パスワードを使ってログイン(selenium)
number = driver.find_element_by_css_selector("input[type=\"tel\"]") number.send_keys(coupon_number) sleep(1) password = driver.find_element_by_css_selector("input[type=\"password\"]") password.send_keys(passwd) sleep(1) driver.find_element_by_css_selector("input[type=\"checkbox\"]").click() sleep(1) driver.find_element_by_css_selector("button[type=\"submit\"]").click() sleep(3)
予約サイトで予約可能な会場の件数を取得(速度はいらないので、そのままselenium)
driver.find_element_by_xpath("//*[text()=\" 新規予約\"]").click() sleep(1) driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div/div/button[1]").click() sleep(2) driver.find_element_by_css_selector("input[type=\"checkbox\"]").click(); sleep(3) element = driver.find_element_by_class_name("page-department-search_nav-header__count") result = re.sub(r"\D", "", element.text)
slack通知
- slackワークスペース設定で「Incoming Webhook」を追加してWebhookURLをコピー
- slackwebを使って通知(めっちゃ簡単に通知できた!)
import slackweb … slack = slackweb.Slack(url=slack_webhook_URL) if result != "0": print(result); slack.notify(text="<!channel> 空いてるよ!!!") else: print("空いてなかったよ")
定期実行
プログラムの定期実行はなんとなくmacのcrontabを利用!(1分ごとに実行) 通知が来たら素早く予約サイトにアクセスして予約完了!
詳細コードは↓ GitHub - kyamada23/covid19itami-vaccine-check
詰まったところなど
crontabの環境変数問題
crontabで定期実行するも全然動いてくれない。 crontabではPATHが全然通ってなくてpythonが動いていないっぽい ↓を参考に解決!
【保存版】cronでPython3を定時実行する方法&注意すべき4つのポイント | たぬハック
定期実行が途中で止まる問題
1回1回seleniumでブラウザを起動しっぱなしで、ブラウザが溜まり続けてたのが問題だった
ちゃんと終わりましょう
driver.quit()
↓参照
Selenium - かならずwebdriverを閉じる - Kobe's Public Scrapbox
感想
2,3時間で10件以上キャンセルは出てたっぽいので、F5アタックでも普通に予約できたかも。 でも作った通知システムで予約できたことですごい満足
ちなみに今回は伊丹市のワクチン予約サイトでしてみました。 ワクチン打つと伊丹消滅するらしい コロナワクチン予約システム