新卒の頃にできてたかったなあとは思いつつ。
経緯
これを見て感化されました。
Agent-Skillsについては全くの無知なので(大丈夫か)今の自分でもギリギリ理解できる方法で実装します。
作ったもの

技術スタックとして積んでおきたいジャンルのニュースを毎朝9時にお届けしてくれるbotを作りました。
概要
Slackのincoming Webhookを使います。
Incoming Webhooks | Slack Developer Docs
マニュアルは色々書いてありますが読めなくても特に問題ありません(ほんとか)。

設定画面でどのチャンネルに通知を飛ばしたいのか等を記入してください。
次にgithubでプライベートリポジトリを作成します。

github Actionsを使うと.github/workflow配下に作成したymlファイルをvmが読み込んで実行してくれます。これを毎朝9時に定期実行しています。
無課金だと順番待ちが発生する為cronの実行から通知までには1時間~1時間半程度かかります。これを見越して定期実行の時刻を早めるといったライフハックが存在します。

yamlの作成例は下記です。
name: Daily Tech News on: schedule: - cron: "0 0 * * *" workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install dependencies run: pip install requests feedparser - name: Run script env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} run: python post_news.py
Slackから提供されているIncoming webhookのURLは必ずハードコーディングせず変数として扱ってください。そのままURLを記入するとコードを入手した悪意ある第三者にチャンネルのメッセージ通知を乗っ取られてしまいます。
次にリポジトリにメインとなるプログラムを配置していきます。
requirements.txtは以下です。
requests feedparser
メインプログラムは以下です。
import os import requests import feedparser from datetime import datetime, timezone, timedelta SLACK_WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL") JST = timezone(timedelta(hours=9)) today = datetime.now(JST).strftime("%Y/%m/%d") FEEDS = { "はてブ (IT)": "https://b.hatena.ne.jp/hotentry/it.rss", "Hacker News": "https://news.ycombinator.com/rss", "Qiita (AI)": "https://qiita.com/tags/ai/feed", } def fetch_news(): messages = [] for name, url in FEEDS.items(): try: feed = feedparser.parse(url) for entry in feed.entries[:2]: messages.append(f"• <{entry.link}|{entry.title}> ({name})") except: pass return messages[:24] def post_to_slack(news_list): if not news_list: return payload = {"text": f"📅 *{today} のテックニュースまとめ*\n\n" + "\n".join(news_list), "username": "Newsbot", "icon_emoji": ":emoji:"} requests.post(SLACK_WEBHOOK_URL, json=payload).raise_for_status() if __name__ == "__main__": news = fetch_news() post_to_slack(news)
FEEDSの中に取り込みたいRSSのURLを書き込みます。
for entry in feed.entries[:2]: :
ここで1RSSの中から何件新着記事を取ってくるかを設定することが出来ます。
return messages[:24] :
全体の最大記事数を設定できます。3:2程のウィンドウなら個人的には16~24記事程度がおススメです。このくらいあると、毎日見ているうちに自分にとって必要な記事と不要な記事の棲み分けが分かってきます。
タイムゾーンをJSTにしていること、メッセージ通知をslackのincoming webhookのアイコンで飛ばさないようにbot用の絵文字を割り当てていることに注意してください。slack内で絵文字を追加する方法は以下です。
ワークスペースにカスタム絵文字とエイリアスを追加する | Slack
完成

これで毎日自分でやる気を出してブラウジングする手間が省けました。























