見出し画像

審判ファンの文系SEが出場審判お知らせLINEボットを作る(息抜き)

LINEで今日の審判が誰が出るかお知らせしてほしい!

三連休の初日は佐々木さんの球審を観に三週連続でZOZOマリンに行ってきました。カバー写真は試合進行にお怒り(ではない)で仁王立ちしている佐々木さんです。第二試合は球審が福寿さんでテンションアゲアゲでしたが日差しと暑さにやられて五回でギブアップしました。スタンドで元審判技術委員の山崎さんに遭遇して一緒に観戦していました。「なるやんは壮大なものを作り始めたね!?」と言われました。果たして完成できるのか…。期待に応えられるよう頑張りたいです。

Flaskのアプリの方はなんかsqlite3でエラーが起きまくっていて挫折しそうなので気分転換に一年前に作ろうと思ったものの挫折した「出場審判お知らせLINEボット」を作ろうと思います。

高校二年生の秋から審判に注目して野球を見始めてから10年間、「NPBのサイトに17時半前くらいからアクセスして審判が試合詳細ページに表示されるまでリロードし続ける」ことをしていてちょっともういい加減やめたいなと思い始めました。だって…無駄じゃないですか。試合数分アクセスして、戻るボタン押して再度表示させて…というのが。SEらしくスマートにかつエレガントに今日の出場審判を知りたいのでLINEボットを作成することにしました。

LINE Notifyの設定


去年のことなので覚えていませんが、アカウント作成とトークン発行までの流れはスムーズにできた記憶があります。

Seleniumで今日の審判を取得する

今日分の試合だけ登録すればよいので、NPBのサイトTOPに表示されている試合数を取得して試合数分だけループして処理を行います。Seleniumのバージョンをあげたので書き方が変わりました。こっちの方がわかりやすいですね。

# 本日の試合数を取得します
today_game = len(driver.find_elements(By.CLASS_NAME, "state"))
team_name = []

if today_game >= 1:
   for i in range(today_game):
       driver.find_elements(By.CLASS_NAME, "state")[i].click()
       # 試合終了の場合はスキップ
       if (
           driver.find_element(
               By.CSS_SELECTOR, "#game_stats > div.line-score > p"
           ).text
           in "試合終了"
       ):
           continue
           umpire = moji_clear(driver.find_element(By.CLASS_NAME, "referee_info").text)
           team_name.append(
               top_team_clear(
                   driver.find_element(
                       By.XPATH,
                       "/html/body/div/div/div[3]/section/table[2]/tbody/tr[1]/th",
                   ).text
               )
               + "vs"
               + top_team_clear(
                   driver.find_element(
                       By.XPATH,
                       "/html/body/div/div/div[3]/section/table[2]/tbody/tr[2]/th",
                   ).text
               )
           )
           umpire_info.append(
               [
                   team_name[i],
                   umpire[0],
                   umpire[1],
                   umpire[2],
                   umpire[3],
               ]
           )
           driver.back()

試合数分ループさせて、umpire_infoというリストにカード名と各審判名を追加していきます。平日のナイターは基本的に同じ時刻から開始なのでよいですが土日祝日はバラバラなのでこっちのスクリプトそのものでは「試合終了」と書かれた試合は通知されているのでスキップする処理のみ追加し、あとは自動処理を設定する際の時間で調整しようと思います。

       for i in range(len(umpire_info)):
           message = (
               "チーム名:"
               + umpire_info[i][0]
               + "\n"
               + "主審:"
               + umpire_info[i][1]
               + " 一塁:"
               + umpire_info[i][2]
               + " 二塁:"
               + umpire_info[i][3]
               + " 三塁:"
               + umpire_info[i][4]
           )
           access_token = "アクセストークン"
           url = "https://notify-api.line.me/api/notify"
           headers = {"Authorization": "Bearer " + access_token}
           payload = {"message": message}
           requests.post(
               url,
               headers=headers,
               params=payload,
           )

messageという変数にumpire_infoの値を代入していきます。色々フォーマットの仕方を悩んだのですがシンプルに1試合1LINEでいきます。

いい感じですねー!これを求めていました。あとはHerokuかGoogleのサービスを使って特定の時間にこのプログラムを実行出来るようにすれば完成です(ここが一番難しいのではないか疑惑)。出来たら完成したLINEbotは公開しようと思っています。数少ない審判ファンの同志に届け!

主審球審警察!?

審判ファン過激派の一部に「主審」というと「主審は責任審判のクルーチーフの〇〇さんであって球審の〇〇さんは主審ではない!」という意見を持った人がいますが、あえてここでは球審を主審と書いています。何故か。球審の方が判定回数が多くメインで判定しているポジションだから主審で間違いないからです。そしてもうひとつ理由がありますが、これはちょっとしたコラムが書けそうなので別の日に。


この記事が気に入ったらサポートをしてみませんか?