用途:帮助开发者搭建 Scrapfly Webhook 处理器,接收并验证异步 Scrape、Extraction、Screenshot 及 Crawler API 的回调结果。
主要能力:按资源类型分发事件;校验签名;处理爬虫事件(crawler_started、crawler_url_visited、crawler_finished 等);提供 Express、Next.js、FastAPI 的完整示例与测试。
使用方式:签名算法为 HMAC-SHA256(secret, raw_body).hexdigest().upper(),请求头为 X-Scrapfly-Webhook-Signature(同时发送小写版本)。必须使用原始请求体字节验证,先验证、再按 X-Scrapfly-Webhook-Resource-Type 分发、最后解析,不要先解析再序列化 JSON,否则字节变化会破坏签名。Express 中应使用 express.raw({ type: '/' });Screenshot 投递为原始图片字节(JPEG/PNG/WebP/GIF),与仪表盘配置的 Content-Type 无关,需在 JSON.parse 之前按资源类型分发。密钥从 Scrapfly 仪表盘原样取用,勿裁剪或 base64 解码。环境变量为 SCRAPFLY_WEBHOOK_SECRET。本地测试可用 npx hookdeck-cli listen 3000 scrapfly --path /webhooks/scrapfly(FastAPI 用 8000),再把隧道地址配置为仪表盘目标并以 webhook_name 触发任务。
适用场景:单一端点同时服务多种 Scrapfly 产品的异步任务回调;需要按 job 或 webhook id 做幂等处理;也可通过 Hookdeck 事件网关在边缘完成签名验证,此时处理器只需验证 Hookdeck 签名。
限制:Webhook 仅对付费套餐可用,FREE 套餐队列为 0 且仪表盘隐藏 Webhook UI,即使配置也不会投递;没有官方 Webhook 验证 SDK,需按文档算法自行实现;无时间戳或重放窗口,签名仅代表真实性;Content-Type 不可靠,不能据此判断内容格式(msgpack 需替换 JSON 解析器)。