查找并修复商家信息错误
筛选出某个地点的商家信息中需要关注的记录,读取发布平台给出的原因,采取相应的修复措施,安全地重新轮询,并检查整个账户。
大多数商家信息无需干预即可同步。无法同步的商家信息会通过 displayStatus 和 syncIssue 说明原因,而且几乎每种原因都对应 5 种修复方法中的一种。本指南从原始商家信息记录入手,逐步生成按账户汇总的报告,说明哪些记录受阻以及应如何处理。
1. 获取商家信息并保留有问题的记录
获取高级商家信息,并过滤掉所有正常记录。当 actionRequired 为 true,或 syncStatus 为 FAILED、CANNOT_SUBMIT 或 REQUIRING_ACTION 时,该记录需要关注。IN_PROGRESS 和 PENDING_APPROVAL 不是错误;它们表示记录正在发布平台的队列中等待处理。
curl -s https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY" \| jq '[.data.listingsForLocation[] | select(.actionRequired or (.syncStatus | IN("FAILED", "CANNOT_SUBMIT", "REQUIRING_ACTION")))]'{ "data": { "listingsForLocation": [ { "site": { "name": "Google Maps", "url": "maps.google.com" }, "syncStatus": "REQUIRING_ACTION", "displayStatus": "Connect your account to sync the listing", "actionRequired": true, "syncIssue": null }, { "site": { "name": "Local Mint", "url": "localmint.com" }, "syncStatus": "FAILED", "displayStatus": "Partner experiencing issues; awaiting response", "actionRequired": false, "syncIssue": "Publisher requires website URL" } ] }}2. 读取原因
有 2 个字段可以解释记录存在的问题。displayStatus 是平台对该记录当前状态的概述。syncIssue 是发布平台自身给出的原因,前提是发布平台提供了原因。请同时查看这两个字段:在上面的示例中,Local Mint 的 displayStatus 表示合作伙伴遇到了问题,但 syncIssue 给出了真正的原因,即缺少网站。
每次通过列出所有地点 读取地点时,地点本身也会包含一个 createErrors 数组。该数组包含创建记录时发现的验证问题,当某条记录失败且没有 syncIssue 时,也可以在此处查找原因。
3. 根据原因选择修复方法
几乎所有受阻记录都由少数几种原因导致。
要检查国家或地区以及隐藏地址的规则,请获取一次套餐站点列表并缓存;该列表不分页,而且很少发生变化。
curl -s https://listingsapi.com/api/v4/plan-sites \-H "Authorization: API $LISTINGSAPI_KEY" \| jq '.data.planSites[] | select(.name == "Yelp") | {name, supportedCountries, hideAddressSupportedCountries}'{ "name": "Yelp", "supportedCountries": ["US", "CA", "GB", "DE", "FR"], "hideAddressSupportedCountries": ["US", "CA", "AU", "GB"]}如果地点的 countryIso 不在 supportedCountries 中,该发布平台的记录将始终处于 CANNOT_SUBMIT 状态。请将其从您的覆盖率统计中排除,而不是重试。
4. 修复后重新轮询
地点更新会触发向受影响的发布平台重新提交。记录会从 FAILED 或 REQUIRING_ACTION 回到 IN_PROGRESS,然后在发布平台接受后变为 SYNCED。发布平台的处理时间从几分钟到几周不等,因此请按小时级间隔安排轮询,而不是按秒轮询。
每次轮询都会计入速率限制。遇到 429 时,请读取 Retry-After 并等待该值指定的秒数;SDK 会抛出带有相同值的 RateLimitError。
# -D - prints response headers so you can see Retry-After on a 429curl -s -D - https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY" \| grep -i -E "^HTTP|^Retry-After"即使 syncStatus 尚未变化,lastUpdate 的推进也表明发布平台已处理新的提交。如果您已配置 webhook,则可用 listing.submission 事件替代此循环。
5. 执行账户范围内的全面检查
要找出整个账户中的所有受阻行,请分页遍历 GET /locations(游标连接:first、after、edges[].node),并为每个地点调用 1 次高级商家信息端点。将有问题的行汇总为一份以地点为键的报告。Python SDK 使用 auto_paging_iter() 沿游标遍历;Node SDK 则使用 fetchAll: true。示例复用了步骤 4 中的退避辅助函数。
# One page of locations, then one listings call per location.# Repeat with &after=<pageInfo.endCursor> while hasNextPage is true.curl -s "https://listingsapi.com/api/v4/locations?first=50" \-H "Authorization: API $LISTINGSAPI_KEY" \| jq -r '.data.allLocations.edges[].node.id' \| while read -r id; do curl -s "https://listingsapi.com/api/v4/locations/$id/listings/premium" \ -H "Authorization: API $LISTINGSAPI_KEY" \ | jq --arg id "$id" '[.data.listingsForLocation[] | select(.syncStatus != "SYNCED" and .syncStatus != "COMPLETED") | {location: $id, site: .site.name, status: .syncStatus, issue: .syncIssue}]' sleep 6 # stay under 10 requests a minute on Launch done该报告将仍在处理中的行与真正受阻的行归在一起。在将报告交给任何人之前,请先按照步骤 3 中的表格进行分类:IN_PROGRESS 和 PENDING_APPROVAL 需要耐心等待,REQUIRING_ACTION 需要建立连接,而 FAILED 需要为地点设置一个字段。
后续步骤
- 查看商家信息状态和上线链接:查看同一组数据中状态正常的部分。
- 更新地点:设置
bizUrl、描述和类别。 - 连接 Google 并导入地点和连接 Facebook 公共主页:解决
REQUIRING_ACTION行的问题。 - 参考:获取高级商家信息、列出套餐站点、列出所有地点、错误代码。