第8回:Raspberry Pi Pico WでNHKニュースを取得してみた

つぶやき

IoTデバイスを使って「自分だけのニュース端末」を作る——そんなことがRaspberry Pi Pico Wなら簡単にできます。
今回は、MicroPythonを使ってWi-Fi経由でNHKの最新ニュースを取得し、コンソールに表示するプログラムを実装してみました。

RSSフィードは、ニュースサイトが提供している「更新情報を機械的に取得するためのXMLデータ」です。
NHKの場合、以下のようなURLが公開されています。

分野RSSフィードURL
総合ニュースhttps://www3.nhk.or.jp/rss/news/cat0.xml
社会https://www3.nhk.or.jp/rss/news/cat1.xml
政治https://www3.nhk.or.jp/rss/news/cat2.xml
経済https://www3.nhk.or.jp/rss/news/cat3.xml
スポーツhttps://www3.nhk.or.jp/rss/news/cat4.xml
科学・文化https://www3.nhk.or.jp/rss/news/cat5.xml

この中から、今回は総合ニュース(cat0.xml)を取得してみます。


プログラムの概要

以下のコードをMicroPythonで実行すると、Wi-Fiに接続してNHKの最新ニュース5件を取得し、タイトルを表示します。

import network
import time
import urequests as requests
from secrets import secrets
from machine import Pin

# ======= 設定 =======
NEWS_URL = "https://www3.nhk.or.jp/rss/news/cat0.xml"  # NHKニュースRSS(総合)
MAX_RETRIES = 3
led = Pin('LED', Pin.OUT)

# ======= Wi-Fi接続 =======
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(secrets['ssid'], secrets['password'])

    print("Wi-Fi接続中...")
    for _ in range(20):
        if wlan.isconnected():
            print("✅ Wi-Fi接続完了:", wlan.ifconfig())
            led.value(1)
            time.sleep(1)
            led.value(0)
            return True
        time.sleep(1)

    print("❌ Wi-Fi接続失敗")
    return False

# ======= ニュースを取得 =======
def fetch_news():
    for attempt in range(1, MAX_RETRIES + 1):
        try:
            print(f"[{attempt}] ニュース取得中...")
            res = requests.get(NEWS_URL)
            xml_data = res.text
            res.close()
            return xml_data
        except Exception as e:
            print(f"ニュース取得エラー: {e}")
            time.sleep(3)
    raise RuntimeError("ニュース取得に複数回失敗しました。")

# ======= タイトル抽出(正規表現を使わずに) =======
def parse_news_titles(xml_data, limit=5):
    titles = []
    start = 0
    while True:
        start_tag = xml_data.find("<title>", start)
        end_tag = xml_data.find("</title>", start_tag)
        if start_tag == -1 or end_tag == -1:
            break
        title = xml_data[start_tag + 7:end_tag].strip()
        titles.append(title)
        start = end_tag + 8
    # 最初のタイトル(RSS全体のタイトル)を除外して上位5件を返す
    return titles[1:limit+1]

# ======= メイン処理 =======
def show_news():
    if not connect_wifi():
        return

    try:
        xml_data = fetch_news()
        titles = parse_news_titles(xml_data)

        print("\n📰【NHK最新ニュース】")
        for i, title in enumerate(titles, 1):
            print(f"{i}. {title}")

        print("\n✅ ニュース取得完了")

    except Exception as e:
        print("❌ ニュース取得エラー:", e)
    finally:
        wlan = network.WLAN(network.STA_IF)
        wlan.active(False)
        print("Wi-Fi切断")

# ======= 実行 =======
show_news()

コードのポイント解説

Wi-Fi接続

Pico WのWi-Fi機能を使ってインターネットに接続します。
接続が成功すると、LEDが一瞬点灯します。

wlan = network.WLAN(network.STA_IF)
wlan.connect(secrets['ssid'], secrets['password'])

このようにsecrets.pyにWi-Fi情報を分離しておくことで、ソースコード内にパスワードを直接書かずに済み、安全です。


ニュースRSSの取得

NHKのRSSフィードをHTTPリクエストで取得しています。
MicroPythonの軽量HTTPクライアントurequestsを使用しています。

res = requests.get(NEWS_URL)
xml_data = res.text

実行結果

実際の出力例は以下の通りです。

Wi-Fi接続中...
✅ Wi-Fi接続完了: ('192.168.1.3', '255.255.255.0', '192.168.1.1', '192.168.1.1')
[1] ニュース取得中...

📰【NHK最新ニュース】
1. 政府、経済対策を発表へ
2. 台風20号が接近中
3. 株価は反発、円安続く
4. 新型AIが注目集める
5. 大リーグ 大谷が快挙

✅ ニュース取得完了
Wi-Fi切断

応用アイデア

このプログラムをベースにすれば、以下のような拡張も簡単です。

  • 定期的にニュースを取得してメール送信
  • 液晶ディスプレイ(I2C接続)にニュースを表示
  • 天気予報APIと組み合わせて「今日のニュース+天気」を配信

IoTデバイスを使って「自分専用のニュースサーバー」を構築する第一歩になります。


  

コメント