1年くらい前に作った寮食BOTのメニュー登録を自動化しました。
寮食BOT作った時の記事 ↓
自動化した理由
なぜか 2019年6月分のメニューデータの登録が何回やっても上手くいかず、サーバー内のデータを見たところ、画像のメニュー分割が上手くいっていないようでした。
何回もメニューの写真を撮って、サーバーにアップロードし、確認、っていうのが面倒だったのでなんとか自動化しようと思って土曜日の2時間くらい使って自動化しました。
まぁ正直記事にするほどのことでもないんですが、こういう機会でも無いと普段記事書かないので書きます。
自動化する前のメニュー登録の流れ
まずは今までのメニューデータの登録の流れとしては
- 今月の寮食メニューのプリントが寮のロビーに月始めに張り出されるので、それをスマホで撮る
- その撮った写真をサイト上の寮食BOTのサイト上にある登録フォームに送信
- 送信が終わったら、メニューが正常に登録されているかサイトのトップページで確認
詳しい、サーバー内のロジックについては寮食BOTを作った時の記事に書いてるのでそっちを見てください。
自動化するにあたって
寮食のメニューというのは実は寮の公式サイト上にPDFとして公開されています。 2019年6月分メニューデータPDF
最初はこのPDFのデータを抽出して登録しようと思ったのですが、なぜかPDF内のテキスト情報を抽出しようとしても1文字も抽出されません。なぜだ...
なんとこのPDF、拡大してみると
文字がかすれてる...?
おそらく、このPDFは印刷したメニュー表をスキャンしてPDF出力したものだと思います。
えぇ...(困惑)
仕方ないので、メニューの自動取得の方法を変更します。
旧: PDFのデータから文字を抜き出してメニューを登録する
新: PDFを画像データに変換してそれを今まで使っていた寮食BOTのformで自動でPOSTリクエストを投げる。
ってことでメニュー登録を自動化する方向が完全に決まりました。
で、必要な処理としては以下の通りです。
- 寮の公式HPから寮食のPDFへのリンクの aタグ を抽出し、それの href 要素を取り出し、その href に入っているURLのリンク先のPDFをダウンロードする。
- ダウンロードしたPDFファイルを画像ファイルに変換する。
- 画像ファイルに変換したPDFを寮食BOTサイトのメニュー登録formにリクエストを送る。
- また、PDFが更新されてるかどうかは、 href 要素が前回の確認から変更があったかで判定する
これらの処理を1つのスクリプトにまとめて、cronで定期実行します。
で、このスクリプトを cron で1日1回定期実行します。
sudo vim /etc/cron.d/akatsuki
で
* * */1 * * python3 /home/jun/Akatsuki/update_menu.py
と書き込み、これで cron で1日おきにスクリプトの実行をするようになります。