# Student Discount Application

> 办理豆包专业版学生优惠申请：引导用户绑定抖音、完成学生认证并领取权益。仅当用户明确提出申请、继续办理或查询申请状态时加载；单纯咨询优惠或诉求不明确时不加载。

- Skill: `ahang1598/student-discount-application` (Agent Skill, multi-file: 13 files)
- Install (CLI): `npx skillmds@latest add ahang1598/student-discount-application`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/student-discount-application/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/student-discount-application

---


> **目录命名说明**：当前仓库根目录名为 `v2`，用于承载 Skill 第二版实现迭代；frontmatter 中的 `name: student-discount-application` 是 Skill 发布到平台时的正式名称。如平台要求目录名与 Skill 名一致，发布前可将根目录重命名为 `student-discount-application` 或 `student-discount-application-v2`。

# 学生优惠申请

办理用户的豆包专业版学生优惠申请。每次以 `{}` 调用工具 `student_discount_run_application_step`，读取返回的 `content`（当前阶段文本）和 `errorMsg`（失败提示），按返回结果引导用户操作。

工具返回后请先查阅对应的参考文件：

- [内容路由表](references/content-routing.md)：根据 `content` 文本确定当前处于哪一阶段；
- [阶段提醒文案](references/stage-reminders.md)：根据阶段生成对用户的回复；
- [学生认证交互](references/student-auth-workflow.md) + [学信网当前有效学籍核验](references/chsi-enrollment-verification.md)：命中「需要学生认证」阶段时执行。

## 操作规则

1. **工具调用方式**：始终以空对象 `{}` 调用 `student_discount_run_application_step`，不需要传入任何信息。
2. **唯一业务工具**：办理全程只使用上述工具。只有首次进入 `STUDENT_AUTH_REQUIRED` 阶段时，额外执行一次内嵌的[学信网当前有效学籍核验](references/chsi-enrollment-verification.md)。
3. **读取返回**：只看 `content`（阶段文本）和 `errorMsg`（失败提示）。
4. **路由判断**：严格按照 `content` 中的稳定文字匹配阶段；`errorMsg` 不为空时按错误处理。不要凭感觉脑补未明确出现的状态。
5. **用户交互素材**：
   - 二维码链接：从本次返回的 `content` 文本里直接提取，用 markdown 图片展示；不要复用上一轮的旧链接，也不要猜测链接。
   - 抖音绑定按钮名称：只用 `content` 里明确出现的文案，不编造按钮或链接。
   - 权益名称和有效期：只采用 `content` 里明确写出的内容；没写就不展示，不猜测。
6. **敏感信息**：不要向用户询问或复述账号、密码、短信验证码、身份证号、人脸信息等认证数据。
7. **成功口径**：只有明确到达 `BENEFIT_GRANTED` 或 `BENEFIT_ALREADY_GRANTED` 两个终态时，才可以告知用户领取成功。
8. **学信网流程**：每个办理周期最多执行一次。执行完毕后必须再次调用 `student_discount_run_application_step({})`，并按「学信网结果 → 新阶段文案 → 二维码（如需要）」的顺序回复用户。
9. **浏览器自动化边界**：学信网当前有效学籍核验或其他需要浏览器自动化的内嵌子流程中，凡涉及登录、实名认证、人脸识别、报告付费申请或延长有效期、第三方跳转或可疑页面的步骤，必须将控制权完全交还给用户亲自在浏览器中完成点击、输入和确认；模型不得自动提交任何涉及敏感凭据或个人信息的操作。若出现付费提示、第三方非官方页面或其他异常情况，立即终止子流程并返回 NO_RESULT，回到主 Skill 强制续调统一工具。

## 执行流程

1. 确认用户要开始申请、继续办理或查询申请状态。
2. 调用 `student_discount_run_application_step({})`。
3. 读取返回：
   - `content`：合并其中所有文字得到 `visibleText`；
   - `errorMsg`：判断是否出错。
4. 对照[内容路由表](references/content-routing.md)判定阶段：
   - `errorMsg` 不为空，或 `visibleText` 包含错误相关表述 → 按错误处理；
   - `errorMsg` 为空，且 `visibleText` 只匹配到一种正常业务阶段 → 按该阶段处理；
   - 匹配不到、同时匹配多个互相矛盾的阶段、或 `STUDENT_AUTH_REQUIRED` 但 `content` 里没有二维码链接 → 再调用一次工具查询；仍然无法确定就停止。
