招标商机监控(付费版)
把「公网爬虫采集招标信息 + HTML 日报生成」封装成可复用付费工作流。
核心原则:付费成功 → 直接采集数据 → 返回 HTML 日报
付费前置检查(必须先做)
调用本 Skill 前,检查当前 Agent 是否已安装微信支付能力(weixinpay 插件 / weixinpay_pay 工具):
- ✅ 已安装 → 继续下方工作流程
- ❌ 未安装 → 提示用户「当前 Agent 暂不支持微信支付付费能力,无法使用此 Skill」,终止流程
工作流程
第一步:交互式配置引导(技能每次运行时先执行)
技能启动后,用问答式引导用户完成配置。
采集配置(必问):
1. 采集范围:需要采集哪个城市 / 区域的招标信息?
> 例如:珠海市、广州市、广东省等
2. 日期范围:需要哪一天或哪一时间段的招标数据?(YYYY-MM-DD)
> 默认:前一天
3. 行业分类:需要限定哪些行业类别?(可选,留空则不限)
> 例如:行政办公、工程建设、医疗卫生等
推送配置(必问):
4. 推送周期与时间:希望多久推送一次?
> 选项:每天 / 每周 / 每月
> 如选「每天」,请指定推送时间(如 09:00)
> 如选「每周」,请指定周几和推送时间(如周一 09:00)
> 如选「每月」,请指定几号和推送时间(如每月1号 09:00)
5. 推送方式:希望如何接收招标日报?
> 选项:QQ 邮箱推送 / WorkBuddy APP 端推送 / 微信群推送
> 默认:QQ 邮箱推送
> - 如选 QQ 邮箱:需提供收件邮箱地址
> - 如选微信群:需提供微信群名(调用 wechat-desktop-send 技能)
默认规则:
- 日期:默认采集前一天的全部招标数据
- 区域:默认获取用户当前位置所在城市的招标数据
- 行业:默认全选不做限制
- 推送:默认每天 09:00 通过 QQ 邮箱 推送
⚠️ 重要:将用户配置结果存入变量/缓存,供后续步骤使用:
{
"region": "珠海市",
"date": "2026-08-27",
"industry": "",
"push": {
"schedule": "DAILY",
"time": "09:00",
"channel": "email",
"email": "[email protected]"
}
}
第二步:发起首次请求(付费前)
向用户确认配置后,显示价格并发起首次请求:
POST https://pay.fastersoft.com.cn/demo/skill/invoke
Content-Type: application/json
{
"source": "crawler",
"params": {
"date": "2026-08-27",
"region": "珠海市",
"industry": ""
}
}
第三步:处理 402 响应(关键)
收到 HTTP 402 响应后,从响应头或响应体中提取并必须同时保存以下两个值:
| 从响应中提取 | 保存变量 | 含义 |
|---|---|---|
WeixinPay-Required(Header 或 Body 的 payment_code 字段值) |
payment_code |
微信支付授权码 |
X-Out-Trade-No(Header 或 Body 的 out_trade_no 字段值) |
out_trade_no |
订单号 |
两者缺一不可,且必须在第五步原样回传。
向用户展示支付提示,例如:
> 本次招标商机采集需支付 ¥X.XX,即将发起微信支付授权。
第四步:发起支付
将第三步保存的 payment_code 作为参数,调用:
weixinpay_pay(paymentCode="第三步保存的 payment_code")
等待用户手机端确认并完成支付。
第五步:支付成功后获取数据(⚠️ 必须执行)
支付成功后,必须用原订单号重新请求,通过 Header 携带第三步保存的两个凭证值:
POST https://pay.fastersoft.com.cn/demo/skill/invoke
Content-Type: application/json
WeixinPay-Required: 第三步保存的 payment_code
X-Out-Trade-No: 第三步保存的 out_trade_no
{
"source": "crawler",
"params": {
"date": "2026-08-27",
"region": "珠海市",
"industry": ""
}
}
> ⚠️ 注意:
> - Body 与第二步完全一致,不要修改
> - 必须通过 Header 传递 WeixinPay-Required(值为 payment_code)和 X-Out-Trade-No(值为 out_trade_no)
> - 不携带 Header 重试 = 永远拿不到数据
成功响应(HTTP 200)包含:
- data.records — 招标信息数组
- data.report_html — HTML 日报内容
成功响应后,执行以下操作:
1. 读取第一步缓存的采集参数(region、date、industry、push配置)
-
发起公网采集(使用
agent-browserSkill):
- 访问目标城市的公共资源交易中心、政府采购网等招标信息网站
- 按配置的日期范围和行业分类筛选招标公告
- 采集字段:项目名称、采购单位、预算金额、发布时间、截止日期、资质要求、行业分类、原文链接 -
生成 HTML 日报:
- 按references/report-spec.md规范生成结构化 HTML
- 支持按行业分组展示
- 每条记录包含可点击的详情链接
第六步:交付用户
将采集结果或生成的 HTML 日报呈现给用户:
> 这是您的招标商机报告,请查收!
定价
| 项目 | 说明 |
|---|---|
| 计费方式 | 按次计费 |
| 单价 | ¥0.10 元/次 |
| 货币 | CNY |
> 实际价格以服务后台配置为准。付费前会向用户展示确认价格。
错误处理
| 情况 | 处理方式 |
|---|---|
| 402 但用户取消支付 | 提示「支付已取消,可稍后重试」 |
| 重试仍返回非 200 | 检查 Header 是否完整携带,订单号是否匹配 |
| 目标网站反爬拦截 | 提示用户稍后重试 |
安全提示
- 不要向用户泄露
payment_code或订单号以外的内部信息 - 每次调用生成独立订单,不要复用
out_trade_no - 支付凭证仅在当前会话内使用,不持久化存储