# WeChat Scraper — Official Account Articles & Full Text (`logiover/wechat-scraper`) Actor

WeChat scraper (微信公众号文章): search WeChat Official Account articles by keyword through Sogou WeChat search and export title, summary, account name, WeChat ID, publish time and the mp.weixin.qq.com link. Optional full text, author, 原创 flag, IP location and images. No login.

- **URL**: https://apify.com/logiover/wechat-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## WeChat Scraper — Official Account Articles & Full Text

**Search WeChat Official Account articles (微信公众号文章) by keyword and export title, summary, account name, WeChat ID, publish time and the mp.weixin.qq.com link for every hit — and, if you switch it on, the full article text, author, original (原创) flag, IP location (发表于), images and account details — as clean JSON, CSV or Excel, without a login.**

> Independent tool. Not affiliated with, endorsed by, or sponsored by Tencent, WeChat (微信) or Sogou (搜狗). "WeChat", "微信", "Sogou" and "搜狗" are trademarks of their owners and are used here only to describe the services this Actor reads. It reads public pages only: it does not log in, does not use any WeChat account, does not read private chats or Moments, and does not bypass any verification.

**WeChat Scraper** is a WeChat Official Account article scraper built on Sogou WeChat search (搜狗微信搜索, weixin.sogou.com), the public search index of articles published by 微信公众号 (WeChat Official Accounts). Give it keywords — Chinese works best, English brand names work too — and it returns one row per article: **title, Sogou's summary, publish time, account name (公众号名称), WeChat ID (微信号), Sogou account ID, verified (认证) flag, avatar, cover image, the article link on mp.weixin.qq.com, and where the hit sits in the search**. Each link is resolved to a working mp.weixin.qq.com address inside the search session that found it. Turn on **Read each article page** and the Actor opens every article and adds the **full text, author (作者), original-content flag (原创) and category, IP location (发表于 province), number of articles in the same push, images, source link (阅读原文), the account's original ID, biz and bio**. Use it to **scrape WeChat articles**, as a **WeChat article API alternative** (WeChat's official interfaces serve an account's own owner, not a search across other accounts' articles), or to **export WeChat Official Account data to CSV, Excel or JSON** for your spreadsheet, BI tool, CRM, data warehouse or AI pipeline. No WeChat account, no QR-code login, no cookies, no phone.

Brand-monitoring and PR teams, market researchers, financial analysts, cross-border e-commerce sellers, journalists, academics and AI teams use it for 微信公众号文章采集 (Official Account article collection), 微信公众号爬虫 (Official Account crawler), 搜狗微信搜索数据导出 (Sogou WeChat search export), 公众号文章抓取 (article scraping), 公众号内容监测 (content monitoring), 舆情监测 (public-opinion monitoring), 品牌声量统计 (brand-mention counts) and 中文语料收集 (Chinese corpus building). Typical searches it answers: *WeChat scraper*, *WeChat article scraper*, *scrape WeChat Official Accounts*, *WeChat public account data*, *WeChat API alternative*, *Sogou WeChat search export*, *mp.weixin.qq.com scraper*, *微信公众号 数据 导出 Excel* and *公众号文章 爬虫*. All numbers on this page were measured on **2026-10-25** from runs on the Apify platform.

***

### Table of contents

- [At a glance](#at-a-glance)
- [What you get](#what-you-get)
- [Who uses it — 12 workflows](#who-uses-it--12-workflows)
- [Cookbook — 12 ready-to-run inputs](#cookbook--12-ready-to-run-inputs)
- [Tutorial: your first run in the Apify Console](#tutorial-your-first-run-in-the-apify-console)
- [Tutorial: run it from the API](#tutorial-run-it-from-the-api)
- [Input reference](#input-reference)
- [Output data dictionary](#output-data-dictionary)
- [Real output sample](#real-output-sample)
- [Scale and speed (measured)](#scale-and-speed-measured)
- [What you pay](#what-you-pay)
- [Integrations](#integrations)
- [Performance tips](#performance-tips)
- [Troubleshooting: every status message explained](#troubleshooting-every-status-message-explained)
- [Honest limits](#honest-limits)
- [How it compares](#how-it-compares)
- [FAQ](#faq)
- [Glossary](#glossary)
- [Is it legal to scrape WeChat articles?](#is-it-legal-to-scrape-wechat-articles)
- [Changelog](#changelog)
- [Support](#support)

***

### At a glance

| | |
|---|---|
| **Source** | Sogou WeChat search (搜狗微信搜索, weixin.sogou.com) for the hits; mp.weixin.qq.com for the article pages |
| **What it exports** | One row per WeChat Official Account article (微信公众号文章) |
| **How you choose what** | Keywords (one Sogou search each), optional related-search expansion, or pasted mp.weixin.qq.com links |
| **Search columns** | 24 columns: title, summary, publish time, account name, WeChat ID, Sogou account ID, verified flag, avatar, cover, link, ids, search context |
| **Article-page columns** | 17 more columns with the full text, author, original flag, IP location, images, account bio and ids (optional) |
| **Depth** | 11,688 unique articles in one run (1,074 s, 0 duplicates); each Sogou search shows 100 hits to visitors who are not logged in, related searches go past that |
| **Speed** | First rows after 4 s; 1,000 articles in about 2 minutes; 100 articles with full text in about 90 s |
| **Login / cookies / proxy** | None needed. Apify datacenter proxy by default, direct connection and a small capped residential rescue as fallbacks |
| **Formats** | JSON, CSV, Excel, XML, RSS, HTML table — or straight into Google Sheets, Make, Zapier, n8n, a webhook or your database |
| **Price** | Pay per result: $3.50 per 1,000 articles on the free plan, down to $2.30 per 1,000 on higher plans |

***

### What you get

Every row is one article, identified by `articleId` (Sogou's account ID + WeChat message ID + position in the push). A row has two groups of columns.

#### Search columns (always present, 24)

- **The article:** `title`, `summary` (Sogou's excerpt, about 70 characters), `url` (an mp.weixin.qq.com address that opens the article), `urlIsPermanent`, `publishedAt` (ISO 8601, UTC), `publishedTimestamp` (Unix seconds), `coverImageUrl`, `hasVideo`.
- **The account (公众号):** `accountName`, `accountWechatId` (the custom WeChat ID, or the original `gh_…` ID when the account has none), `accountSogouId`, `accountVerified` (blue-V style certification shown by Sogou), `accountAvatarUrl`.
- **Identity:** `articleId`, `mid`, `idx` (1 = headline article of the push, 2–8 = the following articles).
- **Search context:** `keyword` (the query that found it), `seedKeyword` (the keyword you gave, when the query is a related search), `searchPage`, `searchPosition`, `searchTotalResults` (Sogou's estimate), `sogouDocId`, `source`, `scrapedAt`.

#### Article-page columns (with "Read each article page", 17 + status)

`author`, `description` (the article's own digest), `accountOriginalId`, `accountBiz`, `accountUin`, `accountDescription` (the account's bio), `isOriginal`, `originalCategory`, `sourceUrl` (阅读原文 link), `ipLocation`, `ipCountry`, `contentType` (article, image post, video…), `articlesInPush`, `contentText` (full text, UTF-8, paragraphs separated by line breaks), `contentLength`, `imageCount`, `imageUrls`, optionally `contentHtml`, and `detailsStatus` (`ok` or why the page could not be read). The page also replaces the search values of `title`, `accountName` and `publishedAt` with its own exact ones.

#### Three ways to use it

1. **Keyword search** — the main mode. `keywords: ["新能源汽车"]` returns up to 100 hits per keyword; `expandKeywords` adds Sogou's own related searches and multiplies that.
2. **Keyword search with full text** — the same, plus `includeArticleDetails: true`.
3. **Articles by link** — `articleUrls` with mp.weixin.qq.com links you already have; every link becomes one row with the full text.

#### Dataset views in the Console

The **Output** tab has two views: **Articles** (cover, title, account, WeChat ID, published, summary, link, keyword) and **Article pages (full text)** (cover, title, author, account, published, original flag, IP location, characters, images, text, link).

***

### Who uses it — 12 workflows

#### 1. Brand and PR monitoring teams (舆情监测)

Search brand, product and executive names every morning (`maxPagesPerKeyword: 3`), keep `articleId` as the key and alert on rows you have not seen. `accountName` and `accountVerified` tell a certified media account from a small blog.

#### 2. Market researchers in consumer goods and retail

Pull 1,000+ articles per category keyword (奶茶, 咖啡, 防晒), group by `accountName` to see who writes about it, and tag themes from `summary` or `contentText`. `searchTotalResults` is Sogou's own size estimate of each topic.

#### 3. Financial analysts and investors

Track how often a listed company, a sector (芯片, 新能源汽车) or a policy term (降息) appears in Official Account articles over time. Run weekly, store `publishedAt` + `articleId`, and chart counts per week next to the share price.

#### 4. Cross-border e-commerce sellers and China-market entrants

See what Chinese consumers and sellers read about a product category before you enter it: keyword lists in Chinese, `expandKeywords` for the long tail (Sogou suggests the phrasings people actually search), then translate the `title` column.

#### 5. Content and SEO teams writing for WeChat

Research a topic before you write: top articles per keyword, how long they are (`contentLength` with article pages on), how many images (`imageCount`), whether they are 原创 (`isOriginal`) and which accounts dominate (`accountName`).

#### 6. KOL and influencer-marketing agencies

Discover accounts by topic: run 10–30 related keywords, then count articles per `accountSogouId` / `accountWechatId`. The verified flag, avatar and WeChat ID give you a first shortlist; `accountDescription` (the account's bio, with article pages on) tells you what each account is about.

#### 7. Journalists, fact-checkers and OSINT researchers

Trace where a claim, a rumour or a quote first appeared: search the exact phrase, sort the rows by `publishedTimestamp`, and open the oldest. With article pages on, `sourceUrl`, `author` and `ipLocation` show attribution and the province the article was published from.

#### 8. Academics — communication studies, sociology, linguistics

Build a Chinese-language corpus of Official Account writing on a topic with date, account and full text. `articleId` is stable, `scrapedAt` documents the collection date, and the row grain (one article) fits coding and sampling designs.

#### 9. Public-health and policy researchers

Study how health topics (中医, 疫苗, 养生) are framed and by whom: keyword families with `expandKeywords`, `accountVerified` to separate institutional from personal accounts, and `contentText` for framing analysis.

#### 10. Education consultants and admissions teams

Collect 高考, 志愿填报, 留学 and school-introduction articles by year, see which accounts publish them, and mine the text for school names, majors and deadlines.

#### 11. Real-estate and automotive analysts

Follow the narrative around 房价, 楼市 and 新能源汽车 by city or brand keyword. Daily runs give a time series of article volume and a text sample for each day.

#### 12. AI and NLP teams

Fine-tuning and retrieval (RAG) need clean Chinese text with metadata. With article pages on you get `contentText` as UTF-8 plain text plus account, time, original flag and category; without them you get summaries at about 3.5 cents per 10 articles.

***

### Cookbook — 12 ready-to-run inputs

Paste any of these into the Input tab (JSON view) or into the API call.

#### 1. Keyword search (the default example)

```json
{ "keywords": ["人工智能"], "maxItems": 100 }
```

#### 2. Several keywords sharing one cap

```json
{ "keywords": ["新能源汽车", "固态电池", "充电桩"], "maxItems": 300 }
```

Page 1 of every keyword is read first, then page 2 of every keyword, and so on, so a small cap is shared fairly.

#### 3. Go past 100 hits with related searches

```json
{ "keywords": ["咖啡"], "expandKeywords": true, "maxQueriesPerKeyword": 30, "maxItems": 2500 }
```

Each query is one more Sogou search with up to 100 hits of its own; duplicates are removed by `articleId`.

#### 4. Full text, author, original flag and IP location

```json
{ "keywords": ["跨境电商"], "maxItems": 100, "includeArticleDetails": true }
```

#### 5. Full text and the article HTML

```json
{ "keywords": ["露营"], "maxItems": 50, "includeArticleDetails": true, "includeContentHtml": true }
```

`contentHtml` keeps the formatting (headings, lists, image tags with `data-src`) and makes rows much larger.

#### 6. Articles by link

```json
{ "articleUrls": ["https://mp.weixin.qq.com/s/_2kC-fXw7UjneZSrsC9CVQ"] }
```

Short links (`/s/xxxx`) and the signed links this Actor produces open normally. Long permanent links (`/s?__biz=…&mid=…&idx=…&sn=…`) are answered with WeChat's verification page and reported as not read — see [Honest limits](#honest-limits).

#### 7. Daily brand monitor (schedule it)

```json
{ "keywords": ["瑞幸咖啡", "蜜雪冰城", "库迪咖啡"], "maxPagesPerKeyword": 3, "maxItems": 90 }
```

#### 8. Fast listing without link resolution

```json
{ "keywords": ["房价"], "maxItems": 100, "resolveArticleUrls": false }
```

Skips the link step: about one request per result less, but `url` stays empty except for the hits where Sogou already shows a permanent link.

#### 9. A corpus on one subject, no row limit

```json
{ "keywords": ["中医", "针灸", "养生"], "expandKeywords": true, "maxQueriesPerKeyword": 40, "maxItems": 0 }
```

`maxItems: 0` means "no limit": the run ends when every query is read, at the run timeout or at your Maximum cost per run.

#### 10. Account discovery by topic

```json
{ "keywords": ["育儿"], "expandKeywords": true, "maxQueriesPerKeyword": 12, "maxItems": 1000 }
```

Pivot the result by `accountSogouId` to list the accounts that write most about the topic.

#### 11. Your own proxies

```json
{
  "keywords": ["芯片"],
  "maxItems": 100,
  "proxyConfiguration": { "useApifyProxy": false, "proxyUrls": ["http://user:password@proxy.example.com:8000"] }
}
```

#### 12. Spend cap instead of a row cap

```json
{ "keywords": ["股票"], "expandKeywords": true, "maxQueriesPerKeyword": 20, "maxItems": 0 }
```

Set **Maximum cost per run** (run options, e.g. $5) when you start it. The Actor reads the limit, saves as many articles as it covers and ends as *succeeded*.

***

### Tutorial: your first run in the Apify Console

1. Open the Actor and click **Try for free** (or **Start** if you already use it).
2. In **Keywords** type what you are looking for, one keyword per line. Chinese works best (人工智能, 新能源汽车, 咖啡); English names work too.
3. Set **Max articles** — 20 for a first look, 1,000 or more for real work. **Pages per keyword** (1–10) limits how deep each search goes.
4. Optional: tick **Read each article page** for full text, author, 原创 flag and IP location; tick **Add Sogou's related searches** to go past 100 hits per keyword.
5. Click **Start**. Rows appear in the **Output** tab within a few seconds; the status line shows how many articles and search pages are done.
6. When the run says **Succeeded**, open **Storage → Dataset** and export **JSON, CSV or Excel** — or pick a view (Articles, Article pages) to see only those columns.

The **Run summary** (key-value store, record `SUMMARY`) lists the outcome, the queries read, requests by kind, refusals, article-page results per route and the notes the Actor made.

***

### Tutorial: run it from the API

#### 1. Get your token

Apify Console → **Settings → Integrations → API token**.

#### 2. Run and get the data in one call (small runs)

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~wechat-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN&format=json" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["人工智能"],"maxItems":50}'
```

#### 3. Start a run and fetch the data later (big runs)

```bash
## start
curl -X POST "https://api.apify.com/v2/acts/logiover~wechat-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["咖啡"],"expandKeywords":true,"maxQueriesPerKeyword":30,"maxItems":3000}'
## poll: GET https://api.apify.com/v2/actor-runs/RUN_ID?token=YOUR_TOKEN   (status SUCCEEDED)
## data: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN
```

#### 4. Node.js (apify-client)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/wechat-scraper').call({
    keywords: ['新能源汽车'],
    maxItems: 200,
    includeArticleDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].title, items[0].accountName, items[0].contentLength);
```

#### 5. Python (apify-client)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/wechat-scraper").call(run_input={
    "keywords": ["跨境电商"],
    "maxItems": 500,
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
by_account = {}
for r in rows:
    by_account[r["accountName"]] = by_account.get(r["accountName"], 0) + 1
print(sorted(by_account.items(), key=lambda kv: -kv[1])[:10])
```

#### 6. Read the run summary

`GET https://api.apify.com/v2/key-value-stores/STORE_ID/records/SUMMARY?token=YOUR_TOKEN` (the run's default key-value store) returns the outcome (`COMPLETED`, `PARTIAL`, `EMPTY_RESULT`, …), why the run stopped, one line per query (hits reported by Sogou, pages read, rows saved) and the network counters (search pages, links resolved, refusals, article pages by route).

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `keywords` | list of strings | — | What to search, one keyword per line. Each keyword is its own Sogou WeChat article search (up to 100 hits each). Chinese works best; English names and brands work too. The form is pre-filled with `人工智能`. |
| `maxItems` | integer | 1000 | Total articles to save across all keywords and links. `0` = no limit (up to the run timeout or your Maximum cost per run). Maximum 1,000,000. The form is pre-filled with 20. |
| `maxPagesPerKeyword` | integer 1–10 | 10 | Pages read per query. Sogou shows 10 articles a page and at most 10 pages to visitors who are not logged in. |
| `expandKeywords` | boolean | false | Add Sogou's related searches (the suggestion list of the WeChat article search box) to every keyword, then theirs, until the keyword has `maxQueriesPerKeyword` queries. Every query brings up to 100 more hits; duplicates are removed. |
| `maxQueriesPerKeyword` | integer 1–500 | 11 | With related searches: the keyword itself plus up to this many minus one related searches. Sogou suggests about ten per query, so values above ~100 rarely add queries. |
| `includeArticleDetails` | boolean | false | Open every article on mp.weixin.qq.com and add the full text, author, 原创 flag, category, IP location, images, source link and the account's original ID, biz and bio. Slower than search alone (see [Scale and speed](#scale-and-speed-measured)). |
| `includeContentHtml` | boolean | false | With article pages: also save the article body as HTML (`contentHtml`). Large — leave off unless you need the formatting. |
| `articleUrls` | list of strings | — | mp.weixin.qq.com links to read directly (`https://mp.weixin.qq.com/s/…` short links and signed links work). Each link becomes one row with the full text. Other addresses are skipped with a note. |
| `resolveArticleUrls` | boolean | true | Turn each Sogou hit into its mp.weixin.qq.com address. Off = faster, but `url` is empty except for the hits where Sogou already shows a permanent link. |
| `maxConcurrency` | integer 1–32 | 8 | Search sessions that run at once; article pages use at most 8 of them in parallel. |
| `proxyConfiguration` | object | Apify datacenter proxy | Apify Proxy settings, or your own `proxyUrls`. The Actor rotates addresses itself and falls back to a direct connection and, for search only, to a small capped number of residential sessions. |

Notes:

- At least one of `keywords` or `articleUrls` is required. Keywords and links can be combined in one run.
- `maxItems` counts rows, not pages; the Actor stops starting new pages when the rows it has reserved reach the cap, so a run never writes more rows than you allow.
- Keywords may also be given as one string with line breaks, commas or semicolons.

***

### Output data dictionary

One row per article. Fill rates are measured on the runs named in each table caption; a column that is not applicable to a run (for example article-page columns in a search-only run) is simply absent from its rows.

#### Search columns — fill rates measured on 11,688 rows of one run

| Field | Type | Meaning | Fill | Example |
|---|---|---|---|---|
| `articleId` | string | Stable unique key of the article: Sogou account ID + WeChat message ID (`mid`) + position in the push (`idx`). Used for de-duplication. | 100 % | "oIWsFt5BEnlXeynLoecQZ9sXciSw_2653007167_1" |
| `title` | string | Title as Sogou lists it (Sogou writes punctuation half-width: `,` `!` `?`). With article pages on, the article's own exact title replaces it. | 100 % | "杭州咖啡地图 | 一杯好咖啡,不负西湖春色美" |
| `summary` | string or null | Sogou's excerpt of the article, about 70 characters, ends with `...`. The desktop site may show a different excerpt of the same article. | 96.4 % | "不久之前,企鹅君奋勇喝了63家咖啡馆,奉上了一张诚意满满的上海咖啡地图.结果,许多小伙伴纷…" |
| `url` | string | An mp.weixin.qq.com address that opens the article. Signed links (`?src=11&timestamp=…&signature=…`) expire within hours; permanent links are given only where Sogou lists them. | 100 % | "https://mp.weixin.qq.com/s?\_\_biz=MjM5Mzc5NTk1…" |
| `urlIsPermanent` | boolean | `true` = the permanent link Sogou lists (`?__biz=…&mid=…&idx=…&sn=…`); `false` = a signed link that expires. | 100 % | true |
| `publishedAt` | string (ISO 8601, UTC) | Publish time. In search mode: the time Sogou lists (see [Honest limits](#honest-limits)); with article pages on: the article page's own publish time. | 100 % | "2017-04-09T02:40:17Z" |
| `publishedTimestamp` | number | The same instant as Unix seconds. | 100 % | 1491705617 |
| `accountName` | string | Name of the Official Account (公众号名称) as Sogou's index has it; with article pages on, the page's current name. | 100 % | "企鹅吃喝指南" |
| `accountWechatId` | string | WeChat ID (微信号): the custom ID, or the original `gh_…` ID when the account has no custom one. | 100 % | "qiechihe" |
| `accountSogouId` | string | Sogou's stable ID of the account (`oIWsFt…`). Use it to group articles by account. | 100 % | "oIWsFt5BEnlXeynLoecQZ9sXciSw" |
| `accountVerified` | boolean | Whether Sogou shows the account as certified (认证 / blue V). | 100 % | true |
| `accountAvatarUrl` | string or null | Avatar image of the account (wx.qlogo.cn). | 99.7 % | "https://wx.qlogo.cn/mmhead/Q3auHgzwzM6LDEuWPV…" |
| `coverImageUrl` | string | Cover image of the article (mmbiz.qpic.cn). | 100 % | "https://mmbiz.qpic.cn/mmbiz_jpg/ibLgUdQXiaIVS…" |
| `mid` | number | WeChat message (push) ID. Several articles of one push share it. | 100 % | 2653007167 |
| `idx` | number | Position of the article inside its push: 1 = headline article, 2–8 = the following ones. | 100 % | 1 |
| `hasVideo` | boolean | Sogou marks the article as containing a video. | 100 % | false |
| `keyword` | string | The Sogou query that found the article (your keyword or one of its related searches). | 100 % | "咖啡" |
| `seedKeyword` | string | The keyword you entered that this query belongs to. | 100 % | "咖啡" |
| `searchPage` | number | Page of the search (1–10) the hit was on. | 100 % | 1 |
| `searchPosition` | number | Position of the hit within the query's results (1–100). | 100 % | 4 |
| `searchTotalResults` | number | Sogou's own estimate of the number of results for the query ("找到约N条结果"). | 100 % | 9367 |
| `sogouDocId` | string | Sogou's internal document ID of the hit. | 100 % | "ab735a258a90e8e1-6bee54fcbd896b2a-9dbd26c1311…" |
| `source` | string | `search` for keyword hits, `url` for articles read from a link. | 100 % | "search" |
| `scrapedAt` | string (ISO 8601, UTC) | When the row was collected. | 100 % | "2026-10-25T12:54:52.925Z" |

#### Article-page columns — fill rates measured on 95 article pages read in one run of 100 rows

| Field | Type | Meaning | Fill | Example |
|---|---|---|---|---|
| `author` | string or null | Author line of the article (作者), when the article has one. | 48.4 % | "阿瑞" |
| `description` | string or null | The article's own digest (摘要), when the author wrote one. | 70.5 % | "宠物的“精致露营”，有多烧钱？" |
| `accountOriginalId` | string or null | The account's original ID (`gh_…` / `wxid_…`). | 100 % | "gh_05f192fce051" |
| `accountBiz` | string or null | The account's `__biz` value (base64). | 100 % | "MjM5ODMzMDMyMw==" |
| `accountUin` | string or null | The numeric account ID decoded from `__biz`. | 100 % | "2398330323" |
| `accountDescription` | string or null | The account's bio (功能介绍). | 86.3 % | "中国最新锐的生活方式周刊。" |
| `isOriginal` | boolean or null | `true` when the article carries the 原创 (original content) badge. | 100 % | true |
| `originalCategory` | string or null | WeChat's category of an original article (e.g. `餐饮美食`, `社会_民生`). | 16.8 % | "宠物_其他" |
| `sourceUrl` | string or null | The "阅读原文" (read original) link of the article. | 12.6 % | "https://…" |
| `ipLocation` | string or null | Province shown as 发表于 (published from); missing on some articles published before mid-2022. | 88.4 % | "广东" |
| `ipCountry` | string or null | Country shown with the IP location. | 88.4 % | "中国" |
| `contentType` | string or null | `article`, `image post`, `video`, `audio`, `text post`… | 100 % | "article" |
| `articlesInPush` | number or null | How many articles the push contained. | 100 % | 4 |
| `contentText` | string or null | Full text, UTF-8, paragraphs separated by line breaks, no HTML. Empty for pure video or picture posts. | 97.9 % | "一件狗狗户外浴袍869元，一条狗狗攀岩胸背绳1400元……宠物的“精致露营”，有多烧钱？\n\n10月31日是…" |
| `contentLength` | number or null | Characters of text without whitespace. | 100 % | 3957 |
| `imageCount` | number or null | Images in the article body. | 100 % | 36 |
| `imageUrls` | array of strings | Image URLs in reading order (mmbiz.qpic.cn). | 94.7 % | \["https://mmbiz.qpic.cn/sz_mmbiz_gif/r7l7L28KwuWpYrq…"] |
| `contentHtml` | string or null | Article body as HTML — only with "Include article HTML". | only on request | |
| `detailsStatus` | string | `ok`, or why the page was not read (`not available: deleted by the publisher`, `not available: account migrated`, `not read: …`). | 100 % | "ok" |

Rows from `articleUrls` have `source: "url"`; their search-context columns (`keyword`, `seedKeyword`, `searchPage`, `searchPosition`, `searchTotalResults`, `sogouDocId`, `accountSogouId`, `accountVerified`) are empty because no search was involved.

***

### Real output sample

Real rows from platform runs on 2026-10-25, unmasked. Rows where Sogou lists the permanent link look the same, with `urlIsPermanent: true` and a `url` of the form `https://mp.weixin.qq.com/s?__biz=…&mid=…&idx=…&sn=…`.

#### A search row (Sogou signed link)

```json
{
  "articleId": "oIWsFt4ACoW3mZLOxHVHRt973RdQ_2248144914_1",
  "title": "咖啡越来越甜了,这些公司是赢家",
  "summary": "把咖啡生意做大的秘密.文|杨亚飞编辑|乔芊来源|36氪未来消费(ID:lslb168)封面来源|视觉中国秋天里的第一杯咖啡不会缺席,但正变得越来越甜.咖啡品牌们今年的九月新品菜单...",
  "url": "https://mp.weixin.qq.com/s?src=11&timestamp=1792932895&ver=7048&signature=oBv9GSkrHU1pGgzkcBgXAF0Phat96OwBPfipSbLx2EMEufUIxDA--BEFTvY86GyaclGq7hd*7Kl4S3P3dJhUR2FnEtFVK76rUPIVM3PwKQL7iB-k*xDOnNdg2OOhossP&new=1",
  "urlIsPermanent": false,
  "publishedAt": "2022-09-24T09:00:51Z",
  "publishedTimestamp": 1664010051,
  "accountName": "36氪",
  "accountWechatId": "wow36kr",
  "accountSogouId": "oIWsFt4ACoW3mZLOxHVHRt973RdQ",
  "accountVerified": true,
  "accountAvatarUrl": "https://wx.qlogo.cn/mmhead/Q3auHgzwzM6bia44ArPNMqFIeUFznyuic1uaRBHxkkppnTnnYpkPVSXA/0",
  "coverImageUrl": "https://mmbiz.qpic.cn/mmbiz_jpg/QicyPhNHD5vaSF3j2WyYyLiajOw9w0l0eiaGLRgs2Dj5INIIfOlQT7icbbcawfZe1gxx4kBibkdzBB4obwn46VibiaFNw/0?wx_fmt=jpeg",
  "mid": 2248144914,
  "idx": 1,
  "hasVideo": false,
  "keyword": "咖啡",
  "seedKeyword": "咖啡",
  "searchPage": 1,
  "searchPosition": 8,
  "searchTotalResults": 9367,
  "sogouDocId": "ab735a258a90e8e1-6bee54fcbd896b2a-708e14ff95a545680f38d8f31dc04647",
  "source": "search",
  "scrapedAt": "2026-10-25T12:54:52.925Z"
}
```

#### The same kind of row with article pages on

Shortened for this page: `contentText` is cut after 250 characters and `imageUrls` to its first two entries; the dataset holds both in full.

```json
{
  "articleId": "oIWsFt_9lOem4bz0PCCr3VgeiUTA_2651707432_2",
  "title": "露营经济的核心不是帐篷，而是“桌子”",
  "summary": "观点 / 刘润 主笔 / 钟卉 责编 / 李桑 本文首发于2022年7月最近有读者跟我分享一篇文章叫《“疫情经济”大退潮,飞盘、露营不香了》,很有意思.这篇文章里讲到,去年最火...",
  "url": "https://mp.weixin.qq.com/s?src=11&timestamp=1792932487&ver=7048&signature=sAc6H3QWCDmMoYAx*p83QhE27ofUYSnjIpsdpDEgsO8WtiqZVNH6MHK4k641a4FEKKim0tdUgq7P0nL92rETLQOy5bvxXuxGWICUWElg8KdvzlPeY6KSw32xmA24Dbsa&new=1",
  "urlIsPermanent": false,
  "publishedAt": "2023-05-19T03:18:00Z",
  "publishedTimestamp": 1684466280,
  "accountName": "刘润",
  "accountWechatId": "runliu-pub",
  "accountSogouId": "oIWsFt_9lOem4bz0PCCr3VgeiUTA",
  "accountVerified": true,
  "accountAvatarUrl": "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5XkXuPCs4YMaek3hDRzVA8l10c5l93dQbcnL6DVVfwFQ/0",
  "coverImageUrl": "https://mmbiz.qpic.cn/mmbiz_jpg/Eia1pKbzLGbQzxNeIt1EY5wnjS8RImUmTG4PZ6anEibXeJqFELSFV6csMWXz4Fzw2qIDd3JQsvpJicHy8icXpyib0aA/0?wx_fmt=jpeg",
  "mid": 2651707432,
  "idx": 2,
  "hasVideo": false,
  "keyword": "露营",
  "seedKeyword": "露营",
  "searchPage": 1,
  "searchPosition": 6,
  "searchTotalResults": 23804,
  "sogouDocId": "ab735a258a90e8e1-6bee54fcbd896b2a-8d6945c1df7964d9671f557058628187",
  "source": "search",
  "scrapedAt": "2026-10-25T12:48:05.293Z",
  "author": "刘润",
  "description": "发明了一个词，桌子经济。",
  "accountOriginalId": "gh_cc764ea0efaa",
  "accountBiz": "MjM5NjM5MjQ4MQ==",
  "accountUin": "2396392481",
  "accountDescription": "降低商业的认知门槛。刘润，润米咨询创始人，战略咨询顾问，“5分钟商学院”课程主理人，《底层逻辑》作者。每年举办“进化的力量·年度演讲”，一起更早看到未来。",
  "isOriginal": true,
  "originalCategory": "其他",
  "sourceUrl": null,
  "ipLocation": "上海",
  "ipCountry": "中国",
  "contentType": "article",
  "articlesInPush": 3,
  "contentText": "观点 / 刘润 主笔 / 钟卉 责编 / 李桑\n\n本文首发于2022年7月\n\n最近有读者跟我分享一篇文章叫《“疫情经济”大退潮，飞盘、露营不香了》，很有意思。\n这篇文章里讲到，去年最火的时候，露营相关的产品，一个月的交易额高达3.36亿元。\n一座山头，一夜之间。露营地，就像雨后春笋一般，迅速冒出来。\n但疫情之后，露营经济却突然间再也不火了。为什么？\n在露营经济爆火的时候，我们曾斗胆做了一个判断：露营经济很快会平淡下来。\n\n今天，我们把这篇重发《露营经济的核心不是帐篷，而是“桌子” 》。\n希望对你…",
  "contentLength": 2329,
  "imageCount": 6,
  "imageUrls": [
    "https://mmbiz.qpic.cn/mmbiz_png/Eia1pKbzLGbRxw410cicK2cTBhfqJ0dVz3m76HdljsnJ3y9v6RvFdscOLxy0UM1u5nNJtfboqEibv0z3dvmreayKg/640?wx_fmt=png",
    "https://mmbiz.qpic.cn/mmbiz_jpg/Eia1pKbzLGbQzxNeIt1EY5wnjS8RImUmT0DYn2AExGv2tJGw5TfgzbXXsZCSB9UYklSh8nX7KqRD0Kc8GWQMT1A/640?wx_fmt=jpeg"
  ],
  "detailsStatus": "ok"
}
```

#### CSV columns

The CSV/Excel export of a search-only run has these columns, in this order:

`articleId, title, summary, url, urlIsPermanent, publishedAt, publishedTimestamp, accountName, accountWechatId, accountSogouId, accountVerified, accountAvatarUrl, coverImageUrl, mid, idx, hasVideo, keyword, seedKeyword, searchPage, searchPosition, searchTotalResults, sogouDocId, source, scrapedAt`

With article pages on, these are appended:

`author, description, accountOriginalId, accountBiz, accountUin, accountDescription, isOriginal, originalCategory, sourceUrl, ipLocation, ipCountry, contentType, articlesInPush, contentText, contentLength, imageCount, imageUrls, contentHtml, detailsStatus`

***

### Scale and speed (measured)

All runs on the Apify platform, 2026-10-25, default settings (1,024 MB memory, 8 parallel searches, Apify datacenter proxy) unless stated.

| Run | Rows | Time | Notes |
|---|---|---|---|
| Prefill input: 人工智能, 20 articles, 3 pages | 20 | 11.4 s and 28.5 s (two runs) end to end | first row after 4.7–4.8 s |
| 15 keywords, 1,000 articles | 1,000 | 101 s (three runs: 94, 101 and 113 s) | first row after 3.5 s, 0 duplicates, 0 refusals by Sogou |
| 12 keywords with related searches, 12 queries each, no row cap | 11,688 | 1,074 s | 144 queries, 1,395 search pages, 7,986 different accounts, 0 duplicates, first row after 3.1 s |
| 100 articles with article pages (露营, 茶叶) | 100 | 90.9 s | 95 article pages read, 3 deleted by the publisher, 2 from migrated accounts; first row after 6.8 s |
| 7 links with `articleUrls` (1 short, 3 signed, 3 long permanent) | 4 | 6.9 s | the 3 long permanent links were reported, not read |

Search alone runs at roughly 10 articles per second: one request per search page (10 hits) plus one per hit to resolve its link. Article pages add one page read per article (about 350 KB each on the wire; the page is read until its data block ends) and run at about 1 article per second.

#### How a run gets past 100 hits

Sogou shows a visitor who is not logged in at most 10 pages of 10 hits per query. The Actor therefore treats **every related search as one more query**: with `expandKeywords`, each keyword is extended breadth-first with Sogou's own suggestions (10 per query), and each of those queries brings up to 100 hits of its own. Pages are scheduled round-robin — page 1 of every query first, then page 2, and so on — so a row cap is shared fairly, and every hit is de-duplicated by `articleId`. The depth of a run is bounded by the number of distinct queries, not by one list: in the proof run 144 queries gave 11,688 unique articles.

***

### What you pay

This Actor is priced **per result** (each saved article is one result). Article pages, HTML and related searches cost nothing extra: a row with full text costs the same as a row without it.

| Results | Free plan | Bronze | Silver | Gold, Platinum, Diamond |
|---|---|---|---|---|
| per 1,000 | $3.50 | $3.10 | $2.70 | $2.30 |
| 1,000 rows | $3.50 | $3.10 | $2.70 | $2.30 |
| 10,000 rows | $35.00 | $31.00 | $27.00 | $23.00 |
| 100,000 rows | $350.00 | $310.00 | $270.00 | $230.00 |

#### Maximum cost per run

Every Apify run has a **Maximum cost per run** (set in the run options). The Actor reads it at the start, works out how many results it covers at your price, and stops cleanly when it gets there: the run **succeeds**, keeps everything collected and says so in its status (`Saved N articles — this run's maximum cost ($X) covers N results at the current price. Raise "Maximum cost per run" to get more.`). It never writes a row it cannot charge for, so the run is never aborted halfway. For a 10,000-row run on the free plan, set the maximum cost to at least $35.

***

### Integrations

#### API, apify-client and webhooks

Everything in the Console is available over the REST API and the official clients for JavaScript and Python (see the tutorial). Add a **webhook** on "run succeeded" to push the dataset URL to your server, Slack or a queue the moment a run ends.

#### Make (Integromat)

Use the Apify app in Make: "Run an Actor" with this Actor and your input JSON, then "Get dataset items" and map `title`, `accountName`, `publishedAt`, `url` to the next module (Google Sheets, Airtable, Notion, e-mail).

#### Zapier

The Apify integration in Zapier starts the Actor on a trigger (schedule, new row in a sheet, form) and passes the dataset to the next step.

#### n8n

Use the Apify node (or an HTTP Request node to `run-sync-get-dataset-items`) and continue with n8n's Spreadsheet, Postgres or Airtable nodes. The JSON is flat apart from `imageUrls`, so it maps directly.

#### Google Sheets and Airtable

Export CSV from the dataset, or use the Google Sheets integration on the Actor's **Integrations** tab to append every run's rows to a sheet. Chinese text stays intact (UTF-8); in Excel, open CSV files via *Data → From Text/CSV* with UTF-8 encoding so the characters show correctly.

#### Scheduling

Apify **Schedules** run the same input daily or weekly — the base for brand monitoring, topic trackers and volume time series (count new `articleId` values per day).

#### Data warehouses (BigQuery, Snowflake, Postgres, S3)

Pull the dataset as JSON lines or CSV from the API and load it with your usual tool. `articleId` is a stable key; `scrapedAt` marks the snapshot.

#### MCP and AI agents

The Actor can be called from AI agents through Apify's MCP server and the Apify tools for agent frameworks: an agent asks for "the 20 latest Official Account articles about 固态电池" and gets typed rows back. `title`, `summary` and `contentText` are good grounding material for RAG over Chinese-language sources.

***

### Performance tips

- **More keywords beat a bigger page limit.** Each keyword is its own search with 100 hits; ten related keywords give up to ten times as many.
- **Use `expandKeywords` for depth,** not for freshness: related searches are Sogou's suggestions, not newer articles.
- **Leave article pages off** unless you need the text, author, original flag or IP location: search alone is about eight times faster.
- **Read article pages in the same run.** Signed links expire within hours; with `includeArticleDetails` the page is read seconds after the link is made.
- **Keep `maxConcurrency` at its default (8)** unless you have a reason: it is the setting every timing on this page was measured with.
- **Shared cap, fair share:** with several keywords and a small `maxItems`, every keyword gets its share because page 1 of every query is read first.
- **Daily jobs:** `maxPagesPerKeyword: 3` returns the top 30 hits per keyword in a few seconds.

***

### Troubleshooting: every status message explained

| Status message | What it means | What to do |
|---|---|---|
| `Saved N/M articles · P search pages · A article pages · S s` | Progress while running | Nothing |
| `Done: N articles saved from P search page(s) — reached Max articles (M).` | Stopped at `maxItems` | Raise `maxItems` for more |
| `Done: N articles saved from P search page(s).` | Every query was read to its end | More keywords or `expandKeywords` give more |
| `Done: N articles with article-page details saved from P search page(s).` | Same, with article pages on | — |
| `Partly done: … — stopped at the run timeout — raise the timeout for more` | The run's timeout came first; everything collected is saved | Raise the run timeout or split the input |
| `Partly done: … — K search page(s) could not be read` / `K search(es) not reached` / `K search(es) could not be read (…)` | Sogou refused or did not answer for some pages after all retries and routes; the rest is complete | Run the same input again; if it repeats, tell us |
| `Partly done: … — Sogou kept refusing new sessions for 3 minutes` | Sogou's antispider refused every new address for three minutes; what was collected is saved | Run again later |
| `… — K article page(s) could not be read (rows kept, detailsStatus says why)` | Some article pages were not read; their rows keep the search data and a `detailsStatus` reason | Read `detailsStatus`; deleted articles stay deleted |
| `… — K result link(s) had no article address` | Sogou returned a hit whose link page contained no mp.weixin.qq.com address | Nothing; those rows keep an empty `url` |
| `… — K long permanent link(s) (…?__biz=…&sn=…) not read — WeChat shows its verification page for them; paste the short link (mp.weixin.qq.com/s/…) instead` | `articleUrls` contained long permanent links, which WeChat answers with a verification page | Use short links, signed links or keyword search |
| `… — K article link(s) not read — WeChat showed its verification page to the exits (try again later or with fewer links per run)` | WeChat's verification page appeared for other links | Run again later or with fewer links |
| `… — K link(s) point to deleted or unavailable articles` | The articles were removed or the accounts migrated | Nothing |
| `Resumed after a platform restart: N article(s) already saved are not written or charged again.` (in the run summary notes) | The platform moved the run to another server; the run continued where it was | Nothing |
| `Saved N articles — this run's maximum cost ($X) covers N results at the current price. Raise "Maximum cost per run" to get more.` | The run stopped at your cost limit (succeeded); a run that ends on its own at the limit says `Done: … — reached the maximum cost per run ($X).` | Raise "Maximum cost per run" |
| `Sogou WeChat search answered but found no articles for "…"` (EMPTY_RESULT, succeeded) | The search is genuinely empty | Try other or broader keywords; Chinese works best |
| `Nothing to scrape: add at least one keyword or one mp.weixin.qq.com article link.` (INVALID_INPUT, run fails) | No usable keyword or link in the input | Fix the input; skipped links are listed in the summary notes |
| `No articles saved: N search page(s) could not be read (…)` / `…Sogou's antispider refused every session (N refusals)…` / `…Sogou could not be reached (…)…` — each ends "This is an access failure, not an empty result" (FETCH_FAILED or BLOCKED, run fails) | Sogou refused or did not answer on any route | Run again in a few minutes |
| `No articles saved: none of the N article link(s) could be read (…).` / `No articles saved: WeChat showed its verification page to every exit address tried …` (run fails) | Link-only run in which no page could be read | Use short links; try again later |

Log lines you may see: `Sogou refuses the DC route for now (…) — resting it for 1 min.` and `The DC route keeps failing in transport (…) — resting it for 1 min.` are the automatic route changes (datacenter → direct connection → capped residential); no action needed.

The run summary (`SUMMARY`) also carries `outcome` (`COMPLETED`, `PARTIAL`, `EMPTY_RESULT`, `BLOCKED`, `FETCH_FAILED` or `INVALID_INPUT`) and `stoppedBy` (`maxItems`, `MAX_COST`, `BLOCKED` or empty).

***

### Honest limits

- **100 hits per query.** Sogou shows visitors who are not logged in at most 10 pages of 10 hits. Related searches (`expandKeywords`) and more keywords are the way past it; there is no way to ask Sogou for page 11.
- **No time filter, no sort order, no account search.** Sogou's time filters (`tsn`, date ranges), the "search inside one account" box and the account search tab (公众号 search) redirect anonymous visitors to the home page or return an empty page (tested 2026-10-25). The Actor therefore offers keyword article search only; Sogou orders the hits by its own relevance, and the order can move between requests (a hit can appear on two pages — it is saved once).
- **Sogou's index is not all of WeChat.** It holds public Official Account articles that Sogou has indexed. `searchTotalResults` is Sogou's own estimate of how many it has for the query.
- **Publish time in search mode is Sogou's.** Compared with the publish time printed on the article page in 82 articles, Sogou's time was identical in 7, within two minutes in 58 more, within a day in 16 and farther off in 1 (Sogou's time is mostly a little later than the page's, which suggests it is the moment Sogou stored the article). With article pages on, `publishedAt` comes from the page itself, to the second.
- **Titles and summaries come with half-width punctuation.** Sogou writes `,` `.` `!` `?` instead of `，` `。` `！` `？` in titles and excerpts (the Sogou website shows the same). With article pages on, `title` is the article's exact title and `contentText` keeps the full-width punctuation.
- **Account names come from Sogou's index** and can lag behind a rename (1 of the 19 accounts checked by hand had been renamed). With article pages on, the page's current name is used.
- **Signed links expire.** The `url` of most rows is a link signed by Sogou; it still opened 62 minutes after the run and had expired when tested 13 hours later. The permanent link is given only where Sogou lists it (10.1 % of the rows in the proof run). `articleId`, `mid` and `idx` identify the article for good; read the pages in the same run if you need them.
- **Long permanent links are not readable anonymously.** `articleUrls` entries of the form `…/s?__biz=…&mid=…&idx=…&sn=…` are answered with WeChat's verification page (环境异常) on every address and header combination tested; the Actor tries two exits, reports them and moves on. Short links (`/s/xxxx`) and the signed links produced by this Actor work.
- **Deleted and migrated articles** (该内容已被发布者删除, 该公众号已迁移) return no text; their rows keep the search data and a `detailsStatus` that says why.
- **No reading, like or comment counts.** WeChat shows them only inside the app; the public page and Sogou's index do not carry them, so the dataset has no such columns.
- **IP location is not on every article.** 88 % of the article pages read in the 100-article run showed 发表于 (the province); the 11 that did not were all published before 2022-04-11, and every newer article in the sample had it.
- **Numbers move.** Sogou's result counts and rankings change between requests; `scrapedAt` records when each row was read.

***

### How it compares

| | This Actor | Searching by hand on the Sogou website | WeChat's official interfaces (公众平台) |
|---|---|---|---|
| Access | Apify account | Browser; Sogou can ask for a verification code after many searches | Credentials of the account owner |
| Scope | Public articles of any account that Sogou indexed | The same, 10 hits per page | The owner's own account and its content |
| Hits per keyword | 100, plus 100 per related search | 100, one page at a time | — |
| Full text, author, 原创 flag, IP location | Yes, with article pages on | Open each article | Own articles only |
| Past the 100-hit window | Related-search expansion | No | — |
| Output | JSON, CSV, Excel, API, integrations | Copy and paste | Your own code |
| Scheduling and monitoring | Built in | No | Your own code |

WeChat's in-app search (搜一搜) is only available inside the WeChat app and is not a data source for scripts.

***

### FAQ

#### What is WeChat Scraper?

An Apify Actor that searches WeChat Official Account articles (微信公众号文章) through Sogou WeChat search and exports them as structured data: title, summary, publish time, account name, WeChat ID, link and, optionally, the full text, author, original flag and IP location.

#### Is there an official WeChat API to search other accounts' articles?

No. WeChat's official interfaces for Official Accounts (公众平台) work with the account owner's credentials and cover the owner's own content. Other accounts' public articles can be searched on Sogou WeChat search, which is what this Actor reads.

#### How do I scrape WeChat articles to Excel or CSV?

Run the Actor with your keywords, open the dataset and choose **Export → Excel** or **CSV**. In Excel, import the CSV as UTF-8 so the Chinese characters display correctly.

#### How do I scrape WeChat Official Accounts by keyword?

Put the keywords in `keywords`, one per line, and set `maxItems`. Each keyword is searched on Sogou WeChat search; every hit becomes a row with the account (公众号) that published it.

#### Do I need a WeChat account, QR-code login or cookies?

No. The Actor never logs in, never scans a QR code and uses no cookies of yours. It reads what Sogou and mp.weixin.qq.com show to any anonymous visitor.

#### Does it work with English keywords?

Yes, brand names and English terms work (`ChatGPT`, `Tesla`), but Official Account articles are mostly Chinese, so Chinese keywords return many more hits.

#### How many articles can I get for one keyword?

Up to 100: Sogou shows visitors who are not logged in 10 pages of 10 hits. For more, add related keywords yourself or switch on `expandKeywords`; each related search brings up to 100 hits of its own.

#### How many articles can I get in one run?

The proof run on 2026-10-25 saved 11,688 unique articles from 12 keywords and their related searches in about 18 minutes. More keywords and a higher `maxQueriesPerKeyword` give more; the limit is the number of distinct searches, not the Actor.

#### How fast is it?

Search alone: about 10 articles per second, first rows after 3–5 seconds, 1,000 articles in about two minutes. With article pages: about one article per second, 100 articles in about 90 seconds.

#### What does "Read each article page" add?

The full text, the article's own digest, author, original flag and category, IP location, articles in the push, images, the 阅读原文 link, and the account's original ID, biz, numeric ID and bio. It also replaces title, account name and publish time with the page's exact values.

#### Why are some article-page columns empty?

Because the article does not have the value: in the 100-article run 48 % of the pages named an author, 70 % had their own digest, 17 % were original articles with a category and 13 % had a source link. Empty means "not on the page", not "not collected".

#### Can I search inside one account's articles?

Not at the moment: Sogou's account search and in-account search need a login (tested 2026-10-25). Search for a phrase the account uses, then filter the rows by `accountName`, `accountWechatId` or `accountSogouId`.

#### Can I filter by date or sort by newest?

No. Sogou's time filters need a login and the order is Sogou's relevance. Sort the dataset by `publishedTimestamp` afterwards, and schedule frequent runs with a few pages per keyword to follow new articles.

#### Can I get the number of reads, likes or comments?

No. WeChat shows them only inside the app and Sogou's public index does not carry them. The Actor does not export columns it cannot fill.

#### Why does the title have `,` instead of `，`?

Sogou writes punctuation half-width in titles and excerpts, on its own website too. Switch on `includeArticleDetails` to get the article's exact title.

#### Is the publish time exact?

With article pages on, yes: it is the time printed on the article page, to the second. Without them it is the time Sogou lists, which was identical, within two minutes or within a day of the page's time in 81 of 82 compared articles (see [Honest limits](#honest-limits)).

#### Why does `url` stop working after a few hours?

Most links are signed by Sogou and expire (links 62 minutes old still opened; 13-hour-old links had expired). Read the pages in the same run with `includeArticleDetails`, or keep `articleId`, `mid` and `idx` and search again. The permanent link is in `url` only where Sogou lists it (`urlIsPermanent: true`).

#### What is a long permanent link and why is it not read?

It is the old form `mp.weixin.qq.com/s?__biz=…&mid=…&idx=…&sn=…`. WeChat answers anonymous visitors of that form with a verification page on every address tried, so the Actor reports it and moves on. Short links (`/s/xxxx`) and the signed links the Actor itself produces open normally.

#### Can I paste article links and get the full text?

Yes: put them in `articleUrls`. Short links and signed links work; every link becomes one row (`source: "url"`).

#### What happens to deleted articles?

Their rows keep the search data, and `detailsStatus` says `not available: deleted by the publisher (该内容已被发布者删除)` or `account migrated (该公众号已迁移)`. They are still saved and counted as results, because the search hit is real data.

#### Are duplicates removed?

Yes. Rows are de-duplicated by `articleId` across all keywords and related searches in a run: an article that two searches both find is saved once (1,214 duplicate hits were skipped in the proof run).

#### Why did I get fewer rows than `maxItems`?

Because the queries ended first: each keyword has at most 100 hits, Sogou can show one article on two pages (saved once), and some queries have fewer hits. Add keywords or switch on `expandKeywords`.

#### Are two runs with the same input identical?

Not exactly. Sogou's ranking and index move: two proof runs 13 hours apart with the same input shared 8,221 articles (about 71 %). Use `articleId` to merge runs.

#### Do I need a proxy?

No. The Actor uses Apify's datacenter proxy by default, falls back to a direct connection and, for search only, to a small capped number of residential sessions. You can also give your own proxies.

#### What happens if Sogou blocks the run?

Sogou's antispider refuses an address, not the run. The Actor retires the session and continues on another address. If every address is refused for three minutes it stops with what it has (`PARTIAL`), or fails with `BLOCKED` if nothing was saved.

#### Can I monitor a brand every day?

Yes. Schedule the run with a few pages per keyword and compare `articleId` values with the previous dataset; `accountName`, `accountVerified` and `publishedAt` help you rank new mentions.

#### Can I find the best accounts on a topic?

Run a family of related keywords, then count rows per `accountSogouId` or `accountWechatId`. `accountVerified` and, with article pages on, `accountDescription` help you shortlist.

#### Does it download images or videos?

No. It exports image and cover URLs (`imageUrls`, `coverImageUrl`) and a `hasVideo` / `contentType` flag, not the files.

#### Can I use the data for AI or LLM training?

The text belongs to its authors; whether you may use it for training depends on your jurisdiction and purpose — see [Is it legal to scrape WeChat articles?](#is-it-legal-to-scrape-wechat-articles). Technically, `contentText` plus the metadata is ready for RAG and fine-tuning pipelines.

#### What happens if Sogou or WeChat changes its pages?

A field or a mode can stop working. The Actor then reports it in its status (`PARTIAL`, or a failed run with the reason) instead of returning empty rows as if they were results, and we fix it; the changelog lists every fix.

#### I need a field or a filter that is missing. Can you add it?

Tell us what you need and why (an example row helps). Fields that WeChat shows publicly can usually be added; fields behind a login cannot.

***

### Glossary

| Term | Meaning |
|---|---|
| 微信公众号 (Official Account) | A WeChat publishing account (service, subscription or enterprise) whose articles are public |
| 公众号文章 | An article published by an Official Account; several articles are sent together as one push |
| 搜狗微信搜索 | Sogou's search engine for Official Account articles, weixin.sogou.com |
| 微信号 | The WeChat ID of an account (custom, or the original `gh_…` ID) |
| biz (`__biz`) | Base64 form of the numeric account ID; part of the long permanent article link |
| 原创 | Original-content badge; `originalCategory` is WeChat's category of the original article |
| 发表于 | "Published from" — the province (IP location) WeChat prints on articles |
| 阅读原文 | The "read original" link at the end of an article (`sourceUrl`) |
| 舆情 | Public opinion; 舆情监测 = public-opinion monitoring |
| 环境异常 | "Abnormal environment" — the wording of WeChat's verification page |
| 该内容已被发布者删除 | "This content has been deleted by the publisher" |
| 该公众号已迁移 | "This account has migrated" — the account moved to a new account |

***

### Is it legal to scrape WeChat articles?

The Actor reads public pages that anyone can open without an account: Sogou's public search results and the public article pages behind them. It does not log in, does not use another person's account, does not read private chats, Moments or groups, and does not defeat any access control.

Articles are the authors' copyright, and the accounts' names, WeChat IDs and avatars are personal or business identifiers. Whether and how you may collect, store and use them depends on your jurisdiction and purpose:

- **China:** the Personal Information Protection Law (个人信息保护法, PIPL) and the Data Security Law apply to personal information and "important data" processed in or about China; processing public personal information must stay within the purpose for which it was made public.
- **EU / UK:** the GDPR applies if you process personal data of people in the EU; you need a lawful basis, must respect data-subject rights and should minimise what you keep.
- **Copyright:** quoting for analysis is treated differently from republishing; do not republish articles or images without permission.

You are responsible for your use of the data. This is general information, not legal advice; ask a lawyer when you build a product on it.

***

### Changelog

- **1.0 (2026-10-25)** — First release: Sogou WeChat article search (10 pages per query), related-search expansion, link resolution to mp.weixin.qq.com, optional article pages (full text, author, original flag, IP location, account IDs, images, HTML), articles by link, pay-per-result pricing with a Maximum-cost guard.

***

### Support

Questions, a field you miss, or a run that looks wrong? Open an issue from the Actor's page in the Apify Store or message the publisher; include the run link. We reply within 24 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/wechat-scraper/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

What to search, one keyword per line — each is its own Sogou WeChat article search (up to 100 articles each). Chinese works best (人工智能, 新能源汽车, 咖啡, 跨境电商); English names and brands work too.

## `maxItems` (type: `integer`):

Total articles to save across all keywords and links (0 = no limit). Several keywords share it fairly.

## `maxPagesPerKeyword` (type: `integer`):

Sogou shows 10 articles a page and at most 10 pages (100 articles) per search to visitors who are not logged in.

## `expandKeywords` (type: `boolean`):

Each keyword is extended with the related searches Sogou suggests for it (e.g. 咖啡 → 咖啡的功效, 咖啡加盟店…), and theirs, until it has 'Queries per keyword' searches. Every query brings up to 100 more articles; duplicates are removed.

## `maxQueriesPerKeyword` (type: `integer`):

Only used with related searches: the keyword itself plus up to this many minus one related searches.

## `includeArticleDetails` (type: `boolean`):

Opens every article on mp.weixin.qq.com and adds the full text, author, account original ID / biz, account bio, original (原创) flag, IP location (发表于), images and source link. Slower: WeChat limits how many pages one address may open.

## `includeContentHtml` (type: `boolean`):

With article pages: also save the article body as HTML (contentHtml). Large — leave off unless you need the formatting.

## `articleUrls` (type: `array`):

WeChat article links to read directly, e.g. https://mp.weixin.qq.com/s/… or https://mp.weixin.qq.com/s?\_\_biz=…\&mid=…\&idx=…\&sn=… — each link becomes one row with full text.

## `resolveArticleUrls` (type: `boolean`):

Turn each Sogou result into its mp.weixin.qq.com address. Off = faster, but rows have no article link (except the few Sogou gives directly).

## `maxConcurrency` (type: `integer`):

How many Sogou search sessions run at once.

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) by default; the Actor rotates addresses itself and falls back to a direct connection.

## Actor input object example

```json
{
  "keywords": [
    "人工智能"
  ],
  "maxItems": 20,
  "maxPagesPerKeyword": 3,
  "expandKeywords": false,
  "maxQueriesPerKeyword": 11,
  "includeArticleDetails": false,
  "includeContentHtml": false,
  "resolveArticleUrls": true,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All articles collected in this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "人工智能"
    ],
    "maxItems": 20,
    "maxPagesPerKeyword": 3,
    "maxQueriesPerKeyword": 11,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/wechat-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["人工智能"],
    "maxItems": 20,
    "maxPagesPerKeyword": 3,
    "maxQueriesPerKeyword": 11,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/wechat-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "人工智能"
  ],
  "maxItems": 20,
  "maxPagesPerKeyword": 3,
  "maxQueriesPerKeyword": 11,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/wechat-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/wechat-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hPedpXIJie1Q6ApR5/builds/jEA0WEkKialvKJvU7/openapi.json
