初始发布: 21 个 skills (Claude Code / Codex / DSH)

This commit is contained in:
2026-08-14 01:51:44 +08:00
commit ea0857bedb
129 changed files with 35566 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
# readdata — 阅读统计
查看个人阅读数据统计,包含阅读时长、天数、读书排行、偏好分析等。
> **⚠️ 使用前必须阅读本文件字段说明。** 阅读统计字段容易因字段名产生误判,尤其是所有阅读时长字段的单位。调用 `/readdata/detail` 前必须先确认本文件中的参数、字段单位和统计口径;禁止凭字段名或数值大小推断单位。
## 接口
### `/readdata/detail` — 阅读统计详情
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `mode` | string | 否 | 统计维度:`weekly`=本周, `monthly`=本月, `annually`=本年, `overall`=总计。默认 `monthly`。|
| `baseTime` | int | 否 | 基准时间戳(0=当前周期),此时服务端会归一化到周期起点:周一、月初、年初;`overall` 固定为 0。传历史时间戳可查看该时间戳所在周期的数据;`annually` 只返回 `baseTime` 所在自然年的数据,不会自动包含后续年份 |
**回包字段说明(字段按 `mode` 和数据条件可选返回):**
| 字段 | 说明 |
|------|------|
| `baseTime` | 统计周期的基准时间戳:`weekly` 为周一 00:00`monthly` 为月初 00:00`annually` 为年初 00:00`overall` 为 0 |
| `readTimes` | 分桶阅读/收听总时长(对象,key 为分桶起始时间戳,value 为秒数)。`weekly`/`monthly` 通常按天分桶,`annually` 按月分桶,`overall` 按年分桶 |
| `dailyReadTimes` | 年度模式可能返回的每日阅读时长明细(对象,key 为日期时间戳,value 为秒数);用于日历明细展示,不应替代 `totalReadTime` 作为总量口径 |
| `readDays` | 有效阅读天数。服务端按有效阅读规则计算,当前规则为单日阅读满 1 分钟 |
| `totalReadTime` | 当前请求周期的总阅读/收听时长(**秒**)。统计总时长时优先使用该字段,`readTimes` 仅用于明细展示或交叉校验;**禁止误当成分钟或小时** |
| `dayAverageReadTime` | 日均阅读/收听时长(秒),分母是当前周期已过去的自然日数或历史完整周期自然日数,不是 `readDays` |
| `compare` | 与上一周期的日均时长对比比例;正数表示增长,负数表示下降。该字段只在当前周期且上一周期数据足够时返回,`0.2` 表示约增长 20% |
| `readLongest` | 读得最多的书/有声内容排行数组,最多 10 条,按 `readTime` 降序;低于 5 分钟的条目会被过滤 |
| `readLongest[].book` | 书籍信息对象(电子书/出版书),包含 `bookId``title``author``cover` 等 |
| `readLongest[].albumInfo` | 有声内容信息对象;当排行条目是有声书/专辑时返回 |
| `readLongest[].readTime` | 该书或有声内容在当前统计范围内的阅读/收听时长(秒) |
| `readLongest[].recordReadingTime` | 该书的朗读/记录类阅读时长(秒),存在时才返回 |
| `readLongest[].tags` | 标签数组,目前常见值包括 `笔记最多``单日阅读最久` |
| `readStat` | 阅读统计摘要数组 |
| `readStat[].stat` | 统计项名称,常见为 `读过``读完``阅读``笔记` |
| `readStat[].counts` | 统计值文案,如 `12本``45天``120条` |
| `readStat[].scheme` | 对应统计项的 App 跳转链接,可能为空 |
| `preferCategory` | 偏好阅读分类数组,最多 8 个;不足时可能补充默认分类占位 |
| `preferCategory[].categoryId` | 分类 ID |
| `preferCategory[].categoryTitle` | 分类名称 |
| `preferCategory[].parentCategoryId` | 父分类 ID |
| `preferCategory[].parentCategoryTitle` | 父分类名称 |
| `preferCategory[].val` | 分类偏好权重,按最高分类阅读时长归一化后的相对值,用于图表展示 |
| `preferCategory[].readingTime` | 该分类阅读时长(秒) |
| `preferCategory[].readingCount` | 该分类阅读本数 |
| `preferCategory[].categoryType` | 分类类型标记,普通分类为 0,部分特殊分类会返回 1 或 2 |
| `preferCategoryWord` | 偏好分类文案,如 `偏好阅读文学`;年度报告场景可能改为固定文案 `偏好阅读` |
| `preferTime` | 24 小时阅读时段分布数组,值为秒数。注意输出顺序从 6 点开始,依次到次日 5 点,不是从 0 点开始 |
| `preferTimeWord` | 偏好时段文案。总偏好时段数据不足 10 小时时可能不返回;常见文案如 `偏好上午阅读``偏好白天阅读``偏好夜间阅读``汲取新知,昼夜不倦` |
| `preferAuthor` | 偏好作者数组。只有作者数据达到展示阈值时返回 |
| `preferAuthor[].authorId` | 作者 ID |
| `preferAuthor[].name` | 作者名 |
| `preferAuthor[].count` | 阅读该作者的书本数 |
| `preferAuthor[].readTime` | 阅读该作者作品的时长,格式化字符串,如 `5小时30分钟`,不是秒数 |
| `preferAuthor[].user` | 作者关联用户信息,存在时返回 |
| `authorCount` | 符合统计条件的作者总数,不一定等于 `preferAuthor` 返回条数 |
| `preferPublisher` | 偏好出版社数组。至少 3 个出版社且最高出版社阅读本数达到阈值时返回 |
| `preferPublisher[].name` | 出版社名 |
| `preferPublisher[].count` | 阅读该出版社书籍的本数 |
| `preferCp` | 偏好版权方数组。满足展示阈值时返回 |
| `preferCp[].count` | 阅读该版权方书籍的本数 |
| `preferCp[].copyrightInfo` | 版权方信息,包括名称、用户 VID、头像、角色等 |
| `readRate` | 文字阅读占比百分比,计算口径约为 `wrReadTime / (wrReadTime + wrListenTime) * 100`。当总时长不足 1 小时或文字阅读占比过高时不返回 |
| `wrReadTime` | 文字阅读时长(秒),通常为 `totalReadTime - wrListenTime`;仅在 `readRate` 可展示时返回 |
| `wrListenTime` | 听书/TTS/有声内容时长(秒);仅在 `readRate` 可展示时返回 |
| `rank` | 本周好友阅读排行信息;仅当前周且未隐藏排行时返回 |
| `rank.text` | 排行文案,如 `朋友中排第3名` |
| `rank.scheme` | 排行跳转链接 |
| `registTime` | 用户注册时间戳 |
| `medals` | 勋章数组;可展示勋章不少于 3 个时返回 |
| `preferBooks` | 偏好阅读书籍卡片数组,包含书籍、推荐理由和偏好类型等信息 |
| `yearReport` | 年度报告入口数组。`overall` 可能返回多年的入口,`annually` 可能返回当前年份入口;`times` 为该年 12 个月阅读/收听时长数组 |
| `recordReadingTime` | 总朗读/记录类阅读时长(秒),目前主要在 `overall` 模式下汇总返回 |
| `readRecordsWord` | 书籍分布模块标题文案,当前固定为 `书籍分布` |
| `readDistributionWord` | 点评分布模块标题文案,当前固定为 `点评分布` |
| `readTimeGears` | 阅读时长档位数组,当前为 `[60, 1800, 3600, 10800, 18000]`,用于前端展示分段 |
| `styleType` | 样式类型,常见为 `normal`;年度报告场景可能返回特殊样式 |
> 年度报告相关字段(如 `annualList2023`、`preferBooks2023`、2025 年报模块字段等)会随活动配置变化,不作为通用阅读统计字段依赖。
## 周期特点与区间组合
`/readdata/detail` 只支持按固定自然周期查询,不支持直接传任意起止日期。遇到"某天至今"、"某月中旬到现在"、"跨年区间"这类请求时,应通过多个固定周期结果组合计算。
| mode | 周期粒度 | baseTime 行为 | 适合用途 |
|------|----------|---------------|----------|
| `weekly` | 自然周 | 归一到该周周一 00:00 | 本周、某历史周 |
| `monthly` | 自然月 | 归一到该月 1 日 00:00 | 本月、某历史月、区间边界扣减 |
| `annually` | 自然年 | 归一到该年 1 月 1 日 00:00 | 某年全年、今年至今、跨年区间拼接 |
| `overall` | 全部历史 | 固定为 0 | 总计,不适合拆任意日期区间 |
**组合原则:**
1. 优先用较大周期减少调用次数:整年用 `annually`,整月用 `monthly`
2. 跨年区间按自然年拆分:历史整年 + 当前年至今。
3. 起点落在年/月中间时,可用"大周期 - 起点之前的完整小周期"近似组合;如果接口返回 `dailyReadTimes`,可对边界日期做日级精确扣减。
4. **完整周期**使用该周期回包的 `totalReadTime`**不完整边界周期**优先使用 `dailyReadTimes` 精确扣除起点前/终点后的日期。若没有日级明细,只能使用月级/年级近似,并在回答中说明口径。
5. 不要把截断展示的 `readTimes` 当作主结果;`readTimes` 仅用于明细展示或交叉校验。
**Few-shot**
- 用户问:"2024 年 1 月 31 日至今,我的总阅读时长是多少?"
- 推荐做法:查询 `2024` 至当前年份的 `annually`,累加年度 `totalReadTime`;再查询 `2024-01``monthly`,从总和中扣除 2024 年 1 月的 `totalReadTime`,得到近似的 `2024-02-01 至今` 口径。
- 若年度返回 `dailyReadTimes` 且需要精确到 1 月 31 日,则只扣除 `2024-01-01``2024-01-30` 的日级时长,保留 1 月 31 日。
- 用户问:"2025 年以来读了多久?"
- 查询 `mode=annually``baseTime` 取 2025 年内任一时间戳;如果当前年份大于 2025,再继续查询后续每个自然年并累加。
- 用户问:"去年 3 月到今年 2 月读了多久?"
- 查询去年 3-12 月各月 `monthly`,再查询今年 1-2 月各月 `monthly`,累加 `totalReadTime`
## 工作流
1. **默认**:调 `/readdata/detail`,不传参数使用默认 `mode=monthly` 展示本月阅读数据。
2. **用户问本周/今年/总共**:对应传 `mode=weekly`/`annually`/`overall`
3. **用户问历史数据**:如"上个月读了多少",将上月某天的时间戳作为 `baseTime` 传入;如"2025 年读了多久",传 `mode=annually``baseTime` 取 2025 年内任一时间戳。
4. **用户问跨年区间**:如"2024 年至今""2025 年以来",必须按自然年逐年查询:从起始年份到当前年份分别调用 `mode=annually`,每次 `baseTime` 取该年份内时间戳;历史年份返回的是该自然年全年数据,当前年份返回的是本年至今数据。不要把 `2025` 年度结果标注为"2025 年至今",也不要漏查当前年份。
5. **用户问任意起止日期区间**:先判断是否能拆成完整自然年/月/周;完整周期使用 `totalReadTime` 累加,不完整边界优先使用 `dailyReadTimes` 做日级扣减;如果没有日级明细,则使用月级近似并说明口径。例如"2024 年 1 月 31 日至今"可用 2024 年至今的年度数据合计,减去 2024 年 1 月月度数据,得到 `2024-02-01 至今` 口径;若有日级明细,则只扣除 1 月 1-30 日,保留 1 月 31 日。
6. **总时长口径**:单个完整周期优先采用回包 `totalReadTime`;跨周期区间按"完整周期 `totalReadTime` 累加/相减 + 边界周期 `dailyReadTimes` 日级修正"计算。不要手动把截断输出里的 `readTimes` 相加作为主结果;回答时明确标注使用了哪些完整周期,以及是否使用了日级边界扣减或月级近似。
7. **日均口径**`dayAverageReadTime` 是按自然日平均,不是按阅读天数平均;如果需要“阅读日均”,必须说明该字段不是接口直接返回值,需要用 `totalReadTime / readDays` 另行计算。
8. 综合展示:总时长、阅读天数、自然日均时长、与上期对比,读得最多的书,偏好分类和作者。
## 输出格式
- **总览**:阅读天数、总时长(转为 x 小时 y 分钟)、自然日均时长、与上期对比(增长/下降百分比)
- **读书排行**:列出读得最多的书/有声内容,书名或专辑名 + 阅读/收听时长
- **阅读统计**:读过本数、读完本数、阅读天数、笔记数等
- **偏好分析**:偏好分类、偏好时段、偏好作者、偏好出版社/版权方(如有)
- 时长单位统一转换:所有阅读时长字段均按秒处理,秒 → "x 小时 y 分钟"格式;不得把 `totalReadTime` 当成分钟或小时