自動車教習所の技能予約の空き状況を LINE で通知する

自動車教習所 未分類
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

概要

コロナ禍で時短勤務となり、この機会に何か実のある事をしようと思い、持っていなかった普通自動車免許を取りに行くことにした。

とはいえ通える時間は平日の夜のみ、できれば休日はゆっくりしたい。

だが、いざ通いだしてみると意外と技能教習の予約が取れない…

限られた時間で最大限通えるように、教習所の予約システム(●-ライセンス)のページを自動巡回し、枠が空いていたら LINE で通知が来るスクリプトを作ったので記録しておく。

環境の準備

運用しているサーバーは既にあるため、Python の仮想環境構築のみを行った。

インストールされている Python のバージョンは 3.6 でした。

Python の仮想環境構築

■ 仮想環境を作る
[user@localhost ~]$ mkdir /var/www/xxxxx(任意のパス)
[user@localhost ~]$ cd /var/www/xxxxx
[user@localhost xxxxx]$ python3 -m venv /var/www/xxxxx/virtualenv

■ 仮想環境に入る
[user@localhost xxxxx]$ source /var/www/xxxxx/virtualenv/bin/activate

■ 関連モジュールのインストール
(xxxxx) [user@localhost xxxxx]$ pip install --upgrade pip
(xxxxx) [user@localhost xxxxx]$ pip install bs4
(xxxxx) [user@localhost xxxxx]$ pip install requests

■ 仮想環境を抜ける
(xxxxx) [user@localhost xxxxx]$ deactivate

LINE Notify の登録

LINE Notify は 2025年3月31日でサービス終了し、後継サービスは Messaging API となります。記事の内容は LINE Notify のままですので、適宜置き換えてください。

LINE Notify(https://notify-bot.line.me/ja/)に自分の LINE ID でログインしてください。

マイページに移動し、「トークンを発行する」をクリックしてください。

  • トークン名は何でも良いですが、ここでは「教習所」としました。
  • 通知するトークルームは「1:1 で LINE Notify から通知を受け取る」を選択します。

自分の LINE に LINE Notify からメッセージが来たら設定完了です。

トークンは、忘れないようにメモ帳などにコピペしておいてください。

※LINE Notify にログインできない場合は、普段お使いの LINE から、ホーム > 設定 > アカウント > 「ログイン・セキュリティ」のログイン許可が ON になっていることを確認してください。また、トークン取得後はログイン許可を OFF に戻して大丈夫です。

スクリプト

Python で教習所の空き状況を確認

PC 版より携帯用サイトの方が出力される HTML がシンプルなので、そちらを解析していきます。

#!/var/www/xxxxx/virtualenv/bin/python3
import time
import requests
from bs4 import BeautifulSoup

##################################################
# 初期設定
user_id    = '教習生番号'
password   = 'パスワード'
useragent  = 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_● like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1'
base_url   = 'https://www.●-license.jp'
line_token = 'LINEで発行したトークン'

##################################################
# LINE Notify
def line(message):
    url = 'https://notify-api.line.me/api/notify'
    headers = { 'Authorization':'Bearer ' + line_token }
    payload = { 'message':message }
    r = requests.post(url, headers=headers, params=payload)

##################################################
# メイン処理

# ログイン画面
session = requests.session()
response = session.get(base_url + '/el●●/mobile/index.action?abc=「b.schoolCd の値」&senisakiCd=5')
response.encoding = 'shift_jis'
time.sleep(1)

# ログイン情報
login = {}
bs = BeautifulSoup(response.text, 'html.parser')
for element in bs.findAll('input'):
    login[element['name']] = element['value']
login['b.studentId'] = user_id
login['b.password'] = password

# クッキーとトークンを取得
cookie = response.cookies
token = cookie.get_dict()['JSESSIONID']

# UserAgentを指定
header = { 'User-Agent':useragent }

# ログイン実行
response = session.post(base_url + '/el●●/mobile/m01a.action;jsessionid=' + token, cookies=cookie, data=login, headers=header)
response.encoding = 'shift_jis'
time.sleep(1)

# エラーチェック
if 'システムメンテナンス' in response.text:
    line('システムメンテナンス中です')
    exit()

# 技能予約
bs = BeautifulSoup(response.text, 'html.parser')
for element in bs.find_all('a'):
    if element.get_text() == '技能予約':
        response = session.get(base_url + element.get('href'))
        response.encoding = 'shift_jis'
        time.sleep(1)
        break

# 予約状況
results = ''
bs = BeautifulSoup(response.text, 'html.parser')
for i in range(7):
    day = bs.findAll('a')[i]
    status = day.next_sibling.next_element.strip()

    # 土日は除外
    week = day.text[-2]
    if week != '土' and week != '日':
        # 後ろから4番目が17時の枠
        if status[-4] == 'O':
            results += day.text + " 17:20~\n"
        # 後ろから3番目が18時の枠
        if status[-3] == 'O':
            results += day.text + " 18:20~\n"
        # 後ろから2番目が19時の枠
        if status[-2] == 'O':
            results += day.text + " 19:20~\n"

# ログアウト
response = session.get(base_url + bs.findAll('a')[-1].get('href'))

# LINEで通知
if results:
    line(results + 'の枠が空いています!')

exit()

上記は私が通っていた教習所の場合になります(IDなどはボカシてあります)ので、参考にされる方は適宜修正してください。

予約まで自動で取ってしまうと、行けなかった場合キャンセル料金が発生するので、通知に留めておいた方が良さそうです。

※教習所を卒業したとたんにサイトにログインできなくなってしまったため、残念ながら予約システムのソースやスクリーンショットは撮れませんでした。

定期的にチェックさせる

Cron で定期的にスクリプトを実行し、空き状況をチェックさせます。

*/6 8-21 * * * root /var/www/xxxxx/virtualenv/bin/python3 /var/www/xxxxx/check.py

今回は 8 時から 21 時までの間、6 分ごとに(1 時間あたり 10 回)チェックをするように設定しました。くれぐれも負荷をかけすぎて他の利用者の迷惑にならない範囲で設定しましょう。

※私の通っていた教習所の場合は 9 時台と 16 時台に更新される事が多いと聞いたので、通っている教習所の状況に合わせて調整するとより効率が上がるかもしれません。

まとめ

LINE Notify

これのおかげで 2 月・3 月(繁忙期)でも割と予約が取れたので、夜間しか通えなくても半年かからずに無事免許を取得することができました。

参考にしたサイト

LINE NotifyをPythonでお試し - Qiita
LINE Notifyは、外部のWebサービスと連携させて、そこからのメッセージをLINEのトークルームで受信できる通知機能です。 指定されたLINE NotifyのURLにメッセージを投げる(POSTする)ことで自分のLINEのトークルー...

コメント

タイトルとURLをコピーしました