この記事では、RSSからAIニュースを集め、同じ話題を重ねて読まないよう重複を避けつつ、OpenAI APIで短く要約し、Markdownメモに整える最小のパイプラインを作ります。
準備からツールの入れ方、Codexへの依頼文、動作確認、直し方までを一つずつ確認します。
この回のゴール
- できること:RSSからAIニュースを自動取得→重複除外→要約→Markdown保存までを1回で回す。
- 用意するもの:PC、VS Code、OpenAIアカウント、Python 3.10+、インターネット回線。
- 大切な約束:APIキーは環境変数で安全に管理し、要約は人が最後に目で確認してから使う。
最初に知っておきたい用語
- RSS:Webサイトの新着情報を決まった形で配る仕組み。新聞の見出しが一列に並ぶイメージ。
- パイプライン:作業を順番に自動で流す仕組み。ベルトコンベアのように次々処理する。
- 環境変数:アプリが参照する外部設定の引き出し。秘密の鍵をコード外に隠せる。
- 要約:長い文章の大事な点だけを短くまとめること。連絡ノートの要点だけ書く感覚。
- 重複除外:同じニュースを二度カウントしない工夫。既に読んだものに印を付けるイメージ。
- フィード:RSSの配信データ本体。複数の見出しやリンクが入った箱。
- レート制限:短時間に大量のリクエストを送らないための制限。順番待ちの整理券のようなもの。
- タイムアウト:返事が来なければ待つのをやめる時間の上限。置き去り防止のための約束。
1. この記事でできること
VS CodeでOpenAI Codexと一緒に、RSSからAIニュースを自動収集し、同じ話題を避けながら要約してMarkdownに保存する最小の仕組みを作ります。
たとえるなら、朝の支度の間に「新聞の切り抜き係」が見出しを集め、「要点メモ係」が短くまとめて、ノートに貼っておいてくれる感じです。
2. 完成イメージ
- 1回の実行で、RSSを取得→重複除外→OpenAI APIで要約→Markdownファイルに保存。
- 決めたフォルダに「YYYY-MM-DD_ai_news.md」のようなファイルが並ぶ。
- 各項目にタイトル、要約、出典リンク、取得時刻が入る。
- 毎朝1本のコマンド実行で、その日の要約メモができる。
完成後は、朝食のトーストが焼ける間に「今日の見出しノート」ができあがるイメージです。
3. 最初に知っておきたいこと
- RSSは「新聞の切り抜き箱」。更新があると見出しとリンクを受け取れます。
- パイプラインは「ベルトコンベア」。取得→整形→要約→保存の順で流れます。
- 重複除外は「既読マーク」。同じ話題を何度も読まないために必要です。
- 人の最終確認は「検品」。誤要約や文脈違いを止め、信頼を守ります。
料金・仕様は変わることがあります。OpenAI APIの料金や制限は公式のOpenAI API Quickstartで最新を確認してください。
4. 対象読者

