EZBBS.NETで移動情報を発信されている掲示板を定期的に巡回し、新着情報があれば表示する簡易的なプログラムをPythonで作ってみました。
最初に各掲示板を巡回し既存の情報を取得、その後は定期的に巡回し、新しい情報があれば表示するだけのプログラムです。
最後に移動運用によるサービスをしていただいている各局に感謝いたします。
-------------------------------------------------------------------------------
import time
import requests
from bs4 import BeautifulSoup
import sys
import re
# 巡回対象
TARGETS = {
"http://www3.ezbbs.net/08/kjrakip8/": "KJR",
"http://www3.ezbbs.net/09/backhoo0615/": "BPK",
"http://www3.ezbbs.net/35/jn1kwr/": "KWR"
}
# 表示させたくない文字
skip_words = {
"[ ホームページ ] [ 携帯用URL ]",
"ブログ引っ越しました、上記ホームページからどうぞ !!CQ Now !",
"文字色", "投稿KEY", "タグ有効",
"黒", "青", "赤", "紫", "緑", "水色", "黄色", "灰色",
"藍色", "青緑", "茶色", "ピンク", "オレンジ", "オリーブ", "シエナ",
"主に国内 CW/SSBのNow QRV局の情報や連絡などをどうぞ★お願い★E-mailの欄には、アドレスを入力しないで下さい。"
}
# 前回の投稿リストを保存
previous_posts = {url: [] for url in TARGETS}
# HTMLタグ除去用
TAG_RE = re.compile(r"<[^>]+>")
def clean_text(html):
"""HTMLタグを除去してテキストだけにする"""
text = TAG_RE.sub("", html)
return text.strip()
def extract_posts(url):
"""掲示板の投稿ブロックを抽出してテキスト化"""
try:
res = requests.get(url, timeout=10)
res.encoding = "shift_jis"
soup = BeautifulSoup(res.text, "html.parser")
# EZBBS.NET の投稿は <table> 内の <td> に入っていることが多い
tds = soup.find_all("td")
posts = []
for td in tds:
raw = str(td)
text = clean_text(raw)
# 投稿らしいものだけ抽出(短すぎるものは除外)
if len(text) > 20:
posts.append(text)
return posts
except Exception as e:
print(f"[エラー] {url}: {e}")
return []
# 既存の投稿を表示する
def old_post(posts):
for text in posts:
# 部分一致で除外
if not any(word in text for word in skip_words):
text = text.replace('>', '>')
print(text)
if __name__ == "__main__":
# Windows の文字化け対策
sys.stdout.reconfigure(encoding='utf8')
print("=== 新規投稿抽出モード(60秒おき) ===")
print("------------------------")
while True:
for url, name in TARGETS.items():
posts = extract_posts(url)
if not posts:
print(f"{name} 掲示板は投稿が取得できませんでした")
print("------------------------")
continue
# 初回は保存だけ
if not previous_posts[url]:
print(f"\033[36m(初回取得 {name} 掲示板 )\033[0m")
print("------------------------")
previous_posts[url] = posts
# 既存Postの表示
old_post(posts)
print("------------------------")
continue
# 新規投稿を検出
new_posts = [p for p in posts if not p in previous_posts[url]]
# 新規投稿あり
if new_posts:
for p in new_posts:
p = p.replace('>','>')
print(f"\033[36m------ 新規投稿 {name} ------\033[0m")
print(p)
print("----------------------")
# 更新
previous_posts[url] = posts
time.sleep(60)