{"id":49574808,"url":"https://github.com/andyleimc-source/x-radar","last_synced_at":"2026-05-03T16:08:45.374Z","repository":{"id":352886842,"uuid":"1215055497","full_name":"andyleimc-source/x-radar","owner":"andyleimc-source","description":"Twice-daily digest of your favorite X (Twitter) accounts, analyzed and ranked by Claude, delivered to your inbox.","archived":false,"fork":false,"pushed_at":"2026-04-21T14:58:47.000Z","size":61,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T16:29:33.895Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andyleimc-source.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-19T12:23:44.000Z","updated_at":"2026-04-21T14:58:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/andyleimc-source/x-radar","commit_stats":null,"previous_names":["andyleimc-source/x-radar"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/andyleimc-source/x-radar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyleimc-source%2Fx-radar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyleimc-source%2Fx-radar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyleimc-source%2Fx-radar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyleimc-source%2Fx-radar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andyleimc-source","download_url":"https://codeload.github.com/andyleimc-source/x-radar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andyleimc-source%2Fx-radar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32575290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-03T16:08:43.668Z","updated_at":"2026-05-03T16:08:45.368Z","avatar_url":"https://github.com/andyleimc-source.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# X Radar · 灵感雷达\n\n\u003e 每天两次，把你关注的 X（Twitter）博主的新推抓回来，AI 分析 + 排序后邮件送到邮箱。给没时间刷 X 的人，做一份\"只看值得看的\"每日简报。\n\n- 📬 早 6 点 + 晚 10 点两次推送（时间、频率都可改）\n- 🧠 AI 写一段\"今日观察\"，抓出跨账号共鸣的主题\n- 📚 按对你的相关性排序，英文推自动附中文要点\n- 💾 原始 JSON 全量落盘，方便二次加工（写文章、做视频选题）\n- ✉️ 通过 `email-mcp` 发邮件（走任意 IMAP/SMTP 账号，不绑定某家邮箱服务商）\n\n数据源：[twitterapi.io](https://twitterapi.io)（稳定、便宜、支持支付宝）。\nLLM：[DeepSeek V4 Flash](https://platform.deepseek.com)（OpenAI 兼容 API，中文强，大陆直连，一次简报成本约 ¥0.05）。换 MiniMax / OpenAI / Claude 只需改 `.env` 里的 `DEEPSEEK_BASE_URL` + `DEEPSEEK_MODEL` + key。\n\n## 目录结构\n\n```\n.\n├── config/\n│   ├── accounts.yaml      # 关注列表（唯一真相源，改这里增删）\n│   └── settings.yaml      # 邮箱、时区、抓取规则\n├── data/\n│   ├── raw/\u003cdate\u003e/        # 每次抓取的原始 JSON\n│   ├── state/last_seen.json\n│   └── digests/           # 生成的每封 Markdown 简报\n├── prompts/analysis.md    # 分析 + 排序提示词（喂给 DeepSeek）\n├── scripts/\n│   ├── fetch_tweets.sh       # 抓一个账号最新推文\n│   ├── digest.py             # 主脚本：并发抓 + 过滤 + 调 DeepSeek + 写 digest\n│   ├── send-digest.sh        # 调度总控：跑 digest.py + 发邮件（launchd/cron 调这个）\n│   └── send-email-mcp.py     # 通过 email-mcp stdio JSON-RPC 发邮件\n└── .claude/commands/twitter-digest.md   # 历史：原 Claude Code 斜杠命令（已不在调度路径上）\n```\n\n## 快速开始\n\n前置条件：macOS / Linux · Python 3.10+ · `curl` · 一个 twitterapi.io 账号 · 一个 DeepSeek API key。\n\n```bash\ngit clone https://github.com/andyleimc-source/x-radar.git\ncd x-radar\ncp .env.example .env\n# 编辑 .env，填入 TWITTERAPI_IO_KEY 和 DEEPSEEK_API_KEY\npip3 install pyyaml    # 唯一运行期 Python 依赖\n```\n\n改 `config/accounts.yaml` 换成你自己关注的人。默认预置了 25 个 AI / SaaS / 低代码 / 营销技术领域的官号和关键人物。\n\n手动跑一次：\n\n```bash\npython3 scripts/digest.py morning    # 只生成 digest，不发邮件\nbash scripts/send-digest.sh morning  # 生成 + 发邮件（全流程）\n```\n\n首次会回填过去 24 小时的推文，之后按 `data/state/last_seen.json` 增量。\n\n## 部署：launchd + 邮件\n\n当前线上组合 —— **macOS launchd 定时 → `send-digest.sh` 执行 → email-mcp 发邮件**。纯本地，无外部调度依赖。\n\n### 1. 邮件渠道（email-mcp）\n\n装 [email-mcp](https://www.npmjs.com/package/email-mcp) 并配一个能发信的账号（IMAP/SMTP，任意服务商都行）：\n\n```bash\nnpm install -g email-mcp\nemail-mcp account add       # 交互式向导：起个 account 名字，填 IMAP/SMTP\nemail-mcp account list      # 确认配好\n```\n\n记下你起的 account 名（例如 `work`）。修改 `scripts/send-email-mcp.py` 里的 `ACCOUNT` 和 `TO` 两个常量。\n\n### 2. launchd 定时\n\n仓库里 `scripts/send-digest.sh \u003cmorning|evening\u003e` 就是总控。写两个 LaunchAgent，一次早间一次晚间：\n\n```bash\ncat \u003e ~/Library/LaunchAgents/com.andy.xradar.evening.plist \u003c\u003c'PLIST'\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n\u003cplist version=\"1.0\"\u003e\n\u003cdict\u003e\n  \u003ckey\u003eLabel\u003c/key\u003e\u003cstring\u003ecom.andy.xradar.evening\u003c/string\u003e\n  \u003ckey\u003eProgramArguments\u003c/key\u003e\n  \u003carray\u003e\n    \u003cstring\u003e/bin/bash\u003c/string\u003e\n    \u003cstring\u003e/Users/andy/xradar/scripts/send-digest.sh\u003c/string\u003e\n    \u003cstring\u003eevening\u003c/string\u003e\n  \u003c/array\u003e\n  \u003ckey\u003eStartCalendarInterval\u003c/key\u003e\n  \u003cdict\u003e\u003ckey\u003eHour\u003c/key\u003e\u003cinteger\u003e22\u003c/integer\u003e\u003ckey\u003eMinute\u003c/key\u003e\u003cinteger\u003e0\u003c/integer\u003e\u003c/dict\u003e\n  \u003ckey\u003eEnvironmentVariables\u003c/key\u003e\n  \u003cdict\u003e\u003ckey\u003ePATH\u003c/key\u003e\u003cstring\u003e/Users/andy/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin\u003c/string\u003e\u003c/dict\u003e\n  \u003ckey\u003eWorkingDirectory\u003c/key\u003e\u003cstring\u003e/Users/andy/xradar\u003c/string\u003e\n  \u003ckey\u003eStandardOutPath\u003c/key\u003e\u003cstring\u003e/Users/andy/Library/Logs/xradar/launchd-evening.out\u003c/string\u003e\n  \u003ckey\u003eStandardErrorPath\u003c/key\u003e\u003cstring\u003e/Users/andy/Library/Logs/xradar/launchd-evening.err\u003c/string\u003e\n\u003c/dict\u003e\n\u003c/plist\u003e\nPLIST\n\nlaunchctl load ~/Library/LaunchAgents/com.andy.xradar.evening.plist\n# 早间把 evening 全替换成 morning，Hour 改 6\n```\n\n`PATH` 里必须带 `claude` 的目录（`~/.local/bin`）和 `python3` 的目录（Homebrew 的 `/opt/homebrew/bin`），launchd 默认 PATH 不含这些。\n\n### 3. 查看 / 停启 / 手动触发\n\n```bash\nlaunchctl list | grep xradar                                  # 查看状态（第二列是上次退出码）\nlaunchctl unload ~/Library/LaunchAgents/com.andy.xradar.*.plist\nlaunchctl load   ~/Library/LaunchAgents/com.andy.xradar.*.plist\nlaunchctl start  com.andy.xradar.evening                      # 立刻手动跑一次\nbash scripts/send-digest.sh evening                           # 或直接命令行跑\n```\n\n日志在 `data/state/launchd-\u003cslot\u003e.log` / `.err.log`。\n\n## 成本参考\n\ntwitterapi.io 计价：每返回 1 条推文 15 credits，$1 = 100,000 credits。\n默认 25 个账号 × 每次每号 ~20 条 × 2 次/日 ≈ 15,000 credits/日。\n**$10 约可跑 2 个月以上**。\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandyleimc-source%2Fx-radar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandyleimc-source%2Fx-radar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandyleimc-source%2Fx-radar/lists"}