- 情報収集の時間を減らしたいビジネスパーソン。
- RSSを初めて使う人。
- Pythonの基本をこれから触る人。
学校の係活動のように「役割を分担」して動かすと覚えやすいです。取得係、整形係、要約係、保存係がいると考えましょう。
5. 必要なものと入れ方
ここで言う「入れ方」は、画面でどこを押すかまで示します。途中で分からなくなったら、この章に戻って確認してください。
VS Code(エディタ)
- これは何?:文章を書くノートの高機能版。ファイルを整理しながら作業できます。
- 用意するもの:インターネット接続、PCの管理者権限、Webブラウザ。
- 入れ方・開き方:公式サイトを開き、Windows/macOS/Linuxに合ったインストーラをダウンロードし、案内に沿ってインストール後、アプリを起動します。
- 最初の設定:日本語表示にしたい場合は拡張機能で「Japanese Language Pack」を追加します。
- できたか確認:「Welcome」画面と左側のアイコン(エクスプローラーなど)が表示されていればOKです。
Python(実行環境)
- これは何?:指示を書いたレシピ(スクリプト)を実際に動かすための台所。
- 用意するもの:インターネット接続、PC。
- 入れ方・開き方:公式のPythonをインストールします。Windowsではインストーラで「Add Python to PATH」にチェック、macOSでは.pkgを開いて案内に従います。
- 最初の設定:VS Codeを開き、左下のPythonバージョン表示をクリックしてPython 3.10以上のインタプリタを選びます。
- できたか確認:VS Codeのステータスバーに選択したPythonバージョンが表示されればOKです。
OpenAI Codex(コーディングエージェント)
- これは何?:説明文からコードを書いてくれる頼れる相棒。家で宿題を手伝う家庭教師のような存在です。
- 用意するもの:OpenAIのアカウント、インターネット接続。
- 入れ方・開き方:VS Code左側の四角いアイコン(拡張機能)を押し、検索ボックスに「Codex」と入力。OpenAIが提供するCodex拡張を選び、「インストール」をクリック。完了後、サイドバーにCodexのアイコンが現れます。
- 最初の設定:拡張を開き、「サインイン」をクリックし、指示に従ってOpenAIアカウントまたはAPIキーで認証します。完了後、「新しいチャット」を押してチャット欄を開きます。
- できたか確認:VS Code内にCodexのチャット欄が開き、メッセージを入力できればOKです。
feedparser(RSS解析ライブラリ)
- これは何?:RSSの箱から中身(見出しやリンク)を取り出す道具。缶切りのような役割です。
- 用意するもの:Pythonが使える状態。
- 入れ方・開き方:このライブラリの導入や設定は、後の手順でCodexに任せます。人が直接コマンドを打つ必要はありません。
- 最初の設定:特別な事前設定は不要です。必要になったときにCodexがセットアップします。
- できたか確認:後の「動かして確認する」で、実際にRSSを読めれば成功です。
6. エージェントと作るものの全体像

作るものは、小さなフォルダ構成のアプリです。
たとえば、学校の係分担表のように、役割を分けて考えます。
- フォルダ構成:src/ と data/。設定は環境変数で管理します(.envは使いません)。
- 処理の流れ:フィード取得→正規化→既読・重複判定(URL/タイトル正規化)→要約→出力。
- 失敗時のリトライとログ:失敗したら待ってから再試行、経過はログに記録。
自転車の補助輪のように、最初は最小の機能で転ばないことを大事にします。
7. 手順1: ツールを準備する
目的と全体像
ここでは、VS Code、Python、Codexを使える状態にし、Codexのチャットが開けるかを確認します。準備は机を片付けるのと同じ。道具が揃えば、作業が進みます。
画面での操作
- VS Codeを開く → 左の拡張機能で「Python」を検索 → MicrosoftのPython拡張を「インストール」。
- 左下のPythonバージョン表示をクリック → Python 3.10以上を選択。
- 拡張機能で「Codex」を検索 → OpenAIのCodex拡張を「インストール」 → 拡張を開き「サインイン」。
- Codexの「新しいチャット」を押して、入力欄が表示されるか確認。
成功の見分け方
- VS Codeのサイドバーに「Codex」アイコンがある。
- チャット欄にメッセージを入力できる。
- ステータスバーにPython 3.10+が選ばれている。
困ったら
拡張が見つからないときは、インターネット接続とVS Codeのバージョンを確認。Pythonが選べないときは、OSにPythonが入っているかを確認してください。
8. 手順2: APIキーを安全に用意する

