Python feedparserでWordPressのRSSフィードから新着記事をチェック

公開 | 更新 

dlvr.itの無料プラン廃止を受け、WordPressサイト記事のRSSフィードをPython のfeedparserライブラリで解析、新着記事を抽出する仕組みを自前で構築します。

dlvr.it無料プラン廃止

IFFFTがTwitter連携を有償化したことから、WordPressの新記事をツイートする仕組みを、dlvr.itへ移行したのが昨年。 それも一年ちょっとでまた同じ憂き目に。

2024年8月にサービスプランの見直しと称した無料プランの廃止に伴い、9月から2週間のお試し期間の後、divr.itからツイートされることは本当に無くなりました。

図1.dlvr.it無料サービス終了通知

図1.dlvr.it無料サービス終了通知

これを受け、RSSフィードを読み込んで新着記事をツイートする仕組みをPythonで組んでみようと思います。なお、本記事ではRSSフィードから新着記事を取り出すところまで。

 

WordPress RSSフィード設定確認

開発を始める前に、RSSフィードを吐き出すWordPressのフィードに関する設定を確認。管理画面の左メニューの 設定表示設定 を開き、フィードの各投稿に含める内容をデフォルトの 全文 ではなく、 抜粋 にしていることを確認します。

知らずに 全文 のままにしていたら以降の開発デバッグが難儀するほか、コピーサイト防止の点でも 抜粋 に留めるのが望ましいのだそう。

図2.フィードに含める内容設定

図2.フィードに含める内容設定

feedparserのインストール

PythonでRSSフィードを取り扱うのに必要なのが、feedparserライブラリです。

今回は、Oracle Cloud上のUbuntu 20.04ベースの仮想マシン上に構築。Python 3.8がインストールされていました。

pip自身の更新の後、pipでfeedparserをインストールします。

 

feedparserのエラーハンドリング

早速、feedparserを使って自身のサイトのRSSフィードを読んでみたり、正常に取得できなかった場合のエラーハンドリングを試してみるも、何やら不思議な現象に見舞われます。

パースの成否は .bozo.bozo_exception に格納されており、 .bozo1 かどうかで成否判定可能とあるのですが、実際は以下の通り。

結局、 .bozo によるハンドリングを諦め、フィードの中身が収められている .entries の長さを見ることにしました。

 

feedparserで得られるフィードエントリ

実際のコーディングを前に、feedparserで得られるRSSフィードエントリの書式を確認。

一つ一つの記事は辞書型で収録されており、 feed.entries はそのリスト型の集合体であることに留意しつつ、スクリプトを組み立てます。

 

動作フロー

今回作成するスクリプトの動作フローは、大まかに以下の通り。

 

  1. ローカルファイル有無・最終更新有無確認 ( os.path.isfile
    → ファイル有れば最終更新情報読み取り ( pickle.load
    → ファイル無ければ空っぽの最終更新情報変数定義
  2. RSSフィード読み込み ( feedparser
    → 異常なら即バッチ終了 ( if feed.entries == 0 )
    → 初回実行モードでは、最初のエントリをファイル出力して終了( pickle.dump )
  3. フィードエントリでループ ( feed.entries
    → エントリの日付( entry.published )と最終更新日付突き合わせ
    → 新しいエントリを別のリスト型変数へ格納(複数になる可能性も考慮)
  4. ループ終了後、新しいエントリを収めたリスト型変数を精査
    → 中身が複数なら、順番をリバース(日付時刻による降順→昇順に)
    → 中身が空っぽなら、新しい記事は無しにつき、即バッチ終了
  5. 新エントリのリストでループ
    → ツイート(API利用するか、 twikit など)
    → ツイート成功なら、そのエントリをローカルファイルへ上書き( pickle.dump )

 

このうち本記事では第4項までを記すこととし、実際にツイートする仕組みはいくつかの選択肢より、別途考察しようと思います。

 

初回実行モード

まず、手元に最終確認記事の情報が無い初回実行モードでは、RSSフィードの最初のエントリを取り出し、ローカルファイルに書き込むだけで終了させます。

 

更新チェックモード

次回以降は、feedparserで得られたRSSフィードのエントリ群と、ローカルファイルに格納された前回最新エントリの内容を一つ一つ突き合わせ、新しいものがあればそれを抜き出して記事タイトルとリンクを取得します。

 

実行結果例はこんな感じに。前回取得後、2つの新着記事が検出されました。

次回は、この新着記事情報をツイートする仕組みの構築です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA