# WeChat Articles Scraper (`dami_studio/wechat-articles-scraper`) Actor

WeChat articles scraper (微信公众号) for Official Account articles by keyword or brand, an account's articles, every article in an album, or article links: title, summary, account, WeChat ID, date, cover. Add the full text for the body, author, region, tags, original badge and images.

- **URL**: https://apify.com/dami_studio/wechat-articles-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Social media, News, Marketing
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 articles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 articles scraper: search Official Account articles by keyword or brand name and get one row per article**: title, summary, account, WeChat ID, verified flag, publish time and cover, and with the full text on, the body, author, publishing region, tags and images. It also finds the accounts writing about a topic, lists one account's articles, reads every article in an album, and opens article links you already have. A keyword reaches up to 100 articles, as deep as the public search goes without signing in, so a brand watch works best with a few variants of the name.

| | |
|---|---|
| **Input** | Keywords or brand names, account names or WeChat IDs, article links, album links |
| **Output** | One row per article: title, summary, account, WeChat ID, verified, publish time, cover, links. With the full text: body, author, gh\_ ID, region, tags, original badge, album, images |
| **Ceiling** | 100 articles a keyword or account, 1,000 an album, 10,000 rows a run |
| **Speed** | About 300 to 500 articles a minute from search, about 15 to 25 a minute with the full text (real runs, 3 November 2026) |
| **Account needed** | None from you |
| **Price** | $0.0145 per 1,000 articles, the same on every plan. The full text adds $0.80 per 1,000, accounts are $0.205 per 1,000 and converted links $1.25 per 1,000. The free plan's $5 a month covers about 340,000 articles, or about 6,000 with the full text |

### 🌏 中文说明

按关键词或品牌名搜索微信公众号文章，每篇文章一行：标题、摘要、公众号名称、微信号、是否认证、发布时间和封面。开启全文后，还有正文、作者、原始ID、发布地区、话题标签、原创标记、所属合集和图片。也可以查找写某个话题的公众号、某个公众号的文章、合集里的全部文章，或读取你已有的文章链接。

只需填写"关键词"一栏即可开始。按条数收费，价格见上方表格。不需要账号。本工具不是微信官方产品。

### 🔍 What WeChat Articles Scraper does

Pick one job in **What to get**:

- **Articles that mention my keywords**: the articles a search for each keyword finds, newest first if you like, filtered by date, by account or by words to leave out.
- **Accounts behind those articles**: one row per account writing about the keyword, with how many matching articles it has and its latest one.
- **One account's articles**: give a name, a WeChat ID or a link to one of its articles.
- **Article details from links**: the full text and details of mp.weixin.qq.com links you already have.
- **Every article in an album**: a 合集, newest first, each with its permanent link.
- **Convert article links**: the short link, the article's ids and, where WeChat gives it, the permanent link.

With **Only new since my last run** on, a daily schedule returns only what earlier runs did not, and you pay for those alone.

### 📋 What data you get from each WeChat article

| You want | Fields |
|---|---|
| The article | `title`, `summary`, `publishedAt` (Beijing time), `publishTimestamp`, `coverUrl`, `hasVideo`, `readMoreUrl` |
| The account | `accountName`, `accountWeChatId`, `accountVerified`, `accountAvatarUrl`, `accountOpenId` |
| Where it was found | `query`, `page`, `position`, `source`, `searchSignals` |
| Links and ids | `searchResultUrl`, `articleUrl`, `articleKey`, `messageId`, `indexInMessage` |
| Full text (paid add-on) | `contentText`, `characterCount`, `author`, `accountId`, `accountDescription`, `isOriginal`, `isPaid`, `ipRegion`, `hashtags`, `topics`, `album`, `itemShowType`, `commentId`, `biz`, `images`, `imageCount`, `links`, `linkCount`, `videoIds`, `videoCount` |
| Optional with the full text | `contentMarkdown`, `contentHtml` |
| Album rows | `albumTitle`, `albumId`, `albumArticleCount`, `albumReadCount`, `permanentUrl`, `sn` |
| Account rows | `articlesFound`, `latestArticle`, plus `accountId` and `accountDescription` with the full text on |

### ▶️ How to scrape WeChat articles

1. Open the actor and click **Try for free**.
2. Leave **What to get** on "Articles that mention my keywords" and type your words in **Keywords**, one per line, in Chinese or English.
3. Set **Results per keyword, account or album** to how many you want, up to 100.
4. Turn on **Add the full text (paid add-on)** if you need the body, or set **Published within** for recent articles only.
5. Click **Start**, then export the dataset as JSON, CSV or Excel.

### 💰 How much does it cost to scrape WeChat articles?

An article row costs $0.0145 per 1,000, and every plan pays the same. The full text adds $0.80 per 1,000 articles whose page was read. An account row is $0.205 per 1,000, and a converted link, or the article link added to a search row, is $1.25 per 1,000. A run also has a start fee of $0.00005. The free plan's $5 a month covers about 340,000 articles, or about 6,000 with the full text.

Not charged: articles left out by your filters, the same article found twice in a run, articles returned before when **Only new since my last run** is on, and the note rows that say why something is missing.

### 📥 What you give it

| Field | Default | What it does |
|---|---|---|
| `mode` | `search` | The job: `search`, `accounts`, `accountArticles`, `articles`, `albums` or `links` |
| `keywords` | none | Words or brand names, for `search` and `accounts` |
| `searchUrls` | none | Links to search result pages you already have; a date filter in them is kept |
| `accounts` | none | For `accountArticles`: the name as WeChat shows it, the WeChat ID, the gh\_ ID or an article link |
| `articleUrls` | none | For `articles` and `links`: mp.weixin.qq.com links, short or long, or search result links |
| `albumUrls` | none | For `albums`: links with `__biz` and `album_id` |
| `maxResultsPerInput` | `20` | Rows per keyword, account or album; a keyword or account stops at 100, an album at 1,000 |
| `maxItems` | `100` | Rows in the whole run, up to 10,000 |
| `sortBy` | `relevance` | `relevance`, or `newest`: latest first. A keyword search then starts with the last day's articles, and the more rows you ask for, the deeper it reads, up to all 100 results |
| `publishedWithin` | `any` | `day`, `week`, `month`, `halfYear` or `year` |
| `publishedAfter` | none | A date like `2026-10-01` (Beijing time) or a number of days like `7`; other forms are refused before anything runs |
| `publishedBefore` | none | A date like `2026-10-31` |
| `excludeKeywords` | none | Leave out articles whose title or summary has any of these words |
| `onlyFromAccounts` | none | Keep only articles by these accounts, by name or WeChat ID |
| `includeContent` | `false` | The full text and details, a paid add-on |
| `includeMarkdown` | `false` | Also the text as Markdown |
| `includeHtml` | `false` | Also the text as HTML |
| `includeImages` | `true` | The list of images in the body |
| `resolveArticleUrls` | `false` | Add the article's own link to search rows, charged as a link |
| `onlyNew` | `false` | Leave out what earlier runs with the same monitor name returned |
| `monitorName` | `wechat-articles-seen` | Letters, digits and hyphens; one name per schedule |
| `resetMonitor` | `false` | Start the monitor's list again |
| `requestDelaySecs` | `1` | Seconds between two search pages, 0.5 to 10 |
| `proxyUrls` | none | Optional. Servers of your own you want the run to use, as `http://user:pass@host:port` |

```json
{
  "mode": "search",
  "keywords": ["比亚迪", "BYD"],
  "maxResultsPerInput": 50,
  "publishedWithin": "month",
  "excludeKeywords": ["招聘"],
  "includeContent": true
}
```

### 📤 What you get back

One row from a real run on 3 November 2026, trimmed:

```json
{
  "recordType": "article",
  "source": "search",
  "query": "华为",
  "page": 1,
  "position": 5,
  "articleKey": "oIWsFtwbC_RfPo29wSlbi2WbTTF4-2650876517-2",
  "title": "华为最新回应",
  "summary": "昨日(6月16日)晚间,华为就美国商务部发布的新规做出回应...",
  "accountName": "南方都市报",
  "accountWeChatId": "nddaily",
  "accountVerified": true,
  "publishedAt": "2020-06-17T12:15:17+08:00",
  "publishTimestamp": 1592367317,
  "coverUrl": "http://mmbiz.qpic.cn/mmbiz_jpg/3OEpTPib0kV9Br1fV...",
  "searchResultUrl": "https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfd...",
  "articleUrl": "https://mp.weixin.qq.com/s?src=11&timestamp=1793690568&ver=7065&...",
  "textStatus": "read",
  "accountId": "wxid_4783107810411",
  "accountDescription": "南都，换一种方式",
  "isOriginal": false,
  "ipRegion": { "country": "中国", "province": "广东" },
  "album": null,
  "biz": "MTk1MjIwODAwMQ==",
  "contentText": "昨日（6月16日）晚间，华为就美国商务部发布的新规做出回应。华为官方声明...",
  "characterCount": 1046,
  "imageCount": 2,
  "linkCount": 6
}
```

| Field | How to read it |
|---|---|
| `articleUrl` | On a search row it is signed for that search and opens the article for some hours. Album rows and the links you give carry links that last |
| `articleKey` | The same for an article on every run: join and deduplicate on it |
| `accountId` | Usually a gh\_ ID; older accounts can show a wxid\_ form |
| `ipRegion`, `album`, `author` | `null` when the article page shows none |
| `searchSignals` | The ranking figures the search gives the result, passed on as given |
| `publishedAt` | Beijing time, with its +08:00 offset |

