报告读取 · 学员端(腾讯云 COS)
用途
从老师发布到 COS 云端的报告里,取出最新(或指定日期)的一版,一次给出两种呈现:
| # | 呈现 | 内容 | 用法 |
|---|---|---|---|
| ① | 四列表格 | Markdown 排名 / 代码 / 名称 / 总分,默认前 30 名,直接在对话里渲染 |
快速看榜单 |
| ② | 在线报告(1 条链接;桌面端另含 1 文件卡片) | 只给 TOP50 总榜(统计卡、因子迷你进度条、★个股硬证、🆕新进标记、免责声明)。桌面端会作为文件卡片附上;手机端无本地文件卡片能力,直接点 TOP50 链接在浏览器看,内容完全一致 | 浏览器打开细看 |
脚本跑完会同时打印这两样,不需要第二次操作。桌面端默认会保存 TOP50 本地副本并把它的绝对路径打印出来(【📎 文件】),由 present_files 作为文件卡片附给学员;手机端无本地文件卡片能力,直接引导学员点下方 TOP50 链接即可(链接与文件内容一致)。
> 数据来源只有云端。 本技能不读取本地报告文件,云端取不到就报错,绝不拿本地旧文件顶替。
配套技能:tdx-report-publish(老师端,负责发布与维护索引页)。
⚠️ 铁律:表格必须原样照搬脚本输出,禁止重生成
本技能的表格不是让你"理解后自己拼"的,而是脚本已经算好、可以直接贴的成品。 严格遵守以下五条:
- 只发脚本打印出来的表格。 运行
node scripts/fetch_report.js后,控制台会打印一段 Markdown 四列表格(| 排名 | 代码 | 名称 | 总分 |)。把这段原封不动贴给用户,一行都不要改、不要删、不要补。 - 行数 = 脚本输出的行数(默认 30 行,--top 指定几行就几行)。 默认
--top 30,脚本必然输出 30 行数据(除非报告本身不足 30 只)。绝不允许只发 10 行、20 行,也不允许把第 11–30 名压缩成"逗号列表 / 一段话 / 竖排纯文本"。 - 禁止自行加列、加字段。 不得新增「较昨」「涨跌幅」「行业」等任何列;四列固定为
排名 / 代码 / 名称 / 总分。 - 禁止自己重新算 / 重新查一份榜单。 不要为了"更准"去联网或本地另算一遍;脚本读的是老师当天发布的云端报告,是唯一的权威来源。
- 在线报告只给脚本末尾那一条 TOP50 链接。 不要再列全量证据报告或 TOP80。
- 文件卡片(桌面端有且仅有 1 个 TOP50;手机端不出现卡片)。 脚本每次运行都会打印一段
【📎 必须附上的文件…】及其绝对路径(--no-save已废弃并被忽略,不可能不落盘)。桌面端:必须把这个 TOP50 网页文件作为唯一一个文件卡片用present_files/ 附件发出,漏掉=违规;严禁附 v7 全量证据、TOP80 或任何第二个报告文件。手机端:无本地文件卡片能力,不要声称"已附上文件卡片",直接引导学员点下方 TOP50 链接在浏览器看完整报告(链接与文件内容完全一致)。理想形态:30 行四列表格 + 1 条 TOP50 链接(+ 桌面端额外 1 个文件卡片)。
> 简言之:脚本输出什么,你就发什么。 你的职责是"运行 + 原样转达",不是"二次创作"。只要出现行数不对、多了"较昨"列、11–30 名被压成一段话、或出现多个文件卡片,都属于违规。
⛔ 唯一有效提示词(口令闸)
本技能从代码层面锁定了唯一能触发报告的指令。脚本 fetch_report.js 带 --query 参数,只有把用户原文传进去、规范化后恰好等于下面这句,才会输出报告;其它任何话进到脚本都直接 ⛔ 无效提示词 退出,不吐任何表格 / 链接 / 文件。
- 唯一有效指令(一字不差):
看今天的报告 - 脚本规范化比对:去空白、去中英文标点、转小写后做全等比较。所以
看今天的报告。、看 今天 的 报告都能过;但看今天报告(少了"的")、看前10名、和昨天对比、下载所有报告一律无效。 - 换口令只改脚本顶部
const PASSPHRASE = '看今天的报告';这一行,并同步改本节的这句即可。
> agent 必做:调用脚本时,务必把用户的原话一字不差透传为 --query 参数(--no-save 已废弃,加不加都一定会落盘):
> node scripts/fetch_report.js --query "<用户原话>"
> 若用户原话不是这句 → 脚本会打印 ⛔ 无效提示词 并退出。此时你必须如实转告用户"无效提示词,请发送:看今天的报告",绝不得自己拼表格 / 自己给链接 / 自己给文件来"救场"。
铁律第 7 条:除 看今天的报告 之外,任何请求都不得生成或展示四列表格 / TOP50 链接 / TOP50 文件;脚本未通过口令闸时,只转达拒绝信息,不自行编造。
何时使用
- 用户想看今天/某天的量化报告、问「最新榜单是什么」。
- 需要把报告下载到本地再打开、转发或归档。
- 只想快速知道前几名,不想打开完整报告。
前置条件
- Node.js 18+。
- 零配置即可用:脚本已内置老师发布所用的桶(
yyc2026-1510332408/ap-shanghai),学员什么都不用配。 - 公开桶匿名直读,不需要任何密钥,也不需要安装 SDK。
- 老师端报告对象为
public-read + Content-Disposition: inline,链接在浏览器/手机里直接打开页面;若点链接变成下载.html,说明该对象是旧版老师端(≤1.0.1)上传的,请老师重新发布一次。 - 私有桶才需要一组只读密钥(
TENCENT_SECRET_ID/TENCENT_SECRET_KEY)+npm install cos-nodejs-sdk-v5:密钥只用于脚本内部签名读取对象,发给学员的链接始终是匿名永久地址(老师端发布时已设x-cos-acl: public-read)。 - 环境里只配了密钥但没装 SDK 时,脚本会打 WARN 并降级为匿名公有读,不会直接退出(旧版会硬失败)。
- 老师端已发布报告,桶里有
stock-reports/index.json索引(默认约定)。
环境变量(全部可选)
| 变量 | 必填 | 说明 | 默认 |
|---|---|---|---|
COS_BUCKET |
否 | 存储桶名,含 APPID | yyc2026-1510332408 |
COS_REGION |
否 | 地域 | ap-shanghai |
TENCENT_SECRET_ID |
私有桶时需要 | 只读子账号密钥 ID | — |
TENCENT_SECRET_KEY |
私有桶时需要 | 只读子账号密钥 Key | — |
COS_ROOT |
否 | 索引/报告根目录 | stock-reports/ |
> 一般学员直接 node scripts/fetch_report.js 就行,不要去改环境变量。换桶时才用 COS_BUCKET 覆盖。
用法
# 看看有哪些日期的报告(--list 不受口令限制,可不带 --query)
node scripts/fetch_report.js --list
# 【学员端标准用法】拉取最新一天:保存本地 TOP50 副本 + 前30名表格 + 在线链接 + 1 个文件
# ⚠️ 报告输出受口令闸限制,必须带 --query "<用户原话>",否则脚本会 ⛔ 无效提示词 并退出
node scripts/fetch_report.js --query "看今天的报告"
# 只想看前50名:加 --top 50
node scripts/fetch_report.js --query "看今天的报告" --top 50
# 指定日期 + 输出到目录 + 前 20 名
node scripts/fetch_report.js --query "看今天的报告" --date 2026-10-19 --out ./reports --top 20
# 只要文件,不打印排名
node scripts/fetch_report.js --query "看今天的报告" --top 0
参数:--bucket --region --date --out --top N --list(--no-save 已废弃:仍可传入,但会被忽略并强制落盘)
> --top 默认 30(直接给出前30名表格)。输出为 Markdown 四列表格(排名/代码/名称/总分),标题按日期自动写成「昨天的榜单(2026-10-20,仅供参考)」这类形式,可直接在对话里渲染。想看更多/更少用 --top N 覆盖,--top 0 则只拉文件不打印摘要。
工作流
- 口令核对(最先做):本技能唯一有效指令是
看今天的报告。若用户原话(规范化后)不是这句,不要运行报告流程,直接回复:⛔ 无效提示词,请发送:看今天的报告,然后停止。若确实是这句,才进入下面流程,并且必须把用户原话通过--query透传给脚本。 - 读索引:从云端取
<root>index.json,拿到所有已发布日期与文件清单。 - 选日期:
--date指定,或默认取最新(字典序最大)的日期。 - 拉内容(务必带 --query):运行
node scripts/fetch_report.js --query "<用户原话>"。脚本只拉取该日期下的 TOP50 总榜一个文件,总是保存本地副本到--out/YYYY-MM-DD/,并在输出里打印【📎 必须附上的文件…】的绝对路径(--no-save已废弃、传了也会落盘);若--query与口令不符,脚本会⛔ 无效提示词退出——此时如实转告,不得自行编造表格/链接/文件。 - 出摘要:解析报告表格表头,定位「排名/代码/名称/总分」列,以 Markdown 四列表格输出
--top N行(默认 30),标题为「(今天/昨天)榜单(日期,仅供参考)」。 - 回报(两种呈现都要给,且必须原样照搬脚本 stdout):
- 先发表格:把脚本打印的 Markdown 四列表格逐行、原样贴出,行数 = 脚本输出的行数(默认 30 行)。保持四列(排名/代码/名称/总分)、每行一只;严禁把第 11–30 名合并成一段话/逗号列表、严禁换成纯文本竖排、严禁自行加「较昨」等任何列、严禁只发 10 行或 20 行(脚本默认 30 行,就必须发满 30 行)。
- 再发链接:给出脚本末尾的唯一一条在线报告链接——🖥 TOP50 总榜(推荐)(不要再列全量证据报告或 TOP80)。
- 文件卡片必须有且仅有 1 个:把脚本输出【📎 必须附上的文件…】后面那个绝对路径的文件,作为唯一一个文件卡片附给学员(present_files/ 附件)。漏掉 = 最终形态缺「1 个文件」,属违规。 脚本只下载/保存 TOP50 这一个文件,严禁把 v7/TOP80 或第二个报告文件卡片一并贴出;本地目录残留旧文件脚本会自动清理。
- 解析失败时明确提示直接打开 HTML,不要猜数据;任何情况下都不得"自己重新生成一份榜单"来替代脚本输出。
关键约定
- 严格云端只读:报告内容一律来自 COS。脚本不扫描、不读取任何本地报告文件。
- 禁止本地回退:云端拉取失败(索引不存在 / 403 / 网络失败)时直接报错退出,不得改去读本地已有报告或本地 CSV 来「救场」——本地副本往往已过期,会给出错误榜单。
- 不写 COS:任何情况下都不做上传/删除/改名操作。
- 索引缺失时提示老师端先发布一次(
tdx-report-publish会生成索引)。 - 排名摘要一律从云端拉回的报告内容里解析,不臆测、不编造;解析不出来就如实说明。
- 摘要固定以 Markdown 表格(排名/代码/名称/总分)呈现,默认前 30 名;必须逐行写完 30 行,严禁把第 11–30 名压缩成一段话/逗号列表,也不要输出成纯文本竖排或自行增删列。
- 在线报告只给 TOP50 总榜一条链接(不要额外展示全量证据报告、TOP80 或其它报告);学员端必须呈现 TOP50 这一个网页文件卡片(有且仅有 1 个),绝不出现第二个报告文件;表格只给数字,明细(行业、12因子进度条、★硬证、🆕新进)在 TOP50 页里。表格数据取自
TOP50 总榜,与页面同一份榜单,两边数字必须一致。 - 对外链接只给匿名永久地址:签名 URL(默认 1 小时有效)仅用于脚本自己读取私有桶对象,绝不输出给学员;输出前统一用
pubUrl()构造匿名地址,链接上不带q-sign-*。因此页面不会出现「签名 1 小时有效」这类误导文案。 - 回答用户时若未成功取到云端数据,要明确说「云端暂无该日期报告 / 拉取失败」,而不是改用其他来源的数据作答。
常见问题
| 现象 | 原因 / 处理 |
|---|---|
读取云端索引失败 |
老师还没发布 → 让老师跑一次 tdx-report-publish;或老师换了桶但学员没设 COS_BUCKET;不要拿本地报告顶替 |
| 报告内容不是今天的 | 老师当天还没重新发布;用 --list 看最新日期 |
403 AccessDenied(匿名模式) |
桶是私有读写 → 配置只读密钥 + cos-nodejs-sdk-v5 后用签名读取;此时对外链接仍是匿名地址,需把桶改为公有读学员才能打开 |
WARN 检测到密钥但找不到 cos-nodejs-sdk-v5 |
已自动降级匿名公有读,公有桶可正常用;私有桶需 npm install cos-nodejs-sdk-v5 或设置 NODE_PATH |
| 拉到的是旧报告 | 老师当天还没重新发布;用 --list 确认最新日期 |
| 摘要解析失败 | 报告版式变了,直接打开在线链接或本地 HTML 查看 |
| 只出表格/链接、没有「1 个文件」 | 脚本一定打印了 【📎 必须附上的文件…】 的绝对路径,按该路径把文件附上即可(1.0.11 起 --no-save 已失效,不会再有"未落盘") |
| 手机端提示"纯云端读取、未落盘" | 那是旧版本(≤1.0.10)的措辞;升级到 1.0.11 后脚本强制落盘,该提示不会再出现 |
WARN 检测到密钥但找不到 cos-nodejs-sdk-v5 后直接失败 / 链接带 ?q-sign-... |
旧版本(≤1.0.13):缺 SDK 时硬退出、有密钥时对外输出 1 小时签名链接。1.0.14 起缺 SDK 自动降级匿名公有读,对外统一匿名永久链接;1.0.15 起脚本内已彻底移除生成签名链接的代码路径 |
点 TOP50 链接变成下载一个 .html 文件,手机上看不到内容 |
报告对象响应头是旧版 Content-Disposition: attachment。老师端升级到 tdx-report-publish 1.0.2 后重新发布(或重传该对象)即变为 inline,浏览器在线打开 |
references/read_setup.md 里还在写 --no-save / 签名 1 小时 |
那是 1.0.10 及更早的旧文档;1.0.15 已整体重写为「零配置匿名 + 口令闸 + 强制落盘 + 匿名永久链接」口径 |