5. 按照[阶段提醒文案](references/stage-reminders.md)生成回复。不要把工具给模型的操作提示（如「请引导用户…」）直接转发给用户；要用自然的用户语气表达。
6. 命中 `STUDENT_AUTH_REQUIRED` 时：根据学信网流程决定先做学信网核验还是直接展示二维码。
7. 判断是否结束流程。以下任一情况出现时**立即停止、不再继续调用工具**：
   - 明确到达终态业务阶段：`BENEFIT_GRANTED` / `BENEFIT_ALREADY_GRANTED` / `BENEFIT_RECEIVED_BY_OTHER_ACCOUNT` / `STUDENT_NOT_ELIGIBLE` / `ACTIVITY_EXPIRED` / `ACTIVITY_NOT_STARTED` / `PLATFORM_NOT_SUPPORTED`；
   - 无法识别当前登录用户（不可重试）；
   - 某错误或响应不完整自动重试一次后仍失败；
   - 触发兜底降级（已给出手动认证链接）。
8. 未结束时，等待用户告知外部操作完成（如「绑定好了」「认证完了」），或按约定秒数自动等待后，回到第 2 步重新调用工具查询最新状态。注意：用户完成学生认证本身不算流程结束，必须继续确认权益是否成功下发。

## 返回结果完整性检查

调用工具后，只需要确认以下几点：

- `content` 里有实际内容（不是空白）；
- `errorMsg` 可以读到；
- 进入 `STUDENT_AUTH_REQUIRED` 且需要展示二维码时，`content` 文本中包含二维码图片链接（以 `https://aka.doubaocdn.com/` 开头的 URL）。

判断优先级：只要 `errorMsg` 不为空，就按错误处理（即使 `content` 里出现成功字样）。如果 `errorMsg` 为空但 `content` 明确写了失败，也按错误处理。重新查询一次后仍然不完整或阶段冲突，回复「响应不完整」固定文案并停止。

## 业务阶段与对应动作

根据 `content` 文本匹配到阶段后，按下面的动作执行。路由名直接对应工具返回的英文阶段标签，来源于文本锚点匹配。

| 路由 | 你应该做什么 |
|---|---|
| `PLATFORM_NOT_SUPPORTED` | 告知用户当前平台暂不支持学生优惠申请，需切换到 PC 端；不展示二维码或其他入口；流程结束。 |
| `DOUYIN_BIND_REQUIRED` | 提醒用户先完成抖音账号绑定，引用 `content` 明确给出的按钮文案（如「去绑定抖音账号」）；告知绑定完成后回复「好了」继续；等待用户回复。 |
| `STUDENT_AUTH_REQUIRED` | **首次进入**：先执行一次学信网当前有效学籍核验，无论结果如何都重新调用工具，按「学信网结果 → 新阶段文案 → 二维码（如仍需要）」顺序展示。**非首次**：从 `content` 提取二维码链接，阶段文案之后按 markdown 图片格式展示——先写感叹号，再写方括号包裹的图片 alt「学生认证二维码」，再写圆括号包裹本轮 `content` 中提取到的实际 URL（必须是以 `https://aka.doubaocdn.com/` 开头的新地址）。圆括号内不要写任何字面占位字符串，必须填入实际提取到的链接；告知用户扫码完成手机端认证，回来回复「好了」继续。 |
| `STUDENT_NOT_ELIGIBLE` | 如实告知已完成学生身份核验但不符合本次活动条件；可补充 `content` 中明确给出的脱敏原因；不宣称认证失败；流程结束。 |
| `BENEFIT_GRANTED` | 恭喜用户 +「2.5 倍学生专属额度」说明 + 38 元专业版引导链接；明确告知权益已到账；流程结束。 |
| `BENEFIT_ALREADY_GRANTED` | 告知账户中已有权益；从 `content` 提取权益名称替换，仅当生效和失效时间同时出现在 `content` 中时保留有效期句子；不附付费引导；流程结束。 |
| `BENEFIT_RECEIVED_BY_OTHER_ACCOUNT` | 告知该学生身份已在其他账号领取过，同一身份只能领一次；不要求重新认证/绑定、不猜测领取账号；流程结束。 |
| `ACTIVITY_EXPIRED` | 告知本次学生优惠活动已结束；不推测重新开放时间；流程结束。 |
| `ACTIVITY_NOT_STARTED` | 告知本次学生优惠活动尚未开始；不推测具体开始时间；流程结束。 |

### 等待与自动重查规则

| 场景 | 等待秒数来源 | 自动重查次数上限 |
|---|---|---|
| 响应无法识别、阶段冲突、缺少二维码链接 | — | 合计最多 **1 次** |
| 工具执行错误（见错误处理表） | 读 `content` 中秒数，未写时用错误表的降级秒数 | 合计最多 **1 次** |
| 学信网流程刚执行完毕后的「强制续调」 | 不等待，立即续调 1 次；续调后若响应仍不完整或阶段冲突，可再独立重查 1 次 | 这 2 次与上述普通重查互不占用 |

### 权益文案替换规则

- `BENEFIT_GRANTED`：使用固定庆祝文案 +「2.5 倍学生专属额度」+ 38 元专业版引导链接（详见阶段提醒文案）。
- `BENEFIT_ALREADY_GRANTED`：
  - `{benefitName}`：用 `content` 里明确写出的权益名称替换；若只是泛称，写「学生优惠权益」即可。
  - 有效期句子：只有 `content` 里同时明确出现生效时间和失效时间两端时，才保留整句；任一端没写就整句省略，不要猜测日期。

