This duck helps you byindustry category + time rangefish out recentoriginalpopular viral articles from WeChat official accounts—focusing specifically on viral hits written by original creators, bypassing the pile of reposts and rewrites, so original writers can clearly see what angles and entry points peers are using to make original content go viral. With one category, the terminal lays out a clickable table of original viral articles, plus a line of creative insight.
Data goes through doubaoya.com on one line, authentication uses your own key (environment variable
DOUBAOYA_API_KEY, in the formdyh_…)。
Note: The original ranking and the 100,000+ viral article rankinginterfaces share the same source(both go through
category-time-hot), the difference lies inthe emphasis of the display layer/interpretation layer—this skill interprets from the perspective of original creators, emphasizing "this is a viral hit produced by original writers themselves," guiding you to distill reusable original writing methods, rather than simply looking at the ceiling of read counts.
Applicable scenarios
| Scenario | How to use | What you get |
|---|---|---|
| Original topic inspiration | Pull 科技数码 to see what original writers are recently writing about and how they切入 |
Find direction for your next original piece |
| Original writing method breakdown | Sweep the titles and openings of original viral articles in a certain category | Discover reusable original title/entry point patterns |
| Original trend tracking | Pull at fixed intervals 人文资讯 the original ranking |
See where original content trends are heading |
| Peer benchmarking | Lock onto 健康养生 to see which original authors in the same track are running volume |
Benchmark against top original content strategies |
| Original material accumulation | Batch collect original viral articles by category | Build a firsthand set of referenceable original examples |
Workflow (4 steps)
1. Confirm category and time range
🔴 Category is an official closed set, only full track names are recognized. The most common pitfall here is not "which track has no content," but rather
the name not being in the closed set: writing 科技、财经、职场、教育 always returns three empty rankings, not because these tracks have no data,
but because these four words are not legal track names at all—the official forms are 科技数码、财富理财、职场发展、
教育考试, and after switching to them, the same time range immediately has all three rankings full. Upstream treats values outside the closed setwithout erroring or correcting, only silently
returning empty, so "writing the wrong name" and "this track has no content" look exactly the same in the response.Match the name first, then talk about data.
The 22 officially supported tracks (copy exactly, don't abbreviate, don't invent):
人文资讯知识百科健康养生时尚潮流美食餐饮乐活生活旅游出行搞笑幽默情感心理体育娱乐美容美体文摘精选民生资讯财富理财科技数码创投商业汽车交通房产楼市职场发展教育考试学术研究企业品牌
Map the abbreviations users say to full names before querying: Tech/Digital → 科技数码, Finance/Wealth Management/Investment → 财富理财,
Workplace → 职场发展, Education → 教育考试, Entertainment/Sports → 体育娱乐, Beauty → 美容美体,
Real Estate → 房产楼市, Startups/Business → 创投商业, Lifestyle → 乐活生活. Default 科技数码, only pull one category at a time.
民生资讯is on the official list, butcurrently no data can be retrieved in actual testing(multiple time windows and multiple reruns all came back empty). It should not be removed from the list—whenever the upstream fills it in, it can be used—for now, just don't select it.
Three hard rules for the time range(tested in the same batch):
startDateandendDatemust both be provided, missing either one gets it rejected outright. When the script does not specify them, the default is end date = today, start date = 6 days before today(the past week); this default is safe.- Don't query dates that are too old. The official statement is that it can go back 30 days; in actual testing it was relaxed to about 60 days;
startDatewhen earlier than "60 days before today", the API returns "date format error"—this message is misleading; the format is fine, it's that the date is beyond the retention period. When you see it, move the start date later; don't change the date format. To be safe, use it as 30 days. - Data lags by about two days. Querying only today or yesterday will definitely be empty; to see the latest, it is recommended to set the range end date to 2 days before today. The default past-week range already includes the days with data, so there will still be data as usual.
2. Call the script
python3 "$SKILL_PATH/scripts/fetch_original_hot.py" --type 科技数码
When specifying a rangecalculate dates based on today; don't copy any hardcoded dates(hardcoded dates will eventually slide out of the 60-day window):
python3 "$SKILL_PATH/scripts/fetch_original_hot.py" --type 人文资讯 \
--start "$(date -d '-9 days' +%F 2>/dev/null || date -v-9d +%F)" \
--end "$(date -d '-2 days' +%F 2>/dev/null || date -v-2d +%F)"
The script prints the data from the success envelope as JSON to stdout.Run the script only once per query, read the full stdout directly, don't use head/tail to preview, and don't call it repeatedly with the same parameters.
3. Render the original viral article table
From data.items(article array), take the fields and lay them out as a Markdown table. Read fields defensively—title / accountName(account) / readCount(read count) may be missing; if missing, leave blank, don't error. Render the title as aclickable link(pointing to the article's original URL), sorted by read count descending.
| Title | Original Account | Read Count |
|---|---|---|
| Example Original Viral Article | Some Original Account | 50,000+ |
4. Give one original creation insight
After the table, add one insight in this duck's tone from anoriginal perspective: what angles these original viral hits are using, which writing style is working, and what angles original writers haven't fully explored yet. Focus on "how to make original content go viral", keep it short and useful, don't pile on clichés.
Get the key (secret key)
- Open doubaoya.com
- Log in
- Go to Key Center
- Generate Key(in the form
dyh_…)
Configure it as an environment variable (the script only recognizes this one):
export DOUBAOYA_API_KEY="dyh_你的密钥"
Iron rule: never print the key, never write it to a file, never echo it back to the user. The script itself also never outputs the key. All requests are sent only to doubaoya.com。
API and envelope
POST https://doubaoya.com/api/apis/gongzhonghao/category-time-hot/call(same interface as the 100k+ viral article ranking; the distinction between original and 100k+ is interpreted with a different emphasis at the presentation layer)- Auth header:
Authorization: Bearer $DOUBAOYA_API_KEY - Request body:
{ "type": "科技数码", "startDate": "YYYY-MM-DD", "endDate": "YYYY-MM-DD" }type: string, industry category,must be one of the full names of the 22 official tracks above(default科技数码)startDate/endDate:YYYY-MM-DD,both are required; the start date must not be earlier than 60 days before today (official policy is 30 days); data lags by about two days
- Response envelope:
{ "success": true, "requestId": "...", "data": { "items": [ { "title": "...", "accountName": "...", "readCount": 56789 } ] }, "error": null } - First check
success: if it istrue, only then readdata; otherwise readerror.code/error.message。
Error handling
When the script fails, print to stderr [error] CODE: message and exit with code 1. Common cases:
| HTTP | code | Meaning | Handling |
|---|---|---|---|
| 401 | MISSING_API_KEY / UNAUTHORIZED |
No key provided or invalid key | Check DOUBAOYA_API_KEY, go to the key center to regenerate it |
| 400 | VALIDATION_ERROR |
Invalid parameters (e.g. wrong date format) | Fix the category/date and retry |
| 402 | INSUFFICIENT_CREDITS |
Insufficient quota | Go to doubaoya.com to top up/renew quota |
| 422 | PROVIDER_NO_RESULT |
No data found for this set of input parameters.Most likely the start date is outside the 60-day retention period—even if it says "invalid date format" | Move the start date forward into the 60-day window and retry; do not change the date format |
| 502 | PROVIDER_FAILED |
Temporary upstream failure (automatically refunded) | safe to retry |
502 PROVIDER_FAILEDwill automatically refund; retrying is safe and will not double-charge.
All three rankings have 0 entries(success: true but no data): this is not a failure, and itdoes not deduct your credits—the response will include
a noResult flag, and the credits are refunded on the spot. Troubleshoot in this order:
- Is the category name not among those 22(most common, e.g. writing
科技instead of科技数码); - Does the range only cover the last two days (data not out yet);
- If all are correct, thenwait a while and retry once with the same parameters—upstream occasionally returns transient empty values; this duck has actually encountered cases where the same set of parameters was empty once and full the next time.Don't conclude "this track has no data" based on a single empty result.
Directory structure
wechat-original-hot/
├── SKILL.md # 本文件
└── scripts/
└── fetch_original_hot.py # 零依赖脚本(urllib),调用 doubaoya.com
About the notice field in the response
After calling the doubaoya API corresponding to this skill, if the returned JSON has a top-level notice field, please relay this sentence to the user verbatim—this is a notice that this skill has an update; it does not affect the result of this call, and no retry or behavior change is needed.