师兄早报 v3.0
每日早报自动生成技能。用户说"生成早报"时触发。
v3.0 更新内容(架构级改版)
板块架构重构:8板块 → 10板块
- 删除"政策"板块:政治敏感风险;政策影响按对象归入民生/医疗/消费等具体板块
- 删除"热点"板块:改为"社会"板块,名称更中性,可容纳正能量事件+社会治理案例+食品安全追责
- 新增"交通"板块:充电桩覆盖、油价变化、铁路调图、高速网络升级、航班——出行是高频刚需
- 新增"天气"板块(弹性):有全国性/大范围预警时纳入,无预警时不设,不硬凑
- 新增"文体"板块:世界杯/NBA等赛事结果、文化活动、展览信息——高关注度但轻量
- 扩展"消费"板块:内容方向从"新品/降价/消费券"扩展为"商品价格 + 消费权益 + 食品安全 + 欺诈警示",明确覆盖消费者知情权
- 民生板块固定2条:覆盖面最广,影响人数最多
- 板块名称统一2字短名:民生、国际、医疗、教育、消费、智能、交通、社会、天气、文体
条数规则更新
- 允许范围:9~12条 → 10~12条
- 常态条数:未定义 → 11条(9板块各1条+民生2条+天气1条)
- 下限规则:至少8个板块有内容,不允许大面积空置
天气预警板块弹性规则
- 纳入标准:影响3个及以上省份,或涉及千万级人口的大范围预警
- 弹性处理:有预警→纳入1条;无预警→不设该板块,当日总条数减1
- 单个城市/小区域的预警不单独纳入
搜索策略改进
- 增加"昨日热搜回顾"搜索步骤:搜索"微博热搜 昨日回顾""昨日热搜盘点""百度热搜 XX日",覆盖已从实时榜单退出的热点
- 定向补充搜索关键词表更新:匹配10板块新架构
影响力评估升级:两层判断
- 第一层:直接影响人数——事件直接波及多少人
- 第二层:通用性问题延伸——事件背后的问题能延伸到多少人(如鹅腿阿姨→食品标签真实性→所有消费者)
- 两层满足其一即可入选;两层都满足的排最高优先级
- 娱乐八卦(如明星绯闻)无通用性问题,不入选
金句字数放宽
- 20字以内 → 30字以内,允许带转折的句子
底部署名格式调整
主理:师兄(中文冒号)→主理:师兄(英文冒号)本内容由AI自动生成→本内容由AI全自动生成- 完整格式:
主理:师兄 · 本内容由AI全自动生成
HTML模板修复
- 修复底部双
<div class="divider"></div>问题,改为单条 - 新增4个板块标签CSS样式(交通、社会、天气、文体)
- 更新所有标签文本为2字短名
完整流程
步骤1:计算日期信息
运行 scripts/calc_date.py 计算日期信息,禁止手写日期/星期:
python scripts/calc_date.py
脚本输出格式:
YEAR=2026
MONTH=6
DAY=15
WEEKDAY=周一
LUNAR=五月二十
DATE_STR=6月15日
FOOTER_DATE=2026年6月15日
YESTERDAY=6月14日
依赖:需安装 zhdate 库(pip install zhdate)
步骤2:搜索新闻(混合策略 + 补漏)
第一阶段:抓热搜(带日期校验)
依次搜索以下热榜,获取当日热门话题:
- 微博热搜:搜索"微博热搜 今日"或"微博热搜榜"
- 百度热搜:搜索"百度热搜 今日"或"百度热搜榜"
- 今日头条热榜:搜索"今日头条热榜"或"头条热搜"
- 知乎热榜:搜索"知乎热榜 今日"
日期校验(强制执行):
- 搜索结果首先按发布日期过滤,发布时间必须在「前一天早6点 → 当天早6点」窗口内
- 无日期标注的文章一律视为不可用,不得采用
- 超出时间窗口的旧闻、转载旧稿一律剔除
- 抓取热搜时优先选择标注了当天日期的聚合页面
将热搜条目按10个板块归类,优先选取与老百姓生活直接相关的话题。
第二阶段:昨日热搜回顾(补漏)
搜索前一天的热搜回顾,覆盖已从实时榜单退出但仍在讨论的热点:
- 搜索"微博热搜 昨日回顾"或"昨日热搜盘点"
- 搜索"百度热搜 {{前一天日期}}"
- 对回顾结果同样执行时间窗口校验
目的:防止实时搜索时已退榜但热度仍在的重要事件被遗漏(如鹅腿阿姨事件6月10日登顶后11日退榜但仍在线)。
第三阶段:定向补充搜索
对热搜和回顾未能覆盖的板块,用关键词补充搜索:
| 板块 | 搜索关键词示例 |
|---|---|
| 民生 | 房价 最新、就业 政策、养老金 调整、物价 菜价、工资 上涨、老旧小区改造、助餐点 |
| 医疗 | 医保 新规、药品 降价、健康 预警、养老 服务、新药纳入医保 |
| 教育 | 高考、中考、升学 政策、教改、学区、义务教育均衡 |
| 消费 | 手机 新品、汽车 降价、家电 补贴、消费 券、食品安全、价格 涨、欺诈 |
| 智能 | 大模型 新进展、AI 应用、机器人、智能体、ChatGPT、支付宝AI |
| 国际 | 中美 关系、国际 冲突、签证 政策、留学生、海外 安全、油价 |
| 交通 | 充电桩 覆盖、油价 调整、铁路 调图、高速 升级、公交 优化 |
| 社会 | 食品安全、社会治理、正能量、公平正义、追责 |
| 天气 | 暴雨 预警、高温 预警、寒潮、大范围 降水 |
| 文体 | 世界杯、NBA、赛事 结果、文化 展览、活动 |
第四阶段:去重、筛选、排序
- 去掉重复内容
- 每条新闻必须来自真实搜索结果,禁止AI凭空编造
- 按影响力排序(两层判断):
- 第一层:直接影响人数(影响越多人越优先)
- 第二层:通用性问题延伸(事件背后的问题能延伸到多少人)
- 两层满足其一即可入选;两层都满足的排最高优先级
- 娱乐八卦(明星绯闻等)无通用性问题,不入选
- 最终选 10~12条,常态11条
步骤3:筛选与提炼
- 新闻时间窗口:前一天早6点 → 当天早6点
- 从搜索结果中筛选 10~12条 重要新闻(常态11条)
- 摘要要求:
- 30~50字高度压缩
- 数据优先(金额、比例、数量必须保留)
- 去掉来源(不写"据XX报道")
- 带温度的柔和语气,像朋友分享,但摘要本身保持干净
- 关键数据用
<span class="highlight">红色高亮 - 场景信息参与因果链的不可省略(如"航班上"是过度换气的触发条件,不能省略)
- 每条内容末尾必须有句号「。」
事实核查(强制执行):
- 摘要中出现具体数字(价格、百分比、人数、金额、涨幅等),必须用独立搜索核对
- 不确定是否正确 → 视为不可用,宁可不写也不写错
- 金融行情类新闻,优先查行情数据本身,不依赖新闻标题的方向判断
- 「持续大涨」「大幅下跌」「创历史新高」等方向性描述,必须有明确对比基准(比什么涨?比什么时候跌?)
影响力评估(两层判断):
- 第一层:直接影响人数——事件直接波及多少人
- 第二层:通用性问题延伸——事件背后的问题能延伸到多少人
- 判断时应同时考虑两层,不能只看直接受影响人数而忽略通用性问题
- 举例:鹅腿阿姨直接影响买鹅腿的顾客,但食品标签真实性问题延伸到所有消费者
板块归类原则:
- 每条新闻归入唯一板块,按"最主要影响对象"判断
- 归类冲突时,问:这条新闻最直接影响的是你的什么?(钱→消费/民生,健康→医疗,出行→交通……)
- 不在两个板块重复出现同一条新闻
步骤4:AI生成每日金句
AI 自由生成一句正能量现代白话文金句。必须严格遵守以下规则:
- 现代白话文:不使用文言文,不引用古诗文或经典名言
- 无出处标注:不写作者、不写篇名、不标注任何来源(纯原创正能量语句)
- 简洁有力:控制在30字以内,手机竖屏阅读友好
- 励志/治愈向:适合早晨阅读,积极温暖,不鸡汤不空洞
- 每天不同:与近期已用过的金句避免重复
格式:金句内容
步骤5:生成HTML
使用以下模板,替换变量部分:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>早报·昨日精选 · {{日期}}</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #f5f5f0;
color: #2c2c2c;
font-family: -apple-system, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
line-height: 1.9;
letter-spacing: 0.5px;
-webkit-font-smoothing: antialiased;
padding: 0;
}
.container {
max-width: 420px;
margin: 0 auto;
padding: 32px 24px 40px;
}
.header {
text-align: center;
margin-bottom: 28px;
padding-bottom: 20px;
border-bottom: 1px solid #d4d4c8;
}
.header .tag {
display: inline-block;
background: #2c2c2c;
color: #f5f5f0;
font-size: 13px;
font-weight: 600;
letter-spacing: 2px;
padding: 4px 14px;
border-radius: 3px;
margin-bottom: 12px;
}
.header .date-line {
font-size: 28px;
font-weight: 700;
letter-spacing: 1px;
color: #1a1a1a;
}
.header .weekday {
font-size: 15px;
color: #888;
margin-left: 8px;
font-weight: 400;
}
.header .lunar {
font-size: 13px;
font-weight: 400;
color: #999;
margin-top: 4px;
}
.motto {
margin-bottom: 16px;
background: #eaeae4;
border-radius: 8px;
padding: 18px 16px;
line-height: 1.8;
}
.motto .motto-title {
text-align: center;
font-size: 13px;
color: #888;
letter-spacing: 1px;
font-weight: 600;
margin-bottom: 8px;
}
.motto .motto-text {
text-align: left;
font-size: 16px;
color: #666;
letter-spacing: 0.8px;
}
.news-list { list-style: none; }
.news-item {
position: relative;
padding: 14px 0 14px 20px;
font-size: 16px;
line-height: 1.85;
letter-spacing: 0.6px;
border-bottom: 1px solid #e0e0d8;
color: #333;
}
.news-item:last-child { border-bottom: none; }
.news-item::before {
content: '';
position: absolute;
left: 0; top: 22px;
width: 7px; height: 7px;
background: #2c2c2c;
border-radius: 50%;
}
.news-item .highlight {
color: #b34233;
font-weight: 600;
}
.news-item .tag-label {
display: inline-block;
font-size: 11px;
font-weight: 600;
letter-spacing: 1px;
padding: 1px 6px;
border-radius: 3px;
margin-right: 6px;
vertical-align: middle;
line-height: 1.6;
}
.tag-livelihood { background: #e0e8dc; color: #4e6b4e; }
.tag-health { background: #e8dce4; color: #6b4e5a; }
.tag-edu { background: #e8e4dc; color: #6b5e4e; }
.tag-consume { background: #dce4e8; color: #4e5e6b; }
.tag-ai { background: #e4e8dc; color: #5e6b4e; }
.tag-transport { background: #dce8e0; color: #4e6b52; }
.tag-social { background: #e8e4dc; color: #6b5e4e; }
.tag-weather { background: #dce4e8; color: #4e5e6b; }
.tag-sports { background: #e4dce8; color: #5e4e6b; }
.tag-intl { background: #dce8e4; color: #4e6b5e; }
.divider {
height: 1px;
background: #ccc;
margin: 24px 0 12px;
}
.source {
font-size: 13px;
color: #888;
line-height: 1.7;
letter-spacing: 0.3px;
text-align: left;
margin-top: 4px;
margin-bottom: 10px;
}
.source .source-title {
font-size: 13px;
color: #888;
font-weight: 600;
margin-bottom: 4px;
letter-spacing: 1px;
}
.footer {
text-align: center;
font-size: 11px;
color: #bbb;
margin-top: 18px;
letter-spacing: 0.5px;
line-height: 1.4;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<div class="tag">早报·昨日精选</div>
<div class="date-line">{{月}}月{{日}}日 <span class="weekday">{{星期}}</span></div>
<div class="lunar">{{农历}}</div>
</div>
<div class="motto">
<div class="motto-title">- 早安寄语 -</div>
<div class="motto-text">{{金句}}</div>
</div>
<ul class="news-list">
{{新闻条目,每条格式:<li class="news-item"><span class="tag-label tag-xxx">板块短名</span>摘要内容<span class="highlight">关键数据</span>。</li>,每条内容末尾必须有句号「。」}}
</ul>
<div class="divider"></div>
<div class="source">
<div class="source-title">数据来源</div>
新华社 · 人民网 · 央视新闻 · 中国政府网<br>
财联社 · 新浪财经 · 每日经济新闻<br>
微博热搜 · 百度热搜 · 今日头条 · 知乎
</div>
<div class="footer"><span class="gen-note">主理:师兄 · 本内容由AI全自动生成</span><br>新闻截止 · {{年}}年{{月}}月{{日}}日 06:00</div>
</div>
</body>
</html>
保存路径:当前工作目录下 早报_昨日精选_{{月}}月{{日}}日.html
步骤6:交付(含云端部署)
6a. 本地预览与交付
- 用 preview_url 展示 HTML 预览
- 用 deliver_attachments 交付 HTML 文件
6b. 云端部署
- 将早报HTML文件复制到一个临时部署目录,重命名为
index.html - 调用
workbuddy_cloudstudio_deploy部署该目录到 CloudStudio - 将生成的公开访问URL一并返回给用户
- 部署完成后清理临时目录
10板块速查表
| # | 板块全名 | 短名(标签) | CSS类 | 条数 | 内容方向 | 弹性 |
|---|---|---|---|---|---|---|
| 1 | 民生 | 民生 | tag-livelihood | 2 | 房价、就业、养老金、医保、住房、老旧小区改造、助餐点 | 固定 |
| 2 | 国际 | 国际 | tag-intl | 1 | 国际冲突→油价/物价传导、签证政策、留学生、海外安全 | 固定 |
| 3 | 医疗 | 医疗 | tag-health | 1 | 医保调整、新药纳入、疾病防控、健康预警 | 固定 |
| 4 | 教育 | 教育 | tag-edu | 1 | 高考中考、升学政策、学区、教改 | 固定 |
| 5 | 消费 | 消费 | tag-consume | 1 | 商品价格涨跌、消费券、消费权益、食品安全、欺诈警示 | 固定 |
| 6 | AI智能 | 智能 | tag-ai | 1 | 大模型新进展、AI应用落地、机器人、智能体 | 固定 |
| 7 | 交通出行 | 交通 | tag-transport | 1 | 充电桩覆盖、油价变化、铁路调图、高速网络升级 | 固定 |
| 8 | 社会广角 | 社会 | tag-social | 1 | 正能量事件、社会治理案例、考编公平、食品安全追责 | 固定 |
| 9 | 天气预警 | 天气 | tag-weather | 0或1 | 大范围降水、高温、寒潮预警;无预警不设 | 弹性 |
| 10 | 文体快讯 | 文体 | tag-sports | 1 | 世界杯/NBA等赛事、文化活动、展览 | 固定 |
条数规则:
- 无天气预警:10条(9板块全覆盖,民生2条)
- 有天气预警:11条
- 民生偶尔可加1条:最多12条
- 常态目标:11条
- 允许范围:10~12条
- 下限规则:至少8个板块有内容
天气预警纳入标准:
- 影响3个及以上省份,或涉及千万级人口的大范围预警
- 单个城市/小区域的预警不单独纳入
新闻选中逻辑(完整流程)
热搜抓取(4平台)
↓
昨日热搜回顾(补漏)
↓
时间窗口过滤(前一天早6点→当天早6点)
↓
无日期标注 → 剔除
↓
定向补充搜索(10板块关键词)
↓
合并去重
↓
影响力评估(两层判断)
↓
事实核查(数字独立搜索核对)
↓
板块归类(按最主要影响对象)
↓
条数平衡(10~12条,常态11条)
↓
摘要压缩(30~50字,因果链信息不可省略)
↓
生成HTML
影响力两层判断:
| 层级 | 判断标准 | 举例 |
|---|---|---|
| 第一层:直接影响 | 事件直接波及多少人 | 美伊协议→油价变化→所有开车的人 |
| 第二层:通用性问题 | 事件背后的问题能延伸到多少人 | 鹅腿阿姨→食品标签真实性→所有消费者 |
- 两层满足其一即可入选;两层都满足的排最高优先级
- 娱乐八卦无通用性问题,不入选
板块归类原则:
- 按"最主要影响对象"判断:影响你的钱(花)→消费,影响你的钱(赚)→民生,影响你的健康→医疗,影响你的出行→交通,影响你的未来→教育,影响你的世界观→国际,影响你用的工具→智能,影响社会信任→社会,影响你今天出门→天气,影响你的娱乐→文体
重要注意事项
- 日期/星期必须用 Python 计算,禁止手写,避免星期几出错
- 农历用 zhdate 库计算,Python 路径同上(优先使用 WorkBuddy 托管 Python,否则用系统 python)
- 新闻时间窗口:前一天早6点 → 当天早6点
- 条数:10~12条,常态11条,至少8个板块有内容
- 数据来源说明固定列在底部
- 底部署名格式:
主理:师兄 · 本内容由AI全自动生成,样式为12px/#aaa,居中(注意英文冒号) - 截止时间格式:
新闻截止 · {{年}}年{{月}}月{{日}}日 06:00,样式为12px/#aaa,居中 - 金句使用现代白话文自由生成,不引用古诗文或经典名言,不标注作者或出处
- 金句每天不同,30字以内,励志/治愈向,积极温暖
- 每条新闻前必须加板块标签(对应CSS类),标签文本使用2字短名
- 不生成PNG图片,仅输出HTML
- 所有新闻必须来自真实搜索结果,禁止AI凭空编造
- 语气带温度,像朋友分享,但摘要本身保持干净
- 热搜优先:先抓微博/百度/头条/知乎热搜,再昨日热搜回顾,再定向补充搜索
- 影响力两层判断:直接影响人数 + 通用性问题延伸,两层满足其一即可入选
- 新闻时间窗口强制校验(最高优先级):搜索结果首先按发布日期过滤,必须在「前一天早6点→当天早6点」窗口内,无日期标注的文章视为不可用,超出窗口的旧闻一律剔除
- 涉及数字的事实核查:摘要中具体数字(价格、百分比、人数、金额、涨幅等)必须独立搜索核对,不确定是否正确则视为不可用,宁可不写也不写错
- 趋势描述对比基准:「持续大涨」「大幅下跌」「创历史新高」等方向性描述必须有明确对比基准,金融行情类新闻优先查行情数据本身
- 云端部署:生成HTML后必须自动部署到CloudStudio并返回公开访问链接
- 新闻末尾句号:每条新闻内容末尾必须有句号「。」
- 早安寄语格式:「- 早安寄语 -」独占一行、居中显示(样式同署名行),金句正文另起一行、左对齐不居中
- 底部区域格式:「数据来源」无冒号,底部署名行为
主理:师兄 · 本内容由AI全自动生成(英文冒号),截止时间行为新闻截止 · 日期时间,均12px/#aaa居中 - 场景信息不可省略:摘要压缩时,参与因果链的场景信息不可省略(如"航班上"是过度换气的触发条件)
- 昨日热搜回顾:搜索阶段必须增加"昨日热搜回顾"步骤,防止已退榜的重要热点被遗漏
- 消费板块扩展:消费板块覆盖商品价格涨跌 + 消费券 + 消费权益 + 食品安全 + 欺诈警示
- 天气预警弹性:有全国性/大范围预警(影响3省+或千万级人口)时纳入,无预警时不设,不硬凑
- HTML底部单divider:底部区域只有一条分隔线,不写两条