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('&gt;', '>')
            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('&gt;','>')
                    print(f"\033[36m------ 新規投稿 {name} ------\033[0m")
                    print(p)
                    print("----------------------")

            # 更新
            previous_posts[url] = posts

        time.sleep(60)

Turbo Hamlogのオプション(O)ーマスターデータをテキスト出力(O)で出力されたテキストファイル(master.txt)をExcelシートに読み込み、"master.xlsx"として保存するマクロです。
 

Hamlog自体にもExcelシートへ出力する機能がありますが、変換に時間がかかるので、テキストファイルから変換してみました。

 

このマクロはマスターデータ(master.txt)と同じディレクトリに置いてください。

ワークブックにはシート”Main"と”Master"をあらかじめ作成しておきます。
 

シート”Main"はマクロを実行するボタンなどを配置
シート”Master"は”Master.txtを読み込んだ結果が反映されます。

-------------------------------------------------------------------------------

Option Explicit

Sub MasterTextToExcel()

On Error GoTo ErrorHandler
    
    Dim ws As Worksheet
    Dim filePath As String
    Dim stream As Object
    Dim lines() As String
    Dim textLine As Variant
    Dim row As Long
    Dim i As Long, j As Long
    
    
    ' スクリーン更新をオフ
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' ワークシートを設定 ここではシート"Master"を設定
    Set ws = ThisWorkbook.Sheets("Master")
    ws.Cells.Clear
    ws.Cells.NumberFormat = "@" ' 文字列形式に設定
    
    ' タイトル行を設定
    ws.Range("A1:T1") = Array("No", "Code", "QTH", "Flag", "1.9", "3.5", "7", "10", "14", "18", _
                              "21", "24", "28", "50", "144", "430", "1200", "2400", "5600", "SAT")
    
    ' テキストファイルのパス
    filePath = ThisWorkbook.Path & "\master.txt"
    
    ' テキストファイル読み込み(Shift-JIS)
    Set stream = CreateObject("ADODB.Stream")
    With stream
        .Type = 2 ' テキスト
        .Charset = "Shift-JIS"
        .Open
        .LoadFromFile filePath
        lines = Split(.ReadText, vbCrLf)
        .Close
    End With
    
    ' 各行を処理
    row = 1
    For Each textLine In lines
        If Trim(textLine) <> "" Then
            row = row + 1
            ws.Cells(row, 1) = row - 1 ' No
            ws.Cells(row, 2) = Trim(Mid(textLine, 1, 6)) ' Code
            ws.Cells(row, 3) = RTrim(Replace(StrConv(MidB(StrConv(textLine, vbFromUnicode), 7, 34), vbUnicode), "   ", "")) ' QTH
            ws.Cells(row, 4) = StrConv(MidB(StrConv(textLine, vbFromUnicode), 41, 4), vbUnicode) ' Flag
            ' バンド別WKD/CFM
            j = 5
            For i = 45 To 75 Step 2
                ws.Cells(row, j) = Trim(StrConv(MidB(StrConv(textLine, vbFromUnicode), i, 2), vbUnicode))
                j = j + 1
            Next i
        End If
    Next
    
    ' Masterシートを別名保存
    ws.Copy
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Master.xlsx", xlOpenXMLWorkbook
    ActiveWorkbook.Close
    
    ' Mainシートに更新情報を記録(この部分は削除可)
    With ThisWorkbook.Sheets("Main")
        .Cells(2, 10) = "Master.xlsx " & Format(Now, "yyyy/mm/dd hh:nn:ss") & " 更新"
        .Activate
    End With
    ThisWorkbook.Save
    
    ' 後処理
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    MsgBox "データ読み込みが完了しました。", vbInformation
Exit Sub

ErrorHandler:
    If Not stream Is Nothing Then stream.Close
    MsgBox "エラーが発生しました。ファイルパスまたはデータ形式を確認してください。", vbCritical
End Sub