小児科予約を自動化しました(python + selenium + GoogleCloudPlatform + LINEmessagingAPI)
前回のブログ更新から、1か月以上たってしまいました。
別にブログに飽きたわけでも、家事育児を何もしていなかったわけでもありません。
小児科予約を自動すべく夜な夜な頑張っていて、ブログを書く余裕がなかったからです。
私はプログラマーではないので、詳細はよくわからないし、いちいち調べながらなのでとても時間がかかりました。
背景
うちのかかりつけの小児科は、予約をWebからすることができます。ブラウザでぽちぽちと、診察券番号とかを入力したり、ボタンをクリックしたりして予約できます。
予約可能な時間帯は決まっているので、予約開始時間ピッタリに高速入力、高速クリックすることが早い順番を予約するには重要です。
目標
LINEで作成したグループに予約したいよ~と投稿すると、なんかいい感じに予約開始時間になったらプログラムが起動して、予約してくれて、予約結果も教えてくれる。
LINEグループに投稿するだけなので、私でも妻でも簡単に予約できる。
そんなシステムになったらいいな。
概要
今回、GoogleCloudPlatform上で使用したAPIは以下の3つです。
- Cloud Functions
- Cloud Pub/Sub
- Cloud Run
LINEで作成したグループに、予約したいよ~と投稿すると、LINEmessagingAPIでCloud Functionsをwebhookで立ち上がります。外部との認証はここぐらい。
Cloud FunctionsはCloud Pub/Subにメッセージを投稿します。
Cloud Pub/Subはメッセージが投稿されると、Cloud Runを起動します。
Cloud Runは予約時間になると、小児科予約のサイトに行って、自動で予約します。
自動予約自体は、seleniumとhead-less chromeで行っています。
そのあとは、予約結果をLINEグループに投稿していく感じです。
流れは以下の図参照。全部、pythonで書いてます。
詳細
私はプログラマーじゃないので、詳細は勘弁してください。
ソースコードなんかも公開しません。git(?)のアカウントとか持ってないし。
Cloud FunctionsやCloud Pub/Subがなくても、Cloud Runだけで実現できそうですが
なんとなく組み合わせてみました。将来、二人目の予約や、ほかの病院の予約なんかをさせるときのVerUpが何となくやりやすそうかな、と思って。(疎結合ってやつ?)
参考にしたページ(の一部)
Cloud Functions (Python3)入門用に LINE BOTを作ってみる - Qiita
GitHub - line/line-bot-sdk-python: LINE Messaging API SDK for Python
メッセージのパブリッシュ | Cloud Pub/Sub | Google Cloud
ABEJA Platform + Cloud Functions + LINE Botで機械学習アプリをつくる - Qiita
botを作りたいけどサーバ管理したくない...そうだ!Cloud Runでサーバレスにしようぜ! - Qiita
Cloud Pub/Subのpushリクエストを認証したい - Qiita
【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ | たぬハック
Using Headless Chrome with Cloud Run - DEV Community 👩💻👨💻
実際
予約はできているんですが、予約結果を返すところがうまくいっていません。
seleniumの待機処理あたりがうまくいってないのかな?
よくわかりませんが、引き続き修正していきたいです。
※追記 予約結果が帰ってこない原因は、予約サイト側のHTMLが間違っているからでした。
とりあえず予約できてるからいっか、と諦め中です。
感想
日曜大工ならぬ、日曜プログラマー的に、DIYするのも楽しいですね。
こういった形で、育児に貢献することも父親っぽくていいかも!?
ただ、予約の自動化って、倫理的によろしいことなのかどうか、少し気になっています。
背に腹はかえられぬのだけれども。