Internal test build — use wechat-official-account-scraper avatar

Internal test build — use wechat-official-account-scraper

Pricing

from $7.00 / 1,000 article search results

Go to Apify Store
Internal test build — use wechat-official-account-scraper

Internal test build — use wechat-official-account-scraper

Internal QA twin. Use the supported product instead: https://apify.com/korado_labs/wechat-official-account-scraper

Pricing

from $7.00 / 1,000 article search results

Rating

0.0

(0)

Developer

Korado Labs

Korado Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

WeChat Official Account Scraper — Articles, Accounts & Change Tracking

Scrape WeChat Official Account (公众号, gongzhonghao) articles and account profiles from publicly accessible sources, and keep the results up to date automatically. This WeChat scraper searches articles by keyword, finds accounts by name, extracts the full text of public article pages, and — unlike a one-shot scraper — remembers what it has already seen so later runs return only what is new or edited. Results are delivered as structured JSON, CSV or Excel, or pushed to your own endpoint through signed webhooks.

No login, no cookies, and no account credentials are required or accepted.


What this WeChat scraper does

CapabilityDetails
Article searchFind public WeChat articles by keyword, with pagination and a since date filter
Account searchResolve public Official Account profiles by name
Account article historyPull the recent public article list for a named account
Article detail extractionFetch a public mp.weixin.qq.com article and extract title, author, publish time and full text
Change trackingDetect new, edited and removed articles across runs — the differentiating feature
Signed webhooksHMAC-SHA256 signed delivery to your endpoint, with SSRF protection and retries
Structured exportJSON, CSV, Excel, or direct API/integration access

Why choose this WeChat Official Account scraper

Most WeChat scrapers return a snapshot: you run them, you get rows, and every later run returns the same rows again — which you then pay for again and have to de-duplicate yourself. This Actor is built around retained state.

  • Incremental sync, not repeated snapshots. Every article version is fingerprinted with a content hash. Re-running a monitor returns only genuinely new or genuinely edited articles.
  • You are not billed twice for the same row. Unchanged articles are skipped before charging, so a daily monitor costs a fraction of a daily full re-scrape.
  • Real change detection. Rows carry a changeType of new or modified, plus a status of active, modified or unavailable, so you can see silently edited and deleted posts — a common compliance and PR signal.
  • A durable outbox. A row is only marked delivered after it is actually written and charged. If a run crashes mid-way, the next run resumes instead of losing or duplicating data.
  • Zero setup for state. Monitoring works out of the box using your own Apify key-value store. PostgreSQL is optional, and only needed if you want to run multiple monitors concurrently.
  • Errors are never billed. Blocked pages, empty results and invalid input produce unbilled diagnostic rows, not charges.
  • Hardened webhook delivery. Webhook targets are DNS-resolved and pinned, private and reserved IP ranges are refused, redirects are not followed, and every payload is HMAC signed.

Supported operations

operationWhat it returnsBilled event
articleSearchPublic articles matching a keywordsearch-result
accountSearchPublic Official Account profilesaccount-result
accountRecentArticlesRecent public articles for a named accountsearch-result
articleDetailFull text and metadata for public article URLsarticle-detail
monitorAccountsOnly new/changed articles for a watchlistsearch-result + monitored-account-day

Add "resolveLinks": true to any article operation to replace the search index's session-bound redirect links with the real mp.weixin.qq.com article URL (one extra request per row, so runs take longer). Row identity (articleId) comes from the source's stable document id, so change tracking works the same with or without link resolution.


Quick start

  1. Click Try for free and open the Input tab.
  2. Choose an operation — start with articleSearch and a keyword such as 科技.
  3. Click Start, then download results as JSON, CSV or Excel from the Storage tab.

To start monitoring, switch operation to monitorAccounts, add public account display names, wxids, or gh_ ids to watchlist, and schedule the Actor to run daily. The first run captures a baseline; every run after that returns only changes.


Input example

{
"operation": "articleSearch",
"keyword": "人工智能",
"maxPages": 3,
"since": "2026-01-01",
"resolveLinks": true
}

Monitoring with webhook delivery:

{
"operation": "monitorAccounts",
"watchlist": ["人民日报", "rmrbwx", "gh_363b924965e9"],
"maxPages": 2,
"webhookUrl": "https://example.com/hooks/wechat"
}

Output example

{
"schemaVersion": 1,
"recordType": "article",
"articleId": "9f2c1b7e5a…",
"url": "https://mp.weixin.qq.com/s?__biz=…",
"title": "人工智能行业观察",
"accountName": "示例公众号",
"publishedAt": "2026-03-04T02:11:00.000Z",
"status": "modified",
"changeType": "modified",
"contentHash": "3b7f…",
"contentText": "…"
}

Every row carries schemaVersion and recordType (article, account, monitorSummary or error), so downstream loads never break on a mixed dataset.


How to use the WeChat Official Account API

Run the Actor programmatically with the Apify API. Replace YOUR_TOKEN with your API token.

cURL

curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~wechat-official-account-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"operation":"articleSearch","keyword":"科技","maxPages":2}'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("YOUR_USERNAME/wechat-official-account-scraper").call(
run_input={"operation": "articleSearch", "keyword": "科技", "maxPages": 2}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["url"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('YOUR_USERNAME/wechat-official-account-scraper').call({
operation: 'articleSearch',
keyword: '科技',
maxPages: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Coverage honesty: what the public index can and cannot see

Results come from the public web index of WeChat Official Account content. Coverage is strongest for keyword search. For a specific account's history, recall depends on how that account's articles rank in the public index: mid-size accounts usually return rows, while the very largest media accounts (whose names are quoted by thousands of other accounts) may return few or none. Raise maxPages to search deeper. If an account returns nothing, that is an index-coverage limit, not an error — the run is free in that case.

Account search (accountSearch) uses the public account vertical where available and automatically falls back to deriving publisher profiles (name + gh_ id) from public article pages where that vertical is region-gated. Rows from the fallback carry the account's gh_ id but not its vanity wxid. To reach the region-gated vertical directly, configure a China (CN) residential exit under Proxy configuration (or pass your own proxyUrls); without one, the fallback keeps account search working everywhere.

Date filtering is applied client-side (since): the index no longer honors server-side date parameters, so results are filtered after fetching. Article identity is stable across runs — the source's per-document id is used, never its session-bound redirect URL (verified across sessions, hours, and datacenters).


Change monitoring and webhooks

Schedule monitorAccounts daily and the Actor will:

  1. Fetch each watchlist account's recent public articles.
  2. Compare each article against the retained content hash.
  3. Emit only new and modified rows, and charge only for those.
  4. Optionally POST them to your webhookUrl in batches of up to 100 events.

Webhook requests include x-signature-256 (HMAC-SHA256 of the body), x-wechat-monitor-delivery (an idempotency key) and x-delivery-attempt. Verify the signature before trusting a payload. Signed delivery requires a WEBHOOK_SECRET of at least 32 characters; without it, webhook input is rejected rather than sent unsigned.


Pricing

This Actor uses pay per event: you pay for result rows, not for compute time or run duration.

EventCharged whenPrice
search-resultOne article row is returned$0.007
account-resultOne account profile row is returned$0.010
article-detailOne full article page is extracted$0.020
monitored-account-dayOne account is checked on one day$0.050

Worked examples

  • 1,000 article search results → $7.00
  • 5,000 article rows per month → $35.00
  • 100 full article extractions → $2.00
  • 25 accounts monitored daily for 30 days, ~1,125 changed articles → 25 × 30 × $0.05 + 1,125 × $0.007 ≈ $45.38/month

Starting an Actor run is free, and the following are never billed: failed or blocked requests, empty result sets, invalid input, error rows, and unchanged articles during monitoring.


Free plan and limits

The Actor runs on the Apify Free plan using your monthly platform credits. Practical limits to be aware of:

  • maxPages accepts 1–50 per run; watchlist and articleUrls accept up to 200 items.
  • Requests are rate limited (2.5 s between requests by default) to stay polite to public sources.
  • A run stops cleanly when it reaches your configured pay-per-event limit and reports budgetLimitReached instead of failing.
  • Concurrent monitorAccounts runs sharing one state store are refused with a clear message; configure PostgreSQL for concurrency.

Integrations

Output works directly with Make, Zapier, n8n, LangChain, Google Sheets, Slack, and any HTTP endpoint through webhooks. Datasets can be pulled through the Apify API in JSON, CSV, Excel, XML or RSS, and the Actor is usable as an MCP tool by AI agents.


Use cases

  • Brand and PR monitoring — catch new mentions, and catch silently edited or deleted posts.
  • Competitive intelligence — track competitor Official Accounts and build a publishing timeline.
  • Market and academic research — build a retained corpus of Chinese-language articles with full text.
  • Compliance and risk — evidence of what a public account published, and when it changed.
  • AI and RAG pipelines — feed a continuously updated, de-duplicated Chinese-language corpus into a vector store.

What this Actor does not do

Honest scope, so you can evaluate before paying:

  • It does not return read counts, like counts, 在看, share or collect metrics.
  • It does not return article comments or comment replies.
  • It does not return WeChat Index time series, registration or principal/company records.
  • It does not log in, use accounts or credentials, or call private WeChat APIs. (The public search index sets anonymous session cookies, which the Actor replays — no login is ever involved.)

Those datasets are not available from publicly accessible endpoints, and this Actor is deliberately built to stay within public sources. Coverage depends on what public indexes expose, which varies by account and keyword.


FAQ

What is a WeChat Official Account (公众号)? An Official Account, or gongzhonghao, is a publisher account on WeChat used by media, brands and government bodies to publish articles to subscribers. Public articles are served from mp.weixin.qq.com.

Do I need a WeChat account or cookies? No. The Actor only reads publicly accessible pages and never accepts credentials.

How does change detection work? Each article's normalized content is hashed. If the hash changes between runs, the row is emitted with changeType: "modified". If the article disappears, its status becomes unavailable.

Do I need a database? No. Monitoring state is stored in your own Apify key-value store by default. A DATABASE_URL for PostgreSQL is optional and only needed for concurrent monitor runs.

Will I be charged for empty or failed runs? No. Only real result rows are billed.

Can I export to CSV or Excel? Yes — from the Storage tab, or through the Apify API in JSON, CSV, Excel, XML and RSS.

How often should I schedule monitoring? Daily is typical. Hourly is supported, but increases monitored-account-day charges only once per account per day, so cost stays predictable.

Can I pass a wxid or gh_ id? Yes. account and watchlist accept a public display name, a wxid such as rmrbwx, or a gh_ id. Identifiers are resolved through public account search.


Troubleshooting

SymptomCause and fix
Zero rows for a keywordThe public index returned nothing. Try a broader keyword, or raise maxPages. You are not billed.
blocked count above zeroThe public source rate limited or challenged the request. Increase MIN_REQUEST_INTERVAL_MS and retry later.
webhookUrl requires WEBHOOK_SECRETSet a WEBHOOK_SECRET of 32+ characters; unsigned delivery is intentionally not allowed.
Webhook rejected as unsafeThe URL resolved to a private, loopback or reserved address. Use a public HTTPS endpoint.
another monitor run already holds the state leaseA previous monitor run is still active. Wait for it, or configure PostgreSQL for concurrent runs.
Account not found in monitorAccountsUse the exact public display name, a wxid, or a gh_ id. Run accountSearch first to confirm it.

This Actor accesses only publicly accessible web pages. It does not log in, does not use or accept WeChat credentials, does not bypass access controls, and does not reverse-engineer private protocols. It applies conservative rate limiting by default.

You are responsible for how you use the extracted data, including compliance with applicable data protection laws such as GDPR and PIPL, and with the terms of the sources you target. Personal data should only be collected where you have a lawful basis. WeChat and 微信 are trademarks of Tencent Holdings Limited. This Actor is not affiliated with, endorsed by, or sponsored by Tencent.


Support

Open an issue on the Actor's Issues tab with your run ID and input, and you will get a response. Breaking changes are announced in the changelog before they ship.