目的
APIキーは秘密の鍵です。コードや共有フォルダに書かないことが大切です。ここでは環境変数で設定します。
考え方
- キーは人が管理して、コードには入れない。
- テスト用の一時キーを使い、作業後はローテーション(新しい鍵に切り替え)を考える。
設定手順(概要)
- Mac/Linux:システムの環境変数にOPENAI_API_KEYを設定します。
- Windows:システムの環境変数に同名の変数を追加します。
具体的な設定画面の操作は、使っているOSの環境設定メニューに従ってください。設定後、VS Codeを再起動して反映させます。値はこの記事に書かないでください。
確認
後の手順でCodexに「環境変数からキーを読むコード」を作ってもらい、実際にAPI呼び出しが通るかで確認します。キーは常に自分の管理画面で有効期限や使用量を見てください(料金・仕様は変動します。最新はOpenAI API Quickstartを参照)。
9. 手順3: エージェントにアプリを作ってもらう
目的
人は要件を言葉で伝え、Codexが設計と実装を行います。キッチンで「メニューを説明→料理人が作る」に近い流れです。
このボックスをコピーして、VS Code内のCodexチャットに送ります
Codexに送るプロンプト
あなたはVS Code上で動くOpenAI Codexです。以下の要件で最小のニュース要約パイプラインをプロジェクトとして作成し、動作確認まで案内してください。人がコードを打たずに済むよう、必要な操作やコマンドはすべて手順として提示し、ファイルはあなたが生成してください。
[目的]
- RSSからAI関連ニュースを取得し、重複を避けて要約し、Markdownで出力する最小構成を作る。
[前提]
- フォルダ構成は root配下に src/ と data/ を作成。設定は環境変数を使い、.envは使わない。
- Python 3.10+ を想定。
[機能要件]
1) フィード取得
- urllib.request でHTTP取得(適切なUser-Agent、タイムアウト、リトライ実装)。
- feedparser でRSS/Atomを解析し、entriesの title, link, published/updated, summary を取り出す。
- ETag/Last-Modified対応は今回は任意。まずは確実な取得を優先。
2) 正規化・重複除外
- タイトルとURLを正規化(前後空白除去、小文字化、クエリやフラグメントの扱い方針をコメントで明記)。
- data/seen.json(既読リスト)を用いて、既出URL/タイトルはスキップ。ファイルは存在しなければ自動作成。
- 近いタイトルの類似度チェック(例:編集記号の差分を吸収する)を用意し、しきい値は設定値として変更可能にする。
3) 要約
- OpenAI APIを呼び出して各記事を日本語で要約(箇条書き3〜5点、出典URL明記、誇張・断定を避ける指示を含む)。
- 認証は環境変数 OPENAI_API_KEY を参照。コードに鍵の実値は絶対に書かない。
- タイムアウト、レート制限(指数バックオフ)、失敗時の再試行とログを実装。
- モデル名は設定で変更可能にして、設定値が空の場合はわかりやすいエラーメッセージを出す。
4) 出力
- data/ 配下に YYYY-MM-DD_ai_news.md を生成。
- 見出し、要約箇条書き、出典リンク、取得時刻、元タイトルを含むテンプレートで整形。
- 実行ログをコンソールと data/logs/summary_YYYYMMDD.log に出力。
[設計]
- src/config.py(設定値とデフォルト、環境変数読取)
- src/fetch.py(取得と解析、リトライ)
- src/dedupe.py(正規化と重複・類似度判定)
- src/summarize.py(OpenAI API呼び出しとバックオフ)
- src/output.py(Markdown整形と保存、ログ出力)
- src/main.py(全体の実行フロー)
- data/seen.json(既読管理)、data/logs/(ログ格納)
[安全]
- APIキーは環境変数のみから取得。Gitに鍵やトークンを含めない注意書きをREADMEに明記。
- 例示用にダミー値を出すときは <YOUR_OPENAI_API_KEY> のようにし、実値は書かない。
[テスト・確認]
- サンプルRSS(複数本)で試せる main.py の実行手順を説明。
- 初回実行で data/seen.json が作成されること、重複がスキップされること、Markdownが生成されることを確認させる。
- 想定される失敗(URLError、レート制限、トークン上限)時の挙動をログで示し、再実行方法を記載。
[不明点があれば]
- 実行前に不足情報(フィードURL、出力先フォルダなど)を質問してください。
- 途中でエラーが出たら、エラーメッセージと次の試行手順を私にわかる言葉で提示してください。
Codexが作るものと、あなたが確認する点
- src/ と data/ のフォルダ、各Pythonファイル、READMEの自動生成。
- 環境変数からAPIキーを読む実装と、エラー時のわかりやすい表示。
- data/seen.json が初回に作られ、2回目以降は既読スキップが働く。
- data/ に日付入りのMarkdownが出力され、要約と出典リンクが並ぶ。
- 失敗時のリトライとバックオフがログに残る。
10. 手順4: 動かして確認する