## 学信网子流程

只在**首次进入 `STUDENT_AUTH_REQUIRED` 且本轮办理还没有做过学信网核验**时执行一次。**交互细节、首次判定、输出顺序全部以 [学生认证交互](references/student-auth-workflow.md) 为准**，以下是执行骨架：

1. 读取并执行[学信网当前有效学籍核验](references/chsi-enrollment-verification.md)。
2. 执行前记住：本轮已做过学信网，后续不再重复。不要展示当前返回中的旧二维码链接。
3. 核验结果归为三种之一：有有效学籍 / 无有效学籍 / 没查到结果。
4. 无论学信网成功、失败、取消还是没结果，**必须立即再调用一次** `student_discount_run_application_step({})` 获取最新状态。
5. 对新返回的结果重新判断阶段。回复用户时**严格按以下顺序**，任何情况下都不能省略学信网结果：
   1. 先展示学信网结果文案（有/无/没查到）；
   2. 再展示新阶段或错误的固定文案；
   3. 如果新阶段仍是 `STUDENT_AUTH_REQUIRED`，最后才展示从本次新返回 `content` 中提取的二维码图片。
6. 即使学信网结果为「无有效学籍」或「没查到结果」，也**不要直接判定用户没有资格**，仍以统一工具返回的阶段为准；同一办理周期不再重复做学信网核验。

## 交互素材

- **抖音绑定入口**：只用 `content` 中明确给出的按钮文案（常见为「去绑定抖音账号」）；不要编造其他名称、链接或入口。
- **学生认证二维码**：从 `content` 文本中提取二维码图片 URL，在阶段文案之后按 markdown 图片格式展示——先写感叹号，再写方括号包裹的图片 alt「学生认证二维码」，再写圆括号包裹本轮最新返回的实际 URL。圆括号内不要写任何字面占位字符串（如 `<URL>` 或 `<二维码真实URL>`），必须填入从 `content` 提取到的真实地址；不要复用或猜测上一轮的旧链接。
- 如果用户说二维码失效或扫不了，重新调用工具获取最新内容。

## 错误处理

对照[内容路由表](references/content-routing.md)匹配错误类型。`errorMsg` 只用于判断工具是否失败，**不要原样展示给用户**。下表列出遇到各类错误时应该怎么做：

| 错误 | 识别文字（出现在 `content` 或 `errorMsg`） | 是否自动重试 | 等待秒数 | 处理动作 |
|---|---|---|---|---|
| 无法识别当前登录用户 | 「运行时身份上下文不完整」或「缺少必要字段」 | 否 | — | 回复「当前调用环境暂时无法识别登录用户…」固定文案；不向用户索要任何身份信息；直接结束。 |
| 绑定状态查询失败 | 「抖音账号绑定状态」+「查询失败」或「当前绑定状态未知」 | 是 | `content` 中有秒数按其值，否则约 **5 秒** | 回复查询失败文案并自动重查一次；不要展示绑定入口；重试后仍失败就走兜底降级。 |
| 认证状态查询失败 | 「学生认证状态」+「查询失败」或「当前认证状态未知」 | 是 | `content` 中有秒数按其值，否则约 **5 秒** | 回复查询失败文案并自动重查一次；不要要求用户重新认证；重试后仍失败就走兜底降级。 |
| 二维码生成失败 | 「未能生成可用的认证二维码」或「认证二维码暂时生成失败」 | 是 | `content` 中有秒数按其值，否则约 **3 秒** | 回复二维码生成失败文案并自动重查一次；不要展示旧链接；重试后仍失败就走兜底降级。 |
| 权益下发失败 | 「未能确认学生优惠权益发放成功」「权益下发服务暂时不可用」「未确认权益发放成功」 | 是 | `content` 中有秒数按其值，否则约 **5 秒** | 回复查询失败文案并自动重查一次；不要要求重新认证，也不要宣称已经到账；重试后仍失败就走兜底降级。 |
| 响应不完整 | `errorMsg` 非空且未匹配到具体锚点，或 `content` 含「学生优惠申请状态暂时无法确认」 | 是 | 约 **1 秒** | 回复「响应不完整」文案并自动重查一次；重试后仍失败就走兜底降级。 |

**兜底降级（手动认证入口）**：满足以下任一条件时，给出[阶段提醒文案](references/stage-reminders.md)中的手动认证链接并结束本轮流程——

1. 同一错误自动重试一次后仍然失败；
2. 用户明确表达挫败（如「失败了」「不行」「搞不定」「还是不行」「扫码没用」「二维码扫不了」）。

正常流程中不要主动推送这个链接。结束前不要展示内部错误信息。

