你还在手动刷新闻、自己猜各国立场?

我是沈知夏。上周我在做地缘政治风险监测时,每天要刷10多家媒体:ynetnews(以色列视角)、Press TV(伊朗)、白宫官网、Al Jazeera……光看标题就花40分钟,还得手动对比各方怎么说美伊协议。直到我写了一个自动化工作流——每天早上8点,Tavily自动抓取最新报道,Claude分析并提取立场标签,数据自动写入Notion数据库。现在打开Notion就能看到:

来源 摘要 对伊朗态度 对以色列态度 关键金句
Ynetnews 以色列认为备忘录让伊朗成为赢家 负面 担忧 “失望且有问题”
Press TV 伊朗称协议是外交胜利 正面 未提及 -
白宫 框架性谈判,涉及制裁缓解 中立 不评论 -

从阅读到分析,全程自动化,耗时最多2分钟(检查异常)。

自动化前后效果对比

维度 手动(之前) 自动化(之后)
时间消耗 45-60分钟/天 2分钟(浏览+判断)
覆盖源数 4-5个(人肉切换) 10+个(Tavily同时搜索)
立场分析 主观记忆 结构化标签,可对比
历史检索 散落在浏览器收藏夹 Notion数据库可筛选、排序

工具组合与流程图

核心链:

text
1
Tavily API (新闻搜索) → 数据清洗 (Python script) → Claude API (立场分析) → Notion API (写入数据库)

触发方式: 每天8:00通过GitHub Actions(免费计划)或Zapier定时任务启动Python脚本。

工具清单

  • Tavily API:专为AI搜索优化的搜索引擎,支持按源、时段筛选,返回结构化结果(标题、摘要、URL、发布时间)。月免费额度1000次调用。
  • Claude API(或ChatGPT API):用于提示词分析。推荐Claude Haiku,速度更快,成本每百万token约$0.25。
  • Notion API:创建数据库,字段包括:标题、来源、日期、摘要、立场_伊朗、立场_以色列、关键金句、原始URL。
  • **Python 3.10+**:脚本胶水。

关键节点配置(可直接复制)

1. Tavily搜索配置

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 搜索美伊协议相关新闻,指定来源为ynetnews和Press TV
from tavily import TavilyClient

tavily = TavilyClient(api_key="YOUR_TAVILY_KEY")

query = "US Iran memorandum deal 2026" + \
        " source:ynetnews.com OR source:presstv.ir OR source:whitehouse.gov"

response = tavily.search(
    query=query,
    days=2,  # 只取最近2天
    max_results=10,
    include_raw_content=False
)

注意: Tavily的source过滤支持域名,但需要写完整URL。如果想同时搜中文媒体,加OR source:huanqiu.com

2. Claude提示词模板

这是最关键的部分。你需要让模型输出结构化JSON,方便后续写入Notion。

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
你是国际政治分析师。请分析以下新闻标题和摘要,输出JSON格式。

输入:
标题:{title}
摘要:{summary}
来源:{source}

请分析:
1. "立场_伊朗":取值 "正面" / "负面" / "中立" / "未提及"。判断依据:对伊朗核计划、制裁缓解、地区影响力的评价。
2. "立场_以色列":同上。
3. "关键金句":原文中最能体现立场的1-2句话,用双引号括起来。
4. "摘要_50字":用50字以内中文总结核心事实(不包含立场评价)。

输出严格JSON格式,不要加额外文字。
{
  "立场_伊朗": "",
  "立场_以色列": "",
  "关键金句": "",
  "摘要_50字": ""
}

调试技巧: 如果模型经常输出错误字段名,在system message里加一句“只输出JSON,不要用markdown代码块”。另外,对于“未提及”的情况,模型可能会强行编造。可以在user prompt末尾加“如果原文未提及某个国家,不要推测,直接写'未提及'”。

3. Notion数据库字段

创建Database时,API需要提前拿到Database ID。字段类型:

字段名 类型 备注
title title 自动
source rich_text 域名
date date 发布日期
iran_stance select 选项:正面/负面/中立/未提及
israel_stance select 同上
key_sentence rich_text 关键金句
summary rich_text 50字摘要
url url 原文链接

写入代码片段(Python + notion-client):

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from notion_client import Client

notion = Client(auth="YOUR_NOTION_TOKEN")

db_id = "xxxxxxxxx"  # 从浏览器URL复制

for item in analyzed_results:  # item是Claude返回的dict
    notion.pages.create(
        parent={"database_id": db_id},
        properties={
            "title": {"title": [{"text": {"content": item["title"]}}]},
            "source": {"rich_text": [{"text": {"content": item["source"]}}]},
            "date": {"date": {"start": item["date"]}},
            "iran_stance": {"select": {"name": item["立场_伊朗"]}},
            "israel_stance": {"select": {"name": item["立场_以色列"]}},
            "key_sentence": {"rich_text": [{"text": {"content": item["关键金句"]}}]},
            "summary": {"rich_text": [{"text": {"content": item["摘要_50字"]}}]},
            "url": {"url": item["url"]}
        }
    )

常见问题与调试技巧

Q1:Tavily返回的结果太少或太旧

  • 增加days参数到7,或改用include_raw_content=True获取全文(但消耗API额度多)。
  • 也可同时用NewsAPI作为后备,但需要自己写聚合。

Q2:Claude立场分析不准(比如把中立判断为负面)

我的经验:在提示词里给出具体判断标准。例如:“如果报道提到‘解除制裁’但未加负面形容词,算中立;如果提到‘伊朗获益’且带有负面语气(如‘令人失望’),算负面。” 最好提供一个示例,比如从过往分析中选一条人工标注正确的作为few-shot。

Q3:重复新闻(同一事件不同媒体)

在写入Notion前,用URL的md5作为唯一ID。如果Notion里已有该URL,跳过。或者直接用Tavily的id字段(如果有的话)去重。

Q4:API限流

Tavily免费版每分钟10次,完全够用。Claude API建议用Haiku,成本极低。如果一次分析10条新闻,调用10次API(每次约500 token),总花费不到$0.01。

我的思考:为什么这个工作流对开发者有价值

你可能会问:“这跟写代码有什么关系?” 我的回答是:信息筛选能力正在成为职业护城河。产品经理、技术决策者、甚至开源项目维护者,都需要快速理解全球动态对行业的影响。把重复劳动交给自动化,把判断力留给自己。

以美伊协议为例,如果我是做跨境支付或能源合规的开发者,我需要立刻知道:伊朗制裁缓解是否影响我的API对接?以色列的立场变化会不会导致中东局势升级,进而影响云服务可靠性?这些判断依赖多源、结构化信息。这套工作流让我不再被单一媒体的叙事牵着走。

下一步你可以做什么

  1. 把脚本部署到GitHub Actions(免费的.github/workflows/daily_news.yml),每天定时运行。
  2. 在Notion里建一个看板视图,按“立场_伊朗”分组,一眼看出媒体报道倾向。
  3. 加一个“告警”节点:如果某来源连续3天对伊朗立场都是负面,自动发邮件提醒。可以用Zapier + Gmail实现。

以上所有代码和提示词模板,你都可以直接复制使用。如果踩坑,欢迎留言交流。

记住:不会自动化信息筛选的开发者,迟早会被信息流淹没。