### 🧾 Reading the output

- `recordType` is `article`, `account` or `link`. Every one of those rows is charged.
- With the full text on, `textStatus` says `read`, `gone` (WeChat no longer shows the article, and `textMessage` gives its reason) or `not_served` (the page was not served this run). Only `read` rows pay the add-on.
- A note row has `_diagnostic: true` and `ok: false`, costs nothing, and its `status` is one of: `BAD_INPUT` (the input was refused before anything ran), `NO_RESULTS` (nothing for that keyword or album, or nothing that passed your filters), `NOT_FOUND` (the link or account does not exist), `NOT_SERVED` (it was not served this run; run it again later), `TIME_LIMIT`, `COST_LIMIT` (your run limit or cost limit stopped it), `UNEXPECTED_ERROR` (with a reference to quote).
- To keep only paid rows, drop the ones where `_diagnostic` is `true`.

### 💡 What people use it for

- A brand team in China checking every morning what Official Accounts wrote about the brand overnight, with **Only new since my last run** on.
- A PR agency collecting launch coverage for a client report, full text included, filtered to the week after the launch.
- An analyst building a reading list of an industry, starting from the accounts that write about it most.
- An editor archiving a column that lives in one WeChat album.

A recipe: run **Accounts behind those articles** for your category, take the `accountName` values of the accounts that matter, then schedule **One account's articles** on them daily with only-new on. For the same brand on Weibo, run Weibo Scraper on the same words.

### 🚧 What it does not do

- It returns image links, not image or video files.
- It reads public articles as a visitor sees them; it does not post, comment or follow.
- It is not an official WeChat tool. Dami's Studio is independent and is not affiliated with or endorsed by WeChat, or by any other company named on this page.

### 🧭 Which WeChat scraper do you need?

