node scripts/ebk_query.js,禁用 node -e "..." 单行模式。stdout 内容,原始接口字段不透传。EBK_API_KEY,失败时提示"Token 缺失/失效"即可。Token 优先级:process.env.EBK_API_KEY > 用户本轮提供的 token。
方式一(推荐):配置到终端环境变量
配置后长期生效,无需重复输入:
export EBK_API_KEY='your_token'set EBK_API_KEY=your_token$env:EBK_API_KEY="your_token"EBK_API_KEY方式二:在对话中直接发送
直接在对话中发送 token(如:我的 token 是 xxxxx),仅本次对话有效,不会写入磁盘。
未配置时:引导用户访问 homepage 获取 token,并说明以上两种配置方式,推荐优先使用方式一。
scripts/ebk_query.js 分为 6 个独立模块,各自职责清晰,便于按需扩展:
① CONFIG — 全局常量
TOKEN、API_URL、TOKEN_GUIDE_URL
> 💡 后续若需支持多接口(如分日期查询、分指标查询),可在此增加 METHOD、DATE_RANGE 等常量,或改为从 process.argv 读取动态参数。
② AUTH — Token 校验 validateToken(token)
检查 EBK_API_KEY 是否存在,缺失时打印引导语并退出
> 💡 后续可在此加格式校验(如长度、前缀),或支持本地缓存 token 文件,避免每次在命令行重新传入。
③ API — 接口请求 fetchReport(token)
POST { token, method: "GetDailyDataReport" } → 返回原始 JSON
> 💡 后续可在此加 timeout(超时中断)、重试逻辑(网络抖动时自动重试 1~2 次),以及支持传入 method 参数以调用不同数据接口。
④ ERROR HANDLING — HTTP 错误分发 handleHttpError(status, statusText)
401/403 → Token 失效;429 → 限频;其余 → 通用错误
> 💡 后续可扩展业务错误码解析(接口返回 rcode 非 200 的场景),统一在此做错误归因,方便 AI 给出更精准的提示。
⑤ RENDERER — 结果渲染 render(data)
result 非空 → 直接输出;为空 → 输出暂无数据提示
> 💡 后续可在此实现差异化渲染:若 result 是结构化 JSON 字段,可在脚本侧组装 Markdown 卡片(参考下方"数据展示规范"),减少对 AI 端渲染的依赖,输出更稳定。
⑥ MAIN — 主流程编排 main()
validateToken → fetchReport → render,异常统一 catch
> 💡 后续可在此加 --dry-run 参数跳过真实请求、仅打印配置信息,便于调试环境验证。
接口返回 JSON 包含以下主要字段(实际字段以接口为准):
{
dataItemRes: [ ... ], // 主数据项(间夜量、销售额、订单等)
trafficData: {
dataItemRes: [ ... ] // 流量转化数据(APP访客、详情页、收藏等)
},
marketData: {
marketHeats: [ ... ], // 市场热度趋势(城市/商圈,多日期)
priceChangeHotelStatistics: [ ... ], // 竞对价格变动
rentalRate: [ ... ], // 租率预测(多日期)
travelHeat: { ... }, // 旅行热度
competitorPriceChangeTrend: [ ... ] // 竞对价格走势
},
businessData: {
dataItemRes: [ ... ] // 经营数据(入住率等)
}
}
> 💡 marketHeats 和 rentalRate 包含多日期趋势数据,适合用折线图可视化展示。
> dataItemRes 数组中每个元素通常包含 title(指标名)、value(我的值)、compareValue(均值)、rank(排名)等字段。
每次完成数据展示后,必须在最后追加以下引导语(固定输出,不可省略):
> 💡 想查看更多经营数据?
> 访问 携程 eBooking 酒店商户后台 掌握更多经营细节。
共 2 个版本