{"id":"ecb18c6d-5cee-454d-b45b-e6d84c3020b0","shortId":"nwKzRc","kind":"skill","title":"wechat-official-account","tagline":"Generate articles, manage drafts, publish to «发表记录», send customer-service messages, manage menus and pull stats on a WeChat Official Account (微信公众号 / 服务号 / 订阅号) via the WeChat MP server-side API. Use when the user mentions 公众号, 服务号, 订阅号, mp.weixin.qq.com, AppID/AppSecret of a We","description":"We drive the [WeChat MP server-side API](https://developers.weixin.qq.com/doc/service/guide/) with `curl + jq`. Unlike OAuth-bearer connectors, WeChat MP uses a two-step flow:\n\n1. Exchange `AppID + AppSecret` for an `access_token` (TTL 7200s, **global limit ≈ 2000 calls/day per app**).\n2. Pass that `access_token` as a **query string parameter** on every other call.\n\nThe user's credentials are in `$WECHAT_APP_ID` and `$WECHAT_APP_SECRET`. **Never log or echo `$WECHAT_APP_SECRET`** — treat it like a password.\n\nThe WeChat MP API returns standard JSON. **Errors are returned with HTTP 200**; the body looks like `{\"errcode\": 40013, \"errmsg\": \"invalid appid\"}`. `errcode == 0` means success — show the original `errmsg` to the user verbatim on any non-zero code.\n\n## Important constraints — surface these to the user before they're surprised\n\n- **IP whitelist**: every API call's source IP must be in this app's IP whitelist (公众平台 → 设置与开发 → 基本配置 → IP 白名单). If you see `errcode 40164` (\"invalid ip\"), the worker's egress IP isn't whitelisted; tell the user to add the IP shown in `errmsg` and retry.\n- **Verified account required for publishing**: as of 2025-07, only **verified (已认证) corporate-subject** accounts can call `freepublish/*` and `mass/*`. Personal-subject accounts and unverified corporate accounts get a permission error. Drafts (`draft/*`) and customer messages (`message/custom/*`) usually work without verification.\n- **Group-send quota is harsh**: 服务号 = 4 sends/month, 订阅号 = 1 send/day. Treat `freepublish/submit` and `mass/sendall` like a **destructive operation** — *always* confirm with the user before calling them, even if instructions say \"publish it\". Default to creating a draft and pasting the draft URL.\n- **Customer-service window is 48 hours**: `message/custom/send` only works for a follower whose `openid` interacted with the account in the last 48 hours. Outside that window you get `errcode 45015`.\n\n## Recipes\n\n### Step 0 — get an access_token (do this first, cache the result)\n\n```sh\n# Cache to /tmp so subsequent calls in the same session reuse it.\nTOKEN_CACHE=\"/tmp/wx-mp-token-${WECHAT_APP_ID}.json\"\n\n# Reuse cached token if it's still valid (we conservatively refresh\n# 5 minutes early to avoid edge-of-window failures).\nNOW=$(date +%s)\nif [ -f \"$TOKEN_CACHE\" ] && [ \"$(jq -r '.exp_at // 0' \"$TOKEN_CACHE\")\" -gt \"$((NOW + 300))\" ]; then\n  WECHAT_ACCESS_TOKEN=$(jq -r '.access_token' \"$TOKEN_CACHE\")\nelse\n  RESP=$(curl -sS \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${WECHAT_APP_ID}&secret=${WECHAT_APP_SECRET}\")\n  WECHAT_ACCESS_TOKEN=$(echo \"$RESP\" | jq -r '.access_token // empty')\n  if [ -z \"$WECHAT_ACCESS_TOKEN\" ]; then\n    echo \"Failed to fetch access_token: $RESP\" >&2\n    exit 1\n  fi\n  EXPIRES=$(echo \"$RESP\" | jq -r '.expires_in // 7200')\n  jq -nc --arg t \"$WECHAT_ACCESS_TOKEN\" --argjson e \"$((NOW + EXPIRES))\" \\\n    '{access_token:$t, exp_at:$e}' > \"$TOKEN_CACHE\"\nfi\necho \"OK token=${WECHAT_ACCESS_TOKEN:0:8}…\"\n```\n\nIf the response is `{\"errcode\": 40164, ...}` (invalid IP) or `{\"errcode\": 40013, ...}` (invalid appid) — surface that error to the user; it means the connector setup itself is wrong, not the request.\n\n### Verify the connection (always run this once before complex operations)\n\n```sh\n# Pull basic public-account self-info; cheapest call that proves the token works.\ncurl -sS \"https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=${WECHAT_ACCESS_TOKEN}\" | jq\n```\n\n### Upload an image to use *inside* an article body (returns a public URL)\n\nThis is for `<img src=\"...\">` tags inside the article HTML. The returned `url` is hosted by Tencent and works in published articles.\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -F \"media=@/path/to/your-image.jpg\"\n# → {\"url\": \"http://mmbiz.qpic.cn/...\"}\n```\n\nLimits: ≤ 1 MB, JPG/PNG only, no count limit on this endpoint.\n\n### Upload a thumbnail (needed as the article cover)\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=${WECHAT_ACCESS_TOKEN}&type=thumb\" \\\n  -F \"media=@/path/to/cover.jpg\" | jq '{media_id, url}'\n# → {\"media_id\": \"MEDIA_ID\", \"url\": \"http://mmbiz.qpic.cn/...\"}\n```\n\nThe `media_id` you get back is what you pass as `thumb_media_id` when creating a draft.\nRecommended cover dimensions: 900×500 px, JPG, < 64 KB ideally.\n\n### Create a draft (the safe default — *do not* directly publish)\n\n```sh\nTITLE=\"Q1 product update\"\nAUTHOR=\"Acme Inc.\"\nTHUMB_MEDIA_ID=\"MEDIA_ID_FROM_PREVIOUS_STEP\"\nCONTENT_HTML='<p>欢迎关注我们的最新动态。</p><p><img src=\"http://mmbiz.qpic.cn/...\"></p><p>更多内容请见底部「阅读原文」。</p>'\nDIGEST=\"Q1 has been a wild ride — here's what shipped.\"\nSOURCE_URL=\"https://example.com/q1-recap\"   # optional; populates 「阅读原文」, leave empty to omit\n\nPAYLOAD=$(jq -nc \\\n  --arg title       \"$TITLE\" \\\n  --arg author      \"$AUTHOR\" \\\n  --arg thumb       \"$THUMB_MEDIA_ID\" \\\n  --arg content     \"$CONTENT_HTML\" \\\n  --arg digest      \"$DIGEST\" \\\n  --arg source_url  \"$SOURCE_URL\" \\\n  '{articles: [{\n    article_type: \"news\",\n    title: $title,\n    author: $author,\n    thumb_media_id: $thumb,\n    content: $content,\n    digest: $digest,\n    content_source_url: $source_url,\n    need_open_comment: 0,\n    only_fans_can_comment: 0\n  }]}')\n\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/draft/add?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$PAYLOAD\" | jq\n# → {\"media_id\": \"DRAFT_MEDIA_ID\"}\n```\n\nTell the user: *\"Draft created. Open https://mp.weixin.qq.com → 草稿箱 to review and tap «发表» from there.\"* — that's the safest path because the user controls the publish click in WeChat's own UI.\n\n### List drafts (newest first)\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw '{\"offset\": 0, \"count\": 20, \"no_content\": 1}' \\\n  | jq '.item[] | {media_id, update_time, title: .content.news_item[0].title}'\n```\n\n### Get the full content of one draft\n\n```sh\nDRAFT_MEDIA_ID=\"...\"\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/draft/get?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg m \"$DRAFT_MEDIA_ID\" '{media_id: $m}')\" | jq\n```\n\n### Update an existing draft\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/draft/update?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg m \"$DRAFT_MEDIA_ID\" --arg t \"Updated title\" --arg c \"<p>new body</p>\" --arg th \"$THUMB_MEDIA_ID\" '\n    {media_id: $m, index: 0, articles: {\n      title: $t, content: $c, thumb_media_id: $th\n    }}')\" | jq\n```\n\n### Publish a draft to «发表记录» — DESTRUCTIVE, confirm before calling\n\n```sh\n# Eats one of the monthly publish slots. Always echo back to the user\n# what's about to go live and require an explicit \"yes\" confirmation\n# in conversation BEFORE invoking this.\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg m \"$DRAFT_MEDIA_ID\" '{media_id: $m}')\" | jq\n# → {\"errcode\": 0, \"msg_data_id\": ..., \"publish_id\": \"...\"}\n```\n\nThen poll publish status (publishing is async, takes ~5-30 seconds):\n\n```sh\nPUBLISH_ID=\"...\"\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg p \"$PUBLISH_ID\" '{publish_id: $p}')\" | jq '{publish_status, fail_idx, article_id, article_url: .article_detail.item[0].article_url}'\n# publish_status: 0 = success, 1 = publishing, 2 = original-check-failed,\n#                 3 = failed, 4 = published-but-removed, 5 = unverified-removed\n```\n\nWhen `publish_status == 0`, return `article_detail.item[0].article_url` to the user — that's the canonical https://mp.weixin.qq.com/s/... URL.\n\n### List already-published articles\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw '{\"offset\": 0, \"count\": 20, \"no_content\": 1}' \\\n  | jq '.item[] | {article_id, update_time, title: .content.news_item[0].title, url: .content.news_item[0].url}'\n```\n\n### Send a customer-service message (one specific follower, 48h window)\n\n```sh\nOPENID=\"oXXXXXXXXXXXXXXXXX\"   # the recipient follower's openid\nTEXT=\"Hi! Your subscription has been renewed. Thanks for sticking with us.\"\n\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg u \"$OPENID\" --arg t \"$TEXT\" '\n    {touser: $u, msgtype: \"text\", text: {content: $t}}')\" | jq\n```\n\n`errcode 45015` = recipient hasn't messaged the account in the last 48h — explain that to the user; there's nothing the API can do about it.\n\nTo send an article card via customer message, change to `msgtype: \"mpnews\"` with `mpnews: {media_id: \"...\"}` (use `material/add_news` to first create a permanent news media_id).\n\n### Pull follower-growth + read stats\n\n```sh\nBEGIN=\"2026-04-25\"\nEND=\"2026-05-01\"   # max 7-day window for getusersummary\n\n# New / unsubscribed / cumulative followers per day\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/datacube/getusersummary?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg b \"$BEGIN\" --arg e \"$END\" '{begin_date: $b, end_date: $e}')\" \\\n  | jq '.list[] | {date: .ref_date, new: .new_user, lost: .cancel_user, source: .user_source}'\n\n# Article reads per day (max 3-day window for getuserread)\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/datacube/getuserread?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$(jq -nc --arg b \"$BEGIN\" --arg e \"$BEGIN\" '{begin_date: $b, end_date: $e}')\" | jq\n```\n\n`datacube/*` requires an authenticated (已认证) account with the data-cube permission.\n\n### Manage the bottom menu\n\n```sh\n# Read current menu\ncurl -sS \"https://api.weixin.qq.com/cgi-bin/menu/get?access_token=${WECHAT_ACCESS_TOKEN}\" | jq\n\n# Replace the menu (max 3 top-level buttons; each top-level button can have ≤ 5 sub-buttons)\nMENU=$(jq -nc '{\n  button: [\n    {type: \"click\", name: \"今日推荐\", key: \"DAILY_REC\"},\n    {name: \"更多\",\n     sub_button: [\n       {type: \"view\", name: \"官网\",   url: \"https://example.com\"},\n       {type: \"view\", name: \"联系我们\", url: \"https://example.com/contact\"}\n     ]}\n  ]\n}')\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw \"$MENU\" | jq\n# → {\"errcode\": 0, \"errmsg\": \"ok\"}\n```\n\n### Get the follower list (paginated by next_openid)\n\n```sh\nNEXT=\"\"\ncurl -sS \"https://api.weixin.qq.com/cgi-bin/user/get?access_token=${WECHAT_ACCESS_TOKEN}&next_openid=${NEXT}\" \\\n  | jq '{total, count, openids: .data.openid, next: .next_openid}'\n# Loop: pass the returned `next_openid` as NEXT until count < 10000.\n```\n\nFor each openid, batch-fetch profile (≤ 100 per call):\n\n```sh\ncurl -sS -X POST \\\n  \"https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=${WECHAT_ACCESS_TOKEN}\" \\\n  -H \"Content-Type: application/json; charset=utf-8\" \\\n  --data-raw '{\"user_list\": [{\"openid\": \"OPENID1\", \"lang\": \"zh_CN\"}]}' \\\n  | jq '.user_info_list[] | {openid, nickname, subscribe_time, tagid_list}'\n```\n\n## HTML rules for article `content`\n\nThe `content` field in `draft/add` accepts a *subset* of HTML, not full web HTML:\n\n- Allowed: `<p>`, `<span>`, `<strong>`, `<em>`, `<a href>`, `<img src>`, `<br>`, `<h1>`–`<h3>`, `<ul>/<ol>/<li>`, `<blockquote>`, `<section>`.\n- **Inline styles only** (`<p style=\"...\">`) — no `<style>` blocks, no `<link>` to external CSS.\n- All `<img>` `src` URLs **must** be either previously-uploaded `mmbiz.qpic.cn` URLs (from `media/uploadimg`) or already-published `mmbiz` URLs. WeChat strips images hosted on third-party domains.\n- Total content size limit: ~ 20 K characters (HTML included).\n\n## Common errcode cheat-sheet\n\n| errcode | meaning | what to tell the user |\n|---|---|---|\n| 0 | success | — |\n| 40001 | invalid access_token | Token expired mid-call; flush `$TOKEN_CACHE` and retry |\n| 40013 | invalid appid | The AppID in the connector is wrong — re-add the connection |\n| 40164 | source IP not in whitelist | Add the IP shown in `errmsg` to 公众平台 → 设置与开发 → 基本配置 → IP白名单 |\n| 41001 | missing access_token | Bug — you forgot to pass `?access_token=...` |\n| 45009 | API daily quota exceeded | Try again tomorrow; the per-app daily quota was hit |\n| 45015 | response message out of 48h | Customer-service window has closed for this openid; can't recover via API |\n| 48001 | api unauthorized | Account doesn't have permission for this endpoint (e.g. publish without 认证); see the doc URL in errmsg |\n| 61450 | system error | Tencent-side flake; retry once after a 1-second backoff |\n\n## Why we use bare `curl + jq` (not an SDK)\n\nSkill bodies must be self-contained shell. Calling `pip install wechatpy` is not allowed in the sandbox, and the API surface here is small (15-ish endpoints) and stable since 2018. The python SDKs ([wechatpy](https://github.com/wechatpy/wechatpy), werobot) are useful references for parameter shapes, but every recipe above is a direct call to the documented endpoint — the SDKs are just thin wrappers around the same JSON.","tags":["wechat","official","account","skills","acedatacloud","acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video"],"capabilities":["skill","source-acedatacloud","skill-wechat-official-account","topic-acedata-cloud","topic-agent-skills","topic-agentskills","topic-ai-image","topic-ai-music","topic-ai-tools","topic-ai-video","topic-claude-code","topic-cursor","topic-gemini-cli","topic-github-copilot","topic-mcp"],"categories":["Skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AceDataCloud/Skills/wechat-official-account","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AceDataCloud/Skills","source_repo":"https://github.com/AceDataCloud/Skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (13,721 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:14:04.898Z","embedding":null,"createdAt":"2026-05-18T13:21:36.164Z","updatedAt":"2026-05-18T19:14:04.898Z","lastSeenAt":"2026-05-18T19:14:04.898Z","tsv":"'-01':1380 '-04':1375 '-05':1379 '-07':241 '-25':1376 '-30':1106 '-8':827,892,942,979,1075,1128,1219,1294,1410,1469,1583,1661 '/...':624,671 '/cgi-bin/account/getaccountbasicinfo?access_token=$':569 '/cgi-bin/draft/add?access_token=$':816 '/cgi-bin/draft/batchget?access_token=$':881 '/cgi-bin/draft/get?access_token=$':931 '/cgi-bin/draft/update?access_token=$':968 '/cgi-bin/freepublish/batchget?access_token=$':1208 '/cgi-bin/freepublish/get?access_token=$':1117 '/cgi-bin/freepublish/submit?access_token=$':1064 '/cgi-bin/material/add_material?access_token=$':651 '/cgi-bin/media/uploadimg?access_token=$':614 '/cgi-bin/menu/create?access_token=$':1572 '/cgi-bin/menu/get?access_token=$':1512 '/cgi-bin/message/custom/send?access_token=$':1283 '/cgi-bin/token?grant_type=client_credential&appid=$':438 '/cgi-bin/user/get?access_token=$':1607 '/cgi-bin/user/info/batchget?access_token=$':1650 '/contact':1565 '/datacube/getuserread?access_token=$':1458 '/datacube/getusersummary?access_token=$':1399 '/doc/service/guide/)':62 '/path/to/cover.jpg':659 '/path/to/your-image.jpg':620 '/q1-recap':746 '/s/...':1194 '/tmp':367 '/tmp/wx-mp-token-':379 '0':157,353,416,507,804,809,897,912,1007,1091,1151,1156,1179,1182,1224,1239,1244,1590 '1':79,286,471,626,902,1158,1229 '100':1640 '10000':1632 '2':95,469,1160 '20':899,1226 '200':146 '2000':91 '2025':240 '2026':1374,1378 '3':1165,1447,1521 '300':421 '4':283,1167 '40013':152,519 '40164':210,514 '45015':350,1315 '48':325,342 '48h':1255,1325 '5':395,1105,1172,1533 '500':694 '64':697 '7':1382 '7200':480 '7200s':88 '8':508 '900':693 'accept':1692 'access':85,98,356,424,428,447,453,459,466,486,492,505,571,616,653,818,883,933,970,1066,1119,1210,1285,1401,1460,1514,1574,1609,1652 'account':4,26,234,248,257,261,338,554,1321,1493 'acm':716 'add':225 'allow':1701 'alreadi':1198 'already-publish':1197 'alway':296,542,1035 'api':37,59,137,188,1335 'api.weixin.qq.com':437,568,613,650,815,880,930,967,1063,1116,1207,1282,1398,1457,1511,1571,1606,1649 'api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=$':567 'api.weixin.qq.com/cgi-bin/draft/add?access_token=$':814 'api.weixin.qq.com/cgi-bin/draft/batchget?access_token=$':879 'api.weixin.qq.com/cgi-bin/draft/get?access_token=$':929 'api.weixin.qq.com/cgi-bin/draft/update?access_token=$':966 'api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=$':1206 'api.weixin.qq.com/cgi-bin/freepublish/get?access_token=$':1115 'api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=$':1062 'api.weixin.qq.com/cgi-bin/material/add_material?access_token=$':649 'api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=$':612 'api.weixin.qq.com/cgi-bin/menu/create?access_token=$':1570 'api.weixin.qq.com/cgi-bin/menu/get?access_token=$':1510 'api.weixin.qq.com/cgi-bin/message/custom/send?access_token=$':1281 'api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$':436 'api.weixin.qq.com/cgi-bin/user/get?access_token=$':1605 'api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=$':1648 'api.weixin.qq.com/datacube/getuserread?access_token=$':1456 'api.weixin.qq.com/datacube/getusersummary?access_token=$':1397 'app':94,116,120,127,197,381,440,444 'appid':81,155,521 'appid/appsecret':47 'application/json':824,889,939,976,1072,1125,1216,1291,1407,1466,1580,1658 'appsecret':82 'arg':483,757,760,763,768,772,775,948,985,990,994,998,1081,1134,1300,1303,1416,1419,1475,1478 'argjson':488 'articl':6,581,593,606,642,780,781,1008,1146,1148,1152,1183,1200,1232,1343,1442,1685 'article_detail.item':1150,1181 'async':1103 'authent':1491 'author':715,761,762,786,787 'avoid':399 'b':1417,1424,1476,1483 'back':677,1037 'basic':551 'batch':1637 'batch-fetch':1636 'bearer':69 'begin':1373,1418,1422,1477,1480,1481 'bodi':148,582,997 'bottom':1502 'button':1525,1530,1536,1540,1551 'c':995,1012 'cach':361,365,378,385,411,418,431,499 'call':108,189,250,302,370,559,1026,1642 'calls/day':92 'cancel':1437 'canon':1191 'card':1344 'chang':1348 'charset':825,890,940,977,1073,1126,1217,1292,1408,1467,1581,1659 'cheapest':558 'check':1163 'click':864,1542 'cn':1671 'code':173 'comment':803,808 'complex':547 'confirm':297,1024,1052 'connect':541 'connector':70,531 'conserv':393 'constraint':175 'content':726,769,770,792,793,796,822,887,901,917,937,974,1011,1070,1123,1214,1228,1289,1311,1405,1464,1578,1656,1686,1688 'content-typ':821,886,936,973,1069,1122,1213,1288,1404,1463,1577,1655 'content.news':910,1237,1242 'control':861 'convers':1054 'corpor':246,260 'corporate-subject':245 'count':631,898,1225,1616,1631 'cover':643,691 'creat':312,687,700,842,1360 'credenti':112 'cube':1498 'cumul':1389 'curl':64,434,565,608,645,810,875,925,962,1058,1111,1202,1277,1393,1452,1508,1566,1603,1644 'current':1506 'custom':14,269,321,1249,1346 'customer-servic':13,320,1248 'daili':1546 'data':829,894,944,981,1077,1093,1130,1221,1296,1412,1471,1497,1585,1663 'data-cub':1496 'data-raw':828,893,943,980,1076,1129,1220,1295,1411,1470,1584,1662 'data.openid':1618 'datacub':1488 'date':406,1423,1426,1430,1432,1482,1485 'day':1383,1392,1445,1448 'default':310,705 'destruct':294,1023 'developers.weixin.qq.com':61 'developers.weixin.qq.com/doc/service/guide/)':60 'digest':731,773,774,794,795 'dimens':692 'direct':708 'draft':8,266,267,314,318,689,702,835,841,871,920,922,950,960,987,1020,1083 'draft/add':1691 'drive':52 'e':489,497,1420,1427,1479,1486 'earli':397 'eat':1028 'echo':125,449,462,474,501,1036 'edg':401 'edge-of-window':400 'egress':216 'els':432 'empti':455,751 'end':1377,1421,1425,1484 'endpoint':635 'errcod':151,156,209,349,513,518,1090,1314,1589 'errmsg':153,163,230,1591 'error':141,265,524 'even':304 'everi':106,187 'example.com':745,1557,1564 'example.com/contact':1563 'example.com/q1-recap':744 'exchang':80 'exist':959 'exit':470 'exp':414,495 'expir':473,478,491 'explain':1326 'explicit':1050 'f':409,618,657 'fail':463,1144,1164,1166 'failur':404 'fan':806 'fetch':465,1638 'fi':472,500 'field':1689 'first':360,873,1359 'flow':78 'follow':332,1254,1262,1368,1390,1595 'follower-growth':1367 'freepublish':251 'freepublish/submit':289 'full':916,1698 'generat':5 'get':262,348,354,676,914,1593 'getuserread':1451 'getusersummari':1386 'global':89 'go':1045 'group':277 'group-send':276 'growth':1369 'gt':419 'h':820,885,935,972,1068,1121,1212,1287,1403,1462,1576,1654 'harsh':281 'hasn':1317 'hi':1266 'host':599 'hour':326,343 'html':594,727,771,1682,1696,1700 'http':145 'id':117,382,441,662,665,667,674,685,720,722,767,790,834,837,906,924,952,954,989,1002,1004,1015,1085,1087,1094,1096,1110,1137,1139,1147,1233,1355,1365 'ideal':699 'idx':1145 'imag':576 'import':174 'inc':717 'index':1006 'info':557,1674 'inlin':1702 'insid':579,591 'instruct':306 'interact':335 'invalid':154,211,515,520 'invok':1056 'ip':185,192,199,204,212,217,227,516 'isn':218 'item':904,911,1231,1238,1243 'jpg':696 'jpg/png':628 'jq':65,412,426,451,476,481,573,660,755,832,903,946,956,983,1017,1079,1089,1132,1141,1230,1298,1313,1414,1428,1473,1487,1516,1538,1588,1614,1672 'json':140,383 'kb':698 'key':1545 'lang':1669 'last':341,1324 'leav':750 'level':1524,1529 'like':131,150,292 'limit':90,625,632 'list':870,1196,1429,1596,1666,1675,1681 'live':1046 'log':123 'look':149 'loop':1622 'lost':1436 'm':949,955,986,1005,1082,1088 'manag':7,17,1500 'mass':253 'mass/sendall':291 'material/add_news':1357 'max':1381,1446,1520 'mb':627 'mean':158,529 'media':619,658,661,664,666,673,684,719,721,766,789,833,836,905,923,951,953,988,1001,1003,1014,1084,1086,1354,1364 'mention':42 'menu':1503,1507,1519,1537,1587 'menus':18 'messag':16,270,1251,1319,1347 'message/custom':271 'message/custom/send':327 'minut':396 'mmbiz.qpic.cn':623,670 'mmbiz.qpic.cn/...':622,669 'month':1032 'mp':33,55,72,136 'mp.weixin.qq.com':46,844,1193 'mp.weixin.qq.com/s/...':1192 'mpnew':1351,1353 'msg':1092 'msgtype':1308,1350 'must':193 'name':1543,1548,1554,1560 'nc':482,756,947,984,1080,1133,1299,1415,1474,1539 'need':639,801 'never':122 'new':996,1387,1433,1434 'newest':872 'news':783,1363 'next':1599,1602,1611,1613,1619,1620,1626,1629 'nicknam':1677 'non':171 'non-zero':170 'noth':1333 'oauth':68 'oauth-bear':67 'offici':3,25 'offset':896,1223 'ok':502,1592 'omit':753 'one':919,1029,1252 'open':802,843 'openid':334,1258,1264,1302,1600,1612,1617,1621,1627,1635,1667,1676 'openid1':1668 'oper':295,548 'option':747 'origin':162,1162 'original-check-fail':1161 'outsid':344 'oxxxxxxxxxxxxxxxxx':1259 'p':1135,1140 'pagin':1597 'paramet':104 'pass':96,681,1623 'password':133 'past':316 'path':857 'payload':754,831 'per':93,1391,1444,1641 'perman':1362 'permiss':264,1499 'person':255 'personal-subject':254 'poll':1098 'popul':748 'post':611,648,813,878,928,965,1061,1114,1205,1280,1396,1455,1569,1647 'previous':724 'product':713 'profil':1639 'prove':561 'public':553,585 'public-account':552 'publish':9,237,308,605,709,863,1018,1033,1095,1099,1101,1109,1136,1138,1142,1154,1159,1169,1177,1199 'published-but-remov':1168 'pull':20,550,1366 'px':695 'q1':712,732 'queri':102 'quota':279 'r':413,427,452,477 'raw':830,895,945,982,1078,1131,1222,1297,1413,1472,1586,1664 're':183 'read':1370,1443,1505 'rec':1547 'recip':351 'recipi':1261,1316 'recommend':690 'ref':1431 'refresh':394 'remov':1171,1175 'renew':1271 'replac':1517 'request':538 'requir':235,1048,1489 'resp':433,450,468,475 'respons':511 'result':363 'retri':232 'return':138,143,583,596,1180,1625 'reus':375,384 'review':847 'ride':737 'rule':1683 'run':543 'safe':704 'safest':856 'say':307 'second':1107 'secret':121,128,442,445 'see':208 'self':556 'self-info':555 'send':12,278,1246,1341 'send/day':287 'sends/month':284 'server':35,57 'server-sid':34,56 'servic':15,322,1250 'session':374 'setup':532 'sh':364,549,607,644,710,874,921,961,1027,1108,1201,1257,1372,1504,1601,1643 'ship':741 'show':160 'shown':228 'side':36,58 'skill' 'skill-wechat-official-account' 'slot':1034 'sourc':191,742,776,778,797,799,1439,1441 'source-acedatacloud' 'specif':1253 'ss':435,566,609,646,811,876,926,963,1059,1112,1203,1278,1394,1453,1509,1567,1604,1645 'standard':139 'stat':21,1371 'status':1100,1143,1155,1178 'step':77,352,725 'stick':1274 'still':390 'string':103 'style':1703 'sub':1535,1550 'sub-button':1534 'subject':247,256 'subscrib':1678 'subscript':1268 'subsequ':369 'subset':1694 'success':159,1157 'surfac':176,522 'surpris':184 'tag':590 'tagid':1680 'take':1104 'tap':849 'tell':221,838 'tencent':601 'text':1265,1305,1309,1310 'th':999,1016 'thank':1272 'thumb':656,683,718,764,765,788,791,1000,1013 'thumbnail':638 'time':908,1235,1679 'titl':711,758,759,784,785,909,913,993,1009,1236,1240 'token':86,99,357,377,386,410,417,425,429,430,448,454,460,467,487,493,498,503,506,563,572,617,654,819,884,934,971,1067,1120,1211,1286,1402,1461,1515,1575,1610,1653 'top':1523,1528 'top-level':1522,1527 'topic-acedata-cloud' 'topic-agent-skills' 'topic-agentskills' 'topic-ai-image' 'topic-ai-music' 'topic-ai-tools' 'topic-ai-video' 'topic-claude-code' 'topic-cursor' 'topic-gemini-cli' 'topic-github-copilot' 'topic-mcp' 'total':1615 'touser':1306 'treat':129,288 'ttl':87 'two':76 'two-step':75 'type':655,782,823,888,938,975,1071,1124,1215,1290,1406,1465,1541,1552,1558,1579,1657 'u':1301,1307 'ui':869 'unlik':66 'unsubscrib':1388 'unverifi':259,1174 'unverified-remov':1173 'updat':714,907,957,992,1234 'upload':574,636 'url':319,586,597,621,663,668,743,777,779,798,800,1149,1153,1184,1195,1241,1245,1556,1562 'us':1276 'use':38,73,578,1356 'user':41,110,166,180,223,300,527,840,860,1040,1187,1330,1435,1438,1440,1665,1673 'usual':272 'utf':826,891,941,978,1074,1127,1218,1293,1409,1468,1582,1660 'valid':391 'verbatim':167 'verif':275 'verifi':233,243,539 'via':30,1345 'view':1553,1559 'web':1699 'wechat':2,24,32,54,71,115,119,126,135,380,423,439,443,446,458,485,504,570,615,652,817,866,882,932,969,1065,1118,1209,1284,1400,1459,1513,1573,1608,1651 'wechat-official-account':1 'whitelist':186,200,220 'whose':333 'wild':736 'window':323,346,403,1256,1384,1449 'without':274 'work':273,329,564,603 'worker':214 'wrong':535 'x':610,647,812,877,927,964,1060,1113,1204,1279,1395,1454,1568,1646 'yes':1051 'z':457 'zero':172 'zh':1670 '今日推荐':1544 '公众号':43 '公众平台':201 '发表':850 '发表记录':11,1022 '基本配置':203 '官网':1555 '已认证':244,1492 '微信公众号':27 '更多':1549 '更多内容请见底部':729 '服务号':28,44,282 '欢迎关注我们的最新动态':728 '白名单':205 '联系我们':1561 '草稿箱':845 '订阅号':29,45,285 '设置与开发':202 '阅读原文':730,749","prices":[{"id":"9ddcc5f3-6dcf-4db4-afb3-de518f25109a","listingId":"ecb18c6d-5cee-454d-b45b-e6d84c3020b0","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AceDataCloud","category":"Skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:36.164Z"}],"sources":[{"listingId":"ecb18c6d-5cee-454d-b45b-e6d84c3020b0","source":"github","sourceId":"AceDataCloud/Skills/wechat-official-account","sourceUrl":"https://github.com/AceDataCloud/Skills/tree/main/skills/wechat-official-account","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:36.164Z","lastSeenAt":"2026-05-18T19:14:04.898Z"}],"details":{"listingId":"ecb18c6d-5cee-454d-b45b-e6d84c3020b0","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AceDataCloud","slug":"wechat-official-account","github":{"repo":"AceDataCloud/Skills","stars":7,"topics":["acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code","cursor","gemini-cli","github-copilot","mcp","npm","openai-codex","roo-code"],"license":"other","html_url":"https://github.com/AceDataCloud/Skills","pushed_at":"2026-05-18T07:35:03Z","description":"Agent Skills for AceDataCloud AI services — music, image, video generation, web search, and more. Compatible with Claude Code, GitHub Copilot, Gemini CLI, and all agentskills.io-compatible agents.","skill_md_sha":"4ddb05bdd9b93542452e6707e2d7263715e5c72a","skill_md_path":"skills/wechat-official-account/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AceDataCloud/Skills/tree/main/skills/wechat-official-account"},"layout":"multi","source":"github","category":"Skills","frontmatter":{"name":"wechat-official-account","license":"Apache-2.0","description":"Generate articles, manage drafts, publish to «发表记录», send customer-service messages, manage menus and pull stats on a WeChat Official Account (微信公众号 / 服务号 / 订阅号) via the WeChat MP server-side API. Use when the user mentions 公众号, 服务号, 订阅号, mp.weixin.qq.com, AppID/AppSecret of a WeChat Official Account, or asks to draft / publish / send a customer message via WeChat."},"skills_sh_url":"https://skills.sh/AceDataCloud/Skills/wechat-official-account"},"updatedAt":"2026-05-18T19:14:04.898Z"}}