WeChat Article Comments Scraper — 公众号文章评论 + 回复抓取
Pricing
$0.08 / actor start
WeChat Article Comments Scraper — 公众号文章评论 + 回复抓取
EN — Pull public comments and reply threads from a WeChat Official Account article. mode=comments for top-level comments only;
Pricing
$0.08 / actor start
Rating
0.0
(0)
Developer
wang wei
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
WeChat Article Comments Scraper
✨ What you get
EN — Pull public comments and reply threads from any WeChat Official Account article. mode=comments returns top-level comments only (cheapest); mode=with-replies adds per-comment reply chains (one extra Data provider call per comment that has replies).
ZH — 抓取任意公众号文章的公开评论和回复链。mode=comments 只返回一级评论(最便宜);mode=with-replies 在每条有回复的评论下追加二级回复链(每条需要时多 1 次上游调用)。
- Console: https://console.apify.com/actors/ier1jWLNCkvLh8vpS
- Short link: opspilot.cc/wechat-article-comments-scraper
💼 Use cases
- Reading what readers actually wrote under an article — the cheapest pass is
mode=comments, which returns the top-level thread withcontent,likeNum,createTimeandipRegionper row. - Following a conversation two levels deep —
mode=with-repliesadds the reply chain under every comment that has one, which is where the objections and the second opinions live. - Bounding cost on a viral post —
maxComments(1 to 500) andmaxReplies(1 to 200) cap the drain; start at the default and raise only ifhasMoretells you there is more. - Skipping a slow page fetch — pass a
commentIdyou already have from the detail Actor and the comment thread is fetched without re-pulling the article HTML first.
✅ Who this is for
- Content and brand teams — checking the reaction to a specific post, where the raw sentences matter more than an aggregate score.
- Community and social managers — who moderate or reply under WeChat articles and need the elected comments flagged.
- Voice-of-customer researchers — mining article threads for the objections and language customers actually use before they buy.
- Market researchers — comparing how two accounts' audiences argue about the same topic, with
ipRegiongiving a rough geographic read on each commenter.
❌ Who this is NOT for
- You think the row count is the comment count —
totalCountandelectedTotalare the platform's own totals, whilefetchedCountis what landed in this run undermaxComments. IfhasMoreis true, you are looking at a capped slice. - You need reply threads without asking twice — with the default
mode=comments,repliesis an empty array even whenreplyTotalis above zero. Setmode=with-repliesor the second level simply is not in the dataset. - You are scraping a deep thread on a budget — each comment that has replies costs an extra upstream call, so a thread with fifty reply-bearing comments is not a cheap run. Raise
maxCommentsgradually and check the totals. - You want profiles for the commenters — you get
nickName, an opaqueidentityNamehash andipRegion. Follower counts, signatures and account history need a separate profile call on the username. - You are after video comments — this Actor reads WeChat Official Account articles only. Comments under a 视频号 video are a different endpoint and a different Actor.
🚀 Quick start
- Console: paste any article URL (or use the default) and click Start.
- API:
curl -X POST "https://api.apify.com/v2/acts/ier1jWLNCkvLh8vpS/runs?waitForFinish=60" \-H "Authorization: Bearer <APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"url":"https://mp.weixin.qq.com/s/...", "mode":"with-replies"}'
- CLI:
apify call wechat-article-comments-scraper \-i '{"url":"https://mp.weixin.qq.com/s/...", "mode":"with-replies", "maxComments":200}'
Free users: 5 runs/day. Paid users: 1 PPE event per page (article-comments-result).
📥 Input parameters
| Field | Type | Default | Notes |
|---|---|---|---|
url | string | https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw | Article URL. Short (/s/<sn>) and long (/s?__biz=...&mid=...) forms accepted. |
mode | string | "comments" | comments = top-level only. with-replies = comments + reply chains (1 extra Data provider call per comment that has replies). |
commentId | string | "" | Pre-known comment_id from /fetch_article_detail response's commentId. Speeds up Data provider by skipping HTML pre-fetch. Leave empty to let Data provider fetch the article HTML. |
maxComments | int | 100 | Hard cap on total comments pulled across paginated requests. 1-500. |
maxReplies | int | 50 | Hard cap on replies per comment (mode=with-replies). 1-200. |
raw | string | "false" | false = omit raw Data provider payload; true = attach rawData for debugging. |
Where to get a URL
- From the Article Detail Scraper: pass any URL, get back
commentId+ body. - From the Account Articles Scraper: each row's
urlfield.
📤 Output
{"url": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw","mode": "with-replies","commentId": "3884868893382230017","appmsgId": "2247780992","totalCount": 28,"electedTotal": 22,"fetchedCount": 10,"hasMore": false,"continueFlag": 0,"commentsPages": 1,"comments": [{"contentId": "921450079049482451","nickName": "IFGSLL","content": "懂了,这就下单 4070TI","likeNum": 20,"createTime": 1741148721,"ipRegion": { "country": "中国", "province": "江苏", "city": "" },"ipIds": { "country": "156", "province": "", "city": "" },"isElected": 1,"isTop": 0,"identityName": "oHQDtwGndOC9slgFqApFtbjJEdxk","replyTotal": 1,"replies": [{"replyId": "2","nickName": "🦄Savior","content": "还没降价,再等等","createTime": 1741149962,"ipRegion": { "country": "中国", "province": "河南", "city": "" },"ipIds": { "country": "156", "province": "", "city": "" },"identityName": "oHQDtwJjKLALca6GJyICQCRhAvKg","fromAi": 0,"replyIsElected": null}]}],"collectedAt": "2026-09-16T12:00:00.000Z"}
Field notes
totalCount/electedTotalcome from the data provider's first response (total in the system).fetchedCountis how many made it into this run (≤maxComments).contentId/replyId/commentId/appmsgIdare always strings (big-integer safe per JSON serialization rules).ipRegionis the human-readable form (country_name / province_name / city_name);ipIdscarries the parallel numeric codes (country_id / province_id / city_id).repliesis[]whenmode=commentseven ifreplyTotal > 0. Usemode=with-repliesto fetch them.hasMore=truemeans Data provider still has more comments / replies beyondmaxComments/maxReplies. Re-run with higher caps to drain.
💰 Billing
PPE: 1 event per page fetched. article-comments-result event is charged with count = (comments pages) + (reply batches). Mode comments typically produces 1-3 PPE per run; mode with-replies produces (comments pages) + (number of comments with replies) PPE per run.
📚 Resources
$npm test
Runs unit assertions (input validation, body shape, normalize across comments / with-replies / raw=true / raw=false, §98 string coercion, ip_wording flattening, null handling) plus 9 integration scenarios (mock fetch drives the full run() flow including default/with-replies modes, commentId forwarding, maxComments cap, free-tier gating, Data provider errors).
✅ unit.js: all assertions passed.integration.js: 9 scenarios passed.
📜 Notes & caveats
Use it together with the other WeChat Actors
| Where in the pipeline | Actor | Console |
|---|---|---|
| step ① listing | Account Articles Scraper | …/vxAjW6anQJQWk7xTF |
| step ② detail | Article Detail Scraper | …/5vrr8dBcnclIva0Lx |
| step ③ metrics | Article Metrics Scraper | …/y3ZqhBdIY2LzGtkVK |
| step ④ comments (you are here) | Article Comments Scraper | …/ier1jWLNCkvLh8vpS |
| step ① profile (alt) | Account Profile Scraper | …/3JV499ECEjb5un854 |
You are here: Article Comments Scraper (step ④) — pair it with an Article Detail / Metrics output for the URL, or pass any URL you already have.