ブログ

IFTTT の MyApplet のConnect状態を Selenium でスクレイピングしてLINE通知

動機

  • IFTTT のアプレットがいつの間にか Disconnect になり、困ることがあった
    • 1年で3回ぐらい遭遇した
    • 有料版を使用
  • アプレットのConnect状態をスクリプトで毎日監視し、LINE通知で確認しよう

結果

以下のように、LINE通知で IFTTT の状況を把握できるようになりました。

アプレットの接続状態を心配する日々から解消されました。

(毎日の通知音は不要なので、LINE Nofity はミュートにして任意タイミングで見るようにしています)

IftttScraping

事前準備

ソースコード

# coding: UTF-8

# スクレイピングで使用
from time import sleep
from bs4 import BeautifulSoup
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import re

# LINE通知で使用
import requests

print("【IFTTT の MyApplet の Connect状態を取得するスクリプト】")

# IFTTT のログインページ
url = "https://ifttt.com/login?wp_=1"

# ログイン情報
email = "IFTTTアカウントのメールアドレス"
password = "IFTTTアカウントのパスワード"

# オプション設定
options = Options()

# headlessモード(ブラウザを描画しない)
options.add_argument('--headless')

# UA設定(適当なUAで偽装すればOK)
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
options.add_argument('--user-agent=' + UA)

# ドライバ起動
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)

print("【ドライバ起動完了】")

# ログインページにアクセス
ret = driver.get(url)

# ページ遷移のため少し待つ
sleep(2)

print("【ログインページアクセス完了】")

# ユーザー情報を設定し、ログイン
driver.find_element(By.ID, 'user_username').send_keys(email)
driver.find_element(By.ID, 'user_password').send_keys(password)
driver.find_element(By.NAME, 'commit').send_keys(Keys.ENTER)

# ページ遷移のため少し待つ
sleep(2)

print("【ログイン完了】")

# MyAppletsページにアクセス
driver.get("https://ifttt.com/my_applets")

# ページ遷移のため少し待つ
sleep(2)

print("【MyAppletsページアクセス完了】")

# ページソースからsoupオブジェクトを作成
# "html.parser" でもよいが、高速化のため lxml を使用
soup = BeautifulSoup(driver.page_source, 'lxml')

# 確認のためページのソースを表示
#print(soup)

# ドライバをクローズ(以降は BeautifulSoup での操作)
driver.close()
driver.quit()

# my-web-applet-card web-applet-card なる class にアプレットたちが記載されているので取得
applets = soup.find_all('li', class_='my-web-applet-card web-applet-card')
applet_num = len(applets)
#print(applet_num)

# アプレットごとに名前とConnect状態を取得し、Connected なアプレット数を取得
print("【アプレット情報を取得】")
connected_num = 0
regex_name = re.compile(r'<div style="display: block;">(\w.*?)</div>')
regex_status = re.compile(r'"object_id":"(Connect(|ed))"')
for applet in applets:
    #print(applet)
    name = regex_name.search(str(applet))
    name_g = name.group(1)
    status = regex_status.search(str(applet))
    status_g = status.group(1)
    print(name_g + ":" + status_g)
    if status_g == "Connected":
        connected_num += 1

# LINE通知時のメッセージを作成
# MyApplet が6個あるとして、6個とも Connected なら正常とする
connect_result = str(connected_num) + "/" + str(applet_num)
print(connect_result)
if connected_num == 6 and applet_num == 6:
    message = "正常 " + connect_result
else:
    message = "!!!異常!!! " + connect_result


#
# LINE通知
#

# エンドポイント
url_line = "https://notify-api.line.me/api/notify"
    
# メッセージ生成
ACCESS_TOKEN = 'アクセストークン'
headers = {'Authorization': 'Bearer ' + ACCESS_TOKEN}
payload = {'message': ' ' + message}

# 通知
requests.post(url_line, headers=headers, data=payload)

print("【LINE通知完了】")
print(message)

 

定期実行

WSL, Anaconda 仮想環境でのPython実行であれば、以下をWindowsタスクスケジューラに1日1回のタスクとして登録します。

プログラム:wsl.exe

引数の追加:/home/ユーザー名/anaconda3/envs/仮想環境名/bin/python /home/ユーザー名/IftttScraping/IftttScraping.py; read Wait

仮想環境以下の Python を指定することで、該当の仮想環境で pip したパッケージが使用できます。
(conda activate してから python 実行したのと同等)

read Wait を加えることで、実行結果を確認可能です。

備考

  • IFTTT に自動ログインするのは1日1回程度にしておきましょう
    • サーバーに負荷を与えるスクレイピングはよろしくありません
    • https://ifttt.com/robots.txt を見る限り、常識の範囲でのスクレイピングは許されていそう(2022/02/24現在)
      • Ifttt_Robots
  • requests.session() で UA や authenticity_token を付けるのも試したがログインできなかったので、requests ではなく selenium を選択しました

-ブログ

© 2024 墾田ええねん! Powered by AFFINGER5