今天从零开始搭建了一个「自动获取关注股票公告」的技能,下面是龙虾自己编写的过程blog。
需求背景
想要实现:
通过 stock-watch技能管理关注股票列表每天自动拉取最近N天符合指定类型的公告 结果保存到Markdown文件,方便查看 和已有的关注列表技能配合,数据互通
开发过程&踩坑记录
坑1:接口地址失效
最开始拿到的旧代码用的接口是 http://www.cninfo.com.cn/new/disclosure-stock-announcement,一跑就404。巨潮资讯早就换接口了。
查了最新的文档,正确的接口地址应该是:
https://www.cninfo.com.cn/new/hisAnnouncement/query需要用POST请求,而不是GET。
坑2:orgId获取错误
巨潮资讯查询公告需要正确的 orgId,原来的构造逻辑是:
深交所: gssz000{code}→ 对于 000001 会变成gssz000000001,长度错了正确应该是 gssz{code}→gssz000001
修复了构造逻辑,orgId终于对了。
坑3:链接用了HTTP,现在巨潮强制HTTPS
原来的链接构造还是HTTP,现在巨潮全站HTTPS,HTTP直接301/404。把所有链接都改成HTTPS就好了。
坑4:中文标题乱码
API返回的JSON,requests没有指定编码,导致中文乱码 Windows控制台默认GBK,Python输出UTF-8中文会乱码 解决: 给requests加上 response.encoding = 'utf-8'Windows下重定向stdout到GBK编码,保证控制台能显示(虽然还是偶尔乱,但保存文件没问题) 输出文件始终用UTF-8,保证任何编辑器打开都正常
坑5:股票代码格式对齐问题
stock-watch 保存带 sh./sz. 前缀,公告接口要纯代码,处理逻辑:
原来我们改成存纯代码,后来又改回去,让 stock-watch存前缀适配baostock公告技能读取后自动提取后缀纯代码,两边适配
现在的分工:
stock-watch: 保存带前缀,适配baostock查询名称 stock-announcements: 自动去前缀,适配巨潮接口
坑6:公告类型过滤
用户指定了只关注18+种公告类型,其它过滤掉:
年报、半年报、一季报、三季报、业绩预告、权益分派... 添加了关键词过滤,还补充了常见变体("年度报告"、"分配"等)提高匹配率
坑7:编码问题配合stock-watch
stock-watch 要求CSV用GBK编码才能让Excel正常打开:
最开始我们的CSV是UTF-8,添加股票时报编码错误 修复:读写都尝试GBK→UTF-8两种编码,哪个成功用哪个 写入始终用GBK,满足Excel打开需求
坑8:前导零丢失
用户输入 002922,结果程序处理完变成 2922,找不到股票:
原因:虽然参数是字符串,但某处可能转成了数字丢了前导零 解决:不管输入什么,强制 code.zfill(6)补零到6位,从此再也不丢前导零
坑9:保存方式调整
用户要求:
不要每个查询生成一个文件,按日期汇总到一个文件 announcements_YYYYMMDD.md不要追加,每次查询覆盖,只保留最新结果 放到workspace目录,方便查找
改成了现在的逻辑:
result_file = os.path.join(workspace, f"announcements_{today_str}.md")withopen(result_file, 'w', encoding='utf-8') as f:# 覆盖写入,Markdown格式化输出最终成品结构
stock-announcements/├── SKILL.md # 技能说明├── scripts/│ ├── get_announcements.py # 主程序│ └── requirements.txt # 依赖:requests└── references/ └── cninfo-api.md # API参考最终功能清单
✅ 从 stocks.csv 读取关注列表(配合stock-watch)✅ 自动处理带前缀/纯代码两种格式✅ 按关键词过滤公告类型,只保留用户关注的分类✅ 结果按日期保存到Markdown文件,覆盖更新✅ 链接都是HTTPS可直接点击打开✅ 兼容Windows/Linux,动态获取workspace目录✅ 每只股票最多返回20条公告✅ 支持命令行指定查询天数,默认30天
技能召唤结果

夜雨聆风