目的
実際にサンプルRSSで動かし、出力とログを目で確かめます。料理の味見にあたります。
操作
- Codexの案内に従ってプロジェクトを開き、main.pyの実行方法の指示を読みます。
- サンプルRSSを設定し、実行後に data/ フォルダとログの中身を確認します。
- Markdownの各項目で、タイトル・要約・出典リンク・取得時刻が正しく並んでいるかを確認。
成功の見分け方
- data/ にその日付のMarkdownができている。
- 同じ記事が繰り返されていない(重複除外が効いている)。
- ログに「要約開始」「再試行」「完了」などの行が並ぶ。
困ったら
要約の質が低い、または出力が空の場合、フィードURLの妥当性やAPIキー設定、レート制限の発生を確認してください。原文リンクから一次情報を必ず見て、誤要約を防ぎます。
11. 手順5: エージェントと直す
目的
使ってみて気づいた点をCodexと一緒に改善します。自転車のサドル高さを少しずつ合わせる感覚です。
改善ポイント例
- 重複判定の厳しさ:タイトル類似度のしきい値を上げ下げして、近い見出しの扱いを調整。
- 要約プロンプト:箇条書き数、出典明記、断定回避の指示を調整。
- 再試行:待機時間や回数、最大同時実行数の制御を見直し。
Codexへの頼み方の例
Codexチャットで「タイトル類似度のしきい値を0.8→0.7に。設定から変更できるようヘルプ文も追加して」と具体的に伝えます。変更後は再実行して効果を確認しましょう。
12. よくあるエラー

URLError / HTTPError
- 画面で見えること:取得時にタイムアウトや404/500などの表示。
- よくある原因:ネットワーク不安定、User-Agent不足、URL間違い。
- 最初に確認する場所:フィードURL、ネット接続、User-Agent設定。
- エージェントに送る質問:「URLErrorが出ました。User-Agentを明示し、タイムアウトを10秒、最大3回の指数バックオフで再試行するよう直してください。」
feedparserのbozoフラグ
- 画面で見えること:解析結果に bozo=1 とエラー情報。
- よくある原因:フィードの形式崩れ、文字コードの不一致。
- 最初に確認する場所:bozo_exception、エンコーディング。
- エージェントに送る質問:「bozo=1です。寛容にパースし、壊れたエントリはスキップするロジックを追加してください。」
OpenAI APIの認証/レート制限/トークン上限
- 画面で見えること:401/429エラー、最大トークン超過のメッセージ。
- よくある原因:APIキー未設定、短時間の呼び出し過多、入力長すぎ。
- 最初に確認する場所:環境変数OPENAI_API_KEY、呼び出し間隔、要約入力の長さ。
- エージェントに送る質問:「429が出ます。指数バックオフと最大再試行回数を増やし、同時実行を抑える修正をしてください。」
文字コードや絵文字での失敗
- 画面で見えること:UnicodeDecodeErrorや文字化け。
- よくある原因:出力時のエンコーディング不一致。
- 最初に確認する場所:入出力のエンコーディング指定(UTF-8)。
- エージェントに送る質問:「UTF-8で読み書き固定にし、絵文字は安全に落とす/置換するオプションを追加してください。」
13. 次に試すこと
- ETag/Last-Modifiedで増分取得にして、通信量と実行時間を節約。
- 社内ポータルへの自動下書き連携(人が承認して公開)。
- 週次ダイジェストを自動生成し、週末に振り返るメモを作成。
次の一歩は、朝の散歩コースを整える作業に似ています。少しずつショートカットを見つけましょう。
14. まとめ

最小構成で動かし、人が最後に確認する安全設計が鍵です。
Codexと分担すれば、「設計は人・実装はエージェント」の型を自然に身につけられます。習い事の基礎練習のように、毎朝の実行と見直しを続ければ、精度と速さは確実に上がります。
参考リンク(公式)
- Python urllib.request:HTTP/HTTPSの取得、タイムアウト、エラー処理の公式解説。
- feedparser documentation:RSS/Atom解析、entriesやETagの扱い。
- OpenAI API Quickstart:セットアップ、認証、料金・レート制限の確認。