Answers
Why do Jina Reader and other web readers fail on WeChat article links?
Short answer
WeChat answers most automated fetches of mp.weixin.qq.com with a verification page (环境异常) instead of the article, so generic readers hand your AI pipeline captcha text or nothing at all. Send WeChat links to a dedicated article endpoint and keep your reader for every other site: okdata returns the full text, account and publish time for $0.02 per link.
Picture a research agent that reads the 40 links your team drops into a channel each day and writes a morning brief. Most links go through Jina Reader or a crawler and come back as clean Markdown. The WeChat ones come back as a few lines asking you to verify your environment, and the agent either says it could not read them or, worse, summarises the verification page and embeds it into your knowledge base. The Jina Reader tracker has several reports of exactly this. The fix is small: route links on mp.weixin.qq.com to Official Account article detail and leave every other site to the reader you already use.
Route by host
import os
import requests
from urllib.parse import urlparse
API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
BLOCK_SIGNS = ("环境异常", "完成验证")
def read_wechat(url):
body = requests.get(API + "/v1/wechat_mp/articles/get", headers=H,
params={"url": url}, timeout=60).json()
if body["code"] != "ok":
return {"url": url, "error": body["code"], "retry": body["retry"]}
a = body["data"]["item"]
return {"url": url, "title": a["title"], "text": a["text"],
"account": a["author"]["name"], "published_at": a["published_at"]}
def read_other(url):
text = requests.get("https://r.jina.ai/" + url, timeout=60).text
if any(sign in text[:500] for sign in BLOCK_SIGNS):
return {"url": url, "error": "blocked_page"}
return {"url": url, "text": text}
def read_url(url):
host = urlparse(url).hostname or ""
return read_wechat(url) if host == "mp.weixin.qq.com" else read_other(url)
The check on the first 500 characters matters even after you route WeChat away. Other sites also answer bots with challenge pages, and a pipeline that stores them silently fills a vector store with noise.
What it costs
| Volume | Calls | Cost |
|---|---|---|
| One article | 1 | $0.02 |
| 20 WeChat links a day for 30 days | 600 | $12.00 |
| Backfilling 2,000 saved links | 2,000 | $40.00 |
Failed calls cost nothing, so a deleted article in the list does not add to the bill.
Limits worth knowing
- The body comes back as plain text. Images, charts and image captions are not included; if a post is mostly infographics, the text will be thin.
- Articles removed by the author or by WeChat return
not_found. Do not retry those. - Reads and likes are filled when WeChat shows them; otherwise they are null and the response says why.
- For an account's whole back catalogue rather than single links, list it first with Official Account article history.
- Only public articles. The text belongs to its author: summarise and cite, do not republish.
Other ways to handle it
For a single article, copying the text into the chat is free and works every time. A headless browser on a residential connection gets through sometimes, but you inherit the upkeep when WeChat changes its checks. WeChat's official API returns articles only for accounts you own, which is the right choice for your own back catalogue. For following whole accounts, an RSS bridge such as wewe-rss is free if you can keep its WeChat Reading login alive. The content research page shows how this fits with the other platforms.
Updated