🌡️

LEBERの検温送信を自動化したい

2023/02/10に公開

※自己責任です※

Seleniumを使ってブラウザをスクレイピングして毎朝自動送信することを可能にしよう!
本記事ではSeleniumを用いたスクレイピングとGihHubActionを使った定期実行を行う方法を解説します。(備忘録要素含む

めんどくさい人は2章のコードと3章だけで動きます。

目次

  • 1.必要なもの
  • 2.ローカル環境でスクレイピングを実行できるようにする
    • 1.準備
    • 2.LEBERのサイトをクリックできるようにする
    • 3.他の部分も同様に作る
    • コード
    • 4.実行する
  • 3.GithubActionを使って実行できるようにする
  • 4.最後に

1.必要なもの

githubアカウント
コードエディタ(vscodeおすすめ)

2.ローカルでスクレイピングを実行してみる

1.準備

ライブラリのインストール

必要なpyhtonのライブラリをインストールします。インストールするライブラリはご自身の環境に合わせてください。

pip install selenium==3.141.0
pip install typing-extensions
pip install webdriver_manager

2.LEBERのサイトにアクセスしてログインボタンを押してみる

Seleniumの基本的なこと

図解!PythonでSeleniumを使ったスクレイピングを徹底解説!(インストール・使い方・Chrome)

実践編

ここではLEBERのサイトを使って以下の2つのことをやります
1.ログインボタンのXPATHを取得する
2.ログインボタンをクリックする

1.ログインボタンのXPATHを取得する

まず、LEBERにアクセスする。

次に、Chromeであれば"F12"を押してデバッグ画面を開きます

四角にカーソルがあるところを押して要素を選択できるようにしたらログインボタンを押します。

要素が記述されている部分を右クリックして
コピー->XPATHをコピーをクリック

コードの方に書く

browser = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
browser.find_element(By.XPATH,('XPATHをここにコピーする'))

ブラウザを開くところからクリックするところまでのコード

#インポート
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from time import sleep
from tokenize import String
from typing_extensions import Self
from webdriver_manager.chrome import ChromeDriverManager
#urlを指定
url = 'https://web.leber.jp/index.html'
# ブラウザのオプションを指定(無視していい
options = webdriver.ChromeOptions()
#ブラウザを開く
browser = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
browser.get(url)
#待機
sleep(4)
#クリック
browser.find_element(By.XPATH,('ここにXPATHをコピーする')).click()
print("ログインをクリック")
sleep(5)

一度実行してみましょう!ログに"ログインをクリック"とでれば成功!

2.他の部分も同様に作る!

コードの書き方

ボタンをクリック

browser.find_element(By.XPATH,('XPATHコピペ')).click()

文字を入力

browser.find_element(By.XPATH,('XPATHコピペ')).send_keys("入力したい文字列")

リストから選択

dropdown = browser.find_element(By.XPATH,('XPATHコピペ'))
select = Select(dropdown)
select.select_by_index(N)#N番目を選択

コード

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from time import sleep
from tokenize import String
from typing_extensions import Self
from webdriver_manager.chrome import ChromeDriverManager

# リンク
url = 'https://web.leber.jp/index.html'

# ブラウザを立ち上げないようにオプションを指定
options = webdriver.ChromeOptions()
options.add_argument("--headless") #表で起動するかどうかテストのときは先頭に#つけてコメントアウトして
options.add_argument("--disable-gpu")
options.add_argument("--window-size=880x996")
options.add_argument("--no-sandbox")

#検温を送信
tel = 電話番号
password = "パスワード"
# ブラウザを生成
browser = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
browser.get(url)
print("アクセス成功")
sleep(4)

# ログイン画面に遷移
element = browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div/div'))
element.click()
print("ログインを選択")
sleep(1)
title = browser.title
print(title)

# 電話番号を入力
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[2]/div/div[2]/input')).send_keys(tel)
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div/div')).click()
print("電話番号を入力して次へを選択")
sleep(1)

# パスワードを入力
browser.find_element(By.XPATH,('//input[@type="password"]')).send_keys(password)
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[3]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div')).click()
print("パスワードを入力、ログインを選択")
sleep(5)

# 体温チェックを選択
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/div/div[2]/div/div[1]/div/div[2]')).click()
print("体温チェックを選択した")

# ユーザーを選択
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div[1]')).click()
print("ユーザーを選択")
sleep(1)

#体温1
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div/div[2]/div/div/div[1]/div/div/div')).click()

#体温2
dropdown = browser.find_element(By.XPATH,('/html/body/div[4]/div/div[2]/div/div/div/div/div[1]/div[3]/select'))
select = Select(dropdown)
select.select_by_index(26)#36.6度

#体温3
browser.find_element(By.XPATH,('/html/body/div[4]/div/div[2]/div/div/div/div/div[1]/div[5]')).click()
print("体温を回答")

#時間1
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div[2]/div[2]/div/div/div[1]/div/div/div')).click()

#時間2
dropdown = browser.find_element(By.XPATH,('/html/body/div[4]/div/div[2]/div/div/div/div/div[1]/div[3]/select'))
select = Select(dropdown)
select.select_by_index(6)#午前6時

#時間3
browser.find_element(By.XPATH,('/html/body/div[4]/div/div[2]/div/div/div/div/div[1]/div[5]')).click()
print("時間を回答")

#体調1
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div[3]/div[2]/div/div/div[1]/div/div[1]/div/div[1]/div')).click()

#体調2
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[3]/div[3]/div[2]/div/div/div[2]/div/div')).click()
print("体調を回答")
sleep(2)

#回答を送信
browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[3]/div/div')).click()
sleep(1)

# 確認用text
print(browser.find_element(By.XPATH,('//*[@id="root"]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div/div[3]/div[2]/div[2]/div/div/div/div/div/div/div/div[2]/div[2]/div/div/div/div/div/div[1]/div/div[2]/div')).text)

# 閉じる
browser.close()

4.実行してみよう!

VSCodeなら右上の三角をクリックで簡単に実行できる

ログの最後に"回答が送信されました"と表示されれば成功!
しかし、この操作を毎朝するんじゃ意味がない。。
なので、次の章ではこのプログラムを定期実行できるようにする。

3.GithubActionを使って実行できるようにする

1.Githubの準備

Githubにログインする

リポジトリを作成する

注意:必ずprivateを選択する

ファイルを追加する

楽な方法
ファイルを作成を選択してさっきのコードをコピペする。

ファイル名は自由に設定してください。

最後に一番下にある"ファイルをコミットする"をクリック

2.定期実行できるようにする

Actionsを選択

Jekyllを追加する

Jekyllを追加する

設定していく


こんな画面になったら
ファイル名はデフォルトのままで、
コードの部分をとりあえず以下のものに書き換えよう。

# ワークフロー名
name: scheduler
on:
  #保存するたびに実行したくなければpushの前に#をつけて
  push:
  schedule:
    # 定期実行する時間
    - cron: "0 21 * * *"

jobs:
  build:
    # Ubuntuの最新版環境内で処理を実行することを指定
    runs-on: ubuntu-latest

    # 実行する処理&コマンド指定
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          # pip更新(必要なライブラリのインストール
          python -m pip install --upgrade pip
          pip install selenium==3.141.0
          pip install typing-extensions
          pip install webdriver_manager
      - name: Run script
        run: |
          # 定期実行するファイルを指定。
          python ファイル名

解説

1.実行する時間を設定

- cron: '0 21 * * *'

指定の仕方はcron形式で。
注意点はここでの時間はUTCに合わせられているので
日本の場合は-9時間してください
例えば、朝6時にしたい場合
(6時)-(9時間)=(21時)

- cron: '0 21 * * *' 毎朝6時

2.実行したいファイル名を指定する

# 定期実行するファイルを指定。
python ファイル名

ファイル名のところに自分の書いたプログラムのファイル名をそのまま記述する。

最後にさっきと同様コミットする

以上で定期実行できるようになった。

4.最後に

いろいろ書いてきましたが、基本コピペで作れるようにしたつもりです。(できてなかったらごめんなさい..)
使うことに関しては完全に自己責任で。
わからないことはググれば大体出てくると思うのでがんばって。

Github
https://github.com/Juno264/Automatic_Thermometer_public

参考記事

https://zenn.dev/cyber_hacnosuke/articles/70b8945783e135
https://qiita.com/cardene/items/67d31f13d27865a12ecf
https://qiita.com/nemutas/items/3f5816eabbf0eda5e6a9

Discussion