カービィカフェのキャンセルを通知するLINE botをPython3で作る。

書こうかやめとくか迷ったネタだったのですが、以下みたいな記事があって、「あ、こういうの書いていいんだ」と思ったので書くことにしました。
年末年始の新幹線をPythonで予約する - ふしみのブログ


カービィカフェ | トレタかんたんウェブ予約をChrome DevToolsで開くと、空き確認用のAPIが存在している事がわかるので、それをそのまま実行してLINE Botで通知すればいいです。

DevToolsのNetwork

準備

LINE Developersから適当にBotを発行してアクセストークンを取得します。For Developerプランだと(友達に登録できる人数に制限がありますが、)無料でメッセージのPushができます。自分用のBotならDeveloperプランで十分でしょう。

チャネル基本設定画面から自分のUserIDとBotのアクセストークンを確認します。今回はCallbackが必要ないのでCallback URLの準備は不要です。

トークンの取得

必要なライブラリをpipで導入します。今回は公式のLINE Bot用のSDKを使いました。
line/line-bot-sdk-python: SDK of the LINE Messaging API for Python.

sudo python3 -m pip install line-bot-sdk

以下のコードをDoS攻撃にならない間隔(2分に1回とか)で定期的に回します。ちなみにコード自体は別のところで公開したやつの改良版です。

import sys
import json
import urllib.request
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

LINE_ACCESS_TOKEN = '取得したアクセストークン'
LINE_USER_ID = '自分のUser ID'
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)

restaurant_id = 'jta9560wTJF-1OGWHJwGdFyX1A3dE4wjK4ChQ2pe6kM'
year = '2019' # 空きを確認したい年
month = '1' # 空きを確認したい月
seats = '2' # 席数

url = 'https://yoyaku.toreta.in/web/v1/web_reservations/{}/days.json?year={}&month={}&seats={}'.format(restaurant_id, year, month, seats)

try:
    req = urllib.request.Request(url)
    res = urllib.request.urlopen(req)
    body = json.loads(res.read().decode('utf-8'))
except urllib.error.HTTPError as err:
    print(err.code)
    sys.exit(1)
except urllib.error.URLError as err:
    print(err.reason)
    sys.exit(1)

days = body['result']['days']

day = 1
message = ""

for results in days:
    if results is not None:
        for result in results:
            if result['label'] is not None:
                message += month + '/' + str(day) + ' ' + result['label'] + '\n'
    day+=1

if message != "":
    #print(message)
    try:
        line_bot_api.push_message(LINE_USER_ID, TextSendMessage(text=message.rstrip()))
    except LineBotApiError as err:
        print(err)

空きが通知された。

5件のコメント

  1. 匿名

    もしやツイッターでキャンセル通知botを運用されていた方でしょうか?去り際に残して頂いたapi仕様の解説とアレのお陰で12月生まれの妻と1月生まれの息子にそれぞれ予約が取れました。ありがとうございました。
    予約開始が平日勤務中で社会人殺しゆえにseleniumを使ったのですがうまくいかず夫婦共々諦めておりましたが、まさかあんなに仕様がガバガバとは盲点でした。

  2. コメント及びキャンセル通知botのご利用ありがとうございます。(私が不公平感を感じていたこともあり)もともと開始時に休みが取れない人のために公開した側面が強かったので、私の望む形でお役に立ててなによりです。

    私も18時は勤務中で予約が取れないのでMechanizeかSeleniumとHeadless Chromeを使う予定だったのですが、予約を扱うシステムとは思えないレベルのAPIが速攻で見つかったのでどちらにも頼らずどうにかなりました。DevToolsには足を向けて寝られません。

    息子さんとのカフェぜひ楽しんでください。

  3. 通りすがりさん

    モノによってはcurlだけで完結できる可能性もあるという点で知見を得られました。人間がやると面倒なことを機械にやらせる技術は良いですね。こういうのに限らず、素晴らしいから自分も勉強してみようという発想にはならず、ズルだの楽してるだのマナー違反だのとにかく叩き出すところに日本の生産性の低さが現れるよね。

    • コメントありがとうございます。curlで完結できるパターンはあまりないので私も驚きました。
      制約があってできないことを技術で解決しようとしているのを「ズルができる」「楽をしている」と言うのは本当に生産性が低いですし、良くないことだと思います。苦労を美徳とするのではなく、みんなで楽をしようという発想になってほしいですね…。

  4. 2019/02/13現在、csrf_tokenの指定が必要になりました。取得方法は難しくないはずなので、この記事では特に言及しません。

りゅー にコメントする コメントをキャンセル

お手数ですが半角数字で計算結果を入力してください。 *