Skip to main content Início Criadores infometa workbuddyskills airchina-travel-assistant
airchina-travel-assistant 帮用户领取中国国航(Air China / 国航 / 国际航空)的优惠券。当用户说"我想领国航的券"、"帮我领张国航机票券"、"国航有活动券吗"、"给我发国航优惠券"、"airchina 券"、"国航活动"、"帮我领张国航券"、"国航现在有活动吗"、"我想领张机票优惠券"、"国航的券怎么领"、"给我发国航券"、"airchina coupon"、"我要国航的活动券"等任何表达"想要国航券"语义的话时,触发本技能。
Ir para a instalação Skills Marketplace Descubra e explore skills de IA criadas pela comunidade.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Copiar promptMostrar detalhes do prompt Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
npx skills add https://github.com/infometa/workbuddyskills --skill airchina-travel-assistantO comando permanece em uma só linha. Role horizontalmente para revisá-lo antes de copiar.
Prefere uma cópia local? Baixe os arquivos disponíveis atualmente no SkillsMP.
Baixar Zip Baixando... Ocupações relacionadas SOC
Baseado na classificação ocupacional SOC
Explorador de arquivos
11 arquivos name airchina-travel-assistant description 帮用户领取中国国航(Air China / 国航 / 国际航空)的优惠券。当用户说"我想领国航的券"、"帮我领张国航机票券"、"国航有活动券吗"、"给我发国航优惠券"、"airchina 券"、"国航活动"、"帮我领张国航券"、"国航现在有活动吗"、"我想领张机票优惠券"、"国航的券怎么领"、"给我发国航券"、"airchina coupon"、"我要国航的活动券"等任何表达"想要国航券"语义的话时,触发本技能。 display_name airchina-travel-assistant display_name_en airchina-travel-assistant description_zh 帮用户领取中国国航(Air China / 国航 / 国际航空)的优惠券。当用户说"我想领国航的券"、"帮我领张国航机票券"、"国航有活动券吗"、"给我发国航优惠券"、"airchina 券"、"国航活动"、"帮我领张国航券"、"国航现在有活动吗"、"我想领张机票优惠券"、"国航的券怎么领"、"给我发国航券"、"airchina coupon"、"我要国航的活动券"等任何表达"想要国航券"语义的话时,触发本技能。 description_en 帮用户领取中国国航(Air China / 国航 / 国际航空)的优惠券。当用户说"我想领国航的券"、"帮我领张国航机票券"、"国航有活动券吗"、"给我发国航优惠券"、"airchina 券"、"国航活动"、"帮我领张国航券"、"国航现在有活动吗"、"我想领张机票优惠券"、"国航的券怎么领"、"给我发国航券"、"airchina coupon"、"我要国航的活动券"等任何表达"想要国航券"语义的话时,触发本技能。 visibility public icon https://codebuddy-platform-1258344699.cos.accelerate.myqcloud.com/public/45edac6b-2078-4678-89f3-6f9800cf5e5f/avatar/skill/au_e5b49432-676.svg
中国国航 · 领券助手
这个 skill 的唯一用户场景 是:帮用户领国航的优惠券 。其它能力都是为这件事服务的基础设施。
技能按"问手机号 → 查是否领过 → 没领过就发短信验证码 → 等用户报验证码 → 领券并展示券码"的流程与用户完成整件事。不要和用户谈"接口""adapter""procedure""签名""加密""token"这些词 ——对用户只说"发短信""填验证码""领券"。
运行所需的外部配置
无需任何环境变量 ——appId、secretKey、渠道、版本、网关地址全部硬编码在脚本里。直接 clone / 拷贝 skill 就能用。
仅有 2 个可选环境变量用于临时覆盖:
环境变量 说明 AIRCHINA_ENV=prod切换到生产环境(默认 test) AIRCHINA_DEBUG=1打印签名/加密中间值便于对账
首次使用跑 <SCRIPT> check-env 可以看到全部硬编码配置(<SCRIPT> 按你当前平台解析,见下方第 0 步)。
生产上线时只需改 scripts/airchina.sh 顶部的 APP_ID / SECRET_KEY / ENV_MODE 三项为生产凭证即可,Python 版和 PowerShell 版同步改模块顶部常量。
维护提示(3 文件同步改) :APP_ID / SECRET_KEY 这些硬编码常量在以下 3 个文件里各有一份:
scripts/airchina.sh(顶部常量块,macOS/Linux 用)
scripts/airchina_client.py(模块顶部,Python 用)
scripts/airchina.ps1(顶部 $script:* 变量块,Windows 用)
改密钥时必须三处同步改 ,否则跨平台表现会不一致。
第一部分 · 面向用户(Agent 与用户对话的话术规范)
与用户对话的四步流程
严格按这四步走,不要跳步、不要提前解释、不要谈技术细节 。语气要温和主动,把用户当客人服务。
第 0 步:自检运行平台,选定 <SCRIPT>(用户不感知,AI 心里做的事)
开始前先看一眼你当前环境里可用的工具,选定本次对话用哪个脚本 ,后续每一步都调它:
你能看到的工具 当前平台 <SCRIPT> 应解析为Bash(有 Bash 工具或 bash/zsh shell)macOS / Linux scripts/airchina.sh只有 PowerShell,没有 Bash Windows scripts\airchina.ps1
需要嵌入 Python 业务代码 任意 python scripts/airchina_client.py
选定之后本次对话固定用这一个脚本 ,不要中途切换,不要混用
Windows 下的你 :禁止自己写 PowerShell 做 AES / Base64 / 签名,详见
第二部分"⚠️ Windows PowerShell 沙箱陷阱(必读)"和 references/windows-sandbox.md
脚本接口三个平台完全一致(同样的子命令、同样的参数、同样的 JSON 输出),
下面三步的命令示例用 <SCRIPT> 占位,代入你选定的那一个即可
第 1 步:问手机号 好的~帮你领国航的优惠券 ✈️
方便把你在国航账户注册的手机号发给我吗?我会用它给你发一条验证码短信。
请问这是哪个国家或地区的手机号呀?中国大陆直接告诉我"86 就好",其它地区麻烦给我对应的国家码。
第 2 步(新增):查本地账本 — 拿到手机号后立刻查,别急着发短信 <SCRIPT> check_claimed --phone <用户手机号> --area-code 86
输出 null → 没领过,继续走第 3 步发短信
输出 JSON(含 coupons) → 已领过,不要再发短信 ,直接告诉用户:
查了一下~你这个号码 4 月 29 日已经领过 2 张国航机票优惠券了 🎉:
| 券名 | 面额 |
|------------|-----|
| 机票优惠券 | ¥50 |
| 机票优惠券 | ¥100 |
券已经挂到你的国航账户啦,打开国航 App → 个人中心 → 优惠券,就能看到使用。
如果你在账户里找不到,可以告诉我,我帮你再核实一下。
好的~每个号码在本次活动通常只能领一次,我再帮你试一次,但不保证能成功。
(继续走第 3 步正常流程,走到领券如果国航返回"已领"再老实告诉用户)
第 3 步:发短信 + 告诉用户查收 <SCRIPT> send_sms_code --phone <用户手机号> --area-code 86
验证码短信已经发到你的手机 138****1234 了(由中国国航官方号码发送),大约 30 秒内到,请查收后把 6 位验证码发给我。
如果提示"60 秒内只能发一次" 这个号码刚才 1 分钟内已经发过一次了~麻烦先查一下手机,短信可能已经到了。
如果一分钟后还没收到,我再帮你重新发一次 🙏
第 4 步:收到验证码 → 领券 → 开心告知 + 写账本 <SCRIPT> claim_coupon --phone <同上> --area-code 86 --veri-code <6位码>
领券成功会自动把该手机号+券码列表写入账本 (下次 check_claimed 就能命中),Agent 不用再做任何事。热情告知用户:
🎉 领取成功!给你发了 2 张国航机票优惠券:
| 券名 | 面额 | 券码 |
|------------|-----|------|
| 机票优惠券 | ¥50 | 929bfdf5c8e6463ba2e6f72bdde04e22 |
| 机票优惠券 | ¥100 | 4037f7c2743a4aa0b52647b792454bca |
券已经挂到你的国航账户了,打开国航 App → 个人中心 → 优惠券 就能看到使用啦 ✈️
祝你出行愉快~
常见用户问题 · 服务型话术 以下话术都遵循三条原则:不说技术词、把事情说清楚、服务意识强 。
用户说 对用户这样说 "没收到短信" "辛苦你查看一下垃圾短信或拦截的短信里有没有呀~如果确实没到,我一分钟后帮你重新发一次。" "验证码输错了" "没事的~麻烦你再看一眼短信,把验证码重新给我就好。" "能领几张券" "每次活动大概会发 1-2 张机票券,具体以实际到账为准,我帮你领一下看看?" "这券怎么用" "在国航 App 买机票时,订单页会自动显示'可用优惠券',选这张就可以抵扣啦。" "券什么时候过期" "券的有效期要到国航 App 的优惠券详情里看哈,我这边只能拿到券码、看不到到期时间。" "能帮我订机票吗" "抱歉呀,目前我只能帮你领券,订机票麻烦到国航 App 或官网操作。领好的券在订单页自动就能用~" "我上次领过了,再领一次" "好的~这次我需要再重新给你发一条验证码短信确认一下,稍等~"(走完整三步流程,不要提"旧的失效了"这种内部逻辑 ) "刚才那个验证码还能用吗" 若离发送超过 5 分钟:"保险起见我给你重新发一条吧~";若在 5 分钟内:"试试看呀,你把 6 位数字发给我。" "我这个号已经领过了 / 为什么领不到" 温和说:"这个活动每个手机号可能只能参加一次哦,如果之前领过,券已经在你国航账户里了~要不打开国航 App 看看优惠券里是不是已经有了?"(绝不说"防刷""拒绝""风控" ) "为什么要手机号" "需要手机号是为了给你发验证码,确认是你本人领取,也是为了把券挂到你的国航账户里。用完就过~" "安全吗" "放心~验证码会由中国国航官方号码发到你手机,整个流程是国航标准的领券验证。"
关于验证码和手机号,Agent 要记住但不主动说 Agent 心里明白,不主动讲 给用户听(问了再答):
每次领券都要重新发一条验证码——这是国航的规则,不能跳过,但对用户说的是"我给你发条验证码确认一下"
同一个手机号 1 分钟内只能发一次短信——遇到时用"刚才已经发过一次了~"化解,不提"限频"
验证码大约 5–10 分钟内有效——用户拖太久就主动说"保险起见我重发一条吧"
同一对话里用户已经报过手机号,领第二次券可以复用,不用再问 ,但一定要重新发一次验证码
跨会话不要记忆用户手机号 ,每次新会话都要重新问(隐私 + 用户可能换号)
账户侧可能每个号每次活动只能领一次——提示用户去 App 看券,不要把"拒绝""限制"甩给用户
禁止对用户使用的词 内部术语 对用户要换成 accessToken / token 什么都别说 appId / secretKey 什么都别说 adapter / procedure 什么都别说 签名 / MD5 / AES / 加密 什么都别说 securityCode / 0000 / 1000 / 3000 / 错误码 翻译成具体现象(下面表格) 接口 / 网关 / API / JSON / req / resp "国航那边" IP 白名单 "系统配置" / "我这边再处理一下" 后端拒绝 / 风控 / 防刷 / 限频 "刚刚已经发过一次了" / "这个活动每个号可能只能参加一次" 缓存 / 过期 / 失效 "保险起见我给你重新发一条"
错误的服务型翻译对照 系统层(Agent 看到的) 对用户说 securityCode=3000(IP 未白名单)"系统正在调整配置,稍等几分钟再试好吗?给你带来不便抱歉啦。" securityCode=1000(签名失败)"我这边遇到一点小问题,马上排查,稍后再帮你重新领一次。" securityCode=0005(token 失效)静默重试一次,用户完全不用知道 code=50023038(60 秒频控)"刚才 1 分钟内已经发过一次了,麻烦先查一下手机~" 验证码错误 "验证码不太对哦,再核对一下短信?或者我重新发一条?" 连续失败 "好像系统今天不太顺利~我记下了,帮你查查,稍后联系你再试?" 超时 "网络好像有点慢,再试一次好吗?"
隐私与合规要求
手机号在日志、回复里永远脱敏 (138****1234)
验证码不要回显 给用户(用户自己有)
券码要完整展示(用户需要用)但不要在非必要场景反复打印
严禁 用用户手机号做任何文档里没定义的操作
失败熔断(给 AI 的执行规则) 这个 skill 涉及远端 API 和本地沙箱两层环境,失败时必须能认输并停手 ,
避免无限重试烧 token、骚扰用户、重复调国航接口。熔断规则分场景判断,
不是"连续 N 次"一刀切 。
场景 A · 静默失败 → 1 次立即停 判断 :PowerShell 或 Bash 命令执行后既没有 stdout 也没有 stderr ,
或退出码为 0 但输出完全为空。
原因 :几乎 100% 是沙箱规则拦截(见"Windows 沙箱陷阱"章节和
references/windows-sandbox.md)。重试相同代码、或换几个"等价"API 换来换去
都只是在碰运气烧 token。
立刻停,不要试第 2 次
改用 scripts/airchina.ps1(Windows)或 scripts/airchina.sh(macOS/Linux)里封装好的子命令 ,不要自己写底层代码
如果调用封装命令仍然静默失败,说明 skill 本身需要更新,
向用户坦白"系统侧出了点问题,我记下来了,请稍后再试"
场景 B · 国航业务错误(明确 error code)→ 不要自动重试 判断 :命令有输出,输出里含 securityCode / code 字段但不是成功码。
典型错误码 (参考 references/status-codes.md):
code=50023038 → 60 秒限流,告诉用户等 1 分钟再来
验证码错误 → 请用户重新核对或重发
已领过 → 告诉用户去国航 App 看券
securityCode=3000 → IP 白名单问题,平台侧事
动作 :按 references/status-codes.md 翻译成用户话术,不自动重试
(比如明明验证码错了还用同一个验证码再请求一次 = 刷接口)。
场景 C · 网络类失败(timeout / 5xx / DNS)→ 最多 3 次 判断 :命令抛异常且异常信息含 timeout / connection refused / 5xx /
name resolution failure 等字样。
动作 :可以重试,但最多 3 次,每次间隔至少 2 秒。3 次仍失败告诉用户
"网络好像有点抖,等会儿再试一次好吗?"。
场景 D · claim_coupon 成功送达但本地解密失败 → 视为已领,停止重试 关键认知 :claim_coupon 只要 HTTP 返回 200 且 securityCode=0000,
国航账户侧已经领到券了 (2026-04-29 trace 证据在案)。哪怕本地解密失败
看不到券码,也不要再用同一个手机号+验证码重领 ——国航会判重复,
反而让用户以为"没领到又领了一堆"。
动作 :告诉用户"券应该已经发到你国航账户了,打开国航 App → 个人中心
→ 优惠券 看一下;如果没看到我再帮你找维护同学确认"。
同时在 stderr 打印原始加密响应供运维排查。
第二部分 · 面向技术维护(Agent 内部执行细节)
调用入口(按用户操作系统选择,不要跨平台混用 ) 用户系统 推荐脚本 可用工具 macOS / Linux scripts/airchina.shBashWindows scripts/airchina.ps1PowerShell其它 / 需融入 Python 业务代码 scripts/airchina_client.pyBash 或 PowerShell 调 python
判断方法 :看你当前环境里哪些工具可用——只有 PowerShell 没有 Bash 就是 Windows。
⚠️ Windows PowerShell 沙箱陷阱(必读) WorkBuddy 的 Windows PowerShell 沙箱会静默拦截 若干 .NET API——命令既不报错也不输出,
看起来像代码写错实际是被沙箱吃掉。已知被拦 API:
被拦截的 API 替代方案 [Convert]::FromBase64String(...)用 System.Security.Cryptography.FromBase64Transform [Convert]::ToBase64String(...)用 System.Security.Cryptography.ToBase64Transform
不要 自己写 PowerShell 做 AES/Base64 处理——全部交给 scripts/airchina.ps1 封装好的命令
不要 复制别处写过的 [Convert]::FromBase64String(...) 代码——这是已知陷阱,写多少次都会静默失败
airchina.ps1 某个操作失败时立刻停止重试 ,去读它 stderr 的错误信息,不要改内部实现
撞上沙箱拦截请走"失败熔断 · 场景 A"流程(见第一部分末尾)
主用:Bash(macOS / Linux) scripts/airchina.sh check-env
scripts/airchina.sh send_sms_code --phone <号> --area-code 86
scripts/airchina.sh claim_coupon --phone <号> --area-code 86 --veri-code <码>
scripts/airchina.sh invoke --adapter <X> --procedure <Y> --req '{...}'
AIRCHINA_DEBUG=1 scripts/airchina.sh send_sms_code --phone <号>
依赖:curl openssl jq base64 awk od(类 Unix 自带)
主用:PowerShell(Windows) scripts\airchina.ps1 check-env # 检查配置
scripts\airchina.ps1 send_sms_code --phone <号> --area-code 86
scripts\airchina.ps1 claim_coupon --phone <号> --area-code 86 --veri-code <码>
scripts\airchina.ps1 invoke --adapter <X> --procedure <Y> --req '{...}'
$env:AIRCHINA_DEBUG='1'; scripts\airchina.ps1 send_sms_code --phone <号>
依赖:PowerShell 5.1+(Windows 自带),零外部依赖。
脚本已内置 Base64/AES 沙箱规避,调用者不用也不应该关心底层怎么实现 。
备选:Python(跨平台) python scripts/airchina_client.py send_sms_code --phone <号> --area-code 86
from scripts.airchina_client import AirChinaClient
client = AirChinaClient()
client.send_sms_code(phone="..." , area_code="86" )
依赖:pip install requests pycryptodome
配置项(全部硬编码在脚本顶部) 所有对接参数都写死在 scripts/airchina.sh 和 scripts/airchina_client.py 顶部,不读任何环境变量。想改就直接改这两个文件的顶部常量块:
常量 值 含义 APP_IDiU4qgwcjS6vWkDOTsVKX3zQe国航签发的 appId SECRET_KEYqOtUj1yAg3h9rYvEWsN8XluM国航签发的 secretKey CHANNELTENCENT国航给腾讯 WorkBuddy 的渠道 SUB_CHANNELOTA固定 SERVICE_VERSION10100文档 v1.0.0 当前版本 ENV_MODEtest / prod切换测试/生产网关
AIRCHINA_ENV=prod — 切换到生产环境
AIRCHINA_DEBUG=1 — 打印中间值用于对账
上生产时 :只改 APP_ID / SECRET_KEY / ENV_MODE 三项。
核心协议规则(维护者需知,用户不知) 下面两条是文档没写明、我们联调踩坑后才定位到的隐藏约定 。skill 已内置处理,新加接口或自己改实现时必须保留。
⚠️ 隐藏约定 1:MD5 签名必须大写 hex 国航 MD5Util.Md5 返回大写,小写会稳定返回 securityCode=1000(签名验证失败)。Bash 版在 md5_of() 里 tr 'a-f' 'A-F',Python 版 .hexdigest().upper()。
⚠️ 隐藏约定 2:响应 resp 解密后还需 URL-decode AES 解密后得到的是 %7B%22msg%22%3A%22ok%22%7D 这种 URL-encoded 字符串,必须再 urldecode 一次才能得到 JSON。Bash 版用 awk 实现,Python 版用 urllib.parse.unquote。
签名输入 按 key 升序拼 lang=zh_CN&req=<JSON裸值>×tamp=<毫秒>,整串 MD5,结果转大写。
AES 加密
密钥 = accessToken[8:24](16 字节,AES-128)
模式 AES/ECB/PKCS5Padding
openssl 命令行必须带 -nosalt
两个业务接口的成功码不同
短信:resp.code == "0"
领券:resp.code == "00000000"
accessToken 有效期 2 小时 Bash 版文件缓存在 $TMPDIR/airchina_token_${env}.json,缓存 110 分钟,过期自动刷新。
缓存 / 失效层级全貌(维护者视角) 层级 缓存对象 位置 有效期 用户感知 L1 accessToken(应用级凭证) $TMPDIR/airchina_token_*.json (Bash) / 进程内 (Python)110 分钟(国航标 2h 减 10min 余量) 无感,Agent 和国航之间的事 L2 短信验证码 60 秒频控 国航后端 60 秒 有感(重发被拒) L3 短信验证码本身 国航后端 推测 5–10 分钟(文档没写) 有感(超时领券失败) L4 活动领券记录 国航账户 永久(按活动规则可能限每人一次) 有感(重复领可能被拒)
accessToken 是应用级凭证 (腾讯 WorkBuddy 这个 appId 的通行证),不是用户身份。1 个 accessToken 可以给 N 个用户发短信、领券。不要在对话里把它暴露给用户。
新增接口扩展流程 国航后续会补接口(文档暗示有 ACOTATrip / getRecycleTripData 等)。扩展步骤:
首选 :不改 skill 代码,直接用 invoke
scripts/airchina.sh invoke --adapter <X> --procedure <Y> --req '{...}'
封装 (如果要给用户场景化用):
在 scripts/airchina.sh 加 cmd_xxx() 函数 + main() 的 case 分支
在 references/api-xxx.md 写一份字段表
在本 SKILL.md 第一部分加一段"用户怎么说 → 怎么回"的话术
Python 版按需同步
参考文件
references/protocol.md — 协议细节
references/api-send-sms-code.md — 短信接口字段
references/api-claim-coupon.md — 领券接口字段
references/status-codes.md — 错误码对照
references/troubleshooting.md — 7 关卡诊断流程
references/windows-sandbox.md — Windows PowerShell 沙箱已知限制与规避方案
examples/curl-demo.sh — 手工 curl 示例
⚠️ 本 skill 基于国航 B2C 接口规范 v1.0.0(2026-04-29)。v2.x 升级时重点核对签名、加密、channel 值是否变化。