Install
openclaw skills install @matthewdflee/news-briefingAutomated daily news briefing system that fetches Twitter/X posts, generates star-rated summaries, and delivers them via Feishu/Lark. Supports Scweet precise fetching with VPN and WebSearch fallback. Configurable sources, scheduling, and briefing format.
openclaw skills install @matthewdflee/news-briefingThis skill encapsulates a complete Twitter/X news briefing automation system that:
News Briefing System
├── Data Layer: Fetch tweets from configured accounts (last 24h)
├── Dedup Layer: Skip already-seen content by tweet_id
├── Briefing Layer: AI generates star-rated summary (max 12 items)
├── Delivery Layer: Send via Feishu/Lark bot
├── Anti-repeat Layer: Daily sent_log prevents duplicate sends
└── Schedule Layer: Runs at intervals, exits early if already sent
project-directory/
├── config/sources.yaml # Information source config (blogger list)
├── scripts/fetch_tweets.py # Scweet tweet fetching script
├── data/sent_log.json # Send status tracking
├── data/seen_tweets.json # Seen content dedup (by tweet_id)
├── data/tweets_raw.json # Raw fetched tweet data
└── .workbuddy/memory/ # Project memory
Create config/sources.yaml with your selected accounts organized by category:
ICT Trading:
- handle: example_trader1
name: Example Trader 1
followers: "100K"
US Stocks:
- handle: example_trader2
name: Example Trader 2
followers: "200K"
AI:
- handle: example_ai1
name: Example AI Researcher
followers: "150K"
Install Scweet for precise Twitter/X data fetching:
pip install scweet
Create scripts/fetch_tweets.py (see scripts/fetch_tweets.py in this skill for the full template). Key configuration:
AUTH_TOKEN: Your Twitter/X auth_token (get from browser: login to x.com, F12, Application, Cookies, auth_token)ACCOUNTS: Dictionary mapping categories to lists of handlesCreate data/sent_log.json:
{
"last_sent_date": "",
"last_sent_time": "",
"history": []
}
Create data/seen_tweets.json:
{
"items": [],
"last_cleanup": ""
}
lark-cli auth status --json --verifyCreate a recurring automation in WorkBuddy with:
FREQ=DAILY;BYHOUR=10,12,14,16,18,20;BYMINUTE=0The automation prompt should follow the six-step workflow below.
Read data/sent_log.json. If last_sent_date equals today, output "Already sent today, exiting" and stop immediately.
Option A: Scweet Precise Fetching (requires VPN/proxy)
python3 scripts/fetch_tweets.py --hours 24 --limit 5 --output data/tweets_raw.json
Option B: WebSearch Fallback (VPN not connected)
Search each category's accounts using WebSearch. Collect results from the last 24 hours.
VPN Status Marker: If Scweet succeeds, add a VPN emoji to the briefing title. If WebSearch fallback is used, do not add the emoji.
Read data/seen_tweets.json. Skip any tweets whose tweet_id matches existing entries.
Category-@Blogger-CoreContent-TradingImpact-OtherSignificance📰 Daily Briefing | {date} {HH:MM} VPN📰 Daily Briefing | {date} {HH:MM}— {N} items / Scweet / next update {time}— {N} items / WebSearch / next update {time}Important: When Scweet succeeds, use ONLY Scweet data. Do not mix with WebSearch results.
📰 Daily Briefing | 2026-07-16 10:00 VPN
⭐⭐⭐
1️⃣ Finance-@example-Market drops 5% on rate fears-Highly impacts SPY/QQQ-Risk-off sentiment rising
2️⃣ Tech-@example-New AI chip announced-Low impact on sector-Competitive landscape shifting
⭐⭐
3️⃣ US Stocks-@example-ES futures grind higher-Highly impacts long strategies-Maintain long positions
⭐
4️⃣ AI-@example-New research paper published-No direct impact-Watch for commercialization timeline
— 4 items / Scweet / next update 12:00
If no valuable new content across all categories, output "No significant updates today" and end without marking as sent.
lark-cli im +messages-send --user-id {YOUR_OPEN_ID} --as bot --text $'briefing content'
ok: true -> SuccessAfter confirmed send success:
Update data/sent_log.json:
last_sent_date to today (YYYY-MM-DD)last_sent_time to current time (ISO 8601)history array: {"date": "today", "time": "now", "preview": "first 50 chars"}Update data/seen_tweets.json:
{"tweet_id": "id", "username": "handle", "summary": "summary", "date": "today", "seen_at": "now"}last_cleanup to todayUsers can add new bloggers by saying in conversation: "Add {category} blogger {handle}"
The AI then automatically:
config/sources.yaml under the appropriate categoryscripts/fetch_tweets.py in the ACCOUNTS dictionarySee references/add-blogger.md for detailed instructions.