A URL with no article at it no longer reports a failed run. The upstream
answers a deleted, non-public or mistyped article with HTTP 200 + code 200
and puts the reason in the body ("请求参数可能有误(如无效的文章 URL…)请
检查参数后重试。注意:使用无效参数的请求被微信处理后仍会计费。") — the
request was answered, and the answer is "there is no such article". The
Actor used to treat that as a fault and end the run with exit code 91, so
the Store counted a normal answer as a broken Actor.
Measured 2026-10-21 on the platform: 31 of this Actor's 66 runs in 30 days
failed this way, holding its Store success rate at 53%. The upstream is
charged for the call whether or not the run succeeds, so ending the run
early saved the user nothing and cost them a red run.
The run now finishes successfully and the dataset carries one
type: 'notice' row explaining what happened, with the upstream's own
reason attached. The SUMMARY record gains ok: false and
, so a successful-but-empty run is distinguishable from a broken one.
Consumers that read the dataset should skip rows whose type is
notice.
The URL check no longer rejects links WeChat itself produces. The
pattern used to require the whole string to match, which turned away
…/s/<id>#rd (the anchor the share dialog adds) and …/s/<id>/ (a
trailing slash) — both of which users paste verbatim. They are accepted
now. The check was also a widening rather than a narrowing of what was
accepted before: the optional subdomain prefix (…mp.weixin.qq.com) is
kept, and a bare …/s is passed to the upstream, which answers it
precisely. A local check stricter than the upstream only produces failed
runs the upstream would have answered.
The rule is now identical to the one in wechat-article-metrics-scraper
and wechat-article-comments-scraper. Sibling Actors disagreeing about
what a valid input is is a bug, not a matter of taste.