77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

炭焼きレストランさわやかの待ち時間を監視してSlackに通知する

肉が食べたい・・・。

 
早速ですが、皆さんは炭焼きレストランさわやかって行ったことありますか?

静岡で展開している人気のお店で、僕もこの前行ってみたんですが、ハンバーグがとても美味しくて、いつも混んでいる人気店だという話も納得でした。

 
「おいおいカテゴリ間違えてるぞ」というツッコミを浴びる前にこの記事の主旨を説明します。

 
この記事は、一言で言うと

Pythonで書いたプログラムで炭焼きレストランさわやかの待ち時間を監視して、空いているタイミングでSlackに通知してくれる仕組みをつくろう

って内容です。

きっかけ

まずは、なぜこんなことをしようと思ったのか、という動機を書いていきます。

とってもおいしいハンバーグを口にしてしまった僕は、さわやかに再び行きたい、と思うようになりました。

しかし、やっぱり混んでいて店に入れない、ってのがネックとなっていました。やがて混んでいない瞬間を狙って行きたい、空いているときを知りたい、と考え始め、最終的に寝ても覚めてもさわやかが空いている瞬間がいつなのか知りたくてしょうがなくなってしまいました(大げさですね)。

 

そこで、皆さんも多分見ているであろうさわやかの待ち時間が分かるページ

さわやか全店舗の待ち時間一覧

を常に見続けていればいいのでは・・・?と思ったのです。以下のページですね。
f:id:J-back:20190912000619p:plain:w700 

それなら、

何分かごとにこのサイトをチェックして、待ち時間が少ないのを発見したらすかさず「今さわやか混んでないよ!」って教えてくれる親切な人がいれば良いんだ!

と思いました。

・・・そんな人いる?

 

まぁ、いないですよね。もしいたら挙手お願いします。※カンパイドリンクおごります。

※注文すると提供時に店員さんが「カンパイ!」って言ってくれるさわやかのドリンクメニューのこと

 

で、やってくれる人がいないなら機械にやってもらおうぜ、って話になりました。

同じページをひたすら更新して見続けるってなかなかの苦行ですよね。人間にとっては。

こういう繰り返し作業は機械の方が得意なのです。なので、プログラムで監視ツールつくってみるか、という考えに至ったというわけです。
 

Pythonのコード

前置きが長くなりましたが、ここから実際のプログラムについて説明していきます。

今回書いたコードは以下です。
※プログラムの内容は本記事執筆時点での「さわやか全店舗の待ち時間一覧」のページに対応しています

# coding: UTF-8
import slackweb
import time
from bs4 import BeautifulSoup
from selenium import webdriver
  
# 定数宣言
SLACKURL = 'ここは各自の値を入れてください'
SLACKUSERID = '<@ここは各自の値を入れてください> \n'
  
# slack送信メソッド
def slackPost(webhookurl,message):
    slack = slackweb.Slack(url = webhookurl)
    slack.notify(text = message)
  
# main処理
def main():
  
    # 通知用メッセージのヘッダー
    header = SLACKUSERID + '【さわやか待ち時間通知】\n'
  
    # 通知用メッセージ
    resultMessage = ""
  
    # スクレイピング対象URL
    URL = "https://www.genkotsu-hb.com/airwait.php"
  
    # 待ち時間の閾値(分)
    WTIME = 15
  
    # スクレイピング実行
    try:
        # Chromeを起動してurlを開く
        driver = webdriver.Chrome()
        driver.get(URL)
        time.sleep(10)
  
        # 文字コードをUTF-8に変換し、html取得
        html = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(html, "html.parser")
  
        # tagとclassを指定して要素を取り出す
        strShopName = soup.find_all("div", class_="sc-fONwsr bmOhpB")
        strWaitingTime = soup.find_all("div", class_="sc-ipXKqB iHAIGD")
  
        for i in range(0, len(strWaitingTime)):
            intWaitingTime = int(strWaitingTime[i].text.replace("約","").replace("分待ち", ""))
            if intWaitingTime <= WTIME:
                resultMessage += strShopName[i].text.replace("さわやか","") + ":" + strWaitingTime[i].text + "\n"
  
    except Exception as e:
        resultMessage = "[例外発生]\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
  
    finally:
        # 起動したChromeを閉じる
        driver.close()
        driver.quit()
  
        # slackに送信
        if resultMessage != "":
            slackPost(SLACKURL, header + resultMessage)
  
if __name__ == '__main__':
    main()
  

上記のコードを動作させるには

Pythonが動作する環境
Seleniumが動作する環境
PythonからSlackにメッセージを投稿する設定


が必要となります。以下の記事を参考にしてください。
www.77-lifework.com
www.77-lifework.com



そして、このプログラムをサーバなどに配置し、スケジュール実行させれば自動で待ち時間を見にいって、待ち時間が15分以下の場合に通知する、ということが実現できます。

スケジュール実行させる方法としては、Windowsならタスクスケジューラ、Linuxならcronで設定すればOKです。
(追記予定)


ちなみに今回の監視対象はさわやかのページなのですが、基本的にどんなページが相手でも基本的な考え方やプログラムの流れは同じだと思います。(もちろん、多少の修正は必要となりますが)

皆さんがチェックしたいサイトがある場合、ここで記載したプログラムの流れを参考に書いてみてもらえると嬉しいです。

最後に

自動でページを確認して結果を知らせてくれるっていうのは結構おもしろいですよ。

まるで自分専用の小人を雇ったみたいです。

「寝ている間に小人が仕事をしてくれる」っていう状況も夢じゃないですね。


今回はここまでです。

最後まで読んでいただきありがとうございました!