Answers

we-mp-rss keeps asking me to rescan the QR code. How do I keep a WeChat feed running?

Short answer

Take the login out of the loop: fetch each Official Account's newest articles with an API key instead of a scanned backend session. Official Account article history returns 10 articles per call at $0.04, so 15 accounts checked twice a day cost $36.00 a month, and nothing expires.

A content team following 15 industry accounts wants new articles to land in their group chat by lunchtime, every day, including the days nobody is around to scan a QR code. That is the job a scanned login can't do reliably. Fetch the article lists with an API key and the session problem goes away: Official Account article history returns an account's 10 newest articles per call, and there is no QR code anywhere in the flow.

Why the QR code keeps coming back

we-mp-rss and similar tools sign in to the Official Account backend (mp.weixin.qq.com) with an account you own, then use its search to read other accounts' article lists. That session lasts a few days. When it ends, every feed stops with a message asking you to authorize again. The same message also shows up when WeChat throttles the account for asking too often, so it is hard to tell which of the two hit you.

Keeping the feed alive

  1. Look up each account's original ID (gh_…) once with Official Account search.
  2. Twice a day, call article history for each ID and keep links you haven't seen.
  3. Post the new ones to your chat, RSS file or database.
import os, requests

API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
WEBHOOK = os.environ["CHAT_WEBHOOK_URL"]  # your Feishu / Slack / WeCom bot

def new_articles(gh, seen):
    body = requests.get(API + "/v1/wechat_mp/accounts/articles/list",
                        headers=H, params={"id": gh, "fields": "title,url,published_at"},
                        timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(f"{gh}: {body['code']} {body['message']}")
    return [a for a in body["data"]["items"] if a["url"] not in seen]

seen = set()  # load this from disk in a real job
for a in new_articles("gh_363b924965e9", seen):
    requests.post(WEBHOOK, json={"text": f"{a['title']}\n{a['url']}"}, timeout=30)

Cost

Accounts Checks a day Calls a month Cost a month
15 2 900 $36.00
15 6 2,700 $108.00
50 1 1,500 $60.00

Most accounts publish once a day at most, so checking more often than twice rarely finds anything new. Failed calls cost nothing.

Limits

  • You get what the account has published publicly: title, link, summary, publish time, and reads and likes where available (null otherwise, listed in meta.unavailable).
  • Full text is a separate call to article detail at $0.02 per article.
  • If an account moves to a new account through WeChat's account migration, search for it again: the new account has a new original ID.

When to keep the scan-based setup

we-mp-rss is free, and for a handful of feeds you read yourself, a rescan every few days is a fair price. Set up its expiry notification so you hear about it the same day. If the account you care about is your own, WeChat's official API lists your published articles without any third party. For a team feed that has to arrive every day, see competitor monitoring.

Updated