求助:使用Google Apps Script实现Onnit订单追踪表单提交失败
问题分析与解决方案
为什么第一个POST请求失败
直接向order-tracking.php提交email和zip参数无效,核心原因:
- 该页面的表单并非直接提交到自身,而是通过前端JavaScript将请求转发到了后端API接口
- 缺少必要的请求头(如
User-Agent、Referer)或隐藏参数(如CSRF令牌),导致服务器拒绝请求 - 表单提交的目标URL并非你指定的PHP页面,而是未公开的API端点
正确实现流程
通过浏览器开发者工具抓包可知,订单追踪的实际流程分为两步:
- 提交Email和Zip Code到验证API,获取订单ID(
order)和追踪哈希(trackingHash) - 使用上述两个参数调用详情API,获取最终追踪数据
步骤1:模拟表单提交获取订单标识
先通过开发者工具的网络请求面板,找到网页提交表单时实际触发的POST API端点(通常类似https://api.onnit.com/orders/track),再用以下代码模拟请求:
function getOrderTrackingIdentifiers() { var email = "email@gmail.com"; var zipcode = "12345"; // 替换为抓包得到的实际API端点 var apiEndpoint = "https://api.onnit.com/orders/track"; var options = { method: "post", headers: { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.107 Mobile Safari/537.36", "Referer": "https://www.onnit.com/cart/order-tracking.php", "Content-Type": "application/json" // 若表单是表单编码提交,替换为application/x-www-form-urlencoded }, payload: JSON.stringify({ email: email, zip: zipcode }) }; try { var response = UrlFetchApp.fetch(apiEndpoint, options); var data = JSON.parse(response.getContentText()); // 根据实际响应结构提取参数,此处为示例 var orderId = data.order.id; var trackingHash = data.trackingHash; return {orderId: orderId, trackingHash: trackingHash}; } catch(e) { Logger.log("请求失败:" + e.toString()); return null; } }
步骤2:调用详情API获取追踪数据
用步骤1得到的参数,调用你已验证有效的详情API,并可将结果写入表格:
function fetchOrderTrackingData() { var identifiers = getOrderTrackingIdentifiers(); if (!identifiers) return; var apiUrl = `https://api.onnit.com/orders/${identifiers.orderId}/shipments?trackingHash=${identifiers.trackingHash}`; var options = { method: "get", headers: { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.107 Mobile Safari/537.36", "Referer": "https://www.onnit.com/cart/order-tracking.php" } }; try { var response = UrlFetchApp.fetch(apiUrl, options); var content = response.getContentText(); Logger.log(content); // 解析数据并写入表格示例 var trackingData = JSON.parse(content); var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.appendRow([ trackingData.order.id, trackingData.shipments[0].trackingNumber, trackingData.shipments[0].status ]); } catch(e) { Logger.log("获取追踪数据失败:" + e.toString()); } }
关键注意事项
- 准确抓包:务必通过浏览器开发者工具确认表单提交的目标API、请求头、参数格式,避免用错端点
- 请求头一致性:服务器会校验
User-Agent、Referer等信息,需与浏览器请求保持一致 - 异常处理:添加错误捕获逻辑,处理请求失败、响应解析错误等场景
- API稳定性:这类未公开的API可能随时变更,需定期验证请求有效性
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

