👋

AIが選んでくれるRSS LINE Botを作った

に公開

はじめに

Claude Codeオモロイやん、と思い毎日ニュースを送ってくれるなんちゃってRSS LINE Botを作りました。
コードは99%くらいをClaudeに書いてもらいました(GitHub Actionsのワークフローのtimeout設定を書いたくらい)。

実際のLINE通知

もう少し下までありますが、ほぼ同じなので省略。

機能一覧

  • 環境変数で読み込む対象RSSのリスト、LINEに配信するカテゴリ、カテゴリごとの最大件数を設定
  • GitHub Actionsで定期実行
  • 複数RSSから過去24時間の記事を一括取得
  • OpenAIでカテゴリ別に分類・選別・件数絞り込み・日本語翻訳(1回のAPI呼び出し)
  • LINEに配信

アーキテクチャ

めっちゃシンプルです。

準備

OpenAI API

アカウント作ってポチポチしてたらAPI Keyを簡単に発行できます。

https://openai.com/ja-JP/index/openai-api/

LINE Messaging API

こちらもポチポチやってたらできます。今回のような1日1回配信のBotなら無料です。
分からんくなったら、Claudeに聞きました。

アイコン画像はBotぽいものにしたかったので、こちらもClaudeに作ってもらい設定しました。

https://developers.line.biz/ja/

チョットダケこだわったところ

LINEへの通知

Claudeと親和性のあるNotionにしようかなと考えましたが、わざわざ見るとは思えなかったので、一番見る可能性のあるLINEにしました。

とにかく安く

ランニングコストはとにかく安く(というか無料であること)にこだわりました。
そうじゃないと長く使えないので。

定期実行

AWSをよく使うので、EventBridge + Lambdaの構成も検討しましたが、よりお手軽かつ無料のGitHub Actionsを選定しました。

環境変数

OpenAI APIを使うAPI Key、LINEのチャンネルアクセストークンといったSecret以外で下記を環境変数で注入しています。これで細かい調整をするときに何度もソースコードを修正する必要がなくなります。

内容
読み込む対象RSSのリスト ["http://example.com","http://example.com#2"]
LINEに配信するカテゴリ(name)、カテゴリごとの最大件数(max) [{"name":"金融","max":5},{"name":"芸能","max":5},{"name":"AI","max":5}]

AIモデル

gpt-4o-miniを使っています。
が最初は無料枠があり、価格も他より安価なGemini APIを使おうとしましたが、次の理由でOpenAI APIとしました。

  • Gemini APIに無料枠があるものの、ハードリミットの設定がなさそうだった(Google Cloudを普段使わないのであったらスイマセン)。意図せず高額請求になるのを懸念した
  • 一方でOpenAI APIでハードリミットの設定ができた
  • 昔OpenAI APIを使った時のCreditが残っていた
  • Gemini APIの方が安いものの、OpenAI APIでも気にならない程度のコストだった
  • とりあえず作ってみたかっただけなので、AIの精度は気にしなくていい(どっちでも変わらん)

AIに渡すプロンプト

そこまでこだわったところではないですが、AIに渡すプロンプトは下記です。
受け取る形式はLINE Messaging APIで使いやすい形式にしています。

以下のRSS記事リストを、指定されたカテゴリに分類して選別してください。

【選択条件】
- 各カテゴリのテーマに合致するもの
- 注目度・話題性が高く、多くの人が関心を持ちそうなもの

【カテゴリ設定】
[{"name":"金融","max":5},{"name":"芸能","max":5},...]

【記事リスト】
[{"index": 0, "title": "...", "summary": "...", "source": "..."}, ...]

【出力形式】
各カテゴリごとに条件に合う記事を選び、以下のJSON形式で返してください。
各カテゴリの記事数は max 以内にしてください。無理にカテゴリに当てはめる必要はなく、該当する記事がなければ空配列にしてください。
指定されたカテゴリ以外のキーは絶対に含めないでください。
どのカテゴリにも属さない記事は出力しないでください。
titleとsummaryは必ず日本語にしてください(元が日本語でも、英語でも、日本語で出力してください)。
以下の形式以外は出力しないでください。
{
  "カテゴリ名": [
    {"index": 0, "title": "日本語タイトル", "summary": "日本語の概要"},
    ...
  ],
  ...
}

良かったこと

ランニング(インフラ)コストが安価

お金がかかるのはOpenAI APIのみです。推定で1ヶ月20〜40円くらいです(記事数などにもよるので、あくまで推定です)。
私の場合、OpenAI APIのCreditが残っており、残りを有効活用できると考えたのでここは問題なし。

日本語訳してくれる

これが一番嬉しいかもしれません。海外のRSSを受け取るようにしてもタイトルが英語なので、読む気がイマイチしなかったストレスがなくなりました。

読む記事数を絞り込める

沢山のRSSを設定すると多すぎて読むのがしんどくなるのですが、これなら件数やカテゴリをカスタマイズできるので、タイパが良いです。

イマイチなところ

AIが選んだ情報しか見なくなるところ、でしょうか。

ゆめみ

Discussion