| If you want | Use |
|---|---|
| WeChat articles about a brand or topic, the accounts writing them, one account, an album, or links you have | This one |
| The same brand in Weibo posts, with the authors' follower counts | [Weibo Scraper](https://apify.com/dami_studio/weibo-scraper) |
| What people search for on Douyin right now | [Douyin Hot Search Scraper](https://apify.com/dami_studio/douyin-hot-search-scraper) |
| RedNote notes you have links for, with their like and collect counts | [RedNote Scraper](https://apify.com/dami_studio/rednote-scraper) |
| Bilibili videos, rankings and the uploaders behind them | [Bilibili Scraper](https://apify.com/dami_studio/bilibili-scraper) |

### ❓ Questions people ask

#### Do I need a WeChat account to scrape WeChat articles?

No. You don't need a WeChat account or any key. Articles are read the way anyone opening them in a browser sees them.

#### How do I cover more than 100 articles for one brand?

Add variants as separate keywords: the Chinese name, the English one, product lines, the name of the brand's own account. Then use **Accounts behind those articles** and **One account's articles** on the accounts that matter, and schedule the run with only-new on so each day adds what is new.

#### Why does an article link from a search stop opening?

The link on a search row is signed for that search and opens for some hours. Keep `articleKey`, the title and the account to find the article again, and search again when you need a link that opens. Album rows and the links you give carry links that last.

#### Can I call it from code or an AI assistant?

Yes. The actor's [API tab](https://apify.com/dami_studio/wechat-articles-scraper/api) has ready calls in several languages. For an MCP client, use `https://mcp.apify.com/?tools=dami_studio/wechat-articles-scraper`, and set `maxTotalChargeUsd` on the run to cap the bill.

#### Is scraping WeChat legal?

The articles are public, and this actor reads them the way a signed-out visitor sees them, with no account and nothing private. Personal data in them falls under GDPR and similar laws, so keep only what you need. WeChat's own terms still apply to what you do with the data. Apify has a [write-up on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/). We are not lawyers.

### 🆘 If something breaks

Open an issue on the actor's Issues tab with the run's id and the input you used. Note rows in the dataset usually say what happened first.

# Actor input Schema

## `mode` (type: `string`):

Articles that mention your keywords; the accounts that wrote them; one account's articles; full details for article links; every article in an album; or the short and permanent links for article links.

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

Brand names, products, people or topics, one per line, in Chinese or English. Used by "Articles that mention my keywords" and "Accounts behind those articles". A keyword returns up to 100 articles, so add variants (the Chinese name, the English one, a product line) to cover more ground.

## `searchUrls` (type: `array`):

Optional, for "Articles that mention my keywords": links to WeChat article search result pages you already have open in your browser. Reading starts at the page in the link, and a date filter in the link is kept.

## `accounts` (type: `array`):

For "One account's articles": the account's name exactly as WeChat shows it (36氪), its WeChat ID (rmrbwx), its gh\_ ID, or a link to any one of its articles. One per line.

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

For "Article details from links" and "Convert article links": mp.weixin.qq.com links, short (/s/xxxx) or long (/s?\_\_biz=...), or a search result link. One per line.

## `albumUrls` (type: `array`):

For "Every article in an album": links like https://mp.weixin.qq.com/mp/appmsgalbum?\_\_biz=...\&album_id=... One per line. Articles come newest first, each with its permanent link.

## `maxResultsPerInput` (type: `integer`):

The most rows from each keyword, account or album. A keyword or an account stops at 100 articles; an album goes up to 1,000.

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

A ceiling across every keyword, account, link and album. The run stops there and you are charged for what arrived.

## `sortBy` (type: `string`):

Relevance keeps the search's own order. Newest first puts the latest first: a keyword search starts with the last day's articles, and the more rows you ask for, the deeper it reads, up to all 100 results.

## `publishedWithin` (type: `string`):

Keep only articles published in this window, counted back from the start of the run. Every row's own date is checked, and articles outside it are left out without charge.

## `publishedAfter` (type: `string`):

Optional. A date like 2026-10-01 (Beijing time), or a number of days back like 7. Older articles are left out without charge.

## `publishedBefore` (type: `string`):

Optional. A date like 2026-10-31 (Beijing time); articles published later that day are kept, later days are left out.

## `excludeKeywords` (type: `array`):

Optional. Articles whose title or summary contains any of these words are left out without charge, for example 招聘 or 广告.

## `onlyFromAccounts` (type: `array`):

Optional. Keep only articles by these accounts: the name as WeChat shows it, or the WeChat ID. Everything else is left out without charge.

## `includeContent` (type: `boolean`):

Opens each article: the body as plain text, author, the account's description and gh\_ ID, publishing region, tags, the original badge, the album it belongs to, images, links and video ids. Charged per article whose page was read, on top of the article row. "Article details from links" always includes it. In "Accounts behind those articles" it adds each account's description and gh\_ ID at no extra charge.

## `includeMarkdown` (type: `boolean`):

With the full text: contentMarkdown, with headings, bold, links and images kept. Handy for AI pipelines.

## `includeHtml` (type: `boolean`):

With the full text: contentHtml, the body as WeChat publishes it, with working image links. Large.

## `includeImages` (type: `boolean`):

With the full text: images, the link, width and height of each picture in the body. Links only, no files.

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

Adds articleUrl, the mp.weixin.qq.com link WeChat signs for this search; it opens the article for a few hours. Charged as a link per row that gets one. Not needed with the full text, which brings it anyway.

## `onlyNew` (type: `boolean`):

For scheduled runs: articles and accounts returned by an earlier run with the same monitor name are left out, uncharged. The list is kept in a store of that name in your own account.

## `monitorName` (type: `string`):

Letters, digits and hyphens. Use a different name for each schedule, for example brand-watch-cn.

## `resetMonitor` (type: `boolean`):

Start the monitor's list again: this run returns everything and remembers it from now on.

## `requestDelaySecs` (type: `number`):

How long to wait between two search pages. One second suits most runs; raise it for very long runs.

## `proxyUrls` (type: `array`):

Optional. HTTP or SOCKS5 proxy URLs you already pay for, used in turn. Leave empty to run without one.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "新能源汽车"
  ],
  "maxResultsPerInput": 20,
  "maxItems": 100,
  "sortBy": "relevance",
  "publishedWithin": "any",
  "includeContent": false,
  "includeMarkdown": false,
  "includeHtml": false,
  "includeImages": true,
  "resolveArticleUrls": false,
  "onlyNew": false,
  "monitorName": "wechat-articles-seen",
  "resetMonitor": false,
  "requestDelaySecs": 1,
  "proxyUrls": []
}
```

# Actor output Schema

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

Every row in the default dataset. Article rows: title, summary, account name, WeChat ID, verified flag, date, cover, the search result link and, with the full text, the body, author, region, tags, original badge, album and images. Account rows: name, WeChat ID, verified flag, avatar, how many matching articles, the latest one. Link rows: the short, permanent or signed address and the article's ids.

# 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": [
        "新能源汽车"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/wechat-articles-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": ["新能源汽车"] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/wechat-articles-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": [
    "新能源汽车"
  ]
}' |
apify call dami_studio/wechat-articles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/wechat-articles-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/MnvBvs5t2Z1HciboI/builds/5vMs0cPkUs9mvJqXe/openapi.json
