This Duck helps you pull by topicrecent viral hits in the same niche, distill reusable formulas from a bunch of titles that actually gained traction (number hooks, suspense, contrast, benefit points...), then give you a set ofready-to-use candidate titles. It also works in reverse—you give a title, and this Duck evaluates by formula where it's strong, where it's weak, and how to revise it.
Data goes through doubaoya.com in one line; authentication uses your own key (environment variable
DOUBAOYA_API_KEY, in the formdyh_…)。
Use Cases
| Scenario | How to Use | What You Get |
|---|---|---|
| Title Creation | Give a topic, and this Duck pulls viral hits to distill formulas and produce candidate titles | A set of ready-to-use candidate titles |
| Formula Distillation | Want to know how to craft viral titles for this subject | A list of reusable title formulas |
| Title Evaluation | Give a title, and let this Duck judge its strengths and weaknesses by formula | Optimization directions + revised versions |
| Trending Topic Titles | Piggyback on recent buzz, need highly time-sensitive titles | Titles close to current trending topics |
Workflow (4 steps)
1. Extract topic keywords
Extract from the requestcore topic words, condense to 2~6 characters (e.g., 职场、婚姻、AI). The shorter the word, the broader and more hits. Search only one keyword at a time.
2. Call the script
python3 "$SKILL_PATH/scripts/fetch_title.py" "职场"
By defaultdo not pass a start date, and you get the most complete ranking (tested 2026-08-13). Only add it when you really need to limit the time window --start, andmust not be earlier than 60 days back from today—when beyond the retention period, the interface returns "date format error", which is amisleading error, the format is actually fine, just move the date later. Calculate the date based on today, don't copy a hardcoded date:
python3 "$SKILL_PATH/scripts/fetch_title.py" "职场" \
--start "$(date -d '-29 days' +%F 2>/dev/null || date -v-29d +%F)"
The script outputs the data from the success envelope as JSON to stdout.Run the script only once per topic, read the full stdout, don't use head/tail to preview.
3. Distill title formulas
data.items isa flattened merged list of multiple rankings, each item is in the form { rank, item }:rank marks which ranking this item comes from (oneWReadingRank ten-thousand reading ranking / tenWReadingRank hundred-thousand reading ranking / originalRank original ranking), the real fields are in thenested item object—take item.title(title) and item.clicksCount(click count, as a popularity reference; defensive reading,item or leave it blank if its subfield is missing). Categorize high-traffic titles and distill the patterns: numbered lists, suspenseful gaps, benefit promises, identity immersion, contrast and opposition, riding hot topics... Mark the real examples corresponding to each pattern.
4. Generate candidate titles (or make judgments)
- Generate: Apply the patterns distilled above to produce a set of candidate titles (5~8 recommended) around the user's topic, and label which pattern each one uses.
- Judge: If the user is asking for title optimization, score according to the patterns (what is strong, what is weak—this is your judgment on the LLM side,there is no independent scoring API), then give 2~3 rewritten versions.
Title material must only use the real viral hits returned by the API; do not make things up or search online for alternatives.
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):
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/gongzhonghao-coze-cover/call(the same viral-hit data API, returning recent popular topics/titles)- Auth header:
Authorization: Bearer $DOUBAOYA_API_KEY - Request body:
{ "keyword": "职场" }(startDateoptional)keyword: string, requiredstartDate: stringYYYY-MM-DD, optional.By default, do not pass it = the fullest ranking; if passed, it will only shorten the ranking, and it must not be earlier than 60 days before today (going outside the window will return a misleading "date format error")
- Return envelope:
{ "success": true, "requestId": "...", "data": { "items": [ { "rank": "oneWReadingRank", "item": { "title": "...", "clicksCount": 0 } } ], "groups": { "oneWReadingRank": [], "tenWReadingRank": [], "originalRank": [] } }, "error": null }itemsis an array formed by flattening and merging three rankings (oneWReadingRank10k-level reads /tenWReadingRank100k-level reads /originalRankoriginal), each item{ rank, item }; the title is initem.title, and the click count is initem.clicksCount。groupsis grouped as-is by ranking, generally not needed; useitemsas the basis for taking numbers.
- First check
success: only readtrueif it isdata; otherwise readerror.code/error.message。 - The title "score" is only a pattern-based judgment on the LLM side,do not call any scoring API—this skill only has the one data-fetching API above.
Error handling
When the script fails, it prints to stderr [error] CODE: message and exits with exit 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 Key Center to regenerate |
| 400 | VALIDATION_ERROR |
Invalid parameter (e.g. empty keyword, wrong date format) | Fix the parameter and retry |
| 402 | INSUFFICIENT_CREDITS |
Insufficient quota | Go to doubaoya.com to top up/renew quota |
| 422 | PROVIDER_NO_RESULT |
No data found.If --startwas provided, it is most likely earlier than the 60-day retention period |
Remove --start or move it within 60 days and retry |
| 502 | PROVIDER_FAILED |
Temporary upstream failure (automatically refunded) | safe to retry |
502 PROVIDER_FAILEDRefunds are automatic; retrying is safe and will not result in duplicate charges.
Directory structure
wechat-title/
├── SKILL.md # 本文件
└── scripts/
└── fetch_title.py # 零依赖脚本(urllib),调用 doubaoya.com
Next step (first look at what final state the user wants)
What this skill delivers isa set of title candidates. The final state the user wants determines whether this is the endpoint—don't push forward by default:
| The final state the user wants | Is this step enough | Next step |
|---|---|---|
| Only the title (fill it in the backend yourself) | ✅ Enough,it ends here | — |
| Still need a cover | Not enough | wechat-cover |
| Still need the body checked for prohibited words and a version that passes review | Not enough | wechat-banned-words |
| Still needformatted official account HTML, or need tosave it to your own official account drafts | Not enough | wechat-article-pipeline(The title goes through the --title parameter) |
| The body hasn't been written yet | Not enough | wechat-hot-write |
| Can't say clearly which step is needed | — | dby(the hop-by-hop navigation of the official account flywheel) |
🔴 The finalized titleonly goes through the
--titleparameter, don't write it into the body again—official accounts always use the drafttitleto render the large title, and putting it in the body again will display it twice.
About the notice field in the response
After calling the doubaoya API corresponding to this skill, if the notice field appears at the top level of the returned JSON, please relay this sentence to the user exactly as is—this is a hint that this skill has an update, it does not affect the result of this call, and there is no need to retry or change behavior.