Web チェック・プログラム
【機能】
・Web画面の文字変化があった時にブザーを鳴らします。確認周期は約1分30秒に設定しています。
・Webの任意のURL設定を設定するだけで動作するはずです。
・Windows11の64Bit-CPUで動作するプログラムですが、下記のDOS風の単純な画面です。
・下記は3回目で画面文字の変化があったサンプル画像です。
【設定の変更】
・Windows11、64Bit-CPUの実行形式(**.exe)で提供します。プログラムのダウンロードはここ。
・Web-Check.zipを解凍すると、次の3本のファイルがあり「任意のフォルダ」に格納してください。
===============================================「任意のフォルダ」に格納
GIA-Chrome-Sub.exe (実行プログラム)
GIA-set1.txt (設定ファイル)
最初にお読みください.txt (説明資料)
------------------------
Web-html-1.html (プログラム起動で新規に作成)
Web-txt-1.txt (プログラム起動で新規に作成)
===============================================以上が「任意のフォルダ」
・「GIA-set1.txt」設定ファイルの1行目に下記データがあります。
1行目の "**" の中のデータを、自分が確認したいWebのURLに変更する。
その他はできるだけ変更しないでください。
url1 = "https://unitednetwork.earth/categories/gia-reports"
・プログラムを起動すると「任意のフォルダ」の中に「Web-html-1.html」として初期画面が格納されます。
URLを変更した時は必ず、「Web-html-1.html」をダブルクリックし期待するWEb画面が読み取られていることを、確認してください。
注1)「Chrome」アプリが自分のPCにインストールしてあることが「必要」です。Chromeの表示読み取り関数を使っているためです。
【プログラム起動】
・「GIA-Chrome-Sub.exe」を右クリックし、「管理者として実行」をクリックする。最初に2回以上実行が必要です。
起動用「ショートカット」を作成すればダブルクリックだけで起動するかもしれません。
・1分30秒周期でWebの画面文字の変化を確認開始する。
・画面文字が変化すると5回のビープ音が鳴ります。次の、1分30秒周期でまた5回のビープ音が鳴ります。
・プログラム起動時の初回だけ、指定URLの画面文字を記録します。初回の画面文字と変化があるかを確認しています。
指定したWeb画面をプログラム起動時に1回だけ「目視で確認」したほうが安心できます。
【プログラム終了】
・「コマンド」画面の右上の「×」を「2回」以上押す。スリープ・モードで動作しているため、30秒程度は応答が無い可能性があります。しばらく待ってください。
【特徴】
(1)1分周期でWeb画面の画面文字を読み取り、文字が変化した時にブザーを鳴らします。
なお、イメージ画像だけが変化しても反応しません。
(2)Javaなどで構成されたWeb画面などあらゆる画面で動作ができます。
その理由はWeb表示の「Chrome」アプリ関数を起動し流用しているためです。
(3)確認WebのURLは初期設定により、任意に設定ができます。
(4)「CPU負荷」と「Diskなどハード負荷」が極力少なくなるようにしています。
画像は読み込んでおらず、URLだけの読み込みで、「読み込み回線負荷」が少ない。
このプログラムを動作させながら、「Chrome」アプリを含め、他のプログラムも通常に動作します。
【Pythonでのプログラミング】
・Pythonでプログラムが出来ており、昔の「DOS」のような簡単なプログラムです。
・開発環境を含め、関連するプログラムは全て無料で入手できます。
・このプログラムはAIの「ChatGBT」が作っています。エラーが発生したら、「ChatGBT」に確認してください。
たぶん、Pythonプログラムをコピーする場合は、自分のPC内部の関数不足がある可能性があります。その場合、関数をロードする。
・GIAレポートのWebサイトはJavaで構成されているようで、「ChatGBT」に色々なことを聞いて2週間ほどかかりました。
【前提条件:Pythonでのプログラミング】
(1)「Chrome」アプリがインストールされていること。「Chrome」アプリを起動する必要はありません。
(2)「Python」をインストール。
(3)「jupyter lab」をインストール。
(4)「JupyterLab」フォルダを作成。場所はどこでも良い。名称は任意。
(5)「JupyterLab」フォルダに次のファイルが存在すること。
====================(「JupyterLab」フォルダ)
01-jupyterlab.bat
GIA-Chrome-Sub.bat
GIA-Chrome-Sub.ipynb
GIA-Chrome-Sub.py
GIA-set1.txt
(下記は自動作成される)
Web-html-1.html
Web-txt-1.txt
====================(以上が「JupyterLab」フォルダ)
(6)「01-jupyterlab.bat」は次の文字を記述する。
====================(「01-jupyterlab.bat」ファイル)
jupyter lab
====================(以上が「01-jupyterlab.bat」ファイル)
(7)「GIA-set1.txt」は次の文字を記述する。
====================(「GIA-set1.txt」ファイル)
url1 = "https://unitednetwork.earth/categories/gia-reports"
url2 =
"https://unitednetwork.earth/categories/gia-reports?search=**-FEB-25"
web-html-1 = "Web-html-1.html"
web-html-2 = "Web-html-2.html"
web-txt-1 = "Web-txt-1.txt"
web-txt-2 = "Web-txt-2.txt"
file-test-1 = "Not-file-test"
====================(以上が「GIA-set1.txt」ファイル)
特記1:「url1」に90秒周期で確認したいWebサイトのURLを記述する。
特記2:「url2」はダミーのURLで何でも良い。
特記3:「web-html-1」は初回のWebサイトのデータを格納するファイル名称です。
特記4:「web-html-2」は2回目以降のWebサイトのデータを格納するファイル名称です。デバッグ・モードの時のみ有効。
特記5:「web-txt-1」は初回のWebサイトの表示文字だけを抜き取ったデータを格納するファイル名称です。
特記6:「web-txt-2」は2回目以降のWebサイトの表示文字だけを抜き取ったデータを格納するファイル名称です。デバッグ・モードの時のみ有効。
特記7:「file-test-1」が「"file-test"」の場合はデバッグ・モード指定です。「"Not-file-test"」の場合はデバッグ・モード指定ではなく、2回目以降のWeb読み取りでファイルには書き込まず、メモリ空間のワーク領域だけの処理となります。
(8)「GIA-Chrome-Sub.ipynb」はPythonのプログラムです。次を記述する。
ただし、下記は
jupyter lab を起動し「GIA-Chrome-Sub.ipynb」のファイルを作成して下記をコピーする。
====================(「GIA-Chrome-Sub.ipynb」ファイル:ソースコード)
# ========================================
# GIA_Chrome_sub (2025/1/14)動作確認
# ========================================
import os
import winsound
import time
import re
from difflib import Differ
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from datetime import datetime
# 「Chromedriverのダウンロードとバージョン管理」
def setup_chromedriver():
print("Chromedriverのダウンロードとバージョン管理を実行")
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=chrome_options)
# 「Webデータの取得と処理」
def process_web_data(driver, url):
driver.get(url)
time.sleep(30) # 30秒待機
content = driver.page_source
content_filtered = clean_content(content)
text_only = driver.find_element(By.TAG_NAME, "body").text
return content_filtered, text_only
# 「コンテンツのフィルタリング」
def clean_content(content):
content = re.sub(r"pixel_session=.*?//]]>", "", content, flags=re.DOTALL)
content = re.sub(r"csrf-token.*?/>", "", content, flags=re.DOTALL)
content = re.sub(r"authenticity_token.*?/>", "", content, flags=re.DOTALL)
# content = re.sub(r"&search=.*?\">", "", content, flags=re.DOTALL)
content = content.replace("\u00A9", "")
return content
# 「ビープ音」(Windows OS)
def beep_5(kai2,hertz2):
count2 = kai2
frequency = hertz2 # ビープ音の周波数(ヘルツ)
duration = 500 # ビープ音の長さ(ミリ秒)
for i in range(count2):
winsound.Beep(frequency, duration) # ビープ音を鳴らす
time.sleep(0.5) # 次のビープ音までの間隔(秒)
# 「初期設定の読み取り」
def read_initial_values(file_path):
variables = {}
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line and "=" in line:
key, value = map(str.strip, line.split("=", 1))
variables[key] = value.strip('"')
return variables
# ファイル読み取り
def load_file_to_memory(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
return file.read()
except Exception as e:
print(f"Error: {e}")
return None
# 「メイン処理」
def main():
print("「ビープ音」を確認のため3回鳴らします。")
# ビープ音
beep_5(3,1000)
# 「Chromedriverのダウンロードとバージョン管理」
driver = setup_chromedriver()
time.sleep(30) # 30秒
# 「初期値を読み取る」
initial_values = read_initial_values("GIA-set1.txt")
for key, value in initial_values.items():
print(f"{key}: {value}")
# 初期変数のセットアップ
url1 = initial_values["url1"]
url2 = initial_values["url2"]
web_html_1 = initial_values["web-html-1"]
web_html_2 = initial_values["web-html-2"]
web_txt_1 = initial_values["web-txt-1"]
web_txt_2 = initial_values["web-txt-2"]
file_test_1 = initial_values["file-test-1"]
# 初回データ取得
m_web_html_1, m_web_txt_1 = process_web_data(driver, url1)
print("m_web_html_1, m_web_txt_1 を読み込みました。")
with open(web_html_1, "w", encoding="utf-8") as f:
f.write(m_web_html_1)
print(f"{web_html_1} にデータを格納しました。")
with open(web_txt_1, "w", encoding="utf-8") as f:
f.write(m_web_txt_1)
print(f"{web_txt_1} にデータを格納しました。")
time.sleep(30) # 30秒
kaisu1 = 0
# Webの変化を無限確認
while True:
kaisu1 += 1
now = datetime.now()
print(f"回数: {kaisu1}"," 時分秒=",now.strftime("%H:%M:%S"))
# 初回データ取得
m_web_html_2, m_web_txt_2 = process_web_data(driver, url1)
print("Webからメモリ(m_web_html_2, m_web_txt_2)に読み込みました。")
#テスト・モードのみ2回目以降でファイルに書き込み。
if file_test_1 == "file-test":
print("「file-test」の指定がありファイルに書き込みます。")
with open(web_html_2, "w", encoding="utf-8") as f:
f.write(m_web_html_2)
print(f"{web_html_2} にデータを格納しました。")
with open(web_txt_2, "w", encoding="utf-8") as f:
f.write(m_web_txt_2)
print(f"{web_txt_2} にデータを格納しました。")
# if m_web_html_1 == m_web_html_2: 「html」形式はNLなど微妙に一致しない。
if m_web_txt_1 == m_web_txt_2:
print("Webに表示された文字に変化がありませんでした。")
else:
print("Webに表示された文字に変化がありました!!!!!!!!!!")
diff_start = next((i for i, (a, b) in enumerate(zip(m_web_txt_1, m_web_txt_2)) if a != b), None)
print(f"変化のあった場所: {diff_start}文字目")
print(f"前のデータ: {m_web_txt_1[max(0, diff_start-15):diff_start+15]}")
print(f"後のデータ: {m_web_txt_2[max(0, diff_start-15):diff_start+15]}")
with open(web_html_2, "w", encoding="utf-8") as file:
file.write(m_web_html_2)
with open(web_txt_2, "w", encoding="utf-8") as file:
file.write(m_web_txt_2)
print("変化データを html_2 と txt_2 ファイルに書き込みました。")
# ビープ音
beep_5(5,1000)
time.sleep(60) # 60秒
# if file_test_1 == "file-test": 「無条件の実行」
m_web_html_1 = load_file_to_memory(web_html_1)
m_web_txt_1 = load_file_to_memory(web_txt_1)
print("無条件で初期値をファイルからメモリに再読み込み。")
# 以上「while True:」までの無限ループ
if __name__ == "__main__":
main()
driver.quit() # Chromedriverの終了
print("GIA_Chrome_sub を終了しました。")
====================(以上が「GIA-Chrome-Sub.ipynb」ファイル:ソースコード)
【補足1】
1.上記「01-jupyterlab.bat」をダブルクリックでプログラム起動をすると下記のJupyterLab画面が表示されます。
2.上記「GIA-Chrome-Sub.ipynb」ソースコードの入力が完了したJupyterLab画面が下記です。
この画面からでもPythonプログラムを実行できます。Runの「▶」を押せば実行します。
・実行形式EXEプログラム: https://timst.sakura.ne.jp/999/Web-Check.zip
以上
著者:TimST (改変は自由のフリーソフトです。) 2025/02/24版