{"id":"e2b3f77c-ad26-4927-b883-84575bb426e2","entityType":"agent","slug":"clawhub-sipingme-wechat-md-publisher-skill","name":"Wechat Md Publisher Skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-sipingme-wechat-md-publisher-skill","canonicalPath":"/agent/clawhub-sipingme-wechat-md-publisher-skill","generatedAt":"2026-10-09T23:24:22.597Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":null},"description":"发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17867zbqf69d0mb2yqzym6nmh83hrxm:wechat-md-publisher-skill","sourceUrl":"https://clawhub.ai/sipingme/wechat-md-publisher-skill","homepage":"https://clawhub.ai/sipingme/skills/wechat-md-publisher-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/sipingme/wechat-md-publisher-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/sipingme/skills/wechat-md-publisher-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":57,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Wechat Md Publisher Skill technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":null},"stars":null,"forks":null,"downloads":1951,"packageName":null,"latestVersion":"1.0.11","tractionLabel":"2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T22:00:24.513Z","lastCrawledAt":"2026-10-09T22:00:24.513Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T22:00:24.513Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.11","createdAt":"2026-05-11T01:49:09.586Z","changelog":"- Enforced exact version pinning: now only allows wechat-md-publisher@1.0.7, rejecting mismatches and unverified upgrades. - Strengthened package resolution: only loads dependencies from trusted global or skill-internal node_modules, explicitly excluding CWD to prevent dependency hijacking. - Documented security model and package auditing procedures more clearly. - No changes to functional behavior for publishing or account operations.","fileCount":10,"zipByteSize":34683},{"version":"1.0.10","createdAt":"2026-04-29T08:17:10.116Z","changelog":"- 安全模型重大升级：Skill 执行方式由每次 npx 拉取切换为全局 npm 安装+in-process 动态 import，彻底消除运行时供应链风险。 - 现在必须提前手动全局安装 wechat-md-publisher（npm install -g），Skill 仅调用本机已安装版本、不再联网拉包。 - 安装方式、风险提示、审计建议和推荐用法等文档全面更新，强调账号凭证加密的上游依赖与最佳实践。 - install 字段 riskLevel 降为 low，riskReason 描述同步更新。 - 所有示例命令统一改为 wechat-pub（不再推荐用 npx）。 - 其余行为与功能无变化。","fileCount":9,"zipByteSize":26816},{"version":"1.0.9","createdAt":"2026-04-29T08:10:34.338Z","changelog":"Version 1.0.9 - No file changes detected in this release. - Skill metadata, usage instructions, and feature descriptions remain the same as version 1.0.7. - No new features, bug fixes, or documentation updates introduced in this version.","fileCount":9,"zipByteSize":25236},{"version":"1.0.8","createdAt":"2026-04-29T08:07:34.705Z","changelog":"Version 1.0.8 (no file changes detected): - No file or configuration changes since the previous release (1.0.7). - All functionality, requirements, installation methods, and documentation remain unchanged.","fileCount":9,"zipByteSize":25482},{"version":"1.0.7","createdAt":"2026-04-29T08:02:00.416Z","changelog":"- Bumped wechat-md-publisher version to 1.0.7 for npx install and all usage examples. - Updated documentation and commands to use version 1.0.7 everywhere. - No other user-facing changes.","fileCount":9,"zipByteSize":23393},{"version":"1.0.6","createdAt":"2026-04-11T12:12:03.495Z","changelog":"版本同步","fileCount":9,"zipByteSize":22674},{"version":"1.0.5","createdAt":"2026-04-11T03:29:42.322Z","changelog":"- Updated dependency version from wechat-md-publisher 1.0.4 to 1.0.5 in all docs, config, and command-line examples. - Adjusted install instructions, execution paths, and usage examples to reference version 1.0.5. - No functional changes beyond version bump and corresponding documentation updates.","fileCount":9,"zipByteSize":22671},{"version":"1.0.4","createdAt":"2026-04-08T03:20:19.430Z","changelog":"v1.0.4: 版本对齐 wechat-md-publisher@1.0.4","fileCount":9,"zipByteSize":22674}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17867zbqf69d0mb2yqzym6nmh83hrxm:wechat-md-publisher-skill","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17867zbqf69d0mb2yqzym6nmh83hrxm:wechat-md-publisher-skill` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/sipingme/wechat-md-publisher-skill before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T23:24:22.594Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sipingme-wechat-md-publisher-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":null},"readme":"Skill: Wechat Md Publisher Skill\n\nOwner: sipingme\n\nSummary: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\n\nTags: latest:1.0.11\n\nVersion history:\n\nv1.0.11 | 2026-05-11T01:49:09.586Z | user\n\n- Enforced exact version pinning: now only allows wechat-md-publisher@1.0.7, rejecting mismatches and unverified upgrades.\n- Strengthened package resolution: only loads dependencies from trusted global or skill-internal node_modules, explicitly excluding CWD to prevent dependency hijacking.\n- Documented security model and package auditing procedures more clearly.\n- No changes to functional behavior for publishing or account operations.\n\nv1.0.10 | 2026-04-29T08:17:10.116Z | user\n\n- 安全模型重大升级：Skill 执行方式由每次 npx 拉取切换为全局 npm 安装+in-process 动态 import，彻底消除运行时供应链风险。\n- 现在必须提前手动全局安装 wechat-md-publisher（npm install -g），Skill 仅调用本机已安装版本、不再联网拉包。\n- 安装方式、风险提示、审计建议和推荐用法等文档全面更新，强调账号凭证加密的上游依赖与最佳实践。\n- install 字段 riskLevel 降为 low，riskReason 描述同步更新。\n- 所有示例命令统一改为 wechat-pub（不再推荐用 npx）。\n- 其余行为与功能无变化。\n\nv1.0.9 | 2026-04-29T08:10:34.338Z | user\n\nVersion 1.0.9\n\n- No file changes detected in this release.\n- Skill metadata, usage instructions, and feature descriptions remain the same as version 1.0.7.\n- No new features, bug fixes, or documentation updates introduced in this version.\n\nv1.0.8 | 2026-04-29T08:07:34.705Z | user\n\nVersion 1.0.8 (no file changes detected):\n\n- No file or configuration changes since the previous release (1.0.7).\n- All functionality, requirements, installation methods, and documentation remain unchanged.\n\nv1.0.7 | 2026-04-29T08:02:00.416Z | user\n\n- Bumped wechat-md-publisher version to 1.0.7 for npx install and all usage examples.\n- Updated documentation and commands to use version 1.0.7 everywhere.\n- No other user-facing changes.\n\nv1.0.6 | 2026-04-11T12:12:03.495Z | user\n\n版本同步\n\nv1.0.5 | 2026-04-11T03:29:42.322Z | auto\n\n- Updated dependency version from wechat-md-publisher 1.0.4 to 1.0.5 in all docs, config, and command-line examples.\n- Adjusted install instructions, execution paths, and usage examples to reference version 1.0.5.\n- No functional changes beyond version bump and corresponding documentation updates.\n\nv1.0.4 | 2026-04-08T03:20:19.430Z | user\n\nv1.0.4: 版本对齐 wechat-md-publisher@1.0.4\n\nv1.0.3 | 2026-04-08T03:07:45.238Z | auto\n\n- Updated to version 1.0.3.\n- Changed npm package version references to 1.0.3 in install instructions and usage examples.\n- Environment variable requirements for WECHAT_APP_ID and WECHAT_APP_SECRET are now optional (previously required); added a note about providing credentials via environment variable or CLI.\n- No code changes; only documentation/config updates.\n\nv1.0.2 | 2026-04-06T15:15:58.327Z | user\n\n升级到 1.0.2，配套 wechat-md-publisher ^1.0.2\n\nv1.0.0 | 2026-04-06T04:56:53.831Z | user\n\n升级到 1.0.0，配套 wechat-md-publisher ^1.0.0\n\nv0.8.38 | 2026-04-06T03:37:45.002Z | user\n\n统一脚本命名为 run.js；添加 postinstall.js 帮助信息脚本；统一所有文件版本号到 0.8.38\n\nv0.8.37 | 2026-04-06T02:12:03.355Z | user\n\n修复安全审计问题（凭证暴露和远程主题风险）；更新 README.md 所有命令为 npx 方式执行\n\nv0.8.36 | 2026-04-06T01:44:42.311Z | user\n\n统一 SKILL.md 和 config.json 的 install 规范，解决安全审计不一致问题\n\nv0.8.35 | 2026-04-06T01:39:12.841Z | user\n\n更新 install 规范为 npx 类型，修复安全审计问题\n\nv0.8.34 | 2026-04-06T01:20:58.912Z | user\n\n使用 npx 方式执行，清理冗余文件\n\nv0.8.33 | 2026-04-04T01:00:26.181Z | user\n\n版本升至0.8.33，同步 wechat-md-publisher 0.8.21\n\nv0.8.30 | 2026-04-03T05:53:20.437Z | auto\n\n- Bump version to 0.8.30.\n- Documentation updates in SKILL.md.\n- Meta and configuration files updated for latest version.\n\nv0.8.29 | 2026-04-03T03:02:38.374Z | auto\n\n- Update version to 0.8.29\n- Documentation (SKILL.md) updated to reflect latest version, but no new features or major content changes observed\n- Internal metadata and config version numbers incremented for alignment with release\n\nv0.8.26 | 2026-04-02T14:52:07.442Z | user\n\nfix: ensure metadata consistency for env vars and security notes; chore: bump version to 0.8.26\n\nv0.8.25 | 2026-04-01T23:32:57.511Z | user\n\nchore: bump version to 0.8.25; fix: replace Chinese field names for clawhub\n\nv0.8.23 | 2026-04-01T16:01:30.832Z | auto\n\n- Updated documentation and metadata for accuracy and clarity.\n- Permissions section in SKILL.md now uses more precise descriptions for file reading.\n- Minor corrections and improvements to configuration/environment documentation.\n- No functional or feature changes; this is a documentation and metadata refresh.\n\nv0.8.21 | 2026-04-01T15:43:49.615Z | auto\n\n- Clarified text in permissions: changed some permission descriptions from Chinese to English and improved clarity (e.g., \"read user-specified markdown files\").\n- Updated description of optional remote theme network access, specifying it is only accessed upon explicit user configuration and renamed the permission key for consistency.\n- No change to feature set or core functionality.\n\nv0.8.20 | 2026-03-31T13:34:48.834Z | auto\n\nVersion 0.8.20\n\n- Updated metadata in skill-submission.json and skill.json.\n- No changes to functionality, documentation, or dependencies.\n\nv0.8.19 | 2026-03-31T13:21:04.704Z | auto\n\nVersion 0.8.19\n\n- Added skill.json to the project.\n\nv0.8.18 | 2026-03-31T13:15:58.444Z | auto\n\n- Updated environment variable and credential configuration for clarity and better structure.\n- Explicit declaration of required runtime, package, and binary dependencies.\n- Permissions and config paths are now described in more detail, including encryption standards.\n- Minor corrections to metadata format and sensitive information handling.\n- SKILL.md and config.json aligned for improved transparency and user guidance.\n\nv0.8.17 | 2026-03-31T11:17:19.783Z | auto\n\n### wechat-md-publisher-skill v0.8.17 Changelog\n\n- Updated required network permission descriptions for optional remote theme API access, clarifying that remote endpoints are only contacted when explicitly configured and trusted by the user.\n- Minor wording improvements in documentation for clarity and consistency.\n- Bumped version number to 0.8.17.\n\nv0.8.16 | 2026-03-30T09:28:09.939Z | auto\n\n- Added _meta.json metadata file to the project.\n- No changes to core functionality or user-facing features.\n\nv0.8.15 | 2026-03-30T09:25:21.827Z | auto\n\n- Version bump to 0.8.15.\n- Updated version field in SKILL.md to 0.8.15. \n- No new features or user-facing changes documented.\n\nv0.8.14 | 2026-03-30T09:19:49.156Z | auto\n\nVersion 0.8.14\n\n- Update version number in SKILL.md from 0.8.13 to 0.8.14.\n- Update config files (config.json, skill-submission.json) to reflect new version.\n- No functional or user-facing changes documented.\n\nv0.8.13 | 2026-03-30T09:10:59.932Z | auto\n\n- Clarified and expanded the credential handling section in the skill manifest; now explicitly notes that credential encryption is managed by the upstream wechat-md-publisher npm package, not by this skill.\n- Added details on credential storage handler and responsibility to the SKILL.md for increased transparency and user trust.\n- No functional or API changes to user-facing publishing features.\n\nv0.8.12 | 2026-03-30T09:06:58.084Z | auto\n\nwechat-md-publisher-skill v0.8.12\n\n- Updated metadata version to 0.8.12 in all relevant files.\n- Documentation updated (README.md, SKILL.md) to match latest version.\n- No functional or API changes; this release aligns documentation and config files for consistency.\n\nv0.8.11 | 2026-03-30T09:02:04.610Z | auto\n\n- Clarified network permission requirements: now lists \"required\" and \"optional\" domains separately, specifying remote theme API access is only used when user explicitly adds a remote theme.\n- Updated SKILL.md to reflect this permission change and provide clearer network-related information.\n- Version bump to 0.8.11.\n\nv0.8.10 | 2026-03-30T08:58:19.682Z | auto\n\n- Added explicit permissions section in SKILL.md, detailing required filesystem, network, and credential access.\n- Declared read/write access for Markdown files, local images, and configuration storage.\n- Listed necessary network domains (api.weixin.qq.com, mp.weixin.qq.com) for API and upload operations.\n- Specified credential storage practices for WECHAT_APP_SECRET, including AES-256 encryption and user consent.\n- Bumped version to 0.8.10.\n\nv0.9.0 | 2026-03-30T08:55:11.741Z | auto\n\nNo changes detected. Version remains at 0.8.9.\n\n- No file changes were made in this version update.\n- Functionality, documentation, and configuration remain the same as the previous release.\n\nv0.8.9 | 2026-03-30T08:47:53.370Z | auto\n\nwechat-md-publisher-skill v0.8.9\n\n- Updated documentation (SKILL.md) to reflect the new version.\n- Incremented version from 0.8.8 to 0.8.9.\n- Minor maintenance in config and dependency check script.\n\nv0.8.8 | 2026-03-30T08:13:40.531Z | auto\n\n- Update version to 0.8.8.\n- Documentation updates in SKILL.md (versioning, possible workflow clarifications).\n- No changes to code functionality.\n\nv0.9.1 | 2026-03-30T07:10:51.234Z | auto\n\n- Updated to version 0.9.1.\n- Modified configuration files: config.json, install.sh, and skill-submission.json.\n- No changes to user documentation or feature set.\n\nv0.8.7 | 2026-03-28T04:03:47.492Z | user\n\n依赖更新、ImageProcessor 优化\n\nv0.8.6 | 2026-03-27T11:45:02.551Z | auto\n\nwechat-md-publisher-skill v0.8.6\n\n- Updated config.json file.\n- No changes to SKILL.md or core functionality.\n- The update may include configuration or metadata adjustments only.\n\nv0.8.5 | 2026-03-27T11:36:02.173Z | auto\n\nwechat-md-publisher-skill v0.8.5 changelog\n\n- Updated config.json.\n- No changes to general documentation or features.\n\nv0.8.4 | 2026-03-27T09:28:47.019Z | auto\n\n- 支持从本地路径上传图片至微信素材库（one-click publishing 更加稳健，远程图片推荐先下载为本地文件）。\n- 推荐搭配 news-to-markdown-skill 使用，并通过 `--download-images` 选项下载图片到本地，显著提升远程图片兼容性。\n- 文档大幅更新，增加针对图片下载、处理的最佳实践说明，提升图片发布成功率。\n- 版本号提升至 0.8.4，description 明确强调本地图片支持。\n\nv0.8.0 | 2026-03-27T05:36:43.861Z | auto\n\n- Update config.json configuration.\n- No functional changes to skill behavior or documentation.\n- Version remains 0.7.1.\n\nv0.7.4 | 2026-03-27T04:21:40.469Z | auto\n\n- Updated to version 0.7.4.\n- SKILL.md bumped version from 0.6.1 to 0.7.1 with no other visible content changes.\n- config.json modified (details not shown).\n\nv0.6.3 | 2026-03-27T00:26:18.184Z | auto\n\n- Update version to 0.6.3.\n- Updated config.json configuration.\n- No user-facing feature changes or documentation changes.\n\nv0.6.2 | 2026-03-26T23:27:34.857Z | auto\n\n## wechat-md-publisher-skill changelog v0.6.2\n\n- Updated `config.json` file.\n- No user-facing feature or documentation changes.\n\nv0.6.1 | 2026-03-26T23:19:59.447Z | auto\n\nwechat-md-publisher-skill 0.6.1\n\n- 更新版本号至 0.6.1\n- 文档无内容变动，仅做元数据维护\n\nv0.6.0 | 2026-03-26T22:57:04.978Z | auto\n\nVersion 0.6.0\n\n- 新增 Wrapper 功能：可在发布文章时自动添加开头/结尾固定图文内容（如导语、二维码、引流信息），支持开关、内容自定义、历史管理与回滚。\n- 更新触发关键词及说明，支持 Wrapper 相关操作与查询。\n- 文档增加 Wrapper 功能相关命令、使用说明及注意事项。\n- 其它文档内容同步至最新功能集。\n\nv0.5.10 | 2026-03-26T15:18:36.483Z | auto\n\nwechat-md-publisher-skill 0.5.10\n\n- No user-facing changes in documentation or features.\n- Internal update: configuration file (config.json) modified.\n- Documentation (SKILL.md) remains unchanged from previous version.\n\nv0.5.2 | 2026-03-26T12:59:27.801Z | auto\n\nwechat-md-publisher-skill 0.5.2\n\n- 移除了损坏和无效的旧主题（如 orangeheart、lapis、rainbow、phycat、pie、purple、maize），仅保留与 CSS 文件匹配的主题。\n- 默认主题和文档中的主题命令及示例相应调整为有效主题（如 orangesun、default 等）。\n- 更新文档说明，明确 0.5.2 版本主题变更提醒。\n\nArchive index:\n\nArchive v1.0.11: 10 files, 34683 bytes\n\nFiles: config.json (5735b), README.md (11070b), references/ip-whitelist-guide.md (7029b), references/quick-start.md (2526b), references/themes.md (5051b), scripts/postinstall.js (4010b), scripts/run.js (13467b), skill-card.md (3494b), SKILL.md (30198b), _meta.json (145b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: wechat-md-publisher\ndescription: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\nversion: 1.0.8\nauthor: Ping Si <sipingme@gmail.com>\nuser-invocable: true\nrequires:\n  runtime:\n    - name: node\n      version: \">=18.0.0\"\n    - name: npm\n      version: \">=8.0.0\"\ninstall:\n  type: npm-global\n  package: wechat-md-publisher\n  version: \"1.0.7\"\n  versionPinning: exact\n  execution: \"npm install -g wechat-md-publisher@1.0.7\"\n  global: true\n  autoInstall: false\n  autoUpdate: false\n  riskLevel: low\n  riskReason: |\n    启动器以 in-process 动态 import 调用本机已安装的 wechat-md-publisher，\n    并在 import 之前校验 manifest.name 与 manifest.version 是否精确等于内置 pin。\n    解析路径仅包含 Node 全局 node_modules 与 Skill 自身 node_modules；\n    当前工作目录 (CWD) 下的 node_modules 已被显式排除，避免被未审计的本地包替身劫持。\n    安装前请审计上游源码与凭证加密实现。\n  trustedResolutionRoots:\n    - \"<node-prefix>/lib/node_modules\"\n    - \"<node-prefix>/node_modules (Windows)\"\n    - \"<skill-dir>/node_modules\"\n  untrustedResolutionRoots:\n    - \"process.cwd()/node_modules (intentionally excluded)\"\n  source:\n    registry: https://registry.npmjs.org\n    repository: https://github.com/sipingme/wechat-md-publisher\n    license: Apache-2.0\n    audit: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n    auditCredentials: https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\nenv:\n  optional:\n    - name: WECHAT_APP_ID\n      description: 微信公众号 AppID\n      sensitive: false\n    - name: WECHAT_APP_SECRET\n      description: 微信公众号 AppSecret\n      sensitive: true\n  note: |\n    凭证可通过两种方式提供（二选一）：\n    1. 环境变量（推荐，避免凭证暴露在进程列表中）\n    2. CLI 命令：`account add --app-id xxx --app-secret xxx`\nconfigPaths:\n  - path: ~/.config/wechat-md-publisher-nodejs/\n    description: 账号配置和缓存目录\n    contains:\n      - credentials: true\n      - encryption: AES-256\npermissions:\n  filesystem:\n    read:\n      - \"*.md\": \"读取用户指定的 Markdown 文件\"\n      - \"*.jpg,*.png,*.gif\": \"读取文章中引用的本地图片\"\n    write:\n      - \"~/.config/wechat-md-publisher-nodejs/\": \"存储账号配置和缓存（凭证使用 AES-256 加密）\"\n  network:\n    required:\n      - \"api.weixin.qq.com\": \"微信公众号 API（发布、草稿、素材管理）\"\n      - \"mp.weixin.qq.com\": \"微信公众号素材上传\"\n    optional:\n      - \"remote-theme-api\": \"仅当用户使用 theme add-remote 命令时才会访问（⚠️ 需用户明确配置并信任该端点）\"\ncredentials:\n  - name: WECHAT_APP_SECRET\n    type: api-secret\n    storage:\n      location: ~/.config/wechat-md-publisher-nodejs/\n      encryption: AES-256\n      handler: wechat-md-publisher npm 包\n      handlerRepo: https://github.com/sipingme/wechat-md-publisher\n    consent: 需要用户明确提供，不会自动收集\n    securityNote: |\n      本 skill 不直接处理凭证加密，安全性依赖上游 npm 包的实现。\n      建议在提供凭证前审查 wechat-md-publisher 包的加密实现：\n      https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\ntags:\n  - wechat\n  - publishing\n  - markdown\n  - content-management\nrepository: https://github.com/sipingme/wechat-md-publisher\n---\n\n# WeChat Publisher Skill\n\n全功能微信公众号 Markdown 发布工具 - 让 AI 能够直接将内容发布到微信公众号。\n\n## ⚠️ 重要提示\n\n**推荐使用方式**：\n- ✅ **最佳实践**：与 `news-to-markdown-skill` 配合使用，实现一键转载新闻到微信公众号\n- 🌐 **固定公网 IP**：必须有固定公网 IP 并配置到微信公众平台的 IP 白名单\n- 🔑 **必需凭证**：必须配置 `WECHAT_APP_ID` 和 `WECHAT_APP_SECRET` 环境变量或通过命令行配置\n\n**关键要求**：\n1. **固定公网 IP**：微信 API 要求服务器 IP 在白名单中，动态 IP 无法使用\n2. **微信公众号凭证**：需要从微信公众平台获取 AppID 和 AppSecret\n3. **IP 白名单配置**：在微信公众平台「设置与开发」→「基本配置」→「IP 白名单」中添加你的公网 IP\n\n## ⚡ 快速开始\n\n### ⚠️ 安全风险与审计要点\n\n**安装与执行模型（请先阅读）**：\n- 本 Skill 的启动器 (`scripts/run.js`) 不会执行任何子进程，也不会通过 `npx` 在运行时从 registry 拉取代码。\n- 启动器使用 in-process 动态 `import` 调用 **本机已经全局安装** 的 `wechat-md-publisher` 包。\n- 因此，安装步骤是显式的、**必须使用精确版本**：`npm install -g wechat-md-publisher@1.0.7`。\n- 启动器在 `import` 之前会读取已解析包的 `package.json`，**校验 `name` 与 `version` 精确等于内置 pin**；任何不匹配（含同名替身、未审计的新版本）都会被拒绝。\n- 解析路径限定为 Node 全局 `node_modules` 与 Skill 自身 `node_modules`；**CWD 下的 `node_modules` 已被显式排除**，避免从含未审计依赖的工作目录启动时被恶意本地包劫持。\n- 这样可以让用户在安装前完整审计上游源码、签名与版本，避免 \"每次运行都从 npm 拉新代码\" 的供应链风险面。\n\n**必须审计的上游代码**（首次安装前）：\n- **CLI 入口与命令分发**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n- **账号 / 凭证加密实现**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\n- 重点关注：AES-256 是否使用 AEAD 模式（如 AES-GCM / AES-CBC + HMAC）、密钥派生方式、是否绑定到当前用户、加密文件权限。\n\n**凭证存储**：账号凭证存储在 `~/.config/wechat-md-publisher-nodejs/`，使用 AES-256 加密。本 skill 不直接处理加密，安全性依赖上游 npm 包的实现 —— 必须在审计上述 `account.ts` 之后再写入真实凭证。\n\n**凭证传递的最佳实践**：\n- 推荐使用环境变量 `WECHAT_APP_ID` / `WECHAT_APP_SECRET`，避免 `--app-secret` 出现在 `ps` 进程列表中。\n- 任何时候在 shell history、CI 日志、容器元数据中暴露 `AppSecret`，都应立即去微信公众平台重置。\n\n**远程主题风险**：如果使用 `theme add-remote` 添加远程主题，第三方端点可能接收文章正文 / 标题。请只使用受信任的主题源；本 Skill 默认网络白名单**不包含**任意第三方主题端点。\n\n**沙箱建议**：若你无法或不愿审计上游 npm 包，请在隔离环境（专用 VM / 容器 / 沙箱账号）中运行；不要把生产微信公众号的 AppSecret 直接交给未审计的工具链。\n\n### 配置账号\n\n**推荐方式（使用环境变量，避免命令行暴露凭证）**：\n\n```bash\n# 设置环境变量（不会出现在进程列表中）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\n# 添加账号\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n**备选方式（命令行传参，注意：可能暴露在进程列表中）**：\n\n```bash\n# ⚠️ 警告：--app-secret 会出现在 ps 进程列表中\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 发布文章\n\n```bash\nwechat-pub publish create \\\n  --file article.md \\\n  --theme orangesun\n```\n\n### 与 news-to-markdown 配合使用\n\n```bash\n# 一键转载新闻到微信公众号（推荐：下载图片到本地）\n# news-to-markdown 会自动下载图片到本地，避免远程 URL 过期问题\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --download-images \\\n  --output-dir /tmp/article\n\n# wechat-md-publisher 会自动读取本地图片并上传\nwechat-pub publish create --file /tmp/article/article.md --theme orangesun\n```\n\n**图片处理最佳实践**（v0.8.3+）：\n- ✅ **推荐**：使用 `--download-images` 下载图片到本地\n  - 避免远程 URL 签名过期（如头条图片）\n  - 避免防盗链问题\n  - 提高发布成功率\n- news-to-markdown 自动提取封面图（og:image > twitter:image > 第一张图片）\n- 图片保存到 `./images/` 目录，Markdown 使用相对路径\n- wechat-md-publisher 自动上传本地图片到微信素材库\n- 完全自动化，无需手动处理\n\n---\n\n## 🎯 何时使用此 Skill\n\n当用户需要以下操作时，应触发此 Skill：\n\n- ✅ 发布文章到微信公众号\n- ✅ 创建微信公众号草稿\n- ✅ 管理微信公众号账号\n- ✅ 查看已发布的文章列表\n- ✅ 删除草稿或已发布文章\n- ✅ 使用不同主题渲染 Markdown\n- ✅ 在文章开头/结尾添加固定图文（Wrapper 功能）\n- ✅ 查看或回滚 Wrapper 历史版本\n\n**触发关键词**：\n- \"发布到微信公众号\"\n- \"创建微信草稿\"\n- \"配置微信公众号\"\n- \"查看微信文章\"\n- \"使用 [主题名] 主题发布\"\n- \"文章开头结尾固定内容\"\n- \"Wrapper\"\n\n## 📋 前置要求\n\n### 1. 系统要求\n- Node.js >= 18.0.0\n- npm 或 pnpm 包管理器\n- 网络连接（访问微信 API）\n\n### 2. 微信公众号配置\n用户必须拥有微信公众号并获取：\n- **AppID**：开发者 ID\n- **AppSecret**：开发者密码\n- **IP 白名单**：必须配置（重要！）\n\n获取方式：\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. **配置 IP 白名单**（必须！）：\n   - 获取当前 IP：`curl ifconfig.me`\n   - 在「IP白名单」中添加该 IP\n   - 详细指南：[IP 白名单配置指南](./references/ip-whitelist-guide.md)\n\n### 3. 安装方式\n\n本 Skill 要求在首次使用前**显式全局安装**底层 npm 包，以便用户审计源码并避免运行时从 registry 拉代码：\n\n```bash\n# 一次性安装（请先阅读上文 \"安全风险与审计要点\" 完成审计；必须使用精确版本）\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证可用且版本精确等于 1.0.7\nwechat-pub --version\n\n# 查看帮助\nwechat-pub --help\n```\n\n> ⚠️ 不要在含有未审计 `node_modules` 的工作目录下运行 Skill。启动器只在受信路径解析包；CWD 下的 `node_modules` 已被显式排除。\n\n安装完成后，Skill 启动器（`scripts/run.js`）会通过 in-process 动态 `import` 调用本机已安装的 `wechat-md-publisher`，不再触发任何 `npx` 网络请求或子进程。\n\n## 🚀 标准操作流程 (SOP)\n\n### ⚠️ AI 自动化必须遵守：草稿优先 + 人工确认\n\n`publish create` 与 `publish submit` 会让文章对公众号粉丝**立即可见**。错误的标题、抓取错误的正文、未压缩的图片，或被远程主题污染的渲染，一旦发布即对外暴露，可能造成公众号违规、品牌或合规风险。\n\n因此当此 Skill 在 AI / 自动化流程中被调用时，**默认行为**必须是：\n\n1. 调用 `draft create`（不是 `publish create`），把内容创建为草稿。\n2. 向用户回报：标题、所用主题、首图/封面来源、图片是否已上传到微信素材库。\n3. 等待用户在微信公众平台后台或预览中**明确确认**后，再调用 `publish create` 或 `publish submit`。\n4. 任何 `delete`、`wrapper set`、`account add` 等会改变线上或本地状态的操作，同样要求用户明确确认。\n\n直接 `publish create` 仅在用户**显式要求\"立即发布\"**且 AI 已经完整复述（标题/主题/正文要点/图片）并获得\"确认发布\"回复后才允许执行。\n\n---\n\n### 操作 1：配置微信公众号账号\n\n**场景**：首次使用或添加新账号\n\n**步骤**：\n\n1. 收集用户提供的账号信息（AppID 和 AppSecret）\n2. 执行命令添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"账号名称\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n3. 验证账号添加成功：\n\n```bash\nwechat-pub account list\n```\n\n**输出示例**：\n```\n┌────────────┬──────────────┬────────────────┬─────────┐\n│ ID         │ 名称         │ AppID          │ 默认    │\n├────────────┼──────────────┼────────────────┼─────────┤\n│ acc_xxx    │ 我的公众号   │ wx123456       │ ✓       │\n└────────────┴──────────────┴────────────────┴─────────┘\n```\n\n**异常处理**：\n- 如果 AppID/AppSecret 错误，会提示\"认证失败\"\n- 如果网络问题，会提示\"无法连接到微信服务器\"\n- 解决方案：检查凭证是否正确，确认 IP 在白名单中\n\n---\n\n### 操作 2：创建并发布文章（一步到位）\n\n**场景**：用户提供 Markdown 内容，并**已明确要求立即发布**到公众号（如果未明确要求，请走\"操作 3：创建草稿\"）\n\n**步骤**：\n\n1. 将用户的 Markdown 内容保存到临时文件：\n\n```bash\ncat > /tmp/article.md << 'EOF'\n---\ntitle: 文章标题\nauthor: 作者名\n---\n\n# 文章内容\n\n这里是正文...\nEOF\n```\n\n2. 执行发布命令：\n\n```bash\nwechat-pub publish create \\\n  --file /tmp/article.md \\\n  --theme orangesun\n```\n\n3. 解析输出，提取 `publish_id`\n\n**输出示例**：\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n4. 向用户报告成功，并提供发布 ID\n\n**可用主题**：\n- `default` - 默认主题（简洁清爽）\n- `orangesun` - Orange Sun（温暖明亮）\n- `redruby` - Red Ruby（优雅醒目）\n- `greenmint` - Green Mint（清新舒适）\n- `purplerain` - Purple Rain（梦幻柔和）\n- `blackink` - Black Ink（深色模式）\n\n**异常处理**：\n- 图片上传失败：检查图片路径和网络\n- Token 过期：自动刷新，无需手动处理\n- 内容违规：微信会返回错误码，提示用户修改内容\n\n---\n\n### 操作 3：创建草稿（不立即发布）\n\n**场景**：用户想先创建草稿，稍后再发布\n\n**步骤**：\n\n1. 保存 Markdown 内容到文件\n2. 执行草稿创建命令：\n\n```bash\nwechat-pub draft create \\\n  --file /tmp/article.md \\\n  --theme default\n```\n\n3. 记录返回的 `media_id`\n\n**输出示例**：\n```\n✓ 草稿创建成功\n\nMedia ID: 3_abcdefghijk123456\n```\n\n4. 告知用户草稿已创建，可以在微信公众平台查看\n\n**后续操作**：\n- 用户可以在微信公众平台编辑草稿\n- 需要发布时，使用 `wechat-pub publish submit <media-id>`\n\n---\n\n### 操作 4：查看草稿列表\n\n**场景**：用户想查看所有草稿\n\n**命令**：\n\n```bash\nwechat-pub draft list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 15 个草稿\n\n┌──────────────────┬────────────────┬────────────────┐\n│ Media ID         │ 标题           │ 更新时间       │\n├──────────────────┼────────────────┼────────────────┤\n│ 3_abc123         │ 测试文章       │ 2026-03-19     │\n│ 3_def456         │ 产品介绍       │ 2026-03-18     │\n└──────────────────┴────────────────┴────────────────┘\n```\n\n---\n\n### 操作 5：查看已发布文章\n\n**场景**：用户想查看已发布的文章\n\n**命令**：\n\n```bash\nwechat-pub publish list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 8 篇已发布文章\n\n┌──────────────┬────────────────┬────────────────┬──────────────────┐\n│ Article ID   │ 标题           │ 发布时间       │ URL              │\n├──────────────┼────────────────┼────────────────┼──────────────────┤\n│ 2247483647_1 │ 最新文章       │ 2026-03-19     │ https://mp.we... │\n└──────────────┴────────────────┴────────────────┴──────────────────┘\n```\n\n---\n\n### 操作 6：删除草稿或文章\n\n**删除草稿**：\n\n```bash\nwechat-pub draft delete <media-id>\n```\n\n**删除已发布文章**：\n\n```bash\nwechat-pub publish delete <article-id>\n```\n\n---\n\n### 操作 7：查看可用主题\n\n**命令**：\n\n```bash\nwechat-pub theme list\n```\n\n**输出示例**：\n```\n可用主题：\n\n┌─────────────┬──────────────┬────────────────────┐\n│ ID          │ 名称         │ 描述               │\n├─────────────┼──────────────┼────────────────────┤\n│ default     │ 默认主题     │ 简洁清爽风格       │\n│ orangesun   │ Orange Sun   │ 温暖明亮风格       │\n│ redruby     │ Red Ruby     │ 优雅醒目风格       │\n│ greenmint   │ Green Mint   │ 清新舒适风格       │\n│ purplerain  │ Purple Rain  │ 梦幻柔和风格       │\n│ blackink    │ Black Ink    │ 深色模式风格       │\n└─────────────┴──────────────┴────────────────────┘\n```\n\n\n---\n\n## 🔧 高级用法\n\n### Wrapper 功能：文章开头/结尾固定图文\n\n在发布文章时自动在开头和结尾添加固定的图文内容（如关注引导、底部二维码等）。\n\n**开启功能**：\n```bash\nwechat-pub wrapper on\n```\n\n**设置内容**：\n```bash\nwechat-pub wrapper set \\\n  --header \"<div>欢迎关注我们的公众号</div>\" \\\n  --footer \"<div>觉得有帮助请点赞+收藏</div>\"\n```\n\n**查看状态**：\n```bash\nwechat-pub wrapper status\n```\n\n**查看历史版本**：\n```bash\nwechat-pub wrapper history\n```\n\n**回滚到指定版本**：\n```bash\nwechat-pub wrapper rollback 1\n```\n\n**关闭功能**：\n```bash\nwechat-pub wrapper off\n```\n\n**注意事项**：\n- 功能默认关闭，需要手动开启\n- 每次 `set` 会创建新版本，支持历史回滚\n- 图片处理：目前直接存储原始 HTML，需要公网可访问的图片 URL\n- 数据库文件：`data/wmp.db`\n\n---\n\n### 使用编程 API\n\n如果需要在代码中集成：\n\n```javascript\nconst { container } = require('wechat-md-publisher');\n\nasync function publishArticle(markdown, theme) {\n  await container.initialize();\n  \n  const publishService = await container.getPublishService();\n  const result = await publishService.createAndPublish({\n    markdown: markdown,\n    theme: theme || 'default',\n  });\n  \n  return result.publish_id;\n}\n```\n\n### 批量发布\n\n```bash\n# 批量创建草稿\nfor file in articles/*.md; do\n    wechat-pub draft create --file \"$file\" --theme default\ndone\n```\n\n---\n\n## 📊 输入输出规范\n\n### 输入格式\n\n**Markdown 文件格式**：\n\n```markdown\n---\ntitle: 文章标题（必需）\nauthor: 作者名（可选）\ncover: ./cover.jpg（可选，封面图路径）\n---\n\n# 正文标题\n\n正文内容...\n\n![图片描述](./image.jpg)\n```\n\n**支持的图片格式**：\n- 本地图片：相对路径或绝对路径\n- 网络图片：HTTP/HTTPS URL\n- 微信图片：微信 CDN URL（自动识别）\n\n### 输出格式\n\n**成功响应**：\n```json\n{\n  \"success\": true,\n  \"publish_id\": \"2247483647_1\",\n  \"message\": \"发布成功\"\n}\n```\n\n**错误响应**：\n```json\n{\n  \"success\": false,\n  \"error\": \"错误信息\",\n  \"code\": \"ERROR_CODE\"\n}\n```\n\n---\n\n## ⚠️ 常见问题和解决方案\n\n### 问题 1：Token 过期\n\n**症状**：提示\"access_token 无效\"\n\n**解决**：Token 会自动刷新，如果仍有问题，重新配置账号\n\n### 问题 2：图片上传失败\n\n**症状**：提示\"图片上传失败\"\n\n**原因**：\n- 图片路径错误\n- 图片大小超限（微信限制 10MB）\n- 服务器 IP 不在白名单\n\n**解决**：\n- 检查图片路径\n- 压缩图片\n- 在微信公众平台添加 IP 到白名单\n\n### 问题 3：找不到主题\n\n**症状**：提示\"主题不存在\"\n\n**解决**：使用 `wechat-pub theme list` 查看可用主题\n\n### 问题 4：权限不足\n\n**症状**：提示\"没有权限\"\n\n**原因**：AppID/AppSecret 错误或权限不足\n\n**解决**：\n- 确认凭证正确\n- 确认公众号类型支持该功能（服务号 vs 订阅号）\n\n---\n\n## 🔒 安全性说明\n\n### 敏感信息处理\n\n- AppID 和 AppSecret 存储在本地配置文件中\n- 配置文件位置：\n  - macOS: `~/Library/Preferences/wechat-md-publisher-nodejs/config.json`\n  - Linux: `~/.config/wechat-md-publisher-nodejs/config.json`\n  - Windows: `%APPDATA%\\wechat-md-publisher-nodejs\\Config\\config.json`\n\n### 权限要求\n\n- 读取本地文件（Markdown 和图片）\n- 网络访问（微信 API）\n- 写入配置文件\n\n### 数据隐私与运维要点\n\n- ✅ 默认不会上传任何数据到第三方服务器；所有通信仅限于微信官方 API（`api.weixin.qq.com` / `mp.weixin.qq.com`）。\n- ✅ 图片缓存仅在本地。\n- ✅ 建议把 `~/.config/wechat-md-publisher-nodejs/` 权限设为 `0700`，并排除在备份/容器镜像/同步盘之外。\n- ✅ 使用环境变量（`WECHAT_APP_ID` / `WECHAT_APP_SECRET`）而非 `--app-secret` 命令行参数，避免出现在 `ps`、shell history、CI 日志中。\n- ✅ 优先使用最小权限或测试公众号验证流程后再切到生产账号；如怀疑泄露，立即在公众平台重置 `AppSecret` 并删除本地缓存目录。\n- ⚠️ 例外：如果用户主动启用 `theme add-remote`，会把文章正文 / 标题 / 图片 URL 发送到该第三方端点，构成新的数据边界，请仅使用受信任的主题源；AI 自动化流程不应在未经用户授权的情况下启用远程主题。\n\n---\n\n## 📚 参考资料\n\n- [项目 GitHub](https://github.com/sipingme/wechat-md-publisher)\n- [微信公众平台文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)\n- [完整 API 文档](https://github.com/sipingme/wechat-md-publisher/blob/main/docs/API.md)\n\n---\n\n## 🎓 示例对话\n\n**用户**：帮我把这篇文章发布到微信公众号\n\n**AI**：好的，我来帮你发布。请提供文章的 Markdown 内容。\n\n**用户**：[提供内容]\n\n**AI**：收到！我将使用 orangesun 主题发布。正在处理...\n\n[执行命令]\n\n**AI**：✅ 文章已成功发布到微信公众号！\n- 发布 ID: 2247483647_1\n- 你可以在微信公众平台查看和管理这篇文章\n\n---\n\n## 📝 维护说明\n\n- **版本**: 1.0.8\n- **最后更新**: 2026-05-11\n- **更新内容（1.0.8 — 安全加固版）**:\n  - **供应链加固**：启动器 (`scripts/run.js`) 在 `import` 之前读取已解析包的 `package.json`，**校验 `name` 与 `version` 精确等于内置 pin（当前 `1.0.7`）**，否则拒绝加载。可阻止同名替身包 / 未审计的新版本静默接管 WeChat 凭证。\n  - **关闭 CWD 解析后门**：包解析路径**显式排除 `process.cwd()/node_modules`**，只在 Node 全局 `node_modules` 与 Skill 自身 `node_modules` 中解析；从含未审计依赖的目录启动 Skill 不再可能被恶意本地包劫持。\n  - **精确版本钉死**：所有安装命令与依赖元数据从 `^1.0.7` / 未版本化的 `npm install` 改为 `wechat-md-publisher@1.0.7`（含 `references/quick-start.md`、`ip-whitelist-guide.md`）。\n  - **草稿优先 SOP**：新增 \"AI 自动化必须遵守：草稿优先 + 人工确认\" 章节；`config.json` 标记 `permissions.publishing.autoPublishWithoutConfirmation: false`，明确 AI 默认走 `draft create` + 人工确认路径。\n  - **凭证最佳实践**：补充环境变量优先、`~/.config/wechat-md-publisher-nodejs/` 目录权限收紧、最小权限/测试公众号、泄露应急流程。\n  - **远程主题数据边界**：强化 `theme add-remote` 警告 — 内置/本地主题为默认，AI 不应在未授权情况下启用远程主题。\n- **更新内容（1.0.7）**:\n  - 明确内置主题为 6 个自定义主题（default, blackink, orangesun, redruby, greenmint, purplerain）\n  - 移除历史遗留的 wenyan-core 主题注册（lapis, maize 等），避免加载不存在的主题\n  - 更新 THEMES.md 文档与实际可用主题保持一致\n- **维护者**: Ping Si <sipingme@gmail.com>\n- **许可证**: Apache-2.0\n\n---\n\n## ✅ 首次成功检查清单\n\n新用户应该能在 5 分钟内完成：\n\n- [ ] 验证工具可用：`wechat-pub --version`\n- [ ] 配置账号：`wechat-pub account add ...`\n- [ ] 创建测试文章\n- [ ] 发布成功：`wechat-pub publish create --file test.md --theme default`\n- [ ] 在微信公众平台看到文章\n\n如果以上步骤都能顺利完成，说明 Skill 已正确配置！\n\n---\n\n## 🔗 与其他 Skills 配合使用\n\n### 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：`news-to-markdown-skill` + `wechat-md-publisher-skill` = 一键转载新闻到微信公众号\n\n#### 使用场景\n\n将网络上的新闻文章快速转载到微信公众号，实现内容聚合和分发。\n\n#### 完整工作流\n\n**场景 1：转载单篇新闻（推荐方式）**\n\n```bash\n# 步骤 1: 使用 news-to-markdown 提取新闻并下载图片\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article/article.md \\\n  --download-images \\\n  --output-dir /tmp/article \\\n  --verbose\n\n# 步骤 2: 使用 wechat-md-publisher 发布到微信\nwechat-pub publish create \\\n  --file /tmp/article/article.md \\\n  --theme orangesun\n```\n\n**为什么要下载图片到本地？**\n- 头条图片 URL 包含签名和过期时间，几小时后会失效\n- 本地图片更可靠，不受网络波动影响\n- 避免防盗链导致的图片加载失败\n\n**场景 2：批量转载新闻**\n\n```bash\n# 新闻 URL 列表\nurls=(\n  \"https://www.toutiao.com/article/123\"\n  \"https://mp.weixin.qq.com/s/abc\"\n  \"https://www.xiaohongshu.com/explore/xyz\"\n)\n\n# 批量处理\nfor i in \"${!urls[@]}\"; do\n  url=\"${urls[$i]}\"\n  output_dir=\"/tmp/article-$i\"\n  \n  # 提取新闻并下载图片\n  convert-url --url \"$url\" \\\n    --output \"$output_dir/article.md\" \\\n    --download-images \\\n    --output-dir \"$output_dir\"\n  \n  # 发布到微信（创建草稿）\n  wechat-pub draft create \\\n    --file \"$output_dir/article.md\" \\\n    --theme default\n  \n  echo \"✓ 已处理: $url\"\ndone\n```\n\n**场景 3：AI 自动化工作流**\n\n用户对 AI 说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 执行流程：\n1. 使用 `news-to-markdown-skill` 提取文章内容\n2. 自动检测平台（头条/微信/小红书）\n3. 使用 `wechat-md-publisher-skill` 发布到微信\n4. 返回发布结果和链接\n\n#### 优势\n\n✅ **智能内容提取**\n- 自动识别新闻正文，过滤广告和噪音\n- 保留文章结构和格式\n- 提取标题、作者、发布时间等元数据\n\n✅ **多平台支持**\n- 头条：优化标题层级、列表、代码块\n- 微信：提取 `#js_content` 区域\n- 小红书：处理 `.note-content` 内容\n\n✅ **三层抓取策略**\n- curl → wget → Playwright\n- 确保动态页面也能正确抓取\n\n✅ **精美主题渲染**\n- 6 个精选内置主题可选\n- 自动处理图片上传\n- 保持排版美观\n\n#### 最佳实践\n\n**1. 内容审核**\n```bash\n# 先创建草稿，人工审核后再发布\nconvert-url --url \"$news_url\" --output /tmp/article.md\nwechat-pub draft create --file /tmp/article.md --theme default\n\n# 审核通过后发布\nwechat-pub publish submit <media-id>\n```\n\n**2. 添加来源声明**\n```bash\n# 提取时保留元数据\nconvert-url --url \"$news_url\" --output /tmp/article.md\n\n# 元数据会自动包含在 Markdown 中：\n# ---\n# title: 文章标题\n# author: 原作者\n# 来源: https://...\n# ---\n```\n\n**3. 选择合适主题**\n- 科技类文章：`default`、`blackink`（深色模式）\n- 生活类文章：`orangesun`（橙色阳光）、`greenmint`（薄荷绿）\n- 教程类文章：`default`、`greenmint`\n- 文艺情感：`purplerain`（紫色雨）、`orangesun`\n- 品牌时尚：`redruby`（宝石红）\n- 夜间阅读：`blackink`\n\n#### 示例对话\n\n**用户**：把这篇头条文章转到我的微信公众号\nhttps://www.toutiao.com/article/7000000000000000000/\n\n**AI**：好的，我来帮你处理：\n\n1. 正在提取文章内容...\n   ```\n   [INFO] 开始抓取: https://www.toutiao.com/article/...\n   [INFO] 检测到平台: toutiao\n   [INFO] 提取成功\n   ```\n\n2. 正在发布到微信公众号...\n   ```\n   ✓ 渲染完成\n   ✓ 图片处理完成\n   ✓ 创建草稿成功\n   ✓ 发布成功\n   ```\n\n✅ **完成！**\n- 文章标题：《xxx》\n- 发布 ID: 2247483647_1\n- 使用主题: orangesun\n- 你可以在微信公众平台查看\n\n#### 相关资源\n\n- **news-to-markdown-skill**: https://github.com/sipingme/news-to-markdown-skill\n- **news-to-markdown 核心库**: https://github.com/sipingme/news-to-markdown\n- **npm 包**: `npm install -g news-to-markdown`\n\n#### 技术栈\n\n```\n新闻网站\n    ↓\nnews-to-markdown (提取 + 转换)\n    ↓\nMarkdown 文件\n    ↓\nwechat-md-publisher (渲染 + 发布)\n    ↓\n微信公众号\n```\n\n---\n\n## 💡 更多组合可能\n\n### 与内容管理工具配合\n- 配合 Git 进行版本管理\n- 配合 CI/CD 实现自动发布\n- 配合数据库存储发布记录\n\n### 与 AI 工具配合\n- AI 生成内容 → wechat-md-publisher 发布\n- AI 润色文章 → wechat-md-publisher 发布\n- AI 翻译文章 → wechat-md-publisher 发布\n\nFile v1.0.11:README.md\n\n# WeChat MD Publisher - OpenClaw Skill\n\n> 全功能微信公众号 Markdown 发布工具 - OpenClaw Skill 版本\n\n## 🛠️ 前置安装：底层 npm 包\n\n本 Skill 的启动器 (`scripts/run.js`) 通过 in-process 动态 `import` 调用本机已安装的 `wechat-md-publisher`，**不会**通过 `npx` 在运行时从 registry 拉取代码。\n因此**必须**在首次使用前显式全局安装底层包，并在安装前完成源码审计。\n\n> ⚠️ **必须使用精确版本（无 caret、无 `@latest`）**。启动器会在 `import` 之前读取已解析包的 `package.json`，校验 `name` 与 `version` 是否与内置 pin（当前 `1.0.7`）精确匹配，任何不匹配都会被拒绝。这是为了防止本地或全局 `node_modules` 中出现的同名替身包被加载。\n\n```bash\n# 一次性安装（请先审计源码，详见下方链接）\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证可用并精确等于 1.0.7\nwechat-pub --version\n```\n\n请审计：\n- CLI 入口：https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n- 凭证加密：https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\n\n> 不要在含有未审计 `node_modules` 的工作目录下运行 Skill。启动器只在受信路径（Node 全局 `node_modules` 与 Skill 自身 `node_modules`）解析包；**当前工作目录（CWD）下的 `node_modules` 已被显式排除**。\n\n## 🚀 快速安装（Skill 本身）\n\n### 方法 1：从 ClawHub 安装（推荐）\n\n```bash\nopenclaw skills install wechat-md-publisher\n```\n\n### 方法 2：从 GitHub 安装\n\n```bash\nopenclaw skills install https://github.com/sipingme/wechat-md-publisher-skill\n```\n\n### 方法 3：手动安装\n\n1. 克隆仓库：\n```bash\ngit clone https://github.com/sipingme/wechat-md-publisher-skill.git\ncd wechat-md-publisher-skill\n```\n\n2. 复制到 OpenClaw skills 目录：\n```bash\ncp -r . ~/.openclaw/skills/wechat-md-publisher/\n```\n\n3. 验证工具可用：\n```bash\nwechat-pub --version\n```\n\n## ✅ 验证安装\n\n```bash\n# 检查 Skill 是否可用\nopenclaw skills list --eligible\n\n# 查看 Skill 详情\nopenclaw skills info wechat-md-publisher\n\n# 测试命令\nwechat-pub --version\n```\n\n## 📋 首次配置\n\n### 1. 获取微信公众号凭证\n\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. 将服务器 IP 添加到「IP白名单」\n\n### 2. 配置账号\n\n```bash\n# 推荐：使用环境变量（避免命令行暴露凭证）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n### 3. 测试发布\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 测试文章\n---\n# Hello World\n这是一篇测试文章。\nEOF\n\n# 发布\nwechat-pub publish create --file test.md --theme default\n```\n\n## 🎯 使用方式\n\n### 在 OpenClaw 对话中使用\n\n**示例 1：发布文章**\n\n```\n用户: 帮我把这篇文章发布到微信公众号\n\n[提供 Markdown 内容]\n\nAI: 好的，我来帮你发布。正在使用 orangeheart 主题...\n✓ 文章已成功发布！发布 ID: 2247483647_1\n```\n\n**示例 2：创建草稿**\n\n```\n用户: 先创建一个草稿，不要立即发布\n\nAI: 明白，我会先创建草稿。\n✓ 草稿创建成功，Media ID: 3_abc123\n你可以在微信公众平台查看和编辑。\n```\n\n**示例 3：查看文章列表**\n\n```\n用户: 查看我已发布的微信文章\n\nAI: 正在获取列表...\n共 8 篇已发布文章：\n1. 最新文章 (2026-03-19)\n2. 产品介绍 (2026-03-18)\n...\n```\n\n### 手动调用 Skill\n\n```bash\n# 使用 OpenClaw 命令\nopenclaw run wechat-md-publisher publish article.md orangeheart\n\n# 或直接使用工具\nwechat-pub publish create --file article.md --theme orangeheart\n```\n\n## � 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：一键转载新闻到微信公众号\n\n### 快速示例\n\n```bash\n# 1. 提取新闻文章\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --platform toutiao\n\n# 2. 发布到微信公众号\nwechat-pub publish create \\\n  --file /tmp/article.md \\\n  --theme orangeheart\n```\n\n### AI 自动化工作流\n\n用户说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 自动执行（**默认走\"草稿优先 + 人工确认\"路径**）：\n1. 使用 `news-to-markdown-skill` 提取文章\n2. 使用 `wechat-md-publisher-skill` **创建草稿**（`draft create`），并向用户回报标题、主题、图片处理结果\n3. 等待用户明确确认后，再使用 `publish create` / `publish submit` 正式发布\n4. 返回发布结果\n\n> ⚠️ **不要在没有用户明确确认的情况下直接发布**。错误的文章、主题或抓取结果一旦 `publish create` 即对粉丝可见，可能产生公众号违规、品牌或合规风险。AI 应默认创建草稿，由用户在微信公众平台后台或预览中复核后再决定是否发布或删除。\n\n### 优势\n\n✅ **智能提取** - 自动识别正文，过滤广告  \n✅ **多平台支持** - 头条、微信、小红书  \n✅ **精美渲染** - 8+ 主题可选  \n✅ **一键发布** - 无需手动复制粘贴\n\n详见 [SKILL.md](./SKILL.md) 中的完整集成指南。\n\n---\n\n## �📚 文档\n\n- **[SKILL.md](./SKILL.md)** - 完整的 SOP 和使用指南（含 news-to-markdown 集成）\n- **[quick-start.md](./references/quick-start.md)** - 5 分钟快速上手\n- **[themes.md](./references/themes.md)** - 主题使用指南\n- **[ip-whitelist-guide.md](./references/ip-whitelist-guide.md)** - IP 白名单配置指南 ⚠️ 重要\n\n## 🎨 可用主题\n\n- `default` - 简洁经典\n- `orangeheart` - 温暖优雅 ⭐ 推荐\n- `rainbow` - 活泼清爽\n- `lapis` - 清新极简 ⭐ 推荐\n- `pie` - 现代锐利\n- `maize` - 柔和舒适\n- `purple` - 简约文艺\n- `phycat` - 薄荷清新\n- `sport` - 运动风 🏃 活力动感\n\n## 🔧 高级配置\n\n### 环境变量（可选）\n\n```bash\n# 在 ~/.bashrc 或 ~/.zshrc 中添加\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n```\n\n### 自定义主题\n\n```bash\n# 添加本地主题（推荐）\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n\n# 添加远程主题 API（⚠️ 见下方安全警告）\nwechat-pub theme add-remote --name md2wechat --url https://api.md2wechat.cn --key xxx\n```\n\n> ⚠️ **远程主题安全警告**：\n> - 使用 `theme add-remote` 会把文章正文 / 标题 / 图片 URL 等内容发送到第三方端点，构成一个**新的数据边界**，超出本 Skill 默认（仅微信官方 API）的网络权限范围。\n> - 默认请使用内置主题（`default` / `orangesun` / `redruby` / `greenmint` / `purplerain` / `blackink`）或本地 CSS 主题（`theme add-local`），无需任何外发请求。\n> - 仅在你完全信任并已审计目标主题服务的隐私与安全策略时再使用 `theme add-remote`；不要把生产公众号的文章正文发送给来源不明的渲染服务。\n> - AI 自动化场景下，不应自动启用远程主题；必须由用户明确配置并承担风险。\n\n## ⚠️ 常见问题\n\n### 问题 1：Skill 未被识别\n\n**解决**：\n```bash\nopenclaw skills refresh\nopenclaw skills info wechat-md-publisher\n```\n\n### 问题 2：权限错误\n\n**解决**：\n```bash\nchmod +x ~/.openclaw/skills/wechat-md-publisher/scripts/publish.js\n```\n\n### 问题 3：找不到命令\n\n**解决**：确认底层 npm 包已用**精确版本**全局安装：\n```bash\nnpm install -g wechat-md-publisher@1.0.7\nwechat-pub --version\n```\n\n### 问题 4：Token 过期\n\nToken 会自动刷新，如仍有问题：\n```bash\nwechat-pub account remove <account-id>\nwechat-pub account add --name \"新账号\" --default\n```\n\n### 问题 5：升级到新版本\n\n本 Skill 不会自动升级底层包。**升级流程必须显式**：\n\n1. 重新审计上游变更（CLI 入口与 `account.ts` 凭证加密）。\n2. 在 `config.json` 与 `scripts/run.js` 中将 `REQUIRED_VERSION` 显式改为新的精确版本号（不要使用 caret/range/`@latest`）。\n3. 在受信主机上执行精确安装并验证：\n\n```bash\n# 将 <NEW_VERSION> 替换为新审计通过的版本号\nnpm install -g wechat-md-publisher@<NEW_VERSION>\nwechat-pub --version\n```\n\n> 启动器会在 `import` 前比对 `manifest.version` 与 `REQUIRED_VERSION`；如果两者不一致，调用会被拒绝。这是有意为之，避免静默吞下未经审计的新版本。\n\n## 🔒 安全性\n\n### 权限要求\n\n- ✅ 读取本地 Markdown 和图片文件\n- ✅ 网络访问（微信官方 API）\n- ✅ 写入配置文件到 `~/.config/wechat-md-publisher-nodejs/`\n- ⚠️ 可选：远程主题 API（仅当用户使用 `theme add-remote` 时）\n\n### 数据隐私与最佳实践\n\n- ✅ 默认情况下，所有通信仅限于微信官方 API（`api.weixin.qq.com` / `mp.weixin.qq.com`）。\n- ✅ 配置与凭证存储在本地 `~/.config/wechat-md-publisher-nodejs/`；凭证加密由 [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher) npm 包处理（请审计 `src/services/account.ts` 后再写入真实 `AppSecret`）。\n- ✅ **推荐使用环境变量** 传递 `WECHAT_APP_ID` / `WECHAT_APP_SECRET`，避免凭证出现在 `ps` 进程列表、shell history、CI 日志中。\n- ✅ **推荐使用最小权限或测试公众号**，先验证流程后再切换到生产账号。\n- ✅ **AI 自动发布默认走草稿路径**：让 AI 调用 `draft create`，由人工在公众平台预览/确认后再决定 `publish create` 或 `publish submit`。\n- ❌ 本 Skill 不会自动收集用户信息或回传任何文章内容。\n- ⚠️ **例外**：如果用户主动配置了远程主题（`theme add-remote`），会把文章正文发送到该第三方端点。请见上文\"远程主题安全警告\"。\n\n### 安全检查\n\n```bash\n# 使用 skill-vetter 检查（如果可用）\nopenclaw skills vet wechat-md-publisher\n```\n\n## 📊 Skill 评分\n\n根据 OpenClaw 社区标准：\n\n- ✅ **规范清晰度**: 5/5 - SKILL.md 结构完整\n- ✅ **首次成功时间**: 5/5 - 5 分钟内可完成\n- ✅ **实用性**: 5/5 - 解决实际发布需求\n- ✅ **安全性**: 5/5 - 权限合理，无恶意代码\n\n## 🤝 贡献\n\n欢迎贡献！\n\n- 报告问题：[GitHub Issues](https://github.com/sipingme/wechat-md-publisher/issues)\n- 提交改进：[Pull Requests](https://github.com/sipingme/wechat-md-publisher/pulls)\n- 讨论交流：[GitHub Discussions](https://github.com/sipingme/wechat-md-publisher/discussions)\n\n## 📜 许可证\n\nApache-2.0 License\n\n## 👤 作者\n\n**Ping Si** <sipingme@gmail.com>\n\n- GitHub: [@sipingme](https://github.com/sipingme)\n- 项目主页: [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher)\n\n## 🙏 致谢\n\n- [@wenyan-md/core](https://github.com/caol64/wenyan-core) - 提供精美主题和渲染引擎\n- OpenClaw 社区 - 提供优秀的 AI Agent 框架\n\n---\n\n**让 AI 能够直接发布内容到微信公众号！** 🚀\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn70nwj71rbkzwyvc7pkqs4p6s8222nc\",\n  \"slug\": \"wechat-md-publisher-skill\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1778464149586\n}\n\nFile v1.0.11:references/ip-whitelist-guide.md\n\n# 微信公众号 IP 白名单配置指南\n\n## 什么是 IP 白名单？\n\n微信公众号为了安全，要求所有调用 API 的服务器 IP 必须在白名单中。如果 IP 不在白名单，API 调用会失败。\n\n## 为什么需要配置？\n\n当你使用 `wechat-md-publisher` 发布文章时，工具会从你的电脑/服务器向微信 API 发送请求。微信会检查请求来源的 IP 地址，只有在白名单中的 IP 才能成功调用。\n\n## 如何获取你的 IP 地址？\n\n### 方法 1：使用命令行（推荐）\n\n```bash\n# macOS/Linux\ncurl ifconfig.me\n\n# 或\ncurl icanhazip.com\n\n# 或\ncurl ipinfo.io/ip\n```\n\n### 方法 2：访问网站\n\n访问以下任一网站查看你的公网 IP：\n- https://www.ip.cn/\n- https://ipinfo.io/\n- https://ifconfig.me/\n\n### 方法 3：在微信公众平台查看\n\n登录微信公众平台后，在 IP 白名单设置页面，微信会显示你当前的 IP 地址。\n\n## 如何配置 IP 白名单？\n\n### 步骤 1：登录微信公众平台\n\n访问 https://mp.weixin.qq.com/ 并登录\n\n### 步骤 2：进入 IP 白名单设置\n\n1. 点击左侧菜单「设置与开发」\n2. 点击「基本配置」\n3. 找到「IP白名单」部分\n4. 点击「修改」或「查看」\n\n### 步骤 3：添加 IP 地址\n\n1. 点击「添加」按钮\n2. 输入你的公网 IP 地址\n3. 点击「确定」\n\n**示例**：\n```\n123.456.789.012\n```\n\n### 步骤 4：验证配置\n\n添加后，等待 1-2 分钟生效，然后测试：\n\n```bash\nwechat-pub account list\n```\n\n如果能正常显示账号列表，说明配置成功。\n\n## 常见场景\n\n### 场景 1：在家里使用\n\n**问题**：家庭宽带的 IP 地址可能会变化\n\n**解决方案**：\n1. **短期方案**：每次 IP 变化后重新添加\n2. **长期方案**：\n   - 联系运营商申请固定 IP（可能需要付费）\n   - 使用云服务器部署（推荐）\n\n### 场景 2：在公司使用\n\n**问题**：公司可能使用固定 IP 或代理\n\n**解决方案**：\n1. 询问 IT 部门获取公司的公网出口 IP\n2. 将公司 IP 添加到白名单\n3. 如果公司使用代理，需要添加代理服务器的 IP\n\n### 场景 3：在云服务器使用\n\n**推荐方案**：\n1. 购买云服务器（阿里云、腾讯云、AWS 等）\n2. 云服务器通常有固定的公网 IP\n3. 将云服务器 IP 添加到白名单\n4. 在云服务器上安装和使用 `wechat-md-publisher`\n\n**优点**：\n- ✅ IP 固定，不会变化\n- ✅ 24/7 在线\n- ✅ 可以设置定时任务自动发布\n- ✅ 网络稳定\n\n### 场景 4：使用 VPN 或代理\n\n**问题**：VPN 会改变你的出口 IP\n\n**解决方案**：\n1. 关闭 VPN 后获取真实 IP\n2. 将真实 IP 添加到白名单\n3. 使用工具时关闭 VPN\n\n或者：\n1. 获取 VPN 的出口 IP\n2. 将 VPN IP 添加到白名单\n3. 使用工具时保持 VPN 连接\n\n## 多 IP 配置\n\n微信公众号支持添加多个 IP 地址（通常最多 10-20 个）。\n\n**适用场景**：\n- 在多个地点使用（家里、公司、咖啡厅）\n- 团队协作（多人使用）\n- 备用 IP（防止主 IP 失效）\n\n**配置方法**：\n在 IP 白名单页面，点击「添加」，逐个添加所有需要的 IP。\n\n## 安全建议\n\n### ✅ 推荐做法\n\n1. **只添加必要的 IP**\n   - 不要添加不信任的 IP\n   - 定期检查和清理不再使用的 IP\n\n2. **使用固定 IP**\n   - 云服务器（推荐）\n   - 固定宽带 IP\n\n3. **定期更新**\n   - IP 变化后及时更新白名单\n   - 删除不再使用的 IP\n\n### ❌ 不推荐做法\n\n1. **不要使用公共 WiFi**\n   - 公共 WiFi 的 IP 可能被多人共享\n   - 存在安全风险\n\n2. **不要添加 0.0.0.0 或通配符**\n   - 微信不支持通配符\n   - 必须添加具体的 IP 地址\n\n3. **不要分享你的 AppSecret**\n   - 即使 IP 在白名单中，也要保护好 AppSecret\n   - 不要将 AppSecret 提交到 Git 仓库\n\n## 故障排查\n\n### 错误：IP 不在白名单\n\n**症状**：\n```\n错误码: 40164\n错误信息: invalid ip xxx.xxx.xxx.xxx, not in whitelist\n```\n\n**解决步骤**：\n\n1. **确认当前 IP**：\n   ```bash\n   curl ifconfig.me\n   ```\n\n2. **检查白名单**：\n   - 登录微信公众平台\n   - 查看 IP 白名单列表\n   - 确认当前 IP 是否在列表中\n\n3. **添加 IP**：\n   - 如果不在，添加当前 IP\n   - 等待 1-2 分钟生效\n\n4. **重试**：\n   ```bash\n   wechat-pub account list\n   ```\n\n### 错误：IP 频繁变化\n\n**症状**：今天能用，明天就不能用了\n\n**原因**：家庭宽带 IP 动态分配\n\n**解决方案**：\n\n**方案 1：使用云服务器（推荐）**\n```bash\n# 1. 购买云服务器（最低配置即可）\n# 2. 在云服务器上安装工具（必须使用精确版本；启动器会校验）\nssh user@your-server-ip\nnpm install -g wechat-md-publisher@1.0.7\n\n# 3. 推荐通过环境变量提供凭证（避免命令行暴露 AppSecret）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\nwechat-pub account add --name \"公众号\" --default\n\n# 4. 使用：建议先创建草稿，人工确认后再 publish\nwechat-pub draft create --file article.md --theme default\n```\n\n**方案 2：申请固定 IP**\n- 联系宽带运营商\n- 申请固定公网 IP（可能需要额外费用）\n\n**方案 3：使用 DDNS**\n- 配置动态 DNS\n- 使用脚本自动更新白名单（需要开发）\n\n## 自动化脚本\n\n### 检查 IP 是否变化\n\n```bash\n#!/bin/bash\n# check-ip.sh\n\nCURRENT_IP=$(curl -s ifconfig.me)\nSAVED_IP=$(cat ~/.wechat-pub-ip 2>/dev/null)\n\nif [ \"$CURRENT_IP\" != \"$SAVED_IP\" ]; then\n    echo \"⚠️  IP 已变化！\"\n    echo \"旧 IP: $SAVED_IP\"\n    echo \"新 IP: $CURRENT_IP\"\n    echo \"请更新微信公众平台的 IP 白名单\"\n    echo \"$CURRENT_IP\" > ~/.wechat-pub-ip\nelse\n    echo \"✓ IP 未变化: $CURRENT_IP\"\nfi\n```\n\n使用：\n```bash\nchmod +x check-ip.sh\n./check-ip.sh\n```\n\n## 推荐配置\n\n### 个人用户\n\n**推荐方案**：使用云服务器\n- 成本：约 10-30 元/月\n- 优点：IP 固定、稳定可靠\n- 推荐服务商：阿里云、腾讯云、华为云\n\n### 企业用户\n\n**推荐方案**：公司服务器 + 固定 IP\n- 在公司内网服务器部署\n- 配置公司出口 IP 到白名单\n- 设置定时任务自动发布\n\n### 团队协作\n\n**推荐方案**：共享云服务器\n- 团队共用一台云服务器\n- 所有成员通过 SSH 访问\n- 统一的 IP 地址\n\n## 总结\n\n1. ✅ **必须配置 IP 白名单**才能使用微信公众号 API\n2. ✅ 使用 `curl ifconfig.me` 获取当前 IP\n3. ✅ 在微信公众平台添加 IP 到白名单\n4. ✅ 推荐使用云服务器获得固定 IP\n5. ✅ 定期检查和更新 IP 白名单\n\n## 相关链接\n\n- [微信公众平台](https://mp.weixin.qq.com/)\n- [微信公众号开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html)\n- [IP 白名单说明](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)\n\n---\n\n如有问题，请查看 [SKILL.md](../SKILL.md) 或提交 [Issue](https://github.com/sipingme/wechat-md-publisher/issues)。\n\nFile v1.0.11:references/quick-start.md\n\n# WeChat Publisher - 快速开始指南\n\n## 5 分钟快速上手\n\n### 步骤 1：安装工具（1 分钟）\n\n> ⚠️ **必须使用精确版本**。Skill 启动器在加载前会校验 `package.json` 的 `name` 与 `version`，任何不匹配都会被拒绝。请勿使用 `@latest` 或浮动范围。\n\n```bash\n# 安装前请先审计上游源码（CLI 与凭证加密）：\n#   - https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n#   - https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证版本（必须精确等于 1.0.7）\nwechat-pub --version\n```\n\n### 步骤 2：配置账号（2 分钟）\n\n1. 获取微信公众号凭证：\n   - 登录 https://mp.weixin.qq.com/\n   - 进入「设置与开发」→「基本配置」\n   - 复制 AppID 和 AppSecret\n\n2. 添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 步骤 3：创建测试文章（1 分钟）\n\n```bash\ncat > test-article.md << 'EOF'\n---\ntitle: 测试文章\nauthor: 测试作者\n---\n\n# 欢迎使用 WeChat Publisher\n\n这是一篇测试文章。\n\n## 主要特性\n\n- 完整的草稿管理\n- 8 个精美主题\n- 智能图片处理\nEOF\n```\n\n### 步骤 4：发布文章（1 分钟）\n\n> 💡 **推荐先创建草稿，人工确认后再发布**。直接 `publish create` 会立即让文章对公众号粉丝可见，请在 AI / 自动化流程中默认走草稿路径。\n\n```bash\n# 推荐：先创建草稿（不会公开发布）\nwechat-pub draft create --file test-article.md --theme orangeheart\n\n# 仅在你已经审阅过渲染结果与图片后，再正式发布\nwechat-pub publish create --file test-article.md --theme orangeheart\n```\n\n### 验证成功\n\n如果看到以下输出，说明配置成功：\n\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n现在可以在微信公众平台查看你的文章了！\n\n## 常用命令速查\n\n```bash\n# 查看所有主题\nwechat-pub theme list\n\n# 创建草稿\nwechat-pub draft create --file article.md --theme lapis\n\n# 查看草稿列表\nwechat-pub draft list\n\n# 查看已发布文章\nwechat-pub publish list\n\n# 删除草稿\nwechat-pub draft delete <media-id>\n```\n\n## 下一步\n\n- 阅读完整文档：[SKILL.md](../SKILL.md)\n- 查看主题示例：[themes.md](./themes.md)\n- 了解 API 用法：https://github.com/sipingme/wechat-md-publisher\n\nFile v1.0.11:references/themes.md\n\n# WeChat Publisher - 主题使用指南\n\n## 6 个内置主题\n\n`wechat-md-publisher` 提供 6 个专为微信公众号优化的内置主题，开箱即用。\n\n### 1. default - 默认主题\n\n**风格**：简洁清爽，适合各类文章\n\n**适用场景**：\n- 企业公告、正式通知\n- 技术文档、学术文章\n- 通用内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme default\n```\n\n---\n\n### 2. blackink - Black Ink\n\n**风格**：深色模式，靛蓝点缀，适合夜间阅读\n\n**适用场景**：\n- 夜间阅读类内容\n- 科技、极客风格文章\n- 深色调品牌内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme blackink\n```\n\n---\n\n### 3. orangesun - Orange Sun\n\n**风格**：温暖明亮，橙色阳光系\n\n**适用场景**：\n- 生活类、旅行类文章\n- 轻松活泼的内容\n- 节日推送\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme orangesun\n```\n\n---\n\n### 4. redruby - Red Ruby\n\n**风格**：优雅大气，宝石红点缀\n\n**适用场景**：\n- 品牌介绍、时尚类文章\n- 重要公告、活动推广\n- 视觉冲击力强的内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme redruby\n```\n\n---\n\n### 5. greenmint - Green Mint\n\n**风格**：清新自然，薄荷绿色调\n\n**适用场景**：\n- 健康、环保类文章\n- 教程指南\n- 清新风格内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme greenmint\n```\n\n---\n\n### 6. purplerain - Purple Rain\n\n**风格**：梦幻浪漫，紫色渐变\n\n**适用场景**：\n- 文艺类、情感类文章\n- 个人博客\n- 创意内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme purplerain\n```\n\n---\n\n## 主题选择建议\n\n### 按内容类型选择\n\n| 内容类型 | 推荐主题 | 备选主题 |\n|---------|---------|---------|\n| 技术文章 | default | blackink |\n| 生活分享 | orangesun | greenmint |\n| 品牌时尚 | redruby | purplerain |\n| 教育内容 | greenmint | default |\n| 文艺情感 | purplerain | orangesun |\n| 正式公告 | default | redruby |\n| 夜间/深色 | blackink | - |\n\n### 按品牌调性选择\n\n- **专业简洁**：default\n- **温暖活力**：orangesun、greenmint\n- **优雅大气**：redruby、purplerain\n- **深色极简**：blackink\n\n---\n\n## 查看可用主题\n\n```bash\nwechat-pub theme list\n```\n\n输出示例：\n```\n┌─────────────┬──────────────┬──────────┬────────────────────────────┐\n│ ID          │ 名称         │ 类型     │ 描述                       │\n├─────────────┼──────────────┼──────────┼────────────────────────────┤\n│ default     │ 默认主题     │ builtin  │ 简洁清爽的默认样式         │\n│ blackink    │ Black Ink    │ builtin  │ 深色模式，靛蓝点缀         │\n│ orangesun   │ Orange Sun   │ builtin  │ 温暖明亮的橙色系主题       │\n│ redruby     │ Red Ruby     │ builtin  │ 优雅的宝石红风格           │\n│ greenmint   │ Green Mint   │ builtin  │ 清新薄荷绿，轻松舒适       │\n│ purplerain  │ Purple Rain  │ builtin  │ 梦幻紫色渐变               │\n└─────────────┴──────────────┴──────────┴────────────────────────────┘\n```\n\n---\n\n## 测试所有主题\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 主题测试\n---\n\n# 标题一\n\n这是正文内容。\n\n## 标题二\n\n- 列表项 1\n- 列表项 2\n\n**粗体文本** 和 *斜体文本*\nEOF\n\n# 测试所有主题（创建草稿对比）\nfor theme in default blackink orangesun redruby greenmint purplerain; do\n    echo \"测试主题: $theme\"\n    wechat-pub draft create --file test.md --theme $theme\ndone\n```\n\n然后在微信公众平台查看对比效果。\n\n---\n\n## 自定义主题\n\n如果内置主题不满足需求，可以创建自定义主题：\n\n### 1. 创建 CSS 文件\n\n```css\n/* my-theme.css */\n#wenyan {\n    font-size: 16px;\n    line-height: 1.8;\n    color: #2c3e50;\n}\n\n#wenyan h1 {\n    color: #ff6b6b;\n    border-bottom: 3px solid #ff6b6b;\n}\n```\n\n### 2. 添加主题\n\n```bash\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n```\n\n### 3. 使用主题\n\n```bash\nwechat-pub publish create --file article.md --theme my-theme\n```\n\n---\n\n## 常见问题\n\n### Q: 如何查看所有可用主题？\n\n```bash\nwechat-pub theme list\n```\n\n### Q: 主题可以修改吗？\n\n内置主题不可修改，但可以创建自定义主题，基于内置主题的 CSS 另存为新主题。\n\n### Q: 发布后可以更换主题吗？\n\n不可以。已发布的文章主题无法更改，需要删除原文章后用新主题重新发布。\n\nFile v1.0.11:skill-card.md\n\n## Description:\n\nPublishes Markdown articles to WeChat Official Accounts, with draft management, themes, image handling, and cover image support.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sipingme](https://clawhub.ai/user/sipingme)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users, developers, and content teams use this skill to create drafts, publish Markdown articles, manage WeChat Official Account content, and apply WeChat-oriented article themes from an agent workflow.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can access a WeChat public account and local article files, and misuse could affect published account content.\n\nMitigation: Use a test or least-privileged account first and install only after reviewing the security guidance.\n\nRisk: AppSecret handling can expose production credentials through shell history, process lists, logs, or local configuration.\n\nMitigation: Prefer environment variables, keep AppSecret out of command arguments and logs, protect the local configuration directory, and reset credentials if exposure is suspected.\n\nRisk: Automated publish flows can make incorrect or noncompliant content immediately visible to followers.\n\nMitigation: Prefer draft creation with manual review, and require explicit confirmation before publish create or publish submit.\n\nRisk: Remote themes may send article content to a third-party endpoint outside the default WeChat API data boundary.\n\nMitigation: Use built-in or local themes by default, and enable remote themes only for trusted and reviewed endpoints.\n\nRisk: The skill depends on the underlying wechat-md-publisher npm package for publishing and credential handling.\n\nMitigation: Audit wechat-md-publisher@1.0.7 before production use and keep the exact version pin unless a newer version is separately reviewed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/sipingme/skills/wechat-md-publisher-skill)\n- [WeChat Publisher project](https://github.com/sipingme/wechat-md-publisher)\n- [WeChat Publisher CLI entry audit file](https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts)\n- [WeChat Publisher credential handling audit file](https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts)\n- [WeChat Publisher API documentation](https://github.com/sipingme/wechat-md-publisher/blob/main/docs/API.md)\n- [WeChat Official Account documentation](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)\n- [Quick start guide](artifact/references/quick-start.md)\n- [IP whitelist guide](artifact/references/ip-whitelist-guide.md)\n- [Theme guide](artifact/references/themes.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and operational status text from the WeChat publishing CLI]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [The skill may create or publish WeChat drafts/articles and may write local account configuration through the underlying CLI.]\n\n## Skill Version(s):\n\n1.0.11 (source: server release evidence and target metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.11:config.json\n\n{\n  \"name\": \"wechat-md-publisher\",\n  \"version\": \"1.0.8\",\n  \"requiredEnvVars\": [],\n  \"optionalEnvVars\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n  \"requires\": {\n    \"runtime\": {\n      \"node\": \">=18.0.0\"\n    },\n    \"binaries\": [\n      {\n        \"name\": \"wechat-pub\",\n        \"providedBy\": \"wechat-md-publisher\",\n        \"install\": \"npm install -g wechat-md-publisher@1.0.7\",\n        \"verify\": \"node -e \\\"const m=require('wechat-md-publisher/package.json'); if(m.name!=='wechat-md-publisher'||m.version!=='1.0.7'){process.exit(1)}\\\"\"\n      }\n    ],\n    \"packages\": {\n      \"global\": [\n        \"wechat-md-publisher@1.0.7\"\n      ]\n    }\n  },\n  \"skill\": {\n    \"name\": \"wechat-md-publisher\",\n    \"version\": \"1.0.8\",\n    \"enabled\": true,\n    \"autoInvoke\": false\n  },\n  \"commands\": {\n    \"publish\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"publish\"],\n      \"description\": \"发布文章到微信公众号\"\n    },\n    \"draft\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"draft\"],\n      \"description\": \"创建微信公众号草稿\"\n    },\n    \"wrapper\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"wrapper\"],\n      \"description\": \"Wrapper 功能管理（文章开头/结尾固定图文）\"\n    },\n    \"list-drafts\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-drafts\"],\n      \"description\": \"列出所有草稿\"\n    },\n    \"list-published\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-published\"],\n      \"description\": \"列出已发布文章\"\n    },\n    \"themes\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"themes\"],\n      \"description\": \"列出可用主题\"\n    },\n    \"help\": {\n      \"script\": \"./scripts/postinstall.js\",\n      \"args\": [],\n      \"description\": \"显示使用帮助\"\n    }\n  },\n  \"environment\": {\n    \"required\": [\n      \"NODE_VERSION>=18.0.0\"\n    ],\n    \"optional\": [\n      \"WECHAT_APP_ID\",\n      \"WECHAT_APP_SECRET\"\n    ],\n    \"note\": \"凭证可通过环境变量或 CLI 命令 (account add --app-id xxx --app-secret xxx) 提供\"\n  },\n  \"install\": {\n    \"type\": \"npm-global\",\n    \"package\": \"wechat-md-publisher\",\n    \"version\": \"1.0.7\",\n    \"versionPinning\": \"exact\",\n    \"execution\": \"npm install -g wechat-md-publisher@1.0.7\",\n    \"global\": true,\n    \"autoInstall\": false,\n    \"autoUpdate\": false,\n    \"riskLevel\": \"low\",\n    \"riskReason\": \"Skill 不再通过 npx 动态拉取或执行子进程；启动器以 in-process 动态 import 调用本机已安装的 wechat-md-publisher，并在 import 之前校验 manifest.name 与 manifest.version 是否与精确 pin 匹配；不再产生供应链运行时下载或 shell 调用。\",\n    \"requiresApproval\": true,\n    \"source\": {\n      \"type\": \"npm\",\n      \"registry\": \"https://registry.npmjs.org\",\n      \"package\": \"wechat-md-publisher\",\n      \"repository\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"license\": \"Apache-2.0\",\n      \"audit\": \"https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\"\n    },\n    \"verification\": {\n      \"command\": \"node -e \\\"const m=require('wechat-md-publisher/package.json'); if(m.name!=='wechat-md-publisher'||m.version!=='1.0.7'){process.exit(1)}\\\"\",\n      \"expectedOutput\": \"\",\n      \"note\": \"校验包名与精确版本号，避免被任意同名包替身\"\n    },\n    \"trustedResolutionRoots\": [\n      \"<node-prefix>/lib/node_modules\",\n      \"<node-prefix>/node_modules (Windows)\",\n      \"<skill-dir>/node_modules\"\n    ],\n    \"untrustedResolutionRoots\": [\n      \"process.cwd()/node_modules (intentionally excluded)\"\n    ]\n  },\n  \"dependencies\": {\n    \"npm\": [\n      \"wechat-md-publisher@1.0.7\"\n    ],\n    \"note\": \"依赖（jsdom, form-data-encoder, formdata-node）由 wechat-md-publisher 自带；版本必须精确等于 1.0.7，升级需重新审计并显式更新 REQUIRED_VERSION。\"\n  },\n  \"credentials\": {\n    \"required\": [],\n    \"optional\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n    \"note\": \"凭证可通过环境变量或 CLI 命令提供（二选一）\",\n    \"storage\": {\n      \"location\": \"~/.config/wechat-md-publisher-nodejs/\",\n      \"encryption\": \"AES-256\",\n      \"handler\": \"wechat-md-publisher npm 包\",\n      \"handlerRepo\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"auditFile\": \"src/services/account.ts\"\n    },\n    \"securityNote\": \"凭证加密由上游 npm 包处理。使用前请审计 https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\",\n    \"bestPractices\": [\n      \"优先使用环境变量 WECHAT_APP_ID/WECHAT_APP_SECRET，不要把 --app-secret 写到命令行（会出现在 ps、shell history、CI 日志中）\",\n      \"保护 ~/.config/wechat-md-publisher-nodejs/ 目录权限（建议 0700），并将其排除在备份/同步/容器镜像之外\",\n      \"在条件允许时使用最小权限或测试公众号验证流程后，再切换到生产账号\",\n      \"如怀疑泄露，立即在微信公众平台重置 AppSecret 并删除本地缓存目录\",\n      \"AI / 自动化场景下，默认走 draft create + 人工确认路径，避免在未审阅的情况下直接 publish\"\n    ]\n  },\n  \"permissions\": {\n    \"filesystem\": {\n      \"read\": [\"*.md\", \"*.jpg\", \"*.png\", \"*.gif\"],\n      \"write\": [\"~/.config/wechat-md-publisher-nodejs/\"]\n    },\n    \"network\": {\n      \"domains\": [\"api.weixin.qq.com\", \"mp.weixin.qq.com\"],\n      \"note\": \"仅微信官方 API。使用 `theme add-remote` 配置的第三方主题端点不在默认网络白名单内，需用户明确授权与信任。\"\n    },\n    \"publishing\": {\n      \"autoPublishWithoutConfirmation\": false,\n      \"recommendedFlow\": \"draft-first\",\n      \"note\": \"AI 自动化默认应调用 draft create，并要求用户在公众平台预览/确认后再执行 publish create 或 publish submit。\"\n    }\n  }\n}\n\nArchive v1.0.10: 9 files, 26816 bytes\n\nFiles: config.json (3959b), README.md (8178b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (5051b), scripts/postinstall.js (3316b), scripts/run.js (9364b), SKILL.md (25649b), _meta.json (145b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: wechat-md-publisher\ndescription: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\nversion: 1.0.7\nauthor: Ping Si <sipingme@gmail.com>\nuser-invocable: true\nrequires:\n  runtime:\n    - name: node\n      version: \">=18.0.0\"\n    - name: npm\n      version: \">=8.0.0\"\ninstall:\n  type: npm-global\n  package: wechat-md-publisher\n  version: \"^1.0.7\"\n  execution: \"npm install -g wechat-md-publisher@^1.0.7\"\n  global: true\n  autoInstall: false\n  autoUpdate: false\n  riskLevel: low\n  riskReason: \"Skill 不再通过 npx 动态拉取或执行子进程；脚本以 in-process 动态 import 调用本机已安装的 wechat-md-publisher。安装前请审计上游源码与凭证加密实现。\"\n  source:\n    registry: https://registry.npmjs.org\n    repository: https://github.com/sipingme/wechat-md-publisher\n    license: Apache-2.0\n    audit: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n    auditCredentials: https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\nenv:\n  optional:\n    - name: WECHAT_APP_ID\n      description: 微信公众号 AppID\n      sensitive: false\n    - name: WECHAT_APP_SECRET\n      description: 微信公众号 AppSecret\n      sensitive: true\n  note: |\n    凭证可通过两种方式提供（二选一）：\n    1. 环境变量（推荐，避免凭证暴露在进程列表中）\n    2. CLI 命令：`account add --app-id xxx --app-secret xxx`\nconfigPaths:\n  - path: ~/.config/wechat-md-publisher-nodejs/\n    description: 账号配置和缓存目录\n    contains:\n      - credentials: true\n      - encryption: AES-256\npermissions:\n  filesystem:\n    read:\n      - \"*.md\": \"读取用户指定的 Markdown 文件\"\n      - \"*.jpg,*.png,*.gif\": \"读取文章中引用的本地图片\"\n    write:\n      - \"~/.config/wechat-md-publisher-nodejs/\": \"存储账号配置和缓存（凭证使用 AES-256 加密）\"\n  network:\n    required:\n      - \"api.weixin.qq.com\": \"微信公众号 API（发布、草稿、素材管理）\"\n      - \"mp.weixin.qq.com\": \"微信公众号素材上传\"\n    optional:\n      - \"remote-theme-api\": \"仅当用户使用 theme add-remote 命令时才会访问（⚠️ 需用户明确配置并信任该端点）\"\ncredentials:\n  - name: WECHAT_APP_SECRET\n    type: api-secret\n    storage:\n      location: ~/.config/wechat-md-publisher-nodejs/\n      encryption: AES-256\n      handler: wechat-md-publisher npm 包\n      handlerRepo: https://github.com/sipingme/wechat-md-publisher\n    consent: 需要用户明确提供，不会自动收集\n    securityNote: |\n      本 skill 不直接处理凭证加密，安全性依赖上游 npm 包的实现。\n      建议在提供凭证前审查 wechat-md-publisher 包的加密实现：\n      https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\ntags:\n  - wechat\n  - publishing\n  - markdown\n  - content-management\nrepository: https://github.com/sipingme/wechat-md-publisher\n---\n\n# WeChat Publisher Skill\n\n全功能微信公众号 Markdown 发布工具 - 让 AI 能够直接将内容发布到微信公众号。\n\n## ⚠️ 重要提示\n\n**推荐使用方式**：\n- ✅ **最佳实践**：与 `news-to-markdown-skill` 配合使用，实现一键转载新闻到微信公众号\n- 🌐 **固定公网 IP**：必须有固定公网 IP 并配置到微信公众平台的 IP 白名单\n- 🔑 **必需凭证**：必须配置 `WECHAT_APP_ID` 和 `WECHAT_APP_SECRET` 环境变量或通过命令行配置\n\n**关键要求**：\n1. **固定公网 IP**：微信 API 要求服务器 IP 在白名单中，动态 IP 无法使用\n2. **微信公众号凭证**：需要从微信公众平台获取 AppID 和 AppSecret\n3. **IP 白名单配置**：在微信公众平台「设置与开发」→「基本配置」→「IP 白名单」中添加你的公网 IP\n\n## ⚡ 快速开始\n\n### ⚠️ 安全风险与审计要点\n\n**安装与执行模型（请先阅读）**：\n- 本 Skill 的启动器 (`scripts/run.js`) 不会执行任何子进程，也不会通过 `npx` 在运行时从 registry 拉取代码。\n- 启动器使用 in-process 动态 `import` 调用 **本机已经全局安装** 的 `wechat-md-publisher` 包。\n- 因此，安装步骤是显式的：`npm install -g wechat-md-publisher@^1.0.7`。\n- 这样可以让用户在安装前完整审计上游源码、签名与版本，避免 \"每次运行都从 npm 拉新代码\" 的供应链风险面。\n\n**必须审计的上游代码**（首次安装前）：\n- **CLI 入口与命令分发**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n- **账号 / 凭证加密实现**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\n- 重点关注：AES-256 是否使用 AEAD 模式（如 AES-GCM / AES-CBC + HMAC）、密钥派生方式、是否绑定到当前用户、加密文件权限。\n\n**凭证存储**：账号凭证存储在 `~/.config/wechat-md-publisher-nodejs/`，使用 AES-256 加密。本 skill 不直接处理加密，安全性依赖上游 npm 包的实现 —— 必须在审计上述 `account.ts` 之后再写入真实凭证。\n\n**凭证传递的最佳实践**：\n- 推荐使用环境变量 `WECHAT_APP_ID` / `WECHAT_APP_SECRET`，避免 `--app-secret` 出现在 `ps` 进程列表中。\n- 任何时候在 shell history、CI 日志、容器元数据中暴露 `AppSecret`，都应立即去微信公众平台重置。\n\n**远程主题风险**：如果使用 `theme add-remote` 添加远程主题，第三方端点可能接收文章正文 / 标题。请只使用受信任的主题源；本 Skill 默认网络白名单**不包含**任意第三方主题端点。\n\n**沙箱建议**：若你无法或不愿审计上游 npm 包，请在隔离环境（专用 VM / 容器 / 沙箱账号）中运行；不要把生产微信公众号的 AppSecret 直接交给未审计的工具链。\n\n### 配置账号\n\n**推荐方式（使用环境变量，避免命令行暴露凭证）**：\n\n```bash\n# 设置环境变量（不会出现在进程列表中）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\n# 添加账号\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n**备选方式（命令行传参，注意：可能暴露在进程列表中）**：\n\n```bash\n# ⚠️ 警告：--app-secret 会出现在 ps 进程列表中\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 发布文章\n\n```bash\nwechat-pub publish create \\\n  --file article.md \\\n  --theme orangesun\n```\n\n### 与 news-to-markdown 配合使用\n\n```bash\n# 一键转载新闻到微信公众号（推荐：下载图片到本地）\n# news-to-markdown 会自动下载图片到本地，避免远程 URL 过期问题\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --download-images \\\n  --output-dir /tmp/article\n\n# wechat-md-publisher 会自动读取本地图片并上传\nwechat-pub publish create --file /tmp/article/article.md --theme orangesun\n```\n\n**图片处理最佳实践**（v0.8.3+）：\n- ✅ **推荐**：使用 `--download-images` 下载图片到本地\n  - 避免远程 URL 签名过期（如头条图片）\n  - 避免防盗链问题\n  - 提高发布成功率\n- news-to-markdown 自动提取封面图（og:image > twitter:image > 第一张图片）\n- 图片保存到 `./images/` 目录，Markdown 使用相对路径\n- wechat-md-publisher 自动上传本地图片到微信素材库\n- 完全自动化，无需手动处理\n\n---\n\n## 🎯 何时使用此 Skill\n\n当用户需要以下操作时，应触发此 Skill：\n\n- ✅ 发布文章到微信公众号\n- ✅ 创建微信公众号草稿\n- ✅ 管理微信公众号账号\n- ✅ 查看已发布的文章列表\n- ✅ 删除草稿或已发布文章\n- ✅ 使用不同主题渲染 Markdown\n- ✅ 在文章开头/结尾添加固定图文（Wrapper 功能）\n- ✅ 查看或回滚 Wrapper 历史版本\n\n**触发关键词**：\n- \"发布到微信公众号\"\n- \"创建微信草稿\"\n- \"配置微信公众号\"\n- \"查看微信文章\"\n- \"使用 [主题名] 主题发布\"\n- \"文章开头结尾固定内容\"\n- \"Wrapper\"\n\n## 📋 前置要求\n\n### 1. 系统要求\n- Node.js >= 18.0.0\n- npm 或 pnpm 包管理器\n- 网络连接（访问微信 API）\n\n### 2. 微信公众号配置\n用户必须拥有微信公众号并获取：\n- **AppID**：开发者 ID\n- **AppSecret**：开发者密码\n- **IP 白名单**：必须配置（重要！）\n\n获取方式：\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. **配置 IP 白名单**（必须！）：\n   - 获取当前 IP：`curl ifconfig.me`\n   - 在「IP白名单」中添加该 IP\n   - 详细指南：[IP 白名单配置指南](./references/ip-whitelist-guide.md)\n\n### 3. 安装方式\n\n本 Skill 要求在首次使用前**显式全局安装**底层 npm 包，以便用户审计源码并避免运行时从 registry 拉代码：\n\n```bash\n# 一次性安装（请先阅读上文 \"安全风险与审计要点\" 完成审计）\nnpm install -g wechat-md-publisher@^1.0.7\n\n# 验证可用\nwechat-pub --version\n\n# 查看帮助\nwechat-pub --help\n```\n\n安装完成后，Skill 启动器（`scripts/run.js`）会通过 in-process 动态 `import` 调用本机已安装的 `wechat-md-publisher`，不再触发任何 `npx` 网络请求或子进程。\n\n## 🚀 标准操作流程 (SOP)\n\n### 操作 1：配置微信公众号账号\n\n**场景**：首次使用或添加新账号\n\n**步骤**：\n\n1. 收集用户提供的账号信息（AppID 和 AppSecret）\n2. 执行命令添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"账号名称\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n3. 验证账号添加成功：\n\n```bash\nwechat-pub account list\n```\n\n**输出示例**：\n```\n┌────────────┬──────────────┬────────────────┬─────────┐\n│ ID         │ 名称         │ AppID          │ 默认    │\n├────────────┼──────────────┼────────────────┼─────────┤\n│ acc_xxx    │ 我的公众号   │ wx123456       │ ✓       │\n└────────────┴──────────────┴────────────────┴─────────┘\n```\n\n**异常处理**：\n- 如果 AppID/AppSecret 错误，会提示\"认证失败\"\n- 如果网络问题，会提示\"无法连接到微信服务器\"\n- 解决方案：检查凭证是否正确，确认 IP 在白名单中\n\n---\n\n### 操作 2：创建并发布文章（一步到位）\n\n**场景**：用户提供 Markdown 内容，直接发布到公众号\n\n**步骤**：\n\n1. 将用户的 Markdown 内容保存到临时文件：\n\n```bash\ncat > /tmp/article.md << 'EOF'\n---\ntitle: 文章标题\nauthor: 作者名\n---\n\n# 文章内容\n\n这里是正文...\nEOF\n```\n\n2. 执行发布命令：\n\n```bash\nwechat-pub publish create \\\n  --file /tmp/article.md \\\n  --theme orangesun\n```\n\n3. 解析输出，提取 `publish_id`\n\n**输出示例**：\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n4. 向用户报告成功，并提供发布 ID\n\n**可用主题**：\n- `default` - 默认主题（简洁清爽）\n- `orangesun` - Orange Sun（温暖明亮）\n- `redruby` - Red Ruby（优雅醒目）\n- `greenmint` - Green Mint（清新舒适）\n- `purplerain` - Purple Rain（梦幻柔和）\n- `blackink` - Black Ink（深色模式）\n\n**异常处理**：\n- 图片上传失败：检查图片路径和网络\n- Token 过期：自动刷新，无需手动处理\n- 内容违规：微信会返回错误码，提示用户修改内容\n\n---\n\n### 操作 3：创建草稿（不立即发布）\n\n**场景**：用户想先创建草稿，稍后再发布\n\n**步骤**：\n\n1. 保存 Markdown 内容到文件\n2. 执行草稿创建命令：\n\n```bash\nwechat-pub draft create \\\n  --file /tmp/article.md \\\n  --theme default\n```\n\n3. 记录返回的 `media_id`\n\n**输出示例**：\n```\n✓ 草稿创建成功\n\nMedia ID: 3_abcdefghijk123456\n```\n\n4. 告知用户草稿已创建，可以在微信公众平台查看\n\n**后续操作**：\n- 用户可以在微信公众平台编辑草稿\n- 需要发布时，使用 `wechat-pub publish submit <media-id>`\n\n---\n\n### 操作 4：查看草稿列表\n\n**场景**：用户想查看所有草稿\n\n**命令**：\n\n```bash\nwechat-pub draft list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 15 个草稿\n\n┌──────────────────┬────────────────┬────────────────┐\n│ Media ID         │ 标题           │ 更新时间       │\n├──────────────────┼────────────────┼────────────────┤\n│ 3_abc123         │ 测试文章       │ 2026-03-19     │\n│ 3_def456         │ 产品介绍       │ 2026-03-18     │\n└──────────────────┴────────────────┴────────────────┘\n```\n\n---\n\n### 操作 5：查看已发布文章\n\n**场景**：用户想查看已发布的文章\n\n**命令**：\n\n```bash\nwechat-pub publish list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 8 篇已发布文章\n\n┌──────────────┬────────────────┬────────────────┬──────────────────┐\n│ Article ID   │ 标题           │ 发布时间       │ URL              │\n├──────────────┼────────────────┼────────────────┼──────────────────┤\n│ 2247483647_1 │ 最新文章       │ 2026-03-19     │ https://mp.we... │\n└──────────────┴────────────────┴────────────────┴──────────────────┘\n```\n\n---\n\n### 操作 6：删除草稿或文章\n\n**删除草稿**：\n\n```bash\nwechat-pub draft delete <media-id>\n```\n\n**删除已发布文章**：\n\n```bash\nwechat-pub publish delete <article-id>\n```\n\n---\n\n### 操作 7：查看可用主题\n\n**命令**：\n\n```bash\nwechat-pub theme list\n```\n\n**输出示例**：\n```\n可用主题：\n\n┌─────────────┬──────────────┬────────────────────┐\n│ ID          │ 名称         │ 描述               │\n├─────────────┼──────────────┼────────────────────┤\n│ default     │ 默认主题     │ 简洁清爽风格       │\n│ orangesun   │ Orange Sun   │ 温暖明亮风格       │\n│ redruby     │ Red Ruby     │ 优雅醒目风格       │\n│ greenmint   │ Green Mint   │ 清新舒适风格       │\n│ purplerain  │ Purple Rain  │ 梦幻柔和风格       │\n│ blackink    │ Black Ink    │ 深色模式风格       │\n└─────────────┴──────────────┴────────────────────┘\n```\n\n\n---\n\n## 🔧 高级用法\n\n### Wrapper 功能：文章开头/结尾固定图文\n\n在发布文章时自动在开头和结尾添加固定的图文内容（如关注引导、底部二维码等）。\n\n**开启功能**：\n```bash\nwechat-pub wrapper on\n```\n\n**设置内容**：\n```bash\nwechat-pub wrapper set \\\n  --header \"<div>欢迎关注我们的公众号</div>\" \\\n  --footer \"<div>觉得有帮助请点赞+收藏</div>\"\n```\n\n**查看状态**：\n```bash\nwechat-pub wrapper status\n```\n\n**查看历史版本**：\n```bash\nwechat-pub wrapper history\n```\n\n**回滚到指定版本**：\n```bash\nwechat-pub wrapper rollback 1\n```\n\n**关闭功能**：\n```bash\nwechat-pub wrapper off\n```\n\n**注意事项**：\n- 功能默认关闭，需要手动开启\n- 每次 `set` 会创建新版本，支持历史回滚\n- 图片处理：目前直接存储原始 HTML，需要公网可访问的图片 URL\n- 数据库文件：`data/wmp.db`\n\n---\n\n### 使用编程 API\n\n如果需要在代码中集成：\n\n```javascript\nconst { container } = require('wechat-md-publisher');\n\nasync function publishArticle(markdown, theme) {\n  await container.initialize();\n  \n  const publishService = await container.getPublishService();\n  const result = await publishService.createAndPublish({\n    markdown: markdown,\n    theme: theme || 'default',\n  });\n  \n  return result.publish_id;\n}\n```\n\n### 批量发布\n\n```bash\n# 批量创建草稿\nfor file in articles/*.md; do\n    wechat-pub draft create --file \"$file\" --theme default\ndone\n```\n\n---\n\n## 📊 输入输出规范\n\n### 输入格式\n\n**Markdown 文件格式**：\n\n```markdown\n---\ntitle: 文章标题（必需）\nauthor: 作者名（可选）\ncover: ./cover.jpg（可选，封面图路径）\n---\n\n# 正文标题\n\n正文内容...\n\n![图片描述](./image.jpg)\n```\n\n**支持的图片格式**：\n- 本地图片：相对路径或绝对路径\n- 网络图片：HTTP/HTTPS URL\n- 微信图片：微信 CDN URL（自动识别）\n\n### 输出格式\n\n**成功响应**：\n```json\n{\n  \"success\": true,\n  \"publish_id\": \"2247483647_1\",\n  \"message\": \"发布成功\"\n}\n```\n\n**错误响应**：\n```json\n{\n  \"success\": false,\n  \"error\": \"错误信息\",\n  \"code\": \"ERROR_CODE\"\n}\n```\n\n---\n\n## ⚠️ 常见问题和解决方案\n\n### 问题 1：Token 过期\n\n**症状**：提示\"access_token 无效\"\n\n**解决**：Token 会自动刷新，如果仍有问题，重新配置账号\n\n### 问题 2：图片上传失败\n\n**症状**：提示\"图片上传失败\"\n\n**原因**：\n- 图片路径错误\n- 图片大小超限（微信限制 10MB）\n- 服务器 IP 不在白名单\n\n**解决**：\n- 检查图片路径\n- 压缩图片\n- 在微信公众平台添加 IP 到白名单\n\n### 问题 3：找不到主题\n\n**症状**：提示\"主题不存在\"\n\n**解决**：使用 `wechat-pub theme list` 查看可用主题\n\n### 问题 4：权限不足\n\n**症状**：提示\"没有权限\"\n\n**原因**：AppID/AppSecret 错误或权限不足\n\n**解决**：\n- 确认凭证正确\n- 确认公众号类型支持该功能（服务号 vs 订阅号）\n\n---\n\n## 🔒 安全性说明\n\n### 敏感信息处理\n\n- AppID 和 AppSecret 存储在本地配置文件中\n- 配置文件位置：\n  - macOS: `~/Library/Preferences/wechat-md-publisher-nodejs/config.json`\n  - Linux: `~/.config/wechat-md-publisher-nodejs/config.json`\n  - Windows: `%APPDATA%\\wechat-md-publisher-nodejs\\Config\\config.json`\n\n### 权限要求\n\n- 读取本地文件（Markdown 和图片）\n- 网络访问（微信 API）\n- 写入配置文件\n\n### 数据隐私\n\n- 不会上传任何数据到第三方服务器\n- 所有通信仅限于微信官方 API\n- 图片缓存仅在本地\n\n---\n\n## 📚 参考资料\n\n- [项目 GitHub](https://github.com/sipingme/wechat-md-publisher)\n- [微信公众平台文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)\n- [完整 API 文档](https://github.com/sipingme/wechat-md-publisher/blob/main/docs/API.md)\n\n---\n\n## 🎓 示例对话\n\n**用户**：帮我把这篇文章发布到微信公众号\n\n**AI**：好的，我来帮你发布。请提供文章的 Markdown 内容。\n\n**用户**：[提供内容]\n\n**AI**：收到！我将使用 orangesun 主题发布。正在处理...\n\n[执行命令]\n\n**AI**：✅ 文章已成功发布到微信公众号！\n- 发布 ID: 2247483647_1\n- 你可以在微信公众平台查看和管理这篇文章\n\n---\n\n## 📝 维护说明\n\n- **版本**: 1.0.7\n- **最后更新**: 2026-04-26\n- **更新内容**: \n  - 明确内置主题为 6 个自定义主题（default, blackink, orangesun, redruby, greenmint, purplerain）\n  - 移除历史遗留的 wenyan-core 主题注册（lapis, maize 等），避免加载不存在的主题\n  - 更新 THEMES.md 文档与实际可用主题保持一致\n- **维护者**: Ping Si <sipingme@gmail.com>\n- **许可证**: Apache-2.0\n\n---\n\n## ✅ 首次成功检查清单\n\n新用户应该能在 5 分钟内完成：\n\n- [ ] 验证工具可用：`wechat-pub --version`\n- [ ] 配置账号：`wechat-pub account add ...`\n- [ ] 创建测试文章\n- [ ] 发布成功：`wechat-pub publish create --file test.md --theme default`\n- [ ] 在微信公众平台看到文章\n\n如果以上步骤都能顺利完成，说明 Skill 已正确配置！\n\n---\n\n## 🔗 与其他 Skills 配合使用\n\n### 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：`news-to-markdown-skill` + `wechat-md-publisher-skill` = 一键转载新闻到微信公众号\n\n#### 使用场景\n\n将网络上的新闻文章快速转载到微信公众号，实现内容聚合和分发。\n\n#### 完整工作流\n\n**场景 1：转载单篇新闻（推荐方式）**\n\n```bash\n# 步骤 1: 使用 news-to-markdown 提取新闻并下载图片\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article/article.md \\\n  --download-images \\\n  --output-dir /tmp/article \\\n  --verbose\n\n# 步骤 2: 使用 wechat-md-publisher 发布到微信\nwechat-pub publish create \\\n  --file /tmp/article/article.md \\\n  --theme orangesun\n```\n\n**为什么要下载图片到本地？**\n- 头条图片 URL 包含签名和过期时间，几小时后会失效\n- 本地图片更可靠，不受网络波动影响\n- 避免防盗链导致的图片加载失败\n\n**场景 2：批量转载新闻**\n\n```bash\n# 新闻 URL 列表\nurls=(\n  \"https://www.toutiao.com/article/123\"\n  \"https://mp.weixin.qq.com/s/abc\"\n  \"https://www.xiaohongshu.com/explore/xyz\"\n)\n\n# 批量处理\nfor i in \"${!urls[@]}\"; do\n  url=\"${urls[$i]}\"\n  output_dir=\"/tmp/article-$i\"\n  \n  # 提取新闻并下载图片\n  convert-url --url \"$url\" \\\n    --output \"$output_dir/article.md\" \\\n    --download-images \\\n    --output-dir \"$output_dir\"\n  \n  # 发布到微信（创建草稿）\n  wechat-pub draft create \\\n    --file \"$output_dir/article.md\" \\\n    --theme default\n  \n  echo \"✓ 已处理: $url\"\ndone\n```\n\n**场景 3：AI 自动化工作流**\n\n用户对 AI 说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 执行流程：\n1. 使用 `news-to-markdown-skill` 提取文章内容\n2. 自动检测平台（头条/微信/小红书）\n3. 使用 `wechat-md-publisher-skill` 发布到微信\n4. 返回发布结果和链接\n\n#### 优势\n\n✅ **智能内容提取**\n- 自动识别新闻正文，过滤广告和噪音\n- 保留文章结构和格式\n- 提取标题、作者、发布时间等元数据\n\n✅ **多平台支持**\n- 头条：优化标题层级、列表、代码块\n- 微信：提取 `#js_content` 区域\n- 小红书：处理 `.note-content` 内容\n\n✅ **三层抓取策略**\n- curl → wget → Playwright\n- 确保动态页面也能正确抓取\n\n✅ **精美主题渲染**\n- 6 个精选内置主题可选\n- 自动处理图片上传\n- 保持排版美观\n\n#### 最佳实践\n\n**1. 内容审核**\n```bash\n# 先创建草稿，人工审核后再发布\nconvert-url --url \"$news_url\" --output /tmp/article.md\nwechat-pub draft create --file /tmp/article.md --theme default\n\n# 审核通过后发布\nwechat-pub publish submit <media-id>\n```\n\n**2. 添加来源声明**\n```bash\n# 提取时保留元数据\nconvert-url --url \"$news_url\" --output /tmp/article.md\n\n# 元数据会自动包含在 Markdown 中：\n# ---\n# title: 文章标题\n# author: 原作者\n# 来源: https://...\n# ---\n```\n\n**3. 选择合适主题**\n- 科技类文章：`default`、`blackink`（深色模式）\n- 生活类文章：`orangesun`（橙色阳光）、`greenmint`（薄荷绿）\n- 教程类文章：`default`、`greenmint`\n- 文艺情感：`purplerain`（紫色雨）、`orangesun`\n- 品牌时尚：`redruby`（宝石红）\n- 夜间阅读：`blackink`\n\n#### 示例对话\n\n**用户**：把这篇头条文章转到我的微信公众号\nhttps://www.toutiao.com/article/7000000000000000000/\n\n**AI**：好的，我来帮你处理：\n\n1. 正在提取文章内容...\n   ```\n   [INFO] 开始抓取: https://www.toutiao.com/article/...\n   [INFO] 检测到平台: toutiao\n   [INFO] 提取成功\n   ```\n\n2. 正在发布到微信公众号...\n   ```\n   ✓ 渲染完成\n   ✓ 图片处理完成\n   ✓ 创建草稿成功\n   ✓ 发布成功\n   ```\n\n✅ **完成！**\n- 文章标题：《xxx》\n- 发布 ID: 2247483647_1\n- 使用主题: orangesun\n- 你可以在微信公众平台查看\n\n#### 相关资源\n\n- **news-to-markdown-skill**: https://github.com/sipingme/news-to-markdown-skill\n- **news-to-markdown 核心库**: https://github.com/sipingme/news-to-markdown\n- **npm 包**: `npm install -g news-to-markdown`\n\n#### 技术栈\n\n```\n新闻网站\n    ↓\nnews-to-markdown (提取 + 转换)\n    ↓\nMarkdown 文件\n    ↓\nwechat-md-publisher (渲染 + 发布)\n    ↓\n微信公众号\n```\n\n---\n\n## 💡 更多组合可能\n\n### 与内容管理工具配合\n- 配合 Git 进行版本管理\n- 配合 CI/CD 实现自动发布\n- 配合数据库存储发布记录\n\n### 与 AI 工具配合\n- AI 生成内容 → wechat-md-publisher 发布\n- AI 润色文章 → wechat-md-publisher 发布\n- AI 翻译文章 → wechat-md-publisher 发布\n\nFile v1.0.10:README.md\n\n# WeChat MD Publisher - OpenClaw Skill\n\n> 全功能微信公众号 Markdown 发布工具 - OpenClaw Skill 版本\n\n## 🛠️ 前置安装：底层 npm 包\n\n本 Skill 的启动器 (`scripts/run.js`) 通过 in-process 动态 `import` 调用本机已安装的 `wechat-md-publisher`，**不会**通过 `npx` 在运行时从 registry 拉取代码。\n因此**必须**在首次使用前显式全局安装底层包，并在安装前完成源码审计：\n\n```bash\nnpm install -g wechat-md-publisher@^1.0.7\nwechat-pub --version\n```\n\n请审计：\n- CLI 入口：https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n- 凭证加密：https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\n\n## 🚀 快速安装（Skill 本身）\n\n### 方法 1：从 ClawHub 安装（推荐）\n\n```bash\nopenclaw skills install wechat-md-publisher\n```\n\n### 方法 2：从 GitHub 安装\n\n```bash\nopenclaw skills install https://github.com/sipingme/wechat-md-publisher-skill\n```\n\n### 方法 3：手动安装\n\n1. 克隆仓库：\n```bash\ngit clone https://github.com/sipingme/wechat-md-publisher-skill.git\ncd wechat-md-publisher-skill\n```\n\n2. 复制到 OpenClaw skills 目录：\n```bash\ncp -r . ~/.openclaw/skills/wechat-md-publisher/\n```\n\n3. 验证工具可用：\n```bash\nwechat-pub --version\n```\n\n## ✅ 验证安装\n\n```bash\n# 检查 Skill 是否可用\nopenclaw skills list --eligible\n\n# 查看 Skill 详情\nopenclaw skills info wechat-md-publisher\n\n# 测试命令\nwechat-pub --version\n```\n\n## 📋 首次配置\n\n### 1. 获取微信公众号凭证\n\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. 将服务器 IP 添加到「IP白名单」\n\n### 2. 配置账号\n\n```bash\n# 推荐：使用环境变量（避免命令行暴露凭证）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n### 3. 测试发布\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 测试文章\n---\n# Hello World\n这是一篇测试文章。\nEOF\n\n# 发布\nwechat-pub publish create --file test.md --theme default\n```\n\n## 🎯 使用方式\n\n### 在 OpenClaw 对话中使用\n\n**示例 1：发布文章**\n\n```\n用户: 帮我把这篇文章发布到微信公众号\n\n[提供 Markdown 内容]\n\nAI: 好的，我来帮你发布。正在使用 orangeheart 主题...\n✓ 文章已成功发布！发布 ID: 2247483647_1\n```\n\n**示例 2：创建草稿**\n\n```\n用户: 先创建一个草稿，不要立即发布\n\nAI: 明白，我会先创建草稿。\n✓ 草稿创建成功，Media ID: 3_abc123\n你可以在微信公众平台查看和编辑。\n```\n\n**示例 3：查看文章列表**\n\n```\n用户: 查看我已发布的微信文章\n\nAI: 正在获取列表...\n共 8 篇已发布文章：\n1. 最新文章 (2026-03-19)\n2. 产品介绍 (2026-03-18)\n...\n```\n\n### 手动调用 Skill\n\n```bash\n# 使用 OpenClaw 命令\nopenclaw run wechat-md-publisher publish article.md orangeheart\n\n# 或直接使用工具\nwechat-pub publish create --file article.md --theme orangeheart\n```\n\n## � 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：一键转载新闻到微信公众号\n\n### 快速示例\n\n```bash\n# 1. 提取新闻文章\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --platform toutiao\n\n# 2. 发布到微信公众号\nwechat-pub publish create \\\n  --file /tmp/article.md \\\n  --theme orangeheart\n```\n\n### AI 自动化工作流\n\n用户说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 自动执行：\n1. 使用 `news-to-markdown-skill` 提取文章\n2. 使用 `wechat-md-publisher-skill` 发布到微信\n3. 返回发布结果\n\n### 优势\n\n✅ **智能提取** - 自动识别正文，过滤广告  \n✅ **多平台支持** - 头条、微信、小红书  \n✅ **精美渲染** - 8+ 主题可选  \n✅ **一键发布** - 无需手动复制粘贴\n\n详见 [SKILL.md](./SKILL.md) 中的完整集成指南。\n\n---\n\n## �📚 文档\n\n- **[SKILL.md](./SKILL.md)** - 完整的 SOP 和使用指南（含 news-to-markdown 集成）\n- **[quick-start.md](./references/quick-start.md)** - 5 分钟快速上手\n- **[themes.md](./references/themes.md)** - 主题使用指南\n- **[ip-whitelist-guide.md](./references/ip-whitelist-guide.md)** - IP 白名单配置指南 ⚠️ 重要\n\n## 🎨 可用主题\n\n- `default` - 简洁经典\n- `orangeheart` - 温暖优雅 ⭐ 推荐\n- `rainbow` - 活泼清爽\n- `lapis` - 清新极简 ⭐ 推荐\n- `pie` - 现代锐利\n- `maize` - 柔和舒适\n- `purple` - 简约文艺\n- `phycat` - 薄荷清新\n- `sport` - 运动风 🏃 活力动感\n\n## 🔧 高级配置\n\n### 环境变量（可选）\n\n```bash\n# 在 ~/.bashrc 或 ~/.zshrc 中添加\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n```\n\n### 自定义主题\n\n```bash\n# 添加本地主题（推荐）\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n\n# 添加远程主题 API（⚠️ 见下方安全警告）\nwechat-pub theme add-remote --name md2wechat --url https://api.md2wechat.cn --key xxx\n```\n\n> ⚠️ **远程主题安全警告**：使用 `theme add-remote` 会向第三方服务器发送请求。请仅使用您信任的远程主题 API。远程主题端点不在本 skill 的默认网络权限范围内，需要用户明确配置并承担相应风险。\n\n## ⚠️ 常见问题\n\n### 问题 1：Skill 未被识别\n\n**解决**：\n```bash\nopenclaw skills refresh\nopenclaw skills info wechat-md-publisher\n```\n\n### 问题 2：权限错误\n\n**解决**：\n```bash\nchmod +x ~/.openclaw/skills/wechat-md-publisher/scripts/publish.js\n```\n\n### 问题 3：找不到命令\n\n**解决**：确认底层 npm 包已全局安装：\n```bash\nnpm install -g wechat-md-publisher@^1.0.7\nwechat-pub --version\n```\n\n### 问题 4：Token 过期\n\nToken 会自动刷新，如仍有问题：\n```bash\nwechat-pub account remove <account-id>\nwechat-pub account add --name \"新账号\" --default\n```\n\n### 问题 5：升级到新版本\n\n本 Skill 不会自动升级底层包。需要新版本时手动执行：\n\n```bash\nnpm install -g wechat-md-publisher@latest\n\n# 验证版本\nwechat-pub --version\n```\n\n> 升级前请重新审计上游变更，避免引入未审查的代码。\n\n## 🔒 安全性\n\n### 权限要求\n\n- ✅ 读取本地 Markdown 和图片文件\n- ✅ 网络访问（微信官方 API）\n- ✅ 写入配置文件到 `~/.config/wechat-md-publisher-nodejs/`\n- ⚠️ 可选：远程主题 API（仅当用户使用 `theme add-remote` 时）\n\n### 数据隐私\n\n- ✅ 默认情况下，所有通信仅限于微信官方 API\n- ✅ 配置文件仅存储在本地（凭证加密由 [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher) npm 包处理）\n- ❌ 不会自动收集用户信息\n- ⚠️ **例外**：如果用户配置了远程主题（`theme add-remote`），会向该第三方端点发送请求\n\n### 安全检查\n\n```bash\n# 使用 skill-vetter 检查（如果可用）\nopenclaw skills vet wechat-md-publisher\n```\n\n## 📊 Skill 评分\n\n根据 OpenClaw 社区标准：\n\n- ✅ **规范清晰度**: 5/5 - SKILL.md 结构完整\n- ✅ **首次成功时间**: 5/5 - 5 分钟内可完成\n- ✅ **实用性**: 5/5 - 解决实际发布需求\n- ✅ **安全性**: 5/5 - 权限合理，无恶意代码\n\n## 🤝 贡献\n\n欢迎贡献！\n\n- 报告问题：[GitHub Issues](https://github.com/sipingme/wechat-md-publisher/issues)\n- 提交改进：[Pull Requests](https://github.com/sipingme/wechat-md-publisher/pulls)\n- 讨论交流：[GitHub Discussions](https://github.com/sipingme/wechat-md-publisher/discussions)\n\n## 📜 许可证\n\nApache-2.0 License\n\n## 👤 作者\n\n**Ping Si** <sipingme@gmail.com>\n\n- GitHub: [@sipingme](https://github.com/sipingme)\n- 项目主页: [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher)\n\n## 🙏 致谢\n\n- [@wenyan-md/core](https://github.com/caol64/wenyan-core) - 提供精美主题和渲染引擎\n- OpenClaw 社区 - 提供优秀的 AI Agent 框架\n\n---\n\n**让 AI 能够直接发布内容到微信公众号！** 🚀\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn70nwj71rbkzwyvc7pkqs4p6s8222nc\",\n  \"slug\": \"wechat-md-publisher-skill\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1777450630116\n}\n\nFile v1.0.10:references/ip-whitelist-guide.md\n\n# 微信公众号 IP 白名单配置指南\n\n## 什么是 IP 白名单？\n\n微信公众号为了安全，要求所有调用 API 的服务器 IP 必须在白名单中。如果 IP 不在白名单，API 调用会失败。\n\n## 为什么需要配置？\n\n当你使用 `wechat-md-publisher` 发布文章时，工具会从你的电脑/服务器向微信 API 发送请求。微信会检查请求来源的 IP 地址，只有在白名单中的 IP 才能成功调用。\n\n## 如何获取你的 IP 地址？\n\n### 方法 1：使用命令行（推荐）\n\n```bash\n# macOS/Linux\ncurl ifconfig.me\n\n# 或\ncurl icanhazip.com\n\n# 或\ncurl ipinfo.io/ip\n```\n\n### 方法 2：访问网站\n\n访问以下任一网站查看你的公网 IP：\n- https://www.ip.cn/\n- https://ipinfo.io/\n- https://ifconfig.me/\n\n### 方法 3：在微信公众平台查看\n\n登录微信公众平台后，在 IP 白名单设置页面，微信会显示你当前的 IP 地址。\n\n## 如何配置 IP 白名单？\n\n### 步骤 1：登录微信公众平台\n\n访问 https://mp.weixin.qq.com/ 并登录\n\n### 步骤 2：进入 IP 白名单设置\n\n1. 点击左侧菜单「设置与开发」\n2. 点击「基本配置」\n3. 找到「IP白名单」部分\n4. 点击「修改」或「查看」\n\n### 步骤 3：添加 IP 地址\n\n1. 点击「添加」按钮\n2. 输入你的公网 IP 地址\n3. 点击「确定」\n\n**示例**：\n```\n123.456.789.012\n```\n\n### 步骤 4：验证配置\n\n添加后，等待 1-2 分钟生效，然后测试：\n\n```bash\nwechat-pub account list\n```\n\n如果能正常显示账号列表，说明配置成功。\n\n## 常见场景\n\n### 场景 1：在家里使用\n\n**问题**：家庭宽带的 IP 地址可能会变化\n\n**解决方案**：\n1. **短期方案**：每次 IP 变化后重新添加\n2. **长期方案**：\n   - 联系运营商申请固定 IP（可能需要付费）\n   - 使用云服务器部署（推荐）\n\n### 场景 2：在公司使用\n\n**问题**：公司可能使用固定 IP 或代理\n\n**解决方案**：\n1. 询问 IT 部门获取公司的公网出口 IP\n2. 将公司 IP 添加到白名单\n3. 如果公司使用代理，需要添加代理服务器的 IP\n\n### 场景 3：在云服务器使用\n\n**推荐方案**：\n1. 购买云服务器（阿里云、腾讯云、AWS 等）\n2. 云服务器通常有固定的公网 IP\n3. 将云服务器 IP 添加到白名单\n4. 在云服务器上安装和使用 `wechat-md-publisher`\n\n**优点**：\n- ✅ IP 固定，不会变化\n- ✅ 24/7 在线\n- ✅ 可以设置定时任务自动发布\n- ✅ 网络稳定\n\n### 场景 4：使用 VPN 或代理\n\n**问题**：VPN 会改变你的出口 IP\n\n**解决方案**：\n1. 关闭 VPN 后获取真实 IP\n2. 将真实 IP 添加到白名单\n3. 使用工具时关闭 VPN\n\n或者：\n1. 获取 VPN 的出口 IP\n2. 将 VPN IP 添加到白名单\n3. 使用工具时保持 VPN 连接\n\n## 多 IP 配置\n\n微信公众号支持添加多个 IP 地址（通常最多 10-20 个）。\n\n**适用场景**：\n- 在多个地点使用（家里、公司、咖啡厅）\n- 团队协作（多人使用）\n- 备用 IP（防止主 IP 失效）\n\n**配置方法**：\n在 IP 白名单页面，点击「添加」，逐个添加所有需要的 IP。\n\n## 安全建议\n\n### ✅ 推荐做法\n\n1. **只添加必要的 IP**\n   - 不要添加不信任的 IP\n   - 定期检查和清理不再使用的 IP\n\n2. **使用固定 IP**\n   - 云服务器（推荐）\n   - 固定宽带 IP\n\n3. **定期更新**\n   - IP 变化后及时更新白名单\n   - 删除不再使用的 IP\n\n### ❌ 不推荐做法\n\n1. **不要使用公共 WiFi**\n   - 公共 WiFi 的 IP 可能被多人共享\n   - 存在安全风险\n\n2. **不要添加 0.0.0.0 或通配符**\n   - 微信不支持通配符\n   - 必须添加具体的 IP 地址\n\n3. **不要分享你的 AppSecret**\n   - 即使 IP 在白名单中，也要保护好 AppSecret\n   - 不要将 AppSecret 提交到 Git 仓库\n\n## 故障排查\n\n### 错误：IP 不在白名单\n\n**症状**：\n```\n错误码: 40164\n错误信息: invalid ip xxx.xxx.xxx.xxx, not in whitelist\n```\n\n**解决步骤**：\n\n1. **确认当前 IP**：\n   ```bash\n   curl ifconfig.me\n   ```\n\n2. **检查白名单**：\n   - 登录微信公众平台\n   - 查看 IP 白名单列表\n   - 确认当前 IP 是否在列表中\n\n3. **添加 IP**：\n   - 如果不在，添加当前 IP\n   - 等待 1-2 分钟生效\n\n4. **重试**：\n   ```bash\n   wechat-pub account list\n   ```\n\n### 错误：IP 频繁变化\n\n**症状**：今天能用，明天就不能用了\n\n**原因**：家庭宽带 IP 动态分配\n\n**解决方案**：\n\n**方案 1：使用云服务器（推荐）**\n```bash\n# 1. 购买云服务器（最低配置即可）\n# 2. 在云服务器上安装工具\nssh user@your-server-ip\nnpm install -g wechat-md-publisher\n\n# 3. 配置账号\nwechat-pub account add --name \"公众号\" --app-id xxx --app-secret xxx\n\n# 4. 使用\nwechat-pub publish create --file article.md --theme default\n```\n\n**方案 2：申请固定 IP**\n- 联系宽带运营商\n- 申请固定公网 IP（可能需要额外费用）\n\n**方案 3：使用 DDNS**\n- 配置动态 DNS\n- 使用脚本自动更新白名单（需要开发）\n\n## 自动化脚本\n\n### 检查 IP 是否变化\n\n```bash\n#!/bin/bash\n# check-ip.sh\n\nCURRENT_IP=$(curl -s ifconfig.me)\nSAVED_IP=$(cat ~/.wechat-pub-ip 2>/dev/null)\n\nif [ \"$CURRENT_IP\" != \"$SAVED_IP\" ]; then\n    echo \"⚠️  IP 已变化！\"\n    echo \"旧 IP: $SAVED_IP\"\n    echo \"新 IP: $CURRENT_IP\"\n    echo \"请更新微信公众平台的 IP 白名单\"\n    echo \"$CURRENT_IP\" > ~/.wechat-pub-ip\nelse\n    echo \"✓ IP 未变化: $CURRENT_IP\"\nfi\n```\n\n使用：\n```bash\nchmod +x check-ip.sh\n./check-ip.sh\n```\n\n## 推荐配置\n\n### 个人用户\n\n**推荐方案**：使用云服务器\n- 成本：约 10-30 元/月\n- 优点：IP 固定、稳定可靠\n- 推荐服务商：阿里云、腾讯云、华为云\n\n### 企业用户\n\n**推荐方案**：公司服务器 + 固定 IP\n- 在公司内网服务器部署\n- 配置公司出口 IP 到白名单\n- 设置定时任务自动发布\n\n### 团队协作\n\n**推荐方案**：共享云服务器\n- 团队共用一台云服务器\n- 所有成员通过 SSH 访问\n- 统一的 IP 地址\n\n## 总结\n\n1. ✅ **必须配置 IP 白名单**才能使用微信公众号 API\n2. ✅ 使用 `curl ifconfig.me` 获取当前 IP\n3. ✅ 在微信公众平台添加 IP 到白名单\n4. ✅ 推荐使用云服务器获得固定 IP\n5. ✅ 定期检查和更新 IP 白名单\n\n## 相关链接\n\n- [微信公众平台](https://mp.weixin.qq.com/)\n- [微信公众号开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html)\n- [IP 白名单说明](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)\n\n---\n\n如有问题，请查看 [SKILL.md](../SKILL.md) 或提交 [Issue](https://github.com/sipingme/wechat-md-publisher/issues)。\n\nFile v1.0.10:references/quick-start.md\n\n# WeChat Publisher - 快速开始指南\n\n## 5 分钟快速上手\n\n### 步骤 1：安装工具（1 分钟）\n\n```bash\nnpm install -g wechat-md-publisher\n```\n\n### 步骤 2：配置账号（2 分钟）\n\n1. 获取微信公众号凭证：\n   - 登录 https://mp.weixin.qq.com/\n   - 进入「设置与开发」→「基本配置」\n   - 复制 AppID 和 AppSecret\n\n2. 添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 步骤 3：创建测试文章（1 分钟）\n\n```bash\ncat > test-article.md << 'EOF'\n---\ntitle: 测试文章\nauthor: 测试作者\n---\n\n# 欢迎使用 WeChat Publisher\n\n这是一篇测试文章。\n\n## 主要特性\n\n- 完整的草稿管理\n- 8 个精美主题\n- 智能图片处理\nEOF\n```\n\n### 步骤 4：发布文章（1 分钟）\n\n```bash\nwechat-pub publish create --file test-article.md --theme orangeheart\n```\n\n### 验证成功\n\n如果看到以下输出，说明配置成功：\n\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n现在可以在微信公众平台查看你的文章了！\n\n## 常用命令速查\n\n```bash\n# 查看所有主题\nwechat-pub theme list\n\n# 创建草稿\nwechat-pub draft create --file article.md --theme lapis\n\n# 查看草稿列表\nwechat-pub draft list\n\n# 查看已发布文章\nwechat-pub publish list\n\n# 删除草稿\nwechat-pub draft delete <media-id>\n```\n\n## 下一步\n\n- 阅读完整文档：[SKILL.md](../SKILL.md)\n- 查看主题示例：[themes.md](./themes.md)\n- 了解 API 用法：https://github.com/sipingme/wechat-md-publisher\n\nFile v1.0.10:references/themes.md\n\n# WeChat Publisher - 主题使用指南\n\n## 6 个内置主题\n\n`wechat-md-publisher` 提供 6 个专为微信公众号优化的内置主题，开箱即用。\n\n### 1. default - 默认主题\n\n**风格**：简洁清爽，适合各类文章\n\n**适用场景**：\n- 企业公告、正式通知\n- 技术文档、学术文章\n- 通用内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme default\n```\n\n---\n\n### 2. blackink - Black Ink\n\n**风格**：深色模式，靛蓝点缀，适合夜间阅读\n\n**适用场景**：\n- 夜间阅读类内容\n- 科技、极客风格文章\n- 深色调品牌内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme blackink\n```\n\n---\n\n### 3. orangesun - Orange Sun\n\n**风格**：温暖明亮，橙色阳光系\n\n**适用场景**：\n- 生活类、旅行类文章\n- 轻松活泼的内容\n- 节日推送\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme orangesun\n```\n\n---\n\n### 4. redruby - Red Ruby\n\n**风格**：优雅大气，宝石红点缀\n\n**适用场景**：\n- 品牌介绍、时尚类文章\n- 重要公告、活动推广\n- 视觉冲击力强的内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme redruby\n```\n\n---\n\n### 5. greenmint - Green Mint\n\n**风格**：清新自然，薄荷绿色调\n\n**适用场景**：\n- 健康、环保类文章\n- 教程指南\n- 清新风格内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme greenmint\n```\n\n---\n\n### 6. purplerain - Purple Rain\n\n**风格**：梦幻浪漫，紫色渐变\n\n**适用场景**：\n- 文艺类、情感类文章\n- 个人博客\n- 创意内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme purplerain\n```\n\n---\n\n## 主题选择建议\n\n### 按内容类型选择\n\n| 内容类型 | 推荐主题 | 备选主题 |\n|---------|---------|---------|\n| 技术文章 | default | blackink |\n| 生活分享 | orangesun | greenmint |\n| 品牌时尚 | redruby | purplerain |\n| 教育内容 | greenmint | default |\n| 文艺情感 | purplerain | orangesun |\n| 正式公告 | default | redruby |\n| 夜间/深色 | blackink | - |\n\n### 按品牌调性选择\n\n- **专业简洁**：default\n- **温暖活力**：orangesun、greenmint\n- **优雅大气**：redruby、purplerain\n- **深色极简**：blackink\n\n---\n\n## 查看可用主题\n\n```bash\nwechat-pub theme list\n```\n\n输出示例：\n```\n┌─────────────┬──────────────┬──────────┬────────────────────────────┐\n│ ID          │ 名称         │ 类型     │ 描述                       │\n├─────────────┼──────────────┼──────────┼────────────────────────────┤\n│ default     │ 默认主题     │ builtin  │ 简洁清爽的默认样式         │\n│ blackink    │ Black Ink    │ builtin  │ 深色模式，靛蓝点缀         │\n│ orangesun   │ Orange Sun   │ builtin  │ 温暖明亮的橙色系主题       │\n│ redruby     │ Red Ruby     │ builtin  │ 优雅的宝石红风格           │\n│ greenmint   │ Green Mint   │ builtin  │ 清新薄荷绿，轻松舒适       │\n│ purplerain  │ Purple Rain  │ builtin  │ 梦幻紫色渐变               │\n└─────────────┴──────────────┴──────────┴────────────────────────────┘\n```\n\n---\n\n## 测试所有主题\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 主题测试\n---\n\n# 标题一\n\n这是正文内容。\n\n## 标题二\n\n- 列表项 1\n- 列表项 2\n\n**粗体文本** 和 *斜体文本*\nEOF\n\n# 测试所有主题（创建草稿对比）\nfor theme in default blackink orangesun redruby greenmint purplerain; do\n    echo \"测试主题: $theme\"\n    wechat-pub draft create --file test.md --theme $theme\ndone\n```\n\n然后在微信公众平台查看对比效果。\n\n---\n\n## 自定义主题\n\n如果内置主题不满足需求，可以创建自定义主题：\n\n### 1. 创建 CSS 文件\n\n```css\n/* my-theme.css */\n#wenyan {\n    font-size: 16px;\n    line-height: 1.8;\n    color: #2c3e50;\n}\n\n#wenyan h1 {\n    color: #ff6b6b;\n    border-bottom: 3px solid #ff6b6b;\n}\n```\n\n### 2. 添加主题\n\n```bash\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n```\n\n### 3. 使用主题\n\n```bash\nwechat-pub publish create --file article.md --theme my-theme\n```\n\n---\n\n## 常见问题\n\n### Q: 如何查看所有可用主题？\n\n```bash\nwechat-pub theme list\n```\n\n### Q: 主题可以修改吗？\n\n内置主题不可修改，但可以创建自定义主题，基于内置主题的 CSS 另存为新主题。\n\n### Q: 发布后可以更换主题吗？\n\n不可以。已发布的文章主题无法更改，需要删除原文章后用新主题重新发布。\n\nFile v1.0.10:config.json\n\n{\n  \"name\": \"wechat-md-publisher\",\n  \"version\": \"1.0.7\",\n  \"requiredEnvVars\": [],\n  \"optionalEnvVars\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n  \"requires\": {\n    \"runtime\": {\n      \"node\": \">=18.0.0\"\n    },\n    \"binaries\": [\n      {\n        \"name\": \"wechat-pub\",\n        \"providedBy\": \"wechat-md-publisher\",\n        \"install\": \"npm install -g wechat-md-publisher@^1.0.7\",\n        \"verify\": \"node -e \\\"require.resolve('wechat-md-publisher/package.json')\\\"\"\n      }\n    ],\n    \"packages\": {\n      \"global\": [\n        \"wechat-md-publisher@^1.0.7\"\n      ]\n    }\n  },\n  \"skill\": {\n    \"name\": \"wechat-md-publisher\",\n    \"version\": \"1.0.7\",\n    \"enabled\": true,\n    \"autoInvoke\": false\n  },\n  \"commands\": {\n    \"publish\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"publish\"],\n      \"description\": \"发布文章到微信公众号\"\n    },\n    \"draft\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"draft\"],\n      \"description\": \"创建微信公众号草稿\"\n    },\n    \"wrapper\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"wrapper\"],\n      \"description\": \"Wrapper 功能管理（文章开头/结尾固定图文）\"\n    },\n    \"list-drafts\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-drafts\"],\n      \"description\": \"列出所有草稿\"\n    },\n    \"list-published\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-published\"],\n      \"description\": \"列出已发布文章\"\n    },\n    \"themes\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"themes\"],\n      \"description\": \"列出可用主题\"\n    },\n    \"help\": {\n      \"script\": \"./scripts/postinstall.js\",\n      \"args\": [],\n      \"description\": \"显示使用帮助\"\n    }\n  },\n  \"environment\": {\n    \"required\": [\n      \"NODE_VERSION>=18.0.0\"\n    ],\n    \"optional\": [\n      \"WECHAT_APP_ID\",\n      \"WECHAT_APP_SECRET\"\n    ],\n    \"note\": \"凭证可通过环境变量或 CLI 命令 (account add --app-id xxx --app-secret xxx) 提供\"\n  },\n  \"install\": {\n    \"type\": \"npm-global\",\n    \"package\": \"wechat-md-publisher\",\n    \"version\": \"^1.0.7\",\n    \"execution\": \"npm install -g wechat-md-publisher@^1.0.7\",\n    \"global\": true,\n    \"autoInstall\": false,\n    \"autoUpdate\": false,\n    \"riskLevel\": \"low\",\n    \"riskReason\": \"Skill 不再通过 npx 动态拉取或执行子进程；脚本以 in-process 动态 import 调用本机已安装的 wechat-md-publisher，不再产生供应链运行时下载或 shell 调用。\",\n    \"requiresApproval\": true,\n    \"source\": {\n      \"type\": \"npm\",\n      \"registry\": \"https://registry.npmjs.org\",\n      \"package\": \"wechat-md-publisher\",\n      \"repository\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"license\": \"Apache-2.0\",\n      \"audit\": \"https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\"\n    },\n    \"verification\": {\n      \"command\": \"node -e \\\"require.resolve('wechat-md-publisher/package.json')\\\"\",\n      \"expectedOutput\": \"\"\n    }\n  },\n  \"dependencies\": {\n    \"npm\": [\n      \"wechat-md-publisher@^1.0.7\"\n    ],\n    \"note\": \"Dependencies (jsdom, form-data-encoder, formdata-node) are bundled in wechat-md-publisher\"\n  },\n  \"credentials\": {\n    \"required\": [],\n    \"optional\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n    \"note\": \"凭证可通过环境变量或 CLI 命令提供（二选一）\",\n    \"storage\": {\n      \"location\": \"~/.config/wechat-md-publisher-nodejs/\",\n      \"encryption\": \"AES-256\",\n      \"handler\": \"wechat-md-publisher npm 包\",\n      \"handlerRepo\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"auditFile\": \"src/services/account.ts\"\n    },\n    \"securityNote\": \"凭证加密由上游 npm 包处理。使用前请审计 https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\"\n  },\n  \"permissions\": {\n    \"filesystem\": {\n      \"read\": [\"*.md\", \"*.jpg\", \"*.png\", \"*.gif\"],\n      \"write\": [\"~/.config/wechat-md-publisher-nodejs/\"]\n    },\n    \"network\": {\n      \"domains\": [\"api.weixin.qq.com\", \"mp.weixin.qq.com\"]\n    }\n  }\n}\n\nArchive v1.0.9: 9 files, 25236 bytes\n\nFiles: config.json (3538b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (5051b), scripts/postinstall.js (2531b), scripts/run.js (9364b), SKILL.md (24319b), _meta.json (144b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: wechat-md-publisher\ndescription: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\nversion: 1.0.7\nauthor: Ping Si <sipingme@gmail.com>\nuser-invocable: true\nrequires:\n  runtime:\n    - name: node\n      version: \">=18.0.0\"\n    - name: npm\n      version: \">=8.0.0\"\ninstall:\n  type: npx\n  package: wechat-md-publisher\n  version: \"^1.0.7\"\n  execution: \"npx --yes wechat-md-publisher@^1.0.7\"\n  riskLevel: moderate\n  riskReason: \"通过 npx 动态拉取并执行第三方 npm 包，存在供应链风险。使用前请审计源码。\"\n  source:\n    registry: https://registry.npmjs.org\n    repository: https://github.com/sipingme/wechat-md-publisher\n    license: Apache-2.0\n    audit: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\nenv:\n  optional:\n    - name: WECHAT_APP_ID\n      description: 微信公众号 AppID\n      sensitive: false\n    - name: WECHAT_APP_SECRET\n      description: 微信公众号 AppSecret\n      sensitive: true\n  note: |\n    凭证可通过两种方式提供（二选一）：\n    1. 环境变量（推荐，避免凭证暴露在进程列表中）\n    2. CLI 命令：`account add --app-id xxx --app-secret xxx`\nconfigPaths:\n  - path: ~/.config/wechat-md-publisher-nodejs/\n    description: 账号配置和缓存目录\n    contains:\n      - credentials: true\n      - encryption: AES-256\npermissions:\n  filesystem:\n    read:\n      - \"*.md\": \"读取用户指定的 Markdown 文件\"\n      - \"*.jpg,*.png,*.gif\": \"读取文章中引用的本地图片\"\n    write:\n      - \"~/.config/wechat-md-publisher-nodejs/\": \"存储账号配置和缓存（凭证使用 AES-256 加密）\"\n  network:\n    required:\n      - \"api.weixin.qq.com\": \"微信公众号 API（发布、草稿、素材管理）\"\n      - \"mp.weixin.qq.com\": \"微信公众号素材上传\"\n    optional:\n      - \"remote-theme-api\": \"仅当用户使用 theme add-remote 命令时才会访问（⚠️ 需用户明确配置并信任该端点）\"\ncredentials:\n  - name: WECHAT_APP_SECRET\n    type: api-secret\n    storage:\n      location: ~/.config/wechat-md-publisher-nodejs/\n      encryption: AES-256\n      handler: wechat-md-publisher npm 包\n      handlerRepo: https://github.com/sipingme/wechat-md-publisher\n    consent: 需要用户明确提供，不会自动收集\n    securityNote: |\n      本 skill 不直接处理凭证加密，安全性依赖上游 npm 包的实现。\n      建议在提供凭证前审查 wechat-md-publisher 包的加密实现：\n      https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\ntags:\n  - wechat\n  - publishing\n  - markdown\n  - content-management\nrepository: https://github.com/sipingme/wechat-md-publisher\n---\n\n# WeChat Publisher Skill\n\n全功能微信公众号 Markdown 发布工具 - 让 AI 能够直接将内容发布到微信公众号。\n\n## ⚠️ 重要提示\n\n**推荐使用方式**：\n- ✅ **最佳实践**：与 `news-to-markdown-skill` 配合使用，实现一键转载新闻到微信公众号\n- 🌐 **固定公网 IP**：必须有固定公网 IP 并配置到微信公众平台的 IP 白名单\n- 🔑 **必需凭证**：必须配置 `WECHAT_APP_ID` 和 `WECHAT_APP_SECRET` 环境变量或通过命令行配置\n\n**关键要求**：\n1. **固定公网 IP**：微信 API 要求服务器 IP 在白名单中，动态 IP 无法使用\n2. **微信公众号凭证**：需要从微信公众平台获取 AppID 和 AppSecret\n3. **IP 白名单配置**：在微信公众平台「设置与开发」→「基本配置」→「IP 白名单」中添加你的公网 IP\n\n## ⚡ 快速开始\n\n### ⚠️ 安全风险提示\n\n**供应链风险**：本 Skill 通过 `npx` 动态拉取并执行第三方 npm 包 `wechat-md-publisher`。使用前请审计源码：\n- **源码仓库**: https://github.com/sipingme/wechat-md-publisher\n- **审计入口**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n\n**凭证存储**：账号凭证存储在 `~/.config/wechat-md-publisher-nodejs/`，使用 AES-256 加密。\n\n**远程主题风险**：如果使用 `theme add-remote` 添加远程主题，第三方端点可能接收文章内容。请只使用可信任的主题源。\n\n### 配置账号\n\n**推荐方式（使用环境变量，避免命令行暴露凭证）**：\n\n```bash\n# 设置环境变量（不会出现在进程列表中）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\n# 添加账号\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n**备选方式（命令行传参，注意：可能暴露在进程列表中）**：\n\n```bash\n# ⚠️ 警告：--app-secret 会出现在 ps 进程列表中\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 发布文章\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file article.md \\\n  --theme orangesun\n```\n\n### 与 news-to-markdown 配合使用\n\n```bash\n# 一键转载新闻到微信公众号（推荐：下载图片到本地）\n# news-to-markdown 会自动下载图片到本地，避免远程 URL 过期问题\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --download-images \\\n  --output-dir /tmp/article\n\n# wechat-md-publisher 会自动读取本地图片并上传\nnpx --yes wechat-md-publisher@^1.0.7 publish create --file /tmp/article/article.md --theme orangesun\n```\n\n**图片处理最佳实践**（v0.8.3+）：\n- ✅ **推荐**：使用 `--download-images` 下载图片到本地\n  - 避免远程 URL 签名过期（如头条图片）\n  - 避免防盗链问题\n  - 提高发布成功率\n- news-to-markdown 自动提取封面图（og:image > twitter:image > 第一张图片）\n- 图片保存到 `./images/` 目录，Markdown 使用相对路径\n- wechat-md-publisher 自动上传本地图片到微信素材库\n- 完全自动化，无需手动处理\n\n---\n\n## 🎯 何时使用此 Skill\n\n当用户需要以下操作时，应触发此 Skill：\n\n- ✅ 发布文章到微信公众号\n- ✅ 创建微信公众号草稿\n- ✅ 管理微信公众号账号\n- ✅ 查看已发布的文章列表\n- ✅ 删除草稿或已发布文章\n- ✅ 使用不同主题渲染 Markdown\n- ✅ 在文章开头/结尾添加固定图文（Wrapper 功能）\n- ✅ 查看或回滚 Wrapper 历史版本\n\n**触发关键词**：\n- \"发布到微信公众号\"\n- \"创建微信草稿\"\n- \"配置微信公众号\"\n- \"查看微信文章\"\n- \"使用 [主题名] 主题发布\"\n- \"文章开头结尾固定内容\"\n- \"Wrapper\"\n\n## 📋 前置要求\n\n### 1. 系统要求\n- Node.js >= 18.0.0\n- npm 或 pnpm 包管理器\n- 网络连接（访问微信 API）\n\n### 2. 微信公众号配置\n用户必须拥有微信公众号并获取：\n- **AppID**：开发者 ID\n- **AppSecret**：开发者密码\n- **IP 白名单**：必须配置（重要！）\n\n获取方式：\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. **配置 IP 白名单**（必须！）：\n   - 获取当前 IP：`curl ifconfig.me`\n   - 在「IP白名单」中添加该 IP\n   - 详细指南：[IP 白名单配置指南](./references/ip-whitelist-guide.md)\n\n### 3. 使用方式\n\n本 Skill 通过 `npx` 动态执行，无需全局安装：\n\n```bash\n# 查看帮助\nnpx --yes wechat-md-publisher@^1.0.7 --help\n```\n\n## 🚀 标准操作流程 (SOP)\n\n### 操作 1：配置微信公众号账号\n\n**场景**：首次使用或添加新账号\n\n**步骤**：\n\n1. 收集用户提供的账号信息（AppID 和 AppSecret）\n2. 执行命令添加账号：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"账号名称\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n3. 验证账号添加成功：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 account list\n```\n\n**输出示例**：\n```\n┌────────────┬──────────────┬────────────────┬─────────┐\n│ ID         │ 名称         │ AppID          │ 默认    │\n├────────────┼──────────────┼────────────────┼─────────┤\n│ acc_xxx    │ 我的公众号   │ wx123456       │ ✓       │\n└────────────┴──────────────┴────────────────┴─────────┘\n```\n\n**异常处理**：\n- 如果 AppID/AppSecret 错误，会提示\"认证失败\"\n- 如果网络问题，会提示\"无法连接到微信服务器\"\n- 解决方案：检查凭证是否正确，确认 IP 在白名单中\n\n---\n\n### 操作 2：创建并发布文章（一步到位）\n\n**场景**：用户提供 Markdown 内容，直接发布到公众号\n\n**步骤**：\n\n1. 将用户的 Markdown 内容保存到临时文件：\n\n```bash\ncat > /tmp/article.md << 'EOF'\n---\ntitle: 文章标题\nauthor: 作者名\n---\n\n# 文章内容\n\n这里是正文...\nEOF\n```\n\n2. 执行发布命令：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file /tmp/article.md \\\n  --theme orangesun\n```\n\n3. 解析输出，提取 `publish_id`\n\n**输出示例**：\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n4. 向用户报告成功，并提供发布 ID\n\n**可用主题**：\n- `default` - 默认主题（简洁清爽）\n- `orangesun` - Orange Sun（温暖明亮）\n- `redruby` - Red Ruby（优雅醒目）\n- `greenmint` - Green Mint（清新舒适）\n- `purplerain` - Purple Rain（梦幻柔和）\n- `blackink` - Black Ink（深色模式）\n\n**异常处理**：\n- 图片上传失败：检查图片路径和网络\n- Token 过期：自动刷新，无需手动处理\n- 内容违规：微信会返回错误码，提示用户修改内容\n\n---\n\n### 操作 3：创建草稿（不立即发布）\n\n**场景**：用户想先创建草稿，稍后再发布\n\n**步骤**：\n\n1. 保存 Markdown 内容到文件\n2. 执行草稿创建命令：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft create \\\n  --file /tmp/article.md \\\n  --theme default\n```\n\n3. 记录返回的 `media_id`\n\n**输出示例**：\n```\n✓ 草稿创建成功\n\nMedia ID: 3_abcdefghijk123456\n```\n\n4. 告知用户草稿已创建，可以在微信公众平台查看\n\n**后续操作**：\n- 用户可以在微信公众平台编辑草稿\n- 需要发布时，使用 `npx --yes wechat-md-publisher@^1.0.7 publish submit <media-id>`\n\n---\n\n### 操作 4：查看草稿列表\n\n**场景**：用户想查看所有草稿\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 15 个草稿\n\n┌──────────────────┬────────────────┬────────────────┐\n│ Media ID         │ 标题           │ 更新时间       │\n├──────────────────┼────────────────┼────────────────┤\n│ 3_abc123         │ 测试文章       │ 2026-03-19     │\n│ 3_def456         │ 产品介绍       │ 2026-03-18     │\n└──────────────────┴────────────────┴────────────────┘\n```\n\n---\n\n### 操作 5：查看已发布文章\n\n**场景**：用户想查看已发布的文章\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 8 篇已发布文章\n\n┌──────────────┬────────────────┬────────────────┬──────────────────┐\n│ Article ID   │ 标题           │ 发布时间       │ URL              │\n├──────────────┼────────────────┼────────────────┼──────────────────┤\n│ 2247483647_1 │ 最新文章       │ 2026-03-19     │ https://mp.we... │\n└──────────────┴────────────────┴────────────────┴──────────────────┘\n```\n\n---\n\n### 操作 6：删除草稿或文章\n\n**删除草稿**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft delete <media-id>\n```\n\n**删除已发布文章**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish delete <article-id>\n```\n\n---\n\n### 操作 7：查看可用主题\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 theme list\n```\n\n**输出示例**：\n```\n可用主题：\n\n┌─────────────┬──────────────┬────────────────────┐\n│ ID          │ 名称         │ 描述               │\n├─────────────┼──────────────┼────────────────────┤\n│ default     │ 默认主题     │ 简洁清爽风格       │\n│ orangesun   │ Orange Sun   │ 温暖明亮风格       │\n│ redruby     │ Red Ruby     │ 优雅醒目风格       │\n│ greenmint   │ Green Mint   │ 清新舒适风格       │\n│ purplerain  │ Purple Rain  │ 梦幻柔和风格       │\n│ blackink    │ Black Ink    │ 深色模式风格       │\n└─────────────┴──────────────┴────────────────────┘\n```\n\n\n---\n\n## 🔧 高级用法\n\n### Wrapper 功能：文章开头/结尾固定图文\n\n在发布文章时自动在开头和结尾添加固定的图文内容（如关注引导、底部二维码等）。\n\n**开启功能**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper on\n```\n\n**设置内容**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper set \\\n  --header \"<div>欢迎关注我们的公众号</div>\" \\\n  --footer \"<div>觉得有帮助请点赞+收藏</div>\"\n```\n\n**查看状态**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper status\n```\n\n**查看历史版本**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper history\n```\n\n**回滚到指定版本**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper rollback 1\n```\n\n**关闭功能**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper off\n```\n\n**注意事项**：\n- 功能默认关闭，需要手动开启\n- 每次 `set` 会创建新版本，支持历史回滚\n- 图片处理：目前直接存储原始 HTML，需要公网可访问的图片 URL\n- 数据库文件：`data/wmp.db`\n\n---\n\n### 使用编程 API\n\n如果需要在代码中集成：\n\n```javascript\nconst { container } = require('wechat-md-publisher');\n\nasync function publishArticle(markdown, theme) {\n  await container.initialize();\n  \n  const publishService = await container.getPublishService();\n  const result = await publishService.createAndPublish({\n    markdown: markdown,\n    theme: theme || 'default',\n  });\n  \n  return result.publish_id;\n}\n```\n\n### 批量发布\n\n```bash\n# 批量创建草稿\nfor file in articles/*.md; do\n    npx --yes wechat-md-publisher@^1.0.7 draft create --file \"$file\" --theme default\ndone\n```\n\n---\n\n## 📊 输入输出规范\n\n### 输入格式\n\n**Markdown 文件格式**：\n\n```markdown\n---\ntitle: 文章标题（必需）\nauthor: 作者名（可选）\ncover: ./cover.jpg（可选，封面图路径）\n---\n\n# 正文标题\n\n正文内容...\n\n![图片描述](./image.jpg)\n```\n\n**支持的图片格式**：\n- 本地图片：相对路径或绝对路径\n- 网络图片：HTTP/HTTPS URL\n- 微信图片：微信 CDN URL（自动识别）\n\n### 输出格式\n\n**成功响应**：\n```json\n{\n  \"success\": true,\n  \"publish_id\": \"2247483647_1\",\n  \"message\": \"发布成功\"\n}\n```\n\n**错误响应**：\n```json\n{\n  \"success\": false,\n  \"error\": \"错误信息\",\n  \"code\": \"ERROR_CODE\"\n}\n```\n\n---\n\n## ⚠️ 常见问题和解决方案\n\n### 问题 1：Token 过期\n\n**症状**：提示\"access_token 无效\"\n\n**解决**：Token 会自动刷新，如果仍有问题，重新配置账号\n\n### 问题 2：图片上传失败\n\n**症状**：提示\"图片上传失败\"\n\n**原因**：\n- 图片路径错误\n- 图片大小超限（微信限制 10MB）\n- 服务器 IP 不在白名单\n\n**解决**：\n- 检查图片路径\n- 压缩图片\n- 在微信公众平台添加 IP 到白名单\n\n### 问题 3：找不到主题\n\n**症状**：提示\"主题不存在\"\n\n**解决**：使用 `npx --yes wechat-md-publisher@^1.0.7 theme list` 查看可用主题\n\n### 问题 4：权限不足\n\n**症状**：提示\"没有权限\"\n\n**原因**：AppID/AppSecret 错误或权限不足\n\n**解决**：\n- 确认凭证正确\n- 确认公众号类型支持该功能（服务号 vs 订阅号）\n\n---\n\n## 🔒 安全性说明\n\n### 敏感信息处理\n\n- AppID 和 AppSecret 存储在本地配置文件中\n- 配置文件位置：\n  - macOS: `~/Library/Preferences/wechat-md-publisher-nodejs/config.json`\n  - Linux: `~/.config/wechat-md-publisher-nodejs/config.json`\n  - Windows: `%APPDATA%\\wechat-md-publisher-nodejs\\Config\\config.json`\n\n### 权限要求\n\n- 读取本地文件（Markdown 和图片）\n- 网络访问（微信 API）\n- 写入配置文件\n\n### 数据隐私\n\n- 不会上传任何数据到第三方服务器\n- 所有通信仅限于微信官方 API\n- 图片缓存仅在本地\n\n---\n\n## 📚 参考资料\n\n- [项目 GitHub](https://github.com/sipingme/wechat-md-publisher)\n- [微信公众平台文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)\n- [完整 API 文档](https://github.com/sipingme/wechat-md-publisher/blob/main/docs/API.md)\n\n---\n\n## 🎓 示例对话\n\n**用户**：帮我把这篇文章发布到微信公众号\n\n**AI**：好的，我来帮你发布。请提供文章的 Markdown 内容。\n\n**用户**：[提供内容]\n\n**AI**：收到！我将使用 orangesun 主题发布。正在处理...\n\n[执行命令]\n\n**AI**：✅ 文章已成功发布到微信公众号！\n- 发布 ID: 2247483647_1\n- 你可以在微信公众平台查看和管理这篇文章\n\n---\n\n## 📝 维护说明\n\n- **版本**: 1.0.7\n- **最后更新**: 2026-04-26\n- **更新内容**: \n  - 明确内置主题为 6 个自定义主题（default, blackink, orangesun, redruby, greenmint, purplerain）\n  - 移除历史遗留的 wenyan-core 主题注册（lapis, maize 等），避免加载不存在的主题\n  - 更新 THEMES.md 文档与实际可用主题保持一致\n- **维护者**: Ping Si <sipingme@gmail.com>\n- **许可证**: Apache-2.0\n\n---\n\n## ✅ 首次成功检查清单\n\n新用户应该能在 5 分钟内完成：\n\n- [ ] 验证工具可用：`npx --yes wechat-md-publisher@^1.0.7 --version`\n- [ ] 配置账号：`npx --yes wechat-md-publisher@^1.0.7 account add ...`\n- [ ] 创建测试文章\n- [ ] 发布成功：`npx --yes wechat-md-publisher@^1.0.7 publish create --file test.md --theme default`\n- [ ] 在微信公众平台看到文章\n\n如果以上步骤都能顺利完成，说明 Skill 已正确配置！\n\n---\n\n## 🔗 与其他 Skills 配合使用\n\n### 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：`news-to-markdown-skill` + `wechat-md-publisher-skill` = 一键转载新闻到微信公众号\n\n#### 使用场景\n\n将网络上的新闻文章快速转载到微信公众号，实现内容聚合和分发。\n\n#### 完整工作流\n\n**场景 1：转载单篇新闻（推荐方式）**\n\n```bash\n# 步骤 1: 使用 news-to-markdown 提取新闻并下载图片\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article/article.md \\\n  --download-images \\\n  --output-dir /tmp/article \\\n  --verbose\n\n# 步骤 2: 使用 wechat-md-publisher 发布到微信\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file /tmp/article/article.md \\\n  --theme orangesun\n```\n\n**为什么要下载图片到本地？**\n- 头条图片 URL 包含签名和过期时间，几小时后会失效\n- 本地图片更可靠，不受网络波动影响\n- 避免防盗链导致的图片加载失败\n\n**场景 2：批量转载新闻**\n\n```bash\n# 新闻 URL 列表\nurls=(\n  \"https://www.toutiao.com/article/123\"\n  \"https://mp.weixin.qq.com/s/abc\"\n  \"https://www.xiaohongshu.com/explore/xyz\"\n)\n\n# 批量处理\nfor i in \"${!urls[@]}\"; do\n  url=\"${urls[$i]}\"\n  output_dir=\"/tmp/article-$i\"\n  \n  # 提取新闻并下载图片\n  convert-url --url \"$url\" \\\n    --output \"$output_dir/article.md\" \\\n    --download-images \\\n    --output-dir \"$output_dir\"\n  \n  # 发布到微信（创建草稿）\n  npx --yes wechat-md-publisher@^1.0.7 draft create \\\n    --file \"$output_dir/article.md\" \\\n    --theme default\n  \n  echo \"✓ 已处理: $url\"\ndone\n```\n\n**场景 3：AI 自动化工作流**\n\n用户对 AI 说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 执行流程：\n1. 使用 `news-to-markdown-skill` 提取文章内容\n2. 自动检测平台（头条/微信/小红书）\n3. 使用 `wechat-md-publisher-skill` 发布到微信\n4. 返回发布结果和链接\n\n#### 优势\n\n✅ **智能内容提取**\n- 自动识别新闻正文，过滤广告和噪音\n- 保留文章结构和格式\n- 提取标题、作者、发布时间等元数据\n\n✅ **多平台支持**\n- 头条：优化标题层级、列表、代码块\n- 微信：提取 `#js_content` 区域\n- 小红书：处理 `.note-content` 内容\n\n✅ **三层抓取策略**\n- curl → wget → Playwright\n- 确保动态页面也能正确抓取\n\n✅ **精美主题渲染**\n- 6 个精选内置主题可选\n- 自动处理图片上传\n- 保持排版美观\n\n#### 最佳实践\n\n**1. 内容审核**\n```bash\n# 先创建草稿，人工审核后再发布\nconvert-url --url \"$news_url\" --output /tmp/article.md\nnpx --yes wechat-md-publisher@^1.0.7 draft create --file /tmp/article.md --theme default\n\n# 审核通过后发布\nnpx --yes wechat-md-publisher@^1.0.7 publish submit <media-id>\n```\n\n**2. 添加来源声明**\n```bash\n# 提取时保留元数据\nconvert-url --url \"$news_url\" --output /tmp/article.md\n\n# 元数据会自动包含在 Markdown 中：\n# ---\n# title: 文章标题\n# author: 原作者\n# 来源: https://...\n# ---\n```\n\n**3. 选择合适主题**\n- 科技类文章：`default`、`blackink`（深色模式）\n- 生活类文章：`orangesun`（橙色阳光）、`greenmint`（薄荷绿）\n- 教程类文章：`default`、`greenmint`\n- 文艺情感：`purplerain`（紫色雨）、`orangesun`\n- 品牌时尚：`redruby`（宝石红）\n- 夜间阅读：`blackink`\n\n#### 示例对话\n\n**用户**：把这篇头条文章转到我的微信公众号\nhttps://www.toutiao.com/article/7000000000000000000/\n\n**AI**：好的，我来帮你处理：\n\n1. 正在提取文章内容...\n   ```\n   [INFO] 开始抓取: https://www.toutiao.com/article/...\n   [INFO] 检测到平台: toutiao\n   [INFO] 提取成功\n   ```\n\n2. 正在发布到微信公众号...\n   ```\n   ✓ 渲染完成\n   ✓ 图片处理完成\n   ✓ 创建草稿成功\n   ✓ 发布成功\n   ```\n\n✅ **完成！**\n- 文章标题：《xxx》\n- 发布 ID: 2247483647_1\n- 使用主题: orangesun\n- 你可以在微信公众平台查看\n\n#### 相关资源\n\n- **news-to-markdown-skill**: https://github.com/sipingme/news-to-markdown-skill\n- **news-to-markdown 核心库**: https://github.com/sipingme/news-to-markdown\n- **npm 包**: `npm install -g news-to-markdown`\n\n#### 技术栈\n\n```\n新闻网站\n    ↓\nnews-to-markdown (提取 + 转换)\n    ↓\nMarkdown 文件\n    ↓\nwechat-md-publisher (渲染 + 发布)\n    ↓\n微信公众号\n```\n\n---\n\n## 💡 更多组合可能\n\n### 与内容管理工具配合\n- 配合 Git 进行版本管理\n- 配合 CI/CD 实现自动发布\n- 配合数据库存储发布记录\n\n### 与 AI 工具配合\n- AI 生成内容 → wechat-md-publisher 发布\n- AI 润色文章 → wechat-md-publisher 发布\n- AI 翻译文章 → wechat-md-publisher 发布\n\nFile v1.0.9:README.md\n\n# WeChat MD Publisher - OpenClaw Skill\n\n> 全功能微信公众号 Markdown 发布工具 - OpenClaw Skill 版本\n\n## 🚀 快速安装\n\n### 方法 1：从 ClawHub 安装（推荐）\n\n```bash\nopenclaw skills install wechat-md-publisher\n```\n\n### 方法 2：从 GitHub 安装\n\n```bash\nopenclaw skills install https://github.com/sipingme/wechat-md-publisher-skill\n```\n\n### 方法 3：手动安装\n\n1. 克隆仓库：\n```bash\ngit clone https://github.com/sipingme/wechat-md-publisher-skill.git\ncd wechat-md-publisher-skill\n```\n\n2. 复制到 OpenClaw skills 目录：\n```bash\ncp -r . ~/.openclaw/skills/wechat-md-publisher/\n```\n\n3. 验证工具可用：\n```bash\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## ✅ 验证安装\n\n```bash\n# 检查 Skill 是否可用\nopenclaw skills list --eligible\n\n# 查看 Skill 详情\nopenclaw skills info wechat-md-publisher\n\n# 测试命令\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## 📋 首次配置\n\n### 1. 获取微信公众号凭证\n\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. 将服务器 IP 添加到「IP白名单」\n\n### 2. 配置账号\n\n```bash\n# 推荐：使用环境变量（避免命令行暴露凭证）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\nnpx --yes wechat-md-publisher@^1.0.6 account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n### 3. 测试发布\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 测试文章\n---\n# Hello World\n这是一篇测试文章。\nEOF\n\n# 发布\nnpx --yes wechat-md-publisher@^1.0.6 publish create --file test.md --theme default\n```\n\n## 🎯 使用方式\n\n### 在 OpenClaw 对话中使用\n\n**示例 1：发布文章**\n\n```\n用户: 帮我把这篇文章发布到微信公众号\n\n[提供 Markdown 内容]\n\nAI: 好的，我来帮你发布。正在使用 orangeheart 主题...\n✓ 文章已成功发布！发布 ID: 2247483647_1\n```\n\n**示例 2：创建草稿**\n\n```\n用户: 先创建一个草稿，不要立即发布\n\nAI: 明白，我会先创建草稿。\n✓ 草稿创建成功，Media ID: 3_abc123\n你可以在微信公众平台查看和编辑。\n```\n\n**示例 3：查看文章列表**\n\n```\n用户: 查看我已发布的微信文章\n\nAI: 正在获取列表...\n共 8 篇已发布文章：\n1. 最新文章 (2026-03-19)\n2. 产品介绍 (2026-03-18)\n...\n```\n\n### 手动调用 Skill\n\n```bash\n# 使用 OpenClaw 命令\nopenclaw run wechat-md-publisher publish article.md orangeheart\n\n# 或直接使用工具\nnpx --yes wechat-md-publisher@^1.0.6 publish create --file article.md --theme orangeheart\n```\n\n## � 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：一键转载新闻到微信公众号\n\n### 快速示例\n\n```bash\n# 1. 提取新闻文章\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --platform toutiao\n\n# 2. 发布到微信公众号\nnpx --yes wechat-md-publisher@^1.0.6 publish create \\\n  --file /tmp/article.md \\\n  --theme orangeheart\n```\n\n### AI 自动化工作流\n\n用户说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 自动执行：\n1. 使用 `news-to-markdown-skill` 提取文章\n2. 使用 `wechat-md-publisher-skill` 发布到微信\n3. 返回发布结果\n\n### 优势\n\n✅ **智能提取** - 自动识别正文，过滤广告  \n✅ **多平台支持** - 头条、微信、小红书  \n✅ **精美渲染** - 8+ 主题可选  \n✅ **一键发布** - 无需手动复制粘贴\n\n详见 [SKILL.md](./SKILL.md) 中的完整集成指南。\n\n---\n\n## �📚 文档\n\n- **[SKILL.md](./SKILL.md)** - 完整的 SOP 和使用指南（含 news-to-markdown 集成）\n- **[quick-start.md](./references/quick-start.md)** - 5 分钟快速上手\n- **[themes.md](./references/themes.md)** - 主题使用指南\n- **[ip-whitelist-guide.md](./references/ip-whitelist-guide.md)** - IP 白名单配置指南 ⚠️ 重要\n\n## 🎨 可用主题\n\n- `default` - 简洁经典\n- `orangeheart` - 温暖优雅 ⭐ 推荐\n- `rainbow` - 活泼清爽\n- `lapis` - 清新极简 ⭐ 推荐\n- `pie` - 现代锐利\n- `maize` - 柔和舒适\n- `purple` - 简约文艺\n- `phycat` - 薄荷清新\n- `sport` - 运动风 🏃 活力动感\n\n## 🔧 高级配置\n\n### 环境变量（可选）\n\n```bash\n# 在 ~/.bashrc 或 ~/.zshrc 中添加\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n```\n\n### 自定义主题\n\n```bash\n# 添加本地主题（推荐）\nnpx --yes wechat-md-publisher@^1.0.6 theme add-local --name my-theme --path ./my-theme.css\n\n# 添加远程主题 API（⚠️ 见下方安全警告）\nnpx --yes wechat-md-publisher@^1.0.6 theme add-remote --name md2wechat --url https://api.md2wechat.cn --key xxx\n```\n\n> ⚠️ **远程主题安全警告**：使用 `theme add-remote` 会向第三方服务器发送请求。请仅使用您信任的远程主题 API。远程主题端点不在本 skill 的默认网络权限范围内，需要用户明确配置并承担相应风险。\n\n## ⚠️ 常见问题\n\n### 问题 1：Skill 未被识别\n\n**解决**：\n```bash\nopenclaw skills refresh\nopenclaw skills info wechat-md-publisher\n```\n\n### 问题 2：权限错误\n\n**解决**：\n```bash\nchmod +x ~/.openclaw/skills/wechat-md-publisher/scripts/publish.js\n```\n\n### 问题 3：找不到命令\n\n**解决**：\n```bash\n# 本 Skill 使用 npx 动态执行，无需全局安装\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n### 问题 4：Token 过期\n\nToken 会自动刷新，如仍有问题：\n```bash\nnpx --yes wechat-md-publisher@^1.0.6 account remove <account-id>\nnpx --yes wechat-md-publisher@^1.0.6 account add --name \"新账号\" --default\n```\n\n### 问题 5：更新 Skill 后依赖未更新\n\n本 Skill 使用 `npx` 动态执行，会自动拉取指定版本的包。如需清除缓存：\n\n```bash\n# 清除 npx 缓存\nnpm cache clean --force\n\n# 验证版本\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## 🔒 安全性\n\n### 权限要求\n\n- ✅ 读取本地 Markdown 和图片文件\n- ✅ 网络访问（微信官方 API）\n- ✅ 写入配置文件到 `~/.config/wechat-md-publisher-nodejs/`\n- ⚠️ 可选：远程主题 API（仅当用户使用 `theme add-remote` 时）\n\n### 数据隐私\n\n- ✅ 默认情况下，所有通信仅限于微信官方 API\n- ✅ 配置文件仅存储在本地（凭证加密由 [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher) npm 包处理）\n- ❌ 不会自动收集用户信息\n- ⚠️ **例外**：如果用户配置了远程主题（`theme add-remote`），会向该第三方端点发送请求\n\n### 安全检查\n\n```bash\n# 使用 skill-vetter 检查（如果可用）\nopenclaw skills vet wechat-md-publisher\n```\n\n## 📊 Skill 评分\n\n根据 OpenClaw 社区标准：\n\n- ✅ **规范清晰度**: 5/5 - SKILL.md 结构完整\n- ✅ **首次成功时间**: 5/5 - 5 分钟内可完成\n- ✅ **实用性**: 5/5 - 解决实际发布需求\n- ✅ **安全性**: 5/5 - 权限合理，无恶意代码\n\n## 🤝 贡献\n\n欢迎贡献！\n\n- 报告问题：[GitHub Issues](https://github.com/sipingme/wechat-md-publisher/issues)\n- 提交改进：[Pull Requests](https://github.com/sipingme/wechat-md-publisher/pulls)\n- 讨论交流：[GitHub Discussions](https://github.com/sipingme/wechat-md-publisher/discussions)\n\n## 📜 许可证\n\nApache-2.0 License\n\n## 👤 作者\n\n**Ping Si** <sipingme@gmail.com>\n\n- GitHub: [@sipingme](https://github.com/sipingme)\n- 项目主页: [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher)\n\n## 🙏 致谢\n\n- [@wenyan-md/core](https://github.com/caol64/wenyan-core) - 提供精美主题和渲染引擎\n- OpenClaw 社区 - 提供优秀的 AI Agent 框架\n\n---\n\n**让 AI 能够直接发布内容到微信公众号！** 🚀\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn70nwj71rbkzwyvc7pkqs4p6s8222nc\",\n  \"slug\": \"wechat-md-publisher-skill\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1777450234338\n}\n\nFile v1.0.9:references/ip-whitelist-guide.md\n\n# 微信公众号 IP 白名单配置指南\n\n## 什么是 IP 白名单？\n\n微信公众号为了安全，要求所有调用 API 的服务器 IP 必须在白名单中。如果 IP 不在白名单，API 调用会失败。\n\n## 为什么需要配置？\n\n当你使用 `wechat-md-publisher` 发布文章时，工具会从你的电脑/服务器向微信 API 发送请求。微信会检查请求来源的 IP 地址，只有在白名单中的 IP 才能成功调用。\n\n## 如何获取你的 IP 地址？\n\n### 方法 1：使用命令行（推荐）\n\n```bash\n# macOS/Linux\ncurl ifconfig.me\n\n# 或\ncurl icanhazip.com\n\n# 或\ncurl ipinfo.io/ip\n```\n\n### 方法 2：访问网站\n\n访问以下任一网站查看你的公网 IP：\n- https://www.ip.cn/\n- https://ipinfo.io/\n- https://ifconfig.me/\n\n### 方法 3：在微信公众平台查看\n\n登录微信公众平台后，在 IP 白名单设置页面，微信会显示你当前的 IP 地址。\n\n## 如何配置 IP 白名单？\n\n### 步骤 1：登录微信公众平台\n\n访问 https://mp.weixin.qq.com/ 并登录\n\n### 步骤 2：进入 IP 白名单设置\n\n1. 点击左侧菜单「设置与开发」\n2. 点击「基本配置」\n3. 找到「IP白名单」部分\n4. 点击「修改」或「查看」\n\n### 步骤 3：添加 IP 地址\n\n1. 点击「添加」按钮\n2. 输入你的公网 IP 地址\n3. 点击「确定」\n\n**示例**：\n```\n123.456.789.012\n```\n\n### 步骤 4：验证配置\n\n添加后，等待 1-2 分钟生效，然后测试：\n\n```bash\nwechat-pub account list\n```\n\n如果能正常显示账号列表，说明配置成功。\n\n## 常见场景\n\n### 场景 1：在家里使用\n\n**问题**：家庭宽带的 IP 地址可能会变化\n\n**解决方案**：\n1. **短期方案**：每次 IP 变化后重新添加\n2. **长期方案**：\n   - 联系运营商申请固定 IP（可能需要付费）\n   - 使用云服务器部署（推荐）\n\n### 场景 2：在公司使用\n\n**问题**：公司可能使用固定 IP 或代理\n\n**解决方案**：\n1. 询问 IT 部门获取公司的公网出口 IP\n2. 将公司 IP 添加到白名单\n3. 如果公司使用代理，需要添加代理服务器的 IP\n\n### 场景 3：在云服务器使用\n\n**推荐方案**：\n1. 购买云服务器（阿里云、腾讯云、AWS 等）\n2. 云服务器通常有固定的公网 IP\n3. 将云服务器 IP 添加到白名单\n4. 在云服务器上安装和使用 `wechat-md-publisher`\n\n**优点**：\n- ✅ IP 固定，不会变化\n- ✅ 24/7 在线\n- ✅ 可以设置定时任务自动发布\n- ✅ 网络稳定\n\n### 场景 4：使用 VPN 或代理\n\n**问题**：VPN 会改变你的出口 IP\n\n**解决方案**：\n1. 关闭 VPN 后获取真实 IP\n2. 将真实 IP 添加到白名单\n3. 使用工具时关闭 VPN\n\n或者：\n1. 获取 VPN 的出口 IP\n2. 将 VPN IP 添加到白名单\n3. 使用工具时保持 VPN 连接\n\n## 多 IP 配置\n\n微信公众号支持添加多个 IP 地址（通常最多 10-20 个）。\n\n**适用场景**：\n- 在多个地点使用（家里、公司、咖啡厅）\n- 团队协作（多人使用）\n- 备用 IP（防止主 IP 失效）\n\n**配置方法**：\n在 IP 白名单页面，点击「添加」，逐个添加所有需要的 IP。\n\n## 安全建议\n\n### ✅ 推荐做法\n\n1. **只添加必要的 IP**\n   - 不要添加不信任的 IP\n   - 定期检查和清理不再使用的 IP\n\n2. **使用固定 IP**\n   - 云服务器（推荐）\n   - 固定宽带 IP\n\n3. **定期更新**\n   - IP 变化后及时更新白名单\n   - 删除不再使用的 IP\n\n### ❌ 不推荐做法\n\n1. **不要使用公共 WiFi**\n   - 公共 WiFi 的 IP 可能被多人共享\n   - 存在安全风险\n\n2. **不要添加 0.0.0.0 或通配符**\n   - 微信不支持通配符\n   - 必须添加具体的 IP 地址\n\n3. **不要分享你的 AppSecret**\n   - 即使 IP 在白名单中，也要保护好 AppSecret\n   - 不要将 AppSecret 提交到 Git 仓库\n\n## 故障排查\n\n### 错误：IP 不在白名单\n\n**症状**：\n```\n错误码: 40164\n错误信息: invalid ip xxx.xxx.xxx.xxx, not in whitelist\n```\n\n**解决步骤**：\n\n1. **确认当前 IP**：\n   ```bash\n   curl ifconfig.me\n   ```\n\n2. **检查白名单**：\n   - 登录微信公众平台\n   - 查看 IP 白名单列表\n   - 确认当前 IP 是否在列表中\n\n3. **添加 IP**：\n   - 如果不在，添加当前 IP\n   - 等待 1-2 分钟生效\n\n4. **重试**：\n   ```bash\n   wechat-pub account list\n   ```\n\n### 错误：IP 频繁变化\n\n**症状**：今天能用，明天就不能用了\n\n**原因**：家庭宽带 IP 动态分配\n\n**解决方案**：\n\n**方案 1：使用云服务器（推荐）**\n```bash\n# 1. 购买云服务器（最低配置即可）\n# 2. 在云服务器上安装工具\nssh user@your-server-ip\nnpm install -g wechat-md-publisher\n\n# 3. 配置账号\nwechat-pub account add --name \"公众号\" --app-id xxx --app-secret xxx\n\n# 4. 使用\nwechat-pub publish create --file article.md --theme default\n```\n\n**方案 2：申请固定 IP**\n- 联系宽带运营商\n- 申请固定公网 IP（可能需要额外费用）\n\n**方案 3：使用 DDNS**\n- 配置动态 DNS\n- 使用脚本自动更新白名单（需要开发）\n\n## 自动化脚本\n\n### 检查 IP 是否变化\n\n```bash\n#!/bin/bash\n# check-ip.sh\n\nCURRENT_IP=$(curl -s ifconfig.me)\nSAVED_IP=$(cat ~/.wechat-pub-ip 2>/dev/null)\n\nif [ \"$CURRENT_IP\" != \"$SAVED_IP\" ]; then\n    echo \"⚠️  IP 已变化！\"\n    echo \"旧 IP: $SAVED_IP\"\n    echo \"新 IP: $CURRENT_IP\"\n    echo \"请更新微信公众平台的 IP 白名单\"\n    echo \"$CURRENT_IP\" > ~/.wechat-pub-ip\nelse\n    echo \"✓ IP 未变化: $CURRENT_IP\"\nfi\n```\n\n使用：\n```bash\nchmod +x check-ip.sh\n./check-ip.sh\n```\n\n## 推荐配置\n\n### 个人用户\n\n**推荐方案**：使用云服务器\n- 成本：约 10-30 元/月\n- 优点：IP 固定、稳定可靠\n- 推荐服务商：阿里云、腾讯云、华为云\n\n### 企业用户\n\n**推荐方案**：公司服务器 + 固定 IP\n- 在公司内网服务器部署\n- 配置公司出口 IP 到白名单\n- 设置定时任务自动发布\n\n### 团队协作\n\n**推荐方案**：共享云服务器\n- 团队共用一台云服务器\n- 所有成员通过 SSH 访问\n- 统一的 IP 地址\n\n## 总结\n\n1. ✅ **必须配置 IP 白名单**才能使用微信公众号 API\n2. ✅ 使用 `curl ifconfig.me` 获取当前 IP\n3. ✅ 在微信公众平台添加 IP 到白名单\n4. ✅ 推荐使用云服务器获得固定 IP\n5. ✅ 定期检查和更新 IP 白名单\n\n## 相关链接\n\n- [微信公众平台](https://mp.weixin.qq.com/)\n- [微信公众号开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html)\n- [IP 白名单说明](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)\n\n---\n\n如有问题，请查看 [SKILL.md](../SKILL.md) 或提交 [Issue](https://github.com/sipingme/wechat-md-publisher/issues)。\n\nFile v1.0.9:references/quick-start.md\n\n# WeChat Publisher - 快速开始指南\n\n## 5 分钟快速上手\n\n### 步骤 1：安装工具（1 分钟）\n\n```bash\nnpm install -g wechat-md-publisher\n```\n\n### 步骤 2：配置账号（2 分钟）\n\n1. 获取微信公众号凭证：\n   - 登录 https://mp.weixin.qq.com/\n   - 进入「设置与开发」→「基本配置」\n   - 复制 AppID 和 AppSecret\n\n2. 添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 步骤 3：创建测试文章（1 分钟）\n\n```bash\ncat > test-article.md << 'EOF'\n---\ntitle: 测试文章\nauthor: 测试作者\n---\n\n# 欢迎使用 WeChat Publisher\n\n这是一篇测试文章。\n\n## 主要特性\n\n- 完整的草稿管理\n- 8 个精美主题\n- 智能图片处理\nEOF\n```\n\n### 步骤 4：发布文章（1 分钟）\n\n```bash\nwechat-pub publish create --file test-article.md --theme orangeheart\n```\n\n### 验证成功\n\n如果看到以下输出，说明配置成功：\n\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n现在可以在微信公众平台查看你的文章了！\n\n## 常用命令速查\n\n```bash\n# 查看所有主题\nwechat-pub theme list\n\n# 创建草稿\nwechat-pub draft create --file article.md --theme lapis\n\n# 查看草稿列表\nwechat-pub draft list\n\n# 查看已发布文章\nwechat-pub publish list\n\n# 删除草稿\nwechat-pub draft delete <media-id>\n```\n\n## 下一步\n\n- 阅读完整文档：[SKILL.md](../SKILL.md)\n- 查看主题示例：[themes.md](./themes.md)\n- 了解 API 用法：https://github.com/sipingme/wechat-md-publisher\n\nFile v1.0.9:references/themes.md\n\n# WeChat Publisher - 主题使用指南\n\n## 6 个内置主题\n\n`wechat-md-publisher` 提供 6 个专为微信公众号优化的内置主题，开箱即用。\n\n### 1. default - 默认主题\n\n**风格**：简洁清爽，适合各类文章\n\n**适用场景**：\n- 企业公告、正式通知\n- 技术文档、学术文章\n- 通用内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme default\n```\n\n---\n\n### 2. blackink - Black Ink\n\n**风格**：深色模式，靛蓝点缀，适合夜间阅读\n\n**适用场景**：\n- 夜间阅读类内容\n- 科技、极客风格文章\n- 深色调品牌内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme blackink\n```\n\n---\n\n### 3. orangesun - Orange Sun\n\n**风格**：温暖明亮，橙色阳光系\n\n**适用场景**：\n- 生活类、旅行类文章\n- 轻松活泼的内容\n- 节日推送\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme orangesun\n```\n\n---\n\n### 4. redruby - Red Ruby\n\n**风格**：优雅大气，宝石红点缀\n\n**适用场景**：\n- 品牌介绍、时尚类文章\n- 重要公告、活动推广\n- 视觉冲击力强的内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme redruby\n```\n\n---\n\n### 5. greenmint - Green Mint\n\n**风格**：清新自然，薄荷绿色调\n\n**适用场景**：\n- 健康、环保类文章\n- 教程指南\n- 清新风格内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme greenmint\n```\n\n---\n\n### 6. purplerain - Purple Rain\n\n**风格**：梦幻浪漫，紫色渐变\n\n**适用场景**：\n- 文艺类、情感类文章\n- 个人博客\n- 创意内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme purplerain\n```\n\n---\n\n## 主题选择建议\n\n### 按内容类型选择\n\n| 内容类型 | 推荐主题 | 备选主题 |\n|---------|---------|---------|\n| 技术文章 | default | blackink |\n| 生活分享 | orangesun | greenmint |\n| 品牌时尚 | redruby | purplerain |\n| 教育内容 | greenmint | default |\n| 文艺情感 | purplerain | orangesun |\n| 正式公告 | default | redruby |\n| 夜间/深色 | blackink | - |\n\n### 按品牌调性选择\n\n- **专业简洁**：default\n- **温暖活力**：orangesun、greenmint\n- **优雅大气**：redruby、purplerain\n- **深色极简**：blackink\n\n---\n\n## 查看可用主题\n\n```bash\nwechat-pub theme list\n```\n\n输出示例：\n```\n┌─────────────┬──────────────┬──────────┬────────────────────────────┐\n│ ID          │ 名称         │ 类型     │ 描述                       │\n├─────────────┼──────────────┼──────────┼────────────────────────────┤\n│ default     │ 默认主题     │ builtin  │ 简洁清爽的默认样式         │\n│ blackink    │ Black Ink    │ builtin  │ 深色模式，靛蓝点缀         │\n│ orangesun   │ Orange Sun   │ builtin  │ 温暖明亮的橙色系主题       │\n│ redruby     │ Red Ruby     │ builtin  │ 优雅的宝石红风格           │\n│ greenmint   │ Green Mint   │ builtin  │ 清新薄荷绿，轻松舒适       │\n│ purplerain  │ Purple Rain  │ builtin  │ 梦幻紫色渐变               │\n└─────────────┴──────────────┴──────────┴────────────────────────────┘\n```\n\n---\n\n## 测试所有主题\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 主题测试\n---\n\n# 标题一\n\n这是正文内容。\n\n## 标题二\n\n- 列表项 1\n- 列表项 2\n\n**粗体文本** 和 *斜体文本*\nEOF\n\n# 测试所有主题（创建草稿对比）\nfor theme in default blackink orangesun redruby greenmint purplerain; do\n    echo \"测试主题: $theme\"\n    wechat-pub draft create --file test.md --theme $theme\ndone\n```\n\n然后在微信公众平台查看对比效果。\n\n---\n\n## 自定义主题\n\n如果内置主题不满足需求，可以创建自定义主题：\n\n### 1. 创建 CSS 文件\n\n```css\n/* my-theme.css */\n#wenyan {\n    font-size: 16px;\n    line-height: 1.8;\n    color: #2c3e50;\n}\n\n#wenyan h1 {\n    color: #ff6b6b;\n    border-bottom: 3px solid #ff6b6b;\n}\n```\n\n### 2. 添加主题\n\n```bash\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n```\n\n### 3. 使用主题\n\n```bash\nwechat-pub publish create --file article.md --theme my-theme\n```\n\n---\n\n## 常见问题\n\n### Q: 如何查看所有可用主题？\n\n```bash\nwechat-pub theme list\n```\n\n### Q: 主题可以修改吗？\n\n内置主题不可修改，但可以创建自定义主题，基于内置主题的 CSS 另存为新主题。\n\n### Q: 发布后可以更换主题吗？\n\n不可以。已发布的文章主题无法更改，需要删除原文章后用新主题重新发布。\n\nFile v1.0.9:config.json\n\n{\n  \"name\": \"wechat-md-publisher\",\n  \"version\": \"1.0.7\",\n  \"requiredEnvVars\": [],\n  \"optionalEnvVars\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n  \"skill\": {\n    \"name\": \"wechat-md-publisher\",\n    \"version\": \"1.0.7\",\n    \"enabled\": true,\n    \"autoInvoke\": false\n  },\n  \"commands\": {\n    \"publish\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"publish\"],\n      \"description\": \"发布文章到微信公众号\"\n    },\n    \"draft\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"draft\"],\n      \"description\": \"创建微信公众号草稿\"\n    },\n    \"wrapper\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"wrapper\"],\n      \"description\": \"Wrapper 功能管理（文章开头/结尾固定图文）\"\n    },\n    \"list-drafts\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-drafts\"],\n      \"description\": \"列出所有草稿\"\n    },\n    \"list-published\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"list-published\"],\n      \"description\": \"列出已发布文章\"\n    },\n    \"themes\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"themes\"],\n      \"description\": \"列出可用主题\"\n    },\n    \"help\": {\n      \"script\": \"./scripts/postinstall.js\",\n      \"args\": [],\n      \"description\": \"显示使用帮助\"\n    }\n  },\n  \"environment\": {\n    \"required\": [\n      \"NODE_VERSION>=18.0.0\"\n    ],\n    \"optional\": [\n      \"WECHAT_APP_ID\",\n      \"WECHAT_APP_SECRET\"\n    ],\n    \"note\": \"凭证可通过环境变量或 CLI 命令 (account add --app-id xxx --app-secret xxx) 提供\"\n  },\n  \"install\": {\n    \"type\": \"npm-global\",\n    \"package\": \"wechat-md-publisher\",\n    \"version\": \"^1.0.7\",\n    \"execution\": \"npm install -g wechat-md-publisher@^1.0.7\",\n    \"global\": true,\n    \"autoInstall\": false,\n    \"autoUpdate\": false,\n    \"riskLevel\": \"low\",\n    \"riskReason\": \"Skill 不再通过 npx 动态拉取或执行子进程；脚本以 in-process 动态 import 调用本机已安装的 wechat-md-publisher，不再产生供应链运行时下载或 shell 调用。\",\n    \"requiresApproval\": true,\n    \"source\": {\n      \"type\": \"npm\",\n      \"registry\": \"https://registry.npmjs.org\",\n      \"package\": \"wechat-md-publisher\",\n      \"repository\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"license\": \"Apache-2.0\",\n      \"audit\": \"https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\"\n    },\n    \"verification\": {\n      \"command\": \"node -e \\\"require.resolve('wechat-md-publisher/package.json')\\\"\",\n      \"expectedOutput\": \"\"\n    }\n  },\n  \"dependencies\": {\n    \"npm\": [\n      \"wechat-md-publisher@^1.0.7\"\n    ],\n    \"note\": \"Dependencies (jsdom, form-data-encoder, formdata-node) are bundled in wechat-md-publisher\"\n  },\n  \"credentials\": {\n    \"required\": [],\n    \"optional\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n    \"note\": \"凭证可通过环境变量或 CLI 命令提供（二选一）\",\n    \"storage\": {\n      \"location\": \"~/.config/wechat-md-publisher-nodejs/\",\n      \"encryption\": \"AES-256\",\n      \"handler\": \"wechat-md-publisher npm 包\",\n      \"handlerRepo\": \"https://github.com/sipingme/wechat-md-publisher\",\n      \"auditFile\": \"src/services/account.ts\"\n    },\n    \"securityNote\": \"凭证加密由上游 npm 包处理。使用前请审计 https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\"\n  },\n  \"permissions\": {\n    \"filesystem\": {\n      \"read\": [\"*.md\", \"*.jpg\", \"*.png\", \"*.gif\"],\n      \"write\": [\"~/.config/wechat-md-publisher-nodejs/\"]\n    },\n    \"network\": {\n      \"domains\": [\"api.weixin.qq.com\", \"mp.weixin.qq.com\"]\n    }\n  }\n}\n\nArchive v1.0.8: 9 files, 25482 bytes\n\nFiles: config.json (3538b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (5051b), scripts/postinstall.js (2531b), scripts/run.js (10160b), SKILL.md (24319b), _meta.json (144b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: wechat-md-publisher\ndescription: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\nversion: 1.0.7\nauthor: Ping Si <sipingme@gmail.com>\nuser-invocable: true\nrequires:\n  runtime:\n    - name: node\n      version: \">=18.0.0\"\n    - name: npm\n      version: \">=8.0.0\"\ninstall:\n  type: npx\n  package: wechat-md-publisher\n  version: \"^1.0.7\"\n  execution: \"npx --yes wechat-md-publisher@^1.0.7\"\n  riskLevel: moderate\n  riskReason: \"通过 npx 动态拉取并执行第三方 npm 包，存在供应链风险。使用前请审计源码。\"\n  source:\n    registry: https://registry.npmjs.org\n    repository: https://github.com/sipingme/wechat-md-publisher\n    license: Apache-2.0\n    audit: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\nenv:\n  optional:\n    - name: WECHAT_APP_ID\n      description: 微信公众号 AppID\n      sensitive: false\n    - name: WECHAT_APP_SECRET\n      description: 微信公众号 AppSecret\n      sensitive: true\n  note: |\n    凭证可通过两种方式提供（二选一）：\n    1. 环境变量（推荐，避免凭证暴露在进程列表中）\n    2. CLI 命令：`account add --app-id xxx --app-secret xxx`\nconfigPaths:\n  - path: ~/.config/wechat-md-publisher-nodejs/\n    description: 账号配置和缓存目录\n    contains:\n      - credentials: true\n      - encryption: AES-256\npermissions:\n  filesystem:\n    read:\n      - \"*.md\": \"读取用户指定的 Markdown 文件\"\n      - \"*.jpg,*.png,*.gif\": \"读取文章中引用的本地图片\"\n    write:\n      - \"~/.config/wechat-md-publisher-nodejs/\": \"存储账号配置和缓存（凭证使用 AES-256 加密）\"\n  network:\n    required:\n      - \"api.weixin.qq.com\": \"微信公众号 API（发布、草稿、素材管理）\"\n      - \"mp.weixin.qq.com\": \"微信公众号素材上传\"\n    optional:\n      - \"remote-theme-api\": \"仅当用户使用 theme add-remote 命令时才会访问（⚠️ 需用户明确配置并信任该端点）\"\ncredentials:\n  - name: WECHAT_APP_SECRET\n    type: api-secret\n    storage:\n      location: ~/.config/wechat-md-publisher-nodejs/\n      encryption: AES-256\n      handler: wechat-md-publisher npm 包\n      handlerRepo: https://github.com/sipingme/wechat-md-publisher\n    consent: 需要用户明确提供，不会自动收集\n    securityNote: |\n      本 skill 不直接处理凭证加密，安全性依赖上游 npm 包的实现。\n      建议在提供凭证前审查 wechat-md-publisher 包的加密实现：\n      https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\ntags:\n  - wechat\n  - publishing\n  - markdown\n  - content-management\nrepository: https://github.com/sipingme/wechat-md-publisher\n---\n\n# WeChat Publisher Skill\n\n全功能微信公众号 Markdown 发布工具 - 让 AI 能够直接将内容发布到微信公众号。\n\n## ⚠️ 重要提示\n\n**推荐使用方式**：\n- ✅ **最佳实践**：与 `news-to-markdown-skill` 配合使用，实现一键转载新闻到微信公众号\n- 🌐 **固定公网 IP**：必须有固定公网 IP 并配置到微信公众平台的 IP 白名单\n- 🔑 **必需凭证**：必须配置 `WECHAT_APP_ID` 和 `WECHAT_APP_SECRET` 环境变量或通过命令行配置\n\n**关键要求**：\n1. **固定公网 IP**：微信 API 要求服务器 IP 在白名单中，动态 IP 无法使用\n2. **微信公众号凭证**：需要从微信公众平台获取 AppID 和 AppSecret\n3. **IP 白名单配置**：在微信公众平台「设置与开发」→「基本配置」→「IP 白名单」中添加你的公网 IP\n\n## ⚡ 快速开始\n\n### ⚠️ 安全风险提示\n\n**供应链风险**：本 Skill 通过 `npx` 动态拉取并执行第三方 npm 包 `wechat-md-publisher`。使用前请审计源码：\n- **源码仓库**: https://github.com/sipingme/wechat-md-publisher\n- **审计入口**: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n\n**凭证存储**：账号凭证存储在 `~/.config/wechat-md-publisher-nodejs/`，使用 AES-256 加密。\n\n**远程主题风险**：如果使用 `theme add-remote` 添加远程主题，第三方端点可能接收文章内容。请只使用可信任的主题源。\n\n### 配置账号\n\n**推荐方式（使用环境变量，避免命令行暴露凭证）**：\n\n```bash\n# 设置环境变量（不会出现在进程列表中）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\n# 添加账号\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n**备选方式（命令行传参，注意：可能暴露在进程列表中）**：\n\n```bash\n# ⚠️ 警告：--app-secret 会出现在 ps 进程列表中\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 发布文章\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file article.md \\\n  --theme orangesun\n```\n\n### 与 news-to-markdown 配合使用\n\n```bash\n# 一键转载新闻到微信公众号（推荐：下载图片到本地）\n# news-to-markdown 会自动下载图片到本地，避免远程 URL 过期问题\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --download-images \\\n  --output-dir /tmp/article\n\n# wechat-md-publisher 会自动读取本地图片并上传\nnpx --yes wechat-md-publisher@^1.0.7 publish create --file /tmp/article/article.md --theme orangesun\n```\n\n**图片处理最佳实践**（v0.8.3+）：\n- ✅ **推荐**：使用 `--download-images` 下载图片到本地\n  - 避免远程 URL 签名过期（如头条图片）\n  - 避免防盗链问题\n  - 提高发布成功率\n- news-to-markdown 自动提取封面图（og:image > twitter:image > 第一张图片）\n- 图片保存到 `./images/` 目录，Markdown 使用相对路径\n- wechat-md-publisher 自动上传本地图片到微信素材库\n- 完全自动化，无需手动处理\n\n---\n\n## 🎯 何时使用此 Skill\n\n当用户需要以下操作时，应触发此 Skill：\n\n- ✅ 发布文章到微信公众号\n- ✅ 创建微信公众号草稿\n- ✅ 管理微信公众号账号\n- ✅ 查看已发布的文章列表\n- ✅ 删除草稿或已发布文章\n- ✅ 使用不同主题渲染 Markdown\n- ✅ 在文章开头/结尾添加固定图文（Wrapper 功能）\n- ✅ 查看或回滚 Wrapper 历史版本\n\n**触发关键词**：\n- \"发布到微信公众号\"\n- \"创建微信草稿\"\n- \"配置微信公众号\"\n- \"查看微信文章\"\n- \"使用 [主题名] 主题发布\"\n- \"文章开头结尾固定内容\"\n- \"Wrapper\"\n\n## 📋 前置要求\n\n### 1. 系统要求\n- Node.js >= 18.0.0\n- npm 或 pnpm 包管理器\n- 网络连接（访问微信 API）\n\n### 2. 微信公众号配置\n用户必须拥有微信公众号并获取：\n- **AppID**：开发者 ID\n- **AppSecret**：开发者密码\n- **IP 白名单**：必须配置（重要！）\n\n获取方式：\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. **配置 IP 白名单**（必须！）：\n   - 获取当前 IP：`curl ifconfig.me`\n   - 在「IP白名单」中添加该 IP\n   - 详细指南：[IP 白名单配置指南](./references/ip-whitelist-guide.md)\n\n### 3. 使用方式\n\n本 Skill 通过 `npx` 动态执行，无需全局安装：\n\n```bash\n# 查看帮助\nnpx --yes wechat-md-publisher@^1.0.7 --help\n```\n\n## 🚀 标准操作流程 (SOP)\n\n### 操作 1：配置微信公众号账号\n\n**场景**：首次使用或添加新账号\n\n**步骤**：\n\n1. 收集用户提供的账号信息（AppID 和 AppSecret）\n2. 执行命令添加账号：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 account add \\\n  --name \"账号名称\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n3. 验证账号添加成功：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 account list\n```\n\n**输出示例**：\n```\n┌────────────┬──────────────┬────────────────┬─────────┐\n│ ID         │ 名称         │ AppID          │ 默认    │\n├────────────┼──────────────┼────────────────┼─────────┤\n│ acc_xxx    │ 我的公众号   │ wx123456       │ ✓       │\n└────────────┴──────────────┴────────────────┴─────────┘\n```\n\n**异常处理**：\n- 如果 AppID/AppSecret 错误，会提示\"认证失败\"\n- 如果网络问题，会提示\"无法连接到微信服务器\"\n- 解决方案：检查凭证是否正确，确认 IP 在白名单中\n\n---\n\n### 操作 2：创建并发布文章（一步到位）\n\n**场景**：用户提供 Markdown 内容，直接发布到公众号\n\n**步骤**：\n\n1. 将用户的 Markdown 内容保存到临时文件：\n\n```bash\ncat > /tmp/article.md << 'EOF'\n---\ntitle: 文章标题\nauthor: 作者名\n---\n\n# 文章内容\n\n这里是正文...\nEOF\n```\n\n2. 执行发布命令：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file /tmp/article.md \\\n  --theme orangesun\n```\n\n3. 解析输出，提取 `publish_id`\n\n**输出示例**：\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n4. 向用户报告成功，并提供发布 ID\n\n**可用主题**：\n- `default` - 默认主题（简洁清爽）\n- `orangesun` - Orange Sun（温暖明亮）\n- `redruby` - Red Ruby（优雅醒目）\n- `greenmint` - Green Mint（清新舒适）\n- `purplerain` - Purple Rain（梦幻柔和）\n- `blackink` - Black Ink（深色模式）\n\n**异常处理**：\n- 图片上传失败：检查图片路径和网络\n- Token 过期：自动刷新，无需手动处理\n- 内容违规：微信会返回错误码，提示用户修改内容\n\n---\n\n### 操作 3：创建草稿（不立即发布）\n\n**场景**：用户想先创建草稿，稍后再发布\n\n**步骤**：\n\n1. 保存 Markdown 内容到文件\n2. 执行草稿创建命令：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft create \\\n  --file /tmp/article.md \\\n  --theme default\n```\n\n3. 记录返回的 `media_id`\n\n**输出示例**：\n```\n✓ 草稿创建成功\n\nMedia ID: 3_abcdefghijk123456\n```\n\n4. 告知用户草稿已创建，可以在微信公众平台查看\n\n**后续操作**：\n- 用户可以在微信公众平台编辑草稿\n- 需要发布时，使用 `npx --yes wechat-md-publisher@^1.0.7 publish submit <media-id>`\n\n---\n\n### 操作 4：查看草稿列表\n\n**场景**：用户想查看所有草稿\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 15 个草稿\n\n┌──────────────────┬────────────────┬────────────────┐\n│ Media ID         │ 标题           │ 更新时间       │\n├──────────────────┼────────────────┼────────────────┤\n│ 3_abc123         │ 测试文章       │ 2026-03-19     │\n│ 3_def456         │ 产品介绍       │ 2026-03-18     │\n└──────────────────┴────────────────┴────────────────┘\n```\n\n---\n\n### 操作 5：查看已发布文章\n\n**场景**：用户想查看已发布的文章\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish list --page 1 --size 10\n```\n\n**输出示例**：\n```\n共 8 篇已发布文章\n\n┌──────────────┬────────────────┬────────────────┬──────────────────┐\n│ Article ID   │ 标题           │ 发布时间       │ URL              │\n├──────────────┼────────────────┼────────────────┼──────────────────┤\n│ 2247483647_1 │ 最新文章       │ 2026-03-19     │ https://mp.we... │\n└──────────────┴────────────────┴────────────────┴──────────────────┘\n```\n\n---\n\n### 操作 6：删除草稿或文章\n\n**删除草稿**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 draft delete <media-id>\n```\n\n**删除已发布文章**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 publish delete <article-id>\n```\n\n---\n\n### 操作 7：查看可用主题\n\n**命令**：\n\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 theme list\n```\n\n**输出示例**：\n```\n可用主题：\n\n┌─────────────┬──────────────┬────────────────────┐\n│ ID          │ 名称         │ 描述               │\n├─────────────┼──────────────┼────────────────────┤\n│ default     │ 默认主题     │ 简洁清爽风格       │\n│ orangesun   │ Orange Sun   │ 温暖明亮风格       │\n│ redruby     │ Red Ruby     │ 优雅醒目风格       │\n│ greenmint   │ Green Mint   │ 清新舒适风格       │\n│ purplerain  │ Purple Rain  │ 梦幻柔和风格       │\n│ blackink    │ Black Ink    │ 深色模式风格       │\n└─────────────┴──────────────┴────────────────────┘\n```\n\n\n---\n\n## 🔧 高级用法\n\n### Wrapper 功能：文章开头/结尾固定图文\n\n在发布文章时自动在开头和结尾添加固定的图文内容（如关注引导、底部二维码等）。\n\n**开启功能**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper on\n```\n\n**设置内容**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper set \\\n  --header \"<div>欢迎关注我们的公众号</div>\" \\\n  --footer \"<div>觉得有帮助请点赞+收藏</div>\"\n```\n\n**查看状态**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper status\n```\n\n**查看历史版本**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper history\n```\n\n**回滚到指定版本**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper rollback 1\n```\n\n**关闭功能**：\n```bash\nnpx --yes wechat-md-publisher@^1.0.7 wrapper off\n```\n\n**注意事项**：\n- 功能默认关闭，需要手动开启\n- 每次 `set` 会创建新版本，支持历史回滚\n- 图片处理：目前直接存储原始 HTML，需要公网可访问的图片 URL\n- 数据库文件：`data/wmp.db`\n\n---\n\n### 使用编程 API\n\n如果需要在代码中集成：\n\n```javascript\nconst { container } = require('wechat-md-publisher');\n\nasync function publishArticle(markdown, theme) {\n  await container.initialize();\n  \n  const publishService = await container.getPublishService();\n  const result = await publishService.createAndPublish({\n    markdown: markdown,\n    theme: theme || 'default',\n  });\n  \n  return result.publish_id;\n}\n```\n\n### 批量发布\n\n```bash\n# 批量创建草稿\nfor file in articles/*.md; do\n    npx --yes wechat-md-publisher@^1.0.7 draft create --file \"$file\" --theme default\ndone\n```\n\n---\n\n## 📊 输入输出规范\n\n### 输入格式\n\n**Markdown 文件格式**：\n\n```markdown\n---\ntitle: 文章标题（必需）\nauthor: 作者名（可选）\ncover: ./cover.jpg（可选，封面图路径）\n---\n\n# 正文标题\n\n正文内容...\n\n![图片描述](./image.jpg)\n```\n\n**支持的图片格式**：\n- 本地图片：相对路径或绝对路径\n- 网络图片：HTTP/HTTPS URL\n- 微信图片：微信 CDN URL（自动识别）\n\n### 输出格式\n\n**成功响应**：\n```json\n{\n  \"success\": true,\n  \"publish_id\": \"2247483647_1\",\n  \"message\": \"发布成功\"\n}\n```\n\n**错误响应**：\n```json\n{\n  \"success\": false,\n  \"error\": \"错误信息\",\n  \"code\": \"ERROR_CODE\"\n}\n```\n\n---\n\n## ⚠️ 常见问题和解决方案\n\n### 问题 1：Token 过期\n\n**症状**：提示\"access_token 无效\"\n\n**解决**：Token 会自动刷新，如果仍有问题，重新配置账号\n\n### 问题 2：图片上传失败\n\n**症状**：提示\"图片上传失败\"\n\n**原因**：\n- 图片路径错误\n- 图片大小超限（微信限制 10MB）\n- 服务器 IP 不在白名单\n\n**解决**：\n- 检查图片路径\n- 压缩图片\n- 在微信公众平台添加 IP 到白名单\n\n### 问题 3：找不到主题\n\n**症状**：提示\"主题不存在\"\n\n**解决**：使用 `npx --yes wechat-md-publisher@^1.0.7 theme list` 查看可用主题\n\n### 问题 4：权限不足\n\n**症状**：提示\"没有权限\"\n\n**原因**：AppID/AppSecret 错误或权限不足\n\n**解决**：\n- 确认凭证正确\n- 确认公众号类型支持该功能（服务号 vs 订阅号）\n\n---\n\n## 🔒 安全性说明\n\n### 敏感信息处理\n\n- AppID 和 AppSecret 存储在本地配置文件中\n- 配置文件位置：\n  - macOS: `~/Library/Preferences/wechat-md-publisher-nodejs/config.json`\n  - Linux: `~/.config/wechat-md-publisher-nodejs/config.json`\n  - Windows: `%APPDATA%\\wechat-md-publisher-nodejs\\Config\\config.json`\n\n### 权限要求\n\n- 读取本地文件（Markdown 和图片）\n- 网络访问（微信 API）\n- 写入配置文件\n\n### 数据隐私\n\n- 不会上传任何数据到第三方服务器\n- 所有通信仅限于微信官方 API\n- 图片缓存仅在本地\n\n---\n\n## 📚 参考资料\n\n- [项目 GitHub](https://github.com/sipingme/wechat-md-publisher)\n- [微信公众平台文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)\n- [完整 API 文档](https://github.com/sipingme/wechat-md-publisher/blob/main/docs/API.md)\n\n---\n\n## 🎓 示例对话\n\n**用户**：帮我把这篇文章发布到微信公众号\n\n**AI**：好的，我来帮你发布。请提供文章的 Markdown 内容。\n\n**用户**：[提供内容]\n\n**AI**：收到！我将使用 orangesun 主题发布。正在处理...\n\n[执行命令]\n\n**AI**：✅ 文章已成功发布到微信公众号！\n- 发布 ID: 2247483647_1\n- 你可以在微信公众平台查看和管理这篇文章\n\n---\n\n## 📝 维护说明\n\n- **版本**: 1.0.7\n- **最后更新**: 2026-04-26\n- **更新内容**: \n  - 明确内置主题为 6 个自定义主题（default, blackink, orangesun, redruby, greenmint, purplerain）\n  - 移除历史遗留的 wenyan-core 主题注册（lapis, maize 等），避免加载不存在的主题\n  - 更新 THEMES.md 文档与实际可用主题保持一致\n- **维护者**: Ping Si <sipingme@gmail.com>\n- **许可证**: Apache-2.0\n\n---\n\n## ✅ 首次成功检查清单\n\n新用户应该能在 5 分钟内完成：\n\n- [ ] 验证工具可用：`npx --yes wechat-md-publisher@^1.0.7 --version`\n- [ ] 配置账号：`npx --yes wechat-md-publisher@^1.0.7 account add ...`\n- [ ] 创建测试文章\n- [ ] 发布成功：`npx --yes wechat-md-publisher@^1.0.7 publish create --file test.md --theme default`\n- [ ] 在微信公众平台看到文章\n\n如果以上步骤都能顺利完成，说明 Skill 已正确配置！\n\n---\n\n## 🔗 与其他 Skills 配合使用\n\n### 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：`news-to-markdown-skill` + `wechat-md-publisher-skill` = 一键转载新闻到微信公众号\n\n#### 使用场景\n\n将网络上的新闻文章快速转载到微信公众号，实现内容聚合和分发。\n\n#### 完整工作流\n\n**场景 1：转载单篇新闻（推荐方式）**\n\n```bash\n# 步骤 1: 使用 news-to-markdown 提取新闻并下载图片\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article/article.md \\\n  --download-images \\\n  --output-dir /tmp/article \\\n  --verbose\n\n# 步骤 2: 使用 wechat-md-publisher 发布到微信\nnpx --yes wechat-md-publisher@^1.0.7 publish create \\\n  --file /tmp/article/article.md \\\n  --theme orangesun\n```\n\n**为什么要下载图片到本地？**\n- 头条图片 URL 包含签名和过期时间，几小时后会失效\n- 本地图片更可靠，不受网络波动影响\n- 避免防盗链导致的图片加载失败\n\n**场景 2：批量转载新闻**\n\n```bash\n# 新闻 URL 列表\nurls=(\n  \"https://www.toutiao.com/article/123\"\n  \"https://mp.weixin.qq.com/s/abc\"\n  \"https://www.xiaohongshu.com/explore/xyz\"\n)\n\n# 批量处理\nfor i in \"${!urls[@]}\"; do\n  url=\"${urls[$i]}\"\n  output_dir=\"/tmp/article-$i\"\n  \n  # 提取新闻并下载图片\n  convert-url --url \"$url\" \\\n    --output \"$output_dir/article.md\" \\\n    --download-images \\\n    --output-dir \"$output_dir\"\n  \n  # 发布到微信（创建草稿）\n  npx --yes wechat-md-publisher@^1.0.7 draft create \\\n    --file \"$output_dir/article.md\" \\\n    --theme default\n  \n  echo \"✓ 已处理: $url\"\ndone\n```\n\n**场景 3：AI 自动化工作流**\n\n用户对 AI 说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 执行流程：\n1. 使用 `news-to-markdown-skill` 提取文章内容\n2. 自动检测平台（头条/微信/小红书）\n3. 使用 `wechat-md-publisher-skill` 发布到微信\n4. 返回发布结果和链接\n\n#### 优势\n\n✅ **智能内容提取**\n- 自动识别新闻正文，过滤广告和噪音\n- 保留文章结构和格式\n- 提取标题、作者、发布时间等元数据\n\n✅ **多平台支持**\n- 头条：优化标题层级、列表、代码块\n- 微信：提取 `#js_content` 区域\n- 小红书：处理 `.note-content` 内容\n\n✅ **三层抓取策略**\n- curl → wget → Playwright\n- 确保动态页面也能正确抓取\n\n✅ **精美主题渲染**\n- 6 个精选内置主题可选\n- 自动处理图片上传\n- 保持排版美观\n\n#### 最佳实践\n\n**1. 内容审核**\n```bash\n# 先创建草稿，人工审核后再发布\nconvert-url --url \"$news_url\" --output /tmp/article.md\nnpx --yes wechat-md-publisher@^1.0.7 draft create --file /tmp/article.md --theme default\n\n# 审核通过后发布\nnpx --yes wechat-md-publisher@^1.0.7 publish submit <media-id>\n```\n\n**2. 添加来源声明**\n```bash\n# 提取时保留元数据\nconvert-url --url \"$news_url\" --output /tmp/article.md\n\n# 元数据会自动包含在 Markdown 中：\n# ---\n# title: 文章标题\n# author: 原作者\n# 来源: https://...\n# ---\n```\n\n**3. 选择合适主题**\n- 科技类文章：`default`、`blackink`（深色模式）\n- 生活类文章：`orangesun`（橙色阳光）、`greenmint`（薄荷绿）\n- 教程类文章：`default`、`greenmint`\n- 文艺情感：`purplerain`（紫色雨）、`orangesun`\n- 品牌时尚：`redruby`（宝石红）\n- 夜间阅读：`blackink`\n\n#### 示例对话\n\n**用户**：把这篇头条文章转到我的微信公众号\nhttps://www.toutiao.com/article/7000000000000000000/\n\n**AI**：好的，我来帮你处理：\n\n1. 正在提取文章内容...\n   ```\n   [INFO] 开始抓取: https://www.toutiao.com/article/...\n   [INFO] 检测到平台: toutiao\n   [INFO] 提取成功\n   ```\n\n2. 正在发布到微信公众号...\n   ```\n   ✓ 渲染完成\n   ✓ 图片处理完成\n   ✓ 创建草稿成功\n   ✓ 发布成功\n   ```\n\n✅ **完成！**\n- 文章标题：《xxx》\n- 发布 ID: 2247483647_1\n- 使用主题: orangesun\n- 你可以在微信公众平台查看\n\n#### 相关资源\n\n- **news-to-markdown-skill**: https://github.com/sipingme/news-to-markdown-skill\n- **news-to-markdown 核心库**: https://github.com/sipingme/news-to-markdown\n- **npm 包**: `npm install -g news-to-markdown`\n\n#### 技术栈\n\n```\n新闻网站\n    ↓\nnews-to-markdown (提取 + 转换)\n    ↓\nMarkdown 文件\n    ↓\nwechat-md-publisher (渲染 + 发布)\n    ↓\n微信公众号\n```\n\n---\n\n## 💡 更多组合可能\n\n### 与内容管理工具配合\n- 配合 Git 进行版本管理\n- 配合 CI/CD 实现自动发布\n- 配合数据库存储发布记录\n\n### 与 AI 工具配合\n- AI 生成内容 → wechat-md-publisher 发布\n- AI 润色文章 → wechat-md-publisher 发布\n- AI 翻译文章 → wechat-md-publisher 发布\n\nFile v1.0.8:README.md\n\n# WeChat MD Publisher - OpenClaw Skill\n\n> 全功能微信公众号 Markdown 发布工具 - OpenClaw Skill 版本\n\n## 🚀 快速安装\n\n### 方法 1：从 ClawHub 安装（推荐）\n\n```bash\nopenclaw skills install wechat-md-publisher\n```\n\n### 方法 2：从 GitHub 安装\n\n```bash\nopenclaw skills install https://github.com/sipingme/wechat-md-publisher-skill\n```\n\n### 方法 3：手动安装\n\n1. 克隆仓库：\n```bash\ngit clone https://github.com/sipingme/wechat-md-publisher-skill.git\ncd wechat-md-publisher-skill\n```\n\n2. 复制到 OpenClaw skills 目录：\n```bash\ncp -r . ~/.openclaw/skills/wechat-md-publisher/\n```\n\n3. 验证工具可用：\n```bash\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## ✅ 验证安装\n\n```bash\n# 检查 Skill 是否可用\nopenclaw skills list --eligible\n\n# 查看 Skill 详情\nopenclaw skills info wechat-md-publisher\n\n# 测试命令\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## 📋 首次配置\n\n### 1. 获取微信公众号凭证\n\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. 将服务器 IP 添加到「IP白名单」\n\n### 2. 配置账号\n\n```bash\n# 推荐：使用环境变量（避免命令行暴露凭证）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\nnpx --yes wechat-md-publisher@^1.0.6 account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n### 3. 测试发布\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 测试文章\n---\n# Hello World\n这是一篇测试文章。\nEOF\n\n# 发布\nnpx --yes wechat-md-publisher@^1.0.6 publish create --file test.md --theme default\n```\n\n## 🎯 使用方式\n\n### 在 OpenClaw 对话中使用\n\n**示例 1：发布文章**\n\n```\n用户: 帮我把这篇文章发布到微信公众号\n\n[提供 Markdown 内容]\n\nAI: 好的，我来帮你发布。正在使用 orangeheart 主题...\n✓ 文章已成功发布！发布 ID: 2247483647_1\n```\n\n**示例 2：创建草稿**\n\n```\n用户: 先创建一个草稿，不要立即发布\n\nAI: 明白，我会先创建草稿。\n✓ 草稿创建成功，Media ID: 3_abc123\n你可以在微信公众平台查看和编辑。\n```\n\n**示例 3：查看文章列表**\n\n```\n用户: 查看我已发布的微信文章\n\nAI: 正在获取列表...\n共 8 篇已发布文章：\n1. 最新文章 (2026-03-19)\n2. 产品介绍 (2026-03-18)\n...\n```\n\n### 手动调用 Skill\n\n```bash\n# 使用 OpenClaw 命令\nopenclaw run wechat-md-publisher publish article.md orangeheart\n\n# 或直接使用工具\nnpx --yes wechat-md-publisher@^1.0.6 publish create --file article.md --theme orangeheart\n```\n\n## � 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：一键转载新闻到微信公众号\n\n### 快速示例\n\n```bash\n# 1. 提取新闻文章\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --platform toutiao\n\n# 2. 发布到微信公众号\nnpx --yes wechat-md-publisher@^1.0.6 publish create \\\n  --file /tmp/article.md \\\n  --theme orangeheart\n```\n\n### AI 自动化工作流\n\n用户说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 自动执行：\n1. 使用 `news-to-markdown-skill` 提取文章\n2. 使用 `wechat-md-publisher-skill` 发布到微信\n3. 返回发布结果\n\n### 优势\n\n✅ **智能提取** - 自动识别正文，过滤广告  \n✅ **多平台支持** - 头条、微信、小红书  \n✅ **精美渲染** - 8+ 主题可选  \n✅ **一键发布** - 无需手动复制粘贴\n\n详见 [SKILL.md](./SKILL.md) 中的完整集成指南。\n\n---\n\n## �📚 文档\n\n- **[SKILL.md](./SKILL.md)** - 完整的 SOP 和使用指南（含 news-to-markdown 集成）\n- **[quick-start.md](./references/quick-start.md)** - 5 分钟快速上手\n- **[themes.md](./references/themes.md)** - 主题使用指南\n- **[ip-whitelist-guide.md](./references/ip-whitelist-guide.md)** - IP 白名单配置指南 ⚠️ 重要\n\n## 🎨 可用主题\n\n- `default` - 简洁经典\n- `orangeheart` - 温暖优雅 ⭐ 推荐\n- `rainbow` - 活泼清爽\n- `lapis` - 清新极简 ⭐ 推荐\n- `pie` - 现代锐利\n- `maize` - 柔和舒适\n- `purple` - 简约文艺\n- `phycat` - 薄荷清新\n- `sport` - 运动风 🏃 活力动感\n\n## 🔧 高级配置\n\n### 环境变量（可选）\n\n```bash\n# 在 ~/.bashrc 或 ~/.zshrc 中添加\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n```\n\n### 自定义主题\n\n```bash\n# 添加本地主题（推荐）\nnpx --yes wechat-md-publisher@^1.0.6 theme add-local --name my-theme --path ./my-theme.css\n\n# 添加远程主题 API（⚠️ 见下方安全警告）\nnpx --yes wechat-md-publisher@^1.0.6 theme add-remote --name md2wechat --url https://api.md2wechat.cn --key xxx\n```\n\n> ⚠️ **远程主题安全警告**：使用 `theme add-remote` 会向第三方服务器发送请求。请仅使用您信任的远程主题 API。远程主题端点不在本 skill 的默认网络权限范围内，需要用户明确配置并承担相应风险。\n\n## ⚠️ 常见问题\n\n### 问题 1：Skill 未被识别\n\n**解决**：\n```bash\nopenclaw skills refresh\nopenclaw skills info wechat-md-publisher\n```\n\n### 问题 2：权限错误\n\n**解决**：\n```bash\nchmod +x ~/.openclaw/skills/wechat-md-publisher/scripts/publish.js\n```\n\n### 问题 3：找不到命令\n\n**解决**：\n```bash\n# 本 Skill 使用 npx 动态执行，无需全局安装\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n### 问题 4：Token 过期\n\nToken 会自动刷新，如仍有问题：\n```bash\nnpx --yes wechat-md-publisher@^1.0.6 account remove <account-id>\nnpx --yes wechat-md-publisher@^1.0.6 account add --name \"新账号\" --default\n```\n\n### 问题 5：更新 Skill 后依赖未更新\n\n本 Skill 使用 `npx` 动态执行，会自动拉取指定版本的包。如需清除缓存：\n\n```bash\n# 清除 npx 缓存\nnpm cache clean --force\n\n# 验证版本\nnpx --yes wechat-md-publisher@^1.0.6 --version\n```\n\n## 🔒 安全性\n\n### 权限要求\n\n- ✅ 读取本地 Markdown 和图片文件\n- ✅ 网络访问（微信官方 API）\n- ✅ 写入配置文件到 `~/.config/wechat-md-publisher-nodejs/`\n- ⚠️ 可选：远程主题 API（仅当用户使用 `theme add-remote` 时）\n\n### 数据隐私\n\n- ✅ 默认情况下，所有通信仅限于微信官方 API\n- ✅ 配置文件仅存储在本地（凭证加密由 [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher) npm 包处理）\n- ❌ 不会自动收集用户信息\n- ⚠️ **例外**：如果用户配置了远程主题（`theme add-remote`），会向该第三方端点发送请求\n\n### 安全检查\n\n```bash\n# 使用 skill-vetter 检查（如果可用）\nopenclaw skills vet wechat-md-publisher\n```\n\n## 📊 Skill 评分\n\n根据 OpenClaw 社区标准：\n\n- ✅ **规范清晰度**: 5/5 - SKILL.md 结构完整\n- ✅ **首次成功时间**: 5/5 - 5 分钟内可完成\n- ✅ **实用性**: 5/5 - 解决实际发布需求\n- ✅ **安全性**: 5/5 - 权限合理，无恶意代码\n\n## 🤝 贡献\n\n欢迎贡献！\n\n- 报告问题：[GitHub Issues](https://github.com/sipingme/wechat-md-publisher/issues)\n- 提交改进：[Pull Requests](https://github.com/sipingme/wechat-md-publisher/pulls)\n- 讨论交流：[GitHub Discussions](https://github.com/sipingme/wechat-md-publisher/discussions)\n\n## 📜 许可证\n\nApache-2.0 License\n\n## 👤 作者\n\n**Ping Si** <sipingme@gmail.com>\n\n- GitHub: [@sipingme](https://github.com/sipingme)\n- 项目主页: [wechat-md-publisher](https://github.com/sipingme/wechat-md-publisher)\n\n## 🙏 致谢\n\n- [@wenyan-md/core](https://github.com/caol64/wenyan-core) - 提供精美主题和渲染引擎\n- OpenClaw 社区 - 提供优秀的 AI Agent 框架\n\n---\n\n**让 AI 能够直接发布内容到微信公众号！** 🚀\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn70nwj71rbkzwyvc7pkqs4p6s8222nc\",\n  \"slug\": \"wechat-md-publisher-skill\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1777450054705\n}\n\nFile v1.0.8:references/ip-whitelist-guide.md\n\n# 微信公众号 IP 白名单配置指南\n\n## 什么是 IP 白名单？\n\n微信公众号为了安全，要求所有调用 API 的服务器 IP 必须在白名单中。如果 IP 不在白名单，API 调用会失败。\n\n## 为什么需要配置？\n\n当你使用 `wechat-md-publisher` 发布文章时，工具会从你的电脑/服务器向微信 API 发送请求。微信会检查请求来源的 IP 地址，只有在白名单中的 IP 才能成功调用。\n\n## 如何获取你的 IP 地址？\n\n### 方法 1：使用命令行（推荐）\n\n```bash\n# macOS/Linux\ncurl ifconfig.me\n\n# 或\ncurl icanhazip.com\n\n# 或\ncurl ipinfo.io/ip\n```\n\n### 方法 2：访问网站\n\n访问以下任一网站查看你的公网 IP：\n- https://www.ip.cn/\n- https://ipinfo.io/\n- https://ifconfig.me/\n\n### 方法 3：在微信公众平台查看\n\n登录微信公众平台后，在 IP 白名单设置页面，微信会显示你当前的 IP 地址。\n\n## 如何配置 IP 白名单？\n\n### 步骤 1：登录微信公众平台\n\n访问 https://mp.weixin.qq.com/ 并登录\n\n### 步骤 2：进入 IP 白名单设置\n\n1. 点击左侧菜单「设置与开发」\n2. 点击「基本配置」\n3. 找到「IP白名单」部分\n4. 点击「修改」或「查看」\n\n### 步骤 3：添加 IP 地址\n\n1. 点击「添加」按钮\n2. 输入你的公网 IP 地址\n3. 点击「确定」\n\n**示例**：\n```\n123.456.789.012\n```\n\n### 步骤 4：验证配置\n\n添加后，等待 1-2 分钟生效，然后测试：\n\n```bash\nwechat-pub account list\n```\n\n如果能正常显示账号列表，说明配置成功。\n\n## 常见场景\n\n### 场景 1：在家里使用\n\n**问题**：家庭宽带的 IP 地址可能会变化\n\n**解决方案**：\n1. **短期方案**：每次 IP 变化后重新添加\n2. **长期方案**：\n   - 联系运营商申请固定 IP（可能需要付费）\n   - 使用云服务器部署（推荐）\n\n### 场景 2：在公司使用\n\n**问题**：公司可能使用固定 IP 或代理\n\n**解决方案**：\n1. 询问 IT 部门获取公司的公网出口 IP\n2. 将公司 IP 添加到白名单\n3. 如果公司使用代理，需要添加代理服务器的 IP\n\n### 场景 3：在云服务器使用\n\n**推荐方案**：\n1. 购买云服务器（阿里云、腾讯云、AWS 等）\n2. 云服务器通常有固定的公网 IP\n3. 将云服务器 IP 添加到白名单\n4. 在云服务器上安装和使用 `wechat-md-publisher`\n\n**优点**：\n- ✅ IP 固定，不会变化\n- ✅ 24/7 在线\n- ✅ 可以设置定时任务自动发布\n- ✅ 网络稳定\n\n### 场景 4：使用 VPN 或代理\n\n**问题**：VPN 会改变你的出口 IP\n\n**解决方案**：\n1. 关闭 VPN 后获取真实 IP\n2. 将真实 IP 添加到白名单\n3. 使用工具时关闭 VPN\n\n或者：\n1. 获取 VPN 的出口 IP\n2. 将 VPN IP 添加到白名单\n3. 使用工具时保持 VPN 连接\n\n## 多 IP 配置\n\n微信公众号支持添加多个 IP 地址（通常最多 10-20 个）。\n\n**适用场景**：\n- 在多个地点使用（家里、公司、咖啡厅）\n- 团队协作（多人使用）\n- 备用 IP（防止主 IP 失效）\n\n**配置方法**：\n在 IP 白名单页面，点击「添加」，逐个添加所有需要的 IP。\n\n## 安全建议\n\n### ✅ 推荐做法\n\n1. **只添加必要的 IP**\n   - 不要添加不信任的 IP\n   - 定期检查和清理不再使用的 IP\n\n2. **使用固定 IP**\n   - 云服务器（推荐）\n   - 固定宽带 IP\n\n3. **定期更新**\n   - IP 变化后及时更新白名单\n   - 删除不再使用的 IP\n\n### ❌ 不推荐做法\n\n1. **不要使用公共 WiFi**\n   - 公共 WiFi 的 IP 可能被多人共享\n   - 存在安全风险\n\n2. **不要添加 0.0.0.0 或通配符**\n   - 微信不支持通配符\n   - 必须添加具体的 IP 地址\n\n3. **不要分享你的 AppSecret**\n   - 即使 IP 在白名单中，也要保护好 AppSecret\n   - 不要将 AppSecret 提交到 Git 仓库\n\n## 故障排查\n\n### 错误：IP 不在白名单\n\n**症状**：\n```\n错误码: 40164\n错误信息: invalid ip xxx.xxx.xxx.xxx, not in whitelist\n```\n\n**解决步骤**：\n\n1. **确认当前 IP**：\n   ```bash\n   curl ifconfig.me\n   ```\n\n2. **检查白名单**：\n   - 登录微信公众平台\n   - 查看 IP 白名单列表\n   - 确认当前 IP 是否在列表中\n\n3. **添加 IP**：\n   - 如果不在，添加当前 IP\n   - 等待 1-2 分钟生效\n\n4. **重试**：\n   ```bash\n   wechat-pub account list\n   ```\n\n### 错误：IP 频繁变化\n\n**症状**：今天能用，明天就不能用了\n\n**原因**：家庭宽带 IP 动态分配\n\n**解决方案**：\n\n**方案 1：使用云服务器（推荐）**\n```bash\n# 1. 购买云服务器（最低配置即可）\n# 2. 在云服务器上安装工具\nssh user@your-server-ip\nnpm install -g wechat-md-publisher\n\n# 3. 配置账号\nwechat-pub account add --name \"公众号\" --app-id xxx --app-secret xxx\n\n# 4. 使用\nwechat-pub publish create --file article.md --theme default\n```\n\n**方案 2：申请固定 IP**\n- 联系宽带运营商\n- 申请固定公网 IP（可能需要额外费用）\n\n**方案 3：使用 DDNS**\n- 配置动态 DNS\n- 使用脚本自动更新白名单（需要开发）\n\n## 自动化脚本\n\n### 检查 IP 是否变化\n\n```bash\n#!/bin/bash\n# check-ip.sh\n\nCURRENT_IP=$(curl -s ifconfig.me)\nSAVED_IP=$(cat ~/.wechat-pub-ip 2>/dev/null)\n\nif [ \"$CURRENT_IP\" != \"$SAVED_IP\" ]; then\n    echo \"⚠️  IP 已变化！\"\n    echo \"旧 IP: $SAVED_IP\"\n    echo \"新 IP: $CURRENT_IP\"\n    echo \"请更新微信公众平台的 IP 白名单\"\n    echo \"$CURRENT_IP\" > ~/.wechat-pub-ip\nelse\n    echo \"✓ IP 未变化: $CURRENT_IP\"\nfi\n```\n\n使用：\n```bash\nchmod +x check-ip.sh\n./check-ip.sh\n```\n\n## 推荐配置\n\n### 个人用户\n\n**推荐方案**：使用云服务器\n- 成本：约 10-30 元/月\n- 优点：IP 固定、稳定可靠\n- 推荐服务商：阿里云、腾讯云、华为云\n\n### 企业用户\n\n**推荐方案**：公司服务器 + 固定 IP\n- 在公司内网服务器部署\n- 配置公司出口 IP 到白名单\n- 设置定时任务自动发布\n\n### 团队协作\n\n**推荐方案**：共享云服务器\n- 团队共用一台云服务器\n- 所有成员通过 SSH 访问\n- 统一的 IP 地址\n\n## 总结\n\n1. ✅ **必须配置 IP 白名单**才能使用微信公众号 API\n2. ✅ 使用 `curl ifconfig.me` 获取当前 IP\n3. ✅ 在微信公众平台添加 IP 到白名单\n4. ✅ 推荐使用云服务器获得固定 IP\n5. ✅ 定期检查和更新 IP 白名单\n\n## 相关链接\n\n- [微信公众平台](https://mp.weixin.qq.com/)\n- [微信公众号开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html)\n- [IP 白名单说明](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)\n\n---\n\n如有问题，请查看 [SKILL.md](../SKILL.md) 或提交 [Issue](https://github.com/sipingme/wechat-md-publisher/issues)。\n\nFile v1.0.8:references/quick-start.md\n\n# WeChat Publisher - 快速开始指南\n\n## 5 分钟快速上手\n\n### 步骤 1：安装工具（1 分钟）\n\n```bash\nnpm install -g wechat-md-publisher\n```\n\n### 步骤 2：配置账号（2 分钟）\n\n1. 获取微信公众号凭证：\n   - 登录 https://mp.weixin.qq.com/\n   - 进入「设置与开发」→「基本配置」\n   - 复制 AppID 和 AppSecret\n\n2. 添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 步骤 3：创建测试文章（1 分钟）\n\n```bash\ncat > test-article.md << 'EOF'\n---\ntitle: 测试文章\nauthor: 测试作者\n---\n\n# 欢迎使用 WeChat Publisher\n\n这是一篇测试文章。\n\n## 主要特性\n\n- 完整的草稿管理\n- 8 个精美主题\n- 智能图片处理\nEOF\n```\n\n### 步骤 4：发布文章（1 分钟）\n\n```bash\nwechat-pub publish create --file test-article.md --theme orangeheart\n```\n\n### 验证成功\n\n如果看到以下输出，说明配置成功：\n\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n现在可以在微信公众平台查看你的文章了！\n\n## 常用命令速查\n\n```bash\n# 查看所有主题\nwechat-pub theme list\n\n# 创建草稿\nwechat-pub draft create --file article.md --theme lapis\n\n# 查看草稿列表\nwechat-pub draft list\n\n# 查看已发布文章\nwechat-pub publish list\n\n# 删除草稿\nwechat-pub draft delete <media-id>\n```\n\n## 下一步\n\n- 阅读完整文档：[SKILL.md](../SKILL.md)\n- 查看主题示例：[themes.md](./themes.md)\n- 了解 API 用法：https://github.com/sipingme/wechat-md-publisher\n\nFile v1.0.8:references/themes.md\n\n# WeChat Publisher - 主题使用指南\n\n## 6 个内置主题\n\n`wechat-md-publisher` 提供 6 个专为微信公众号优化的内置主题，开箱即用。\n\n### 1. default - 默认主题\n\n**风格**：简洁清爽，适合各类文章\n\n**适用场景**：\n- 企业公告、正式通知\n- 技术文档、学术文章\n- 通用内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme default\n```\n\n---\n\n### 2. blackink - Black Ink\n\n**风格**：深色模式，靛蓝点缀，适合夜间阅读\n\n**适用场景**：\n- 夜间阅读类内容\n- 科技、极客风格文章\n- 深色调品牌内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme blackink\n```\n\n---\n\n### 3. orangesun - Orange Sun\n\n**风格**：温暖明亮，橙色阳光系\n\n**适用场景**：\n- 生活类、旅行类文章\n- 轻松活泼的内容\n- 节日推送\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme orangesun\n```\n\n---\n\n### 4. redruby - Red Ruby\n\n**风格**：优雅大气，宝石红点缀\n\n**适用场景**：\n- 品牌介绍、时尚类文章\n- 重要公告、活动推广\n- 视觉冲击力强的内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme redruby\n```\n\n---\n\n### 5. greenmint - Green Mint\n\n**风格**：清新自然，薄荷绿色调\n\n**适用场景**：\n- 健康、环保类文章\n- 教程指南\n- 清新风格内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme greenmint\n```\n\n---\n\n### 6. purplerain - Purple Rain\n\n**风格**：梦幻浪漫，紫色渐变\n\n**适用场景**：\n- 文艺类、情感类文章\n- 个人博客\n- 创意内容\n\n**使用**：\n```bash\nwechat-pub publish create --file article.md --theme purplerain\n```\n\n---\n\n## 主题选择建议\n\n### 按内容类型选择\n\n| 内容类型 | 推荐主题 | 备选主题 |\n|---------|---------|---------|\n| 技术文章 | default | blackink |\n| 生活分享 | orangesun | greenmint |\n| 品牌时尚 | redruby | purplerain |\n| 教育内容 | greenmint | default |\n| 文艺情感 | purplerain | orangesun |\n| 正式公告 | default | redruby |\n| 夜间/深色 | blackink | - |\n\n### 按品牌调性选择\n\n- **专业简洁**：default\n- **温暖活力**：orangesun、greenmint\n- **优雅大气**：redruby、purplerain\n- **深色极简**：blackink\n\n---\n\n## 查看可用主题\n\n```bash\nwechat-pub theme list\n```\n\n输出示例：\n```\n┌─────────────┬──────────────┬──────────┬────────────────────────────┐\n│ ID          │ 名称         │ 类型     │ 描述                       │\n├─────────────┼──────────────┼──────────┼────────────────────────────┤\n│ default     │ 默认主题     │ builtin  │ 简洁清爽的默认样式         │\n│ blackink    │ Black Ink    │ builtin  │ 深色模式，靛蓝点缀         │\n│ orangesun   │ Orange Sun   │ builtin  │ 温暖明亮的橙色系主题       │\n│ redruby     │ Red Ruby     │ builtin  │ 优雅的宝石红风格           │\n│ greenmint   │ Green Mint   │ builtin  │ 清新薄荷绿，轻松舒适       │\n│ purplerain  │ Purple Rain  │ builtin  │ 梦幻紫色渐变               │\n└─────────────┴──────────────┴──────────┴────────────────────────────┘\n```\n\n---\n\n## 测试所有主题\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 主题测试\n---\n\n# 标题一\n\n这是正文内容。\n\n## 标题二\n\n- 列表项 1\n- 列表项 2\n\n**粗体文本** 和 *斜体文本*\nEOF\n\n# 测试所有主题（创建草稿对比）\nfor theme in default blackink orangesun redruby greenmint purplerain; do\n    echo \"测试主题: $theme\"\n    wechat-pub draft create --file test.md --theme $theme\ndone\n```\n\n然后在微信公众平台查看对比效果。\n\n---\n\n## 自定义主题\n\n如果内置主题不满足需求，可以创建自定义主题：\n\n### 1. 创建 CSS 文件\n\n```css\n/* my-theme.css */\n#wenyan {\n    font-size: 16px;\n    line-height: 1.8;\n    color: #2c3e50;\n}\n\n#wenyan h1 {\n    color: #ff6b6b;\n    border-bottom: 3px solid #ff6b6b;\n}\n```\n\n### 2. 添加主题\n\n```bash\nwechat-pub theme add-local --name my-theme --path ./my-theme.css\n```\n\n### 3. 使用主题\n\n```bash\nwechat-pub publish create --file article.md --theme my-theme\n```\n\n---\n\n## 常见问题\n\n### Q: 如何查看所有可用主题？\n\n```bash\nwechat-pub theme list\n```\n\n### Q: 主题可以修改吗？\n\n内置主题不可修改，但可以创建自定义主题，基于内置主题的 CSS 另存为新主题。\n\n### Q: 发布后可以更换主题吗？\n\n不可以。已发布的文章主题无法更改，需要删除原文章后用新主题重新发布。\n\nFile v1.0.8:config.json\n\n{\n  \"name\": \"wechat-md-publisher\",\n  \"version\": \"1.0.7\",\n  \"requiredEnvVars\": [],\n  \"optionalEnvVars\": [\"WECHAT_APP_ID\", \"WECHAT_APP_SECRET\"],\n  \"skill\": {\n    \"name\": \"wechat-md-publisher\",\n    \"version\": \"1.0.7\",\n    \"enabled\": true,\n    \"autoInvoke\": false\n  },\n  \"commands\": {\n    \"publish\": {\n      \"script\": \"./scripts/run.js\",\n      \"args\": [\"publish\"],\n      \"description\": \"发布文章到微信公众号\"\n    },\n   \n\nArchive v1.0.7: 9 files, 23393 bytes\n\nFiles: config.json (3450b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (5051b), scripts/postinstall.js (2531b), scripts/run.js (4519b), SKILL.md (24319b), _meta.json (144b)\n\nArchive v1.0.6: 9 files, 22674 bytes\n\nFiles: config.json (3450b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (4788b), scripts/postinstall.js (2531b), scripts/run.js (2522b), SKILL.md (24336b), _meta.json (144b)\n\nArchive v1.0.5: 9 files, 22671 bytes\n\nFiles: config.json (3450b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (4788b), scripts/postinstall.js (2531b), scripts/run.js (2522b), SKILL.md (24336b), _meta.json (144b)\n\nArchive v1.0.4: 9 files, 22674 bytes\n\nFiles: config.json (3450b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (4788b), scripts/postinstall.js (2531b), scripts/run.js (2522b), SKILL.md (24336b), _meta.json (144b)\n\nArchive v1.0.3: 9 files, 22587 bytes\n\nFiles: config.json (3215b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (4788b), scripts/postinstall.js (2531b), scripts/run.js (2522b), SKILL.md (24336b), _meta.json (144b)\n\nArchive v1.0.2: 9 files, 22513 bytes\n\nFiles: config.json (3215b), README.md (7802b), references/ip-whitelist-guide.md (6799b), references/quick-start.md (1654b), references/themes.md (4788b), scripts/postinstall.js (2531b), scripts/run.js (2522b), SKILL.md (24135b), _meta.json (144b)","readmeExcerpt":"Skill: Wechat Md Publisher Skill Owner: sipingme Summary: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。 Tags: latest:1.0.11 Version history: v1.0.11 | 2026-05-11T01:49:09.586Z | user - Enforced exact version pinning: now only allows wechat-md-publisher@1.0.7, rejecting mismatches and unverified upgrades. - Strengthened package resolution: only loads dependencies from trus","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 设置环境变量（不会出现在进程列表中）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\n# 添加账号\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default"},{"language":"bash","snippet":"# ⚠️ 警告：--app-secret 会出现在 ps 进程列表中\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default"},{"language":"bash","snippet":"wechat-pub publish create \\\n  --file article.md \\\n  --theme orangesun"},{"language":"bash","snippet":"# 一键转载新闻到微信公众号（推荐：下载图片到本地）\n# news-to-markdown 会自动下载图片到本地，避免远程 URL 过期问题\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --download-images \\\n  --output-dir /tmp/article\n\n# wechat-md-publisher 会自动读取本地图片并上传\nwechat-pub publish create --file /tmp/article/article.md --theme orangesun"},{"language":"bash","snippet":"# 一次性安装（请先阅读上文 \"安全风险与审计要点\" 完成审计；必须使用精确版本）\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证可用且版本精确等于 1.0.7\nwechat-pub --version\n\n# 查看帮助\nwechat-pub --help"},{"language":"bash","snippet":"wechat-pub account add \\\n  --name \"账号名称\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: wechat-md-publisher\ndescription: 发布 Markdown 文章到微信公众号，支持草稿管理、多主题、智能图片处理、自动封面图。推荐与 news-to-markdown-skill 配合使用实现一键转载（支持本地图片）。\nversion: 1.0.8\nauthor: Ping Si <sipingme@gmail.com>\nuser-invocable: true\nrequires:\n  runtime:\n    - name: node\n      version: \">=18.0.0\"\n    - name: npm\n      version: \">=8.0.0\"\ninstall:\n  type: npm-global\n  package: wechat-md-publisher\n  version: \"1.0.7\"\n  versionPinning: exact\n  execution: \"npm install -g wechat-md-publisher@1.0.7\"\n  global: true\n  autoInstall: false\n  autoUpdate: false\n  riskLevel: low\n  riskReason: |\n    启动器以 in-process 动态 import 调用本机已安装的 wechat-md-publisher，\n    并在 import 之前校验 manifest.name 与 manifest.version 是否精确等于内置 pin。\n    解析路径仅包含 Node 全局 node_modules 与 Skill 自身 node_modules；\n    当前工作目录 (CWD) 下的 node_modules 已被显式排除，避免被未审计的本地包替身劫持。\n    安装前请审计上游源码与凭证加密实现。\n  trustedResolutionRoots:\n    - \"<node-prefix>/lib/node_modules\"\n    - \"<node-prefix>/node_modules (Windows)\"\n    - \"<skill-dir>/node_modules\"\n  untrustedResolutionRoots:\n    - \"process.cwd()/node_modules (intentionally excluded)\"\n  source:\n    registry: https://registry.npmjs.org\n    repository: https://github.com/sipingme/wechat-md-publisher\n    license: Apache-2.0\n    audit: https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n    auditCredentials: https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\nenv:\n  optional:\n    - name: WECHAT_APP_ID\n      description: 微信公众号 AppID\n      sensitive: false\n    - name: WECHAT_APP_SECRET\n      description: 微信公众号 AppSecret\n      sensitive: true\n  note: |\n    凭证可通过两种方式提供（二选一）：\n    1. 环境变量（推荐，避免凭证暴露在进程列表中）\n    2. CLI 命令：`account add --app-id xxx --app-secret xxx`\nconfigPaths:\n  - path: ~/.config/wechat-md-publisher-nodejs/\n    description: 账号配置和缓存目录\n    contains:\n      - credentials: true\n      - encryption: AES-256\npermissions:\n  filesystem:\n    read:\n      - \"*.md\": \"读取用户指定的 Markdown 文件\"\n      - \"*.jpg,*.png,*.gif\": \"读取文章中引用的本地图片\"\n    write:\n      - \"~/.config/wechat-md-publisher-nodejs/\": \"存储账号配置和缓存（凭证使用 AES-256 加密）\"\n  network:\n    required:\n      - \"api.weixin.qq.com\": \"微信公众号 API（发布、草稿、素材管理）\"\n      - \"mp.weixin.qq.com\": \"微信公众号素材上传\"\n    optional:\n      - \"remote-theme-api\": \"仅当用户使用 theme add-remote 命令时才会访问（⚠️ 需用户明确配置并信任该端点）\"\ncredentials:\n  - name: WECHAT_APP_SECRET\n    type: api-secret\n    storage:\n      location: ~/.config/wechat-md-publisher-nodejs/\n      encryption: AES-256\n      handler: wechat-md-publisher npm 包\n      handlerRepo: https://github.com/sipingme/wechat-md-publisher\n    consent: 需要用户明确提供，不会自动收集\n    securityNote: |\n      本 skill 不直接处理凭证加密，安全性依赖上游 npm 包的实现。\n      建议在提供凭证前审查 wechat-md-publisher 包的加密实现：\n      https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\ntags:\n  - wechat\n  - publishing\n  - markdown\n  - content-management\nrepository: https://github.com/sipingme/wechat-md-publisher\n---\n\n# WeChat Publisher Skill\n\n全功能微信公众号 Markdown 发布工具 - 让 AI 能够直接将内容发布到微信公众号。\n\n## ⚠️ 重要提示\n\n**推荐使用方式**：\n- ✅ **最佳实践**：与 `news-to-"},{"path":"README.md","content":"# WeChat MD Publisher - OpenClaw Skill\n\n> 全功能微信公众号 Markdown 发布工具 - OpenClaw Skill 版本\n\n## 🛠️ 前置安装：底层 npm 包\n\n本 Skill 的启动器 (`scripts/run.js`) 通过 in-process 动态 `import` 调用本机已安装的 `wechat-md-publisher`，**不会**通过 `npx` 在运行时从 registry 拉取代码。\n因此**必须**在首次使用前显式全局安装底层包，并在安装前完成源码审计。\n\n> ⚠️ **必须使用精确版本（无 caret、无 `@latest`）**。启动器会在 `import` 之前读取已解析包的 `package.json`，校验 `name` 与 `version` 是否与内置 pin（当前 `1.0.7`）精确匹配，任何不匹配都会被拒绝。这是为了防止本地或全局 `node_modules` 中出现的同名替身包被加载。\n\n```bash\n# 一次性安装（请先审计源码，详见下方链接）\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证可用并精确等于 1.0.7\nwechat-pub --version\n```\n\n请审计：\n- CLI 入口：https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n- 凭证加密：https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\n\n> 不要在含有未审计 `node_modules` 的工作目录下运行 Skill。启动器只在受信路径（Node 全局 `node_modules` 与 Skill 自身 `node_modules`）解析包；**当前工作目录（CWD）下的 `node_modules` 已被显式排除**。\n\n## 🚀 快速安装（Skill 本身）\n\n### 方法 1：从 ClawHub 安装（推荐）\n\n```bash\nopenclaw skills install wechat-md-publisher\n```\n\n### 方法 2：从 GitHub 安装\n\n```bash\nopenclaw skills install https://github.com/sipingme/wechat-md-publisher-skill\n```\n\n### 方法 3：手动安装\n\n1. 克隆仓库：\n```bash\ngit clone https://github.com/sipingme/wechat-md-publisher-skill.git\ncd wechat-md-publisher-skill\n```\n\n2. 复制到 OpenClaw skills 目录：\n```bash\ncp -r . ~/.openclaw/skills/wechat-md-publisher/\n```\n\n3. 验证工具可用：\n```bash\nwechat-pub --version\n```\n\n## ✅ 验证安装\n\n```bash\n# 检查 Skill 是否可用\nopenclaw skills list --eligible\n\n# 查看 Skill 详情\nopenclaw skills info wechat-md-publisher\n\n# 测试命令\nwechat-pub --version\n```\n\n## 📋 首次配置\n\n### 1. 获取微信公众号凭证\n\n1. 登录 [微信公众平台](https://mp.weixin.qq.com/)\n2. 进入「设置与开发」→「基本配置」\n3. 获取「开发者ID(AppID)」和「开发者密码(AppSecret)」\n4. 将服务器 IP 添加到「IP白名单」\n\n### 2. 配置账号\n\n```bash\n# 推荐：使用环境变量（避免命令行暴露凭证）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\n\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --default\n```\n\n### 3. 测试发布\n\n```bash\n# 创建测试文章\ncat > test.md << 'EOF'\n---\ntitle: 测试文章\n---\n# Hello World\n这是一篇测试文章。\nEOF\n\n# 发布\nwechat-pub publish create --file test.md --theme default\n```\n\n## 🎯 使用方式\n\n### 在 OpenClaw 对话中使用\n\n**示例 1：发布文章**\n\n```\n用户: 帮我把这篇文章发布到微信公众号\n\n[提供 Markdown 内容]\n\nAI: 好的，我来帮你发布。正在使用 orangeheart 主题...\n✓ 文章已成功发布！发布 ID: 2247483647_1\n```\n\n**示例 2：创建草稿**\n\n```\n用户: 先创建一个草稿，不要立即发布\n\nAI: 明白，我会先创建草稿。\n✓ 草稿创建成功，Media ID: 3_abc123\n你可以在微信公众平台查看和编辑。\n```\n\n**示例 3：查看文章列表**\n\n```\n用户: 查看我已发布的微信文章\n\nAI: 正在获取列表...\n共 8 篇已发布文章：\n1. 最新文章 (2026-03-19)\n2. 产品介绍 (2026-03-18)\n...\n```\n\n### 手动调用 Skill\n\n```bash\n# 使用 OpenClaw 命令\nopenclaw run wechat-md-publisher publish article.md orangeheart\n\n# 或直接使用工具\nwechat-pub publish create --file article.md --theme orangeheart\n```\n\n## � 与 news-to-markdown-skill 组合使用\n\n**推荐组合**：一键转载新闻到微信公众号\n\n### 快速示例\n\n```bash\n# 1. 提取新闻文章\nconvert-url --url \"https://www.toutiao.com/article/123\" \\\n  --output /tmp/article.md \\\n  --platform toutiao\n\n# 2. 发布到微信公众号\nwechat-pub publish create \\\n  --file /tmp/article.md \\\n  --theme orangeheart\n```\n\n### AI 自动化工作流\n\n用户说：\n> \"帮我把这篇头条文章转载到我的微信公众号\"\n\nAI 自动执行（**默认走\"草稿优先 + 人工确认\"路径**）：\n1. 使用 `news-to-ma"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70nwj71rbkzwyvc7pkqs4p6s8222nc\",\n  \"slug\": \"wechat-md-publisher-skill\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1778464149586\n}"},{"path":"references/ip-whitelist-guide.md","content":"# 微信公众号 IP 白名单配置指南\n\n## 什么是 IP 白名单？\n\n微信公众号为了安全，要求所有调用 API 的服务器 IP 必须在白名单中。如果 IP 不在白名单，API 调用会失败。\n\n## 为什么需要配置？\n\n当你使用 `wechat-md-publisher` 发布文章时，工具会从你的电脑/服务器向微信 API 发送请求。微信会检查请求来源的 IP 地址，只有在白名单中的 IP 才能成功调用。\n\n## 如何获取你的 IP 地址？\n\n### 方法 1：使用命令行（推荐）\n\n```bash\n# macOS/Linux\ncurl ifconfig.me\n\n# 或\ncurl icanhazip.com\n\n# 或\ncurl ipinfo.io/ip\n```\n\n### 方法 2：访问网站\n\n访问以下任一网站查看你的公网 IP：\n- https://www.ip.cn/\n- https://ipinfo.io/\n- https://ifconfig.me/\n\n### 方法 3：在微信公众平台查看\n\n登录微信公众平台后，在 IP 白名单设置页面，微信会显示你当前的 IP 地址。\n\n## 如何配置 IP 白名单？\n\n### 步骤 1：登录微信公众平台\n\n访问 https://mp.weixin.qq.com/ 并登录\n\n### 步骤 2：进入 IP 白名单设置\n\n1. 点击左侧菜单「设置与开发」\n2. 点击「基本配置」\n3. 找到「IP白名单」部分\n4. 点击「修改」或「查看」\n\n### 步骤 3：添加 IP 地址\n\n1. 点击「添加」按钮\n2. 输入你的公网 IP 地址\n3. 点击「确定」\n\n**示例**：\n```\n123.456.789.012\n```\n\n### 步骤 4：验证配置\n\n添加后，等待 1-2 分钟生效，然后测试：\n\n```bash\nwechat-pub account list\n```\n\n如果能正常显示账号列表，说明配置成功。\n\n## 常见场景\n\n### 场景 1：在家里使用\n\n**问题**：家庭宽带的 IP 地址可能会变化\n\n**解决方案**：\n1. **短期方案**：每次 IP 变化后重新添加\n2. **长期方案**：\n   - 联系运营商申请固定 IP（可能需要付费）\n   - 使用云服务器部署（推荐）\n\n### 场景 2：在公司使用\n\n**问题**：公司可能使用固定 IP 或代理\n\n**解决方案**：\n1. 询问 IT 部门获取公司的公网出口 IP\n2. 将公司 IP 添加到白名单\n3. 如果公司使用代理，需要添加代理服务器的 IP\n\n### 场景 3：在云服务器使用\n\n**推荐方案**：\n1. 购买云服务器（阿里云、腾讯云、AWS 等）\n2. 云服务器通常有固定的公网 IP\n3. 将云服务器 IP 添加到白名单\n4. 在云服务器上安装和使用 `wechat-md-publisher`\n\n**优点**：\n- ✅ IP 固定，不会变化\n- ✅ 24/7 在线\n- ✅ 可以设置定时任务自动发布\n- ✅ 网络稳定\n\n### 场景 4：使用 VPN 或代理\n\n**问题**：VPN 会改变你的出口 IP\n\n**解决方案**：\n1. 关闭 VPN 后获取真实 IP\n2. 将真实 IP 添加到白名单\n3. 使用工具时关闭 VPN\n\n或者：\n1. 获取 VPN 的出口 IP\n2. 将 VPN IP 添加到白名单\n3. 使用工具时保持 VPN 连接\n\n## 多 IP 配置\n\n微信公众号支持添加多个 IP 地址（通常最多 10-20 个）。\n\n**适用场景**：\n- 在多个地点使用（家里、公司、咖啡厅）\n- 团队协作（多人使用）\n- 备用 IP（防止主 IP 失效）\n\n**配置方法**：\n在 IP 白名单页面，点击「添加」，逐个添加所有需要的 IP。\n\n## 安全建议\n\n### ✅ 推荐做法\n\n1. **只添加必要的 IP**\n   - 不要添加不信任的 IP\n   - 定期检查和清理不再使用的 IP\n\n2. **使用固定 IP**\n   - 云服务器（推荐）\n   - 固定宽带 IP\n\n3. **定期更新**\n   - IP 变化后及时更新白名单\n   - 删除不再使用的 IP\n\n### ❌ 不推荐做法\n\n1. **不要使用公共 WiFi**\n   - 公共 WiFi 的 IP 可能被多人共享\n   - 存在安全风险\n\n2. **不要添加 0.0.0.0 或通配符**\n   - 微信不支持通配符\n   - 必须添加具体的 IP 地址\n\n3. **不要分享你的 AppSecret**\n   - 即使 IP 在白名单中，也要保护好 AppSecret\n   - 不要将 AppSecret 提交到 Git 仓库\n\n## 故障排查\n\n### 错误：IP 不在白名单\n\n**症状**：\n```\n错误码: 40164\n错误信息: invalid ip xxx.xxx.xxx.xxx, not in whitelist\n```\n\n**解决步骤**：\n\n1. **确认当前 IP**：\n   ```bash\n   curl ifconfig.me\n   ```\n\n2. **检查白名单**：\n   - 登录微信公众平台\n   - 查看 IP 白名单列表\n   - 确认当前 IP 是否在列表中\n\n3. **添加 IP**：\n   - 如果不在，添加当前 IP\n   - 等待 1-2 分钟生效\n\n4. **重试**：\n   ```bash\n   wechat-pub account list\n   ```\n\n### 错误：IP 频繁变化\n\n**症状**：今天能用，明天就不能用了\n\n**原因**：家庭宽带 IP 动态分配\n\n**解决方案**：\n\n**方案 1：使用云服务器（推荐）**\n```bash\n# 1. 购买云服务器（最低配置即可）\n# 2. 在云服务器上安装工具（必须使用精确版本；启动器会校验）\nssh user@your-server-ip\nnpm install -g wechat-md-publisher@1.0.7\n\n# 3. 推荐通过环境变量提供凭证（避免命令行暴露 AppSecret）\nexport WECHAT_APP_ID=\"wx_your_app_id\"\nexport WECHAT_APP_SECRET=\"your_app_secret\"\nwechat-pub account add --name \"公众号\" --default\n\n# 4. 使用：建议先创建草稿，人工确认后再 publish\nwechat-pub draft create --file article.md --theme default\n```\n\n**方案 2：申请固定 IP**\n- 联系宽带运营商\n- 申请固定公网 IP（可能需要额外费用）\n\n**方案 3：使用 DDNS**\n- 配置动态 DNS\n- 使用脚本自动更新白名单（需要开发）\n\n## 自动化脚本\n\n### 检查 IP 是否变化\n\n```bash\n#!/bin/bash\n# check-ip.sh\n\nCURRENT_IP=$(curl -s ifconfig"},{"path":"references/quick-start.md","content":"# WeChat Publisher - 快速开始指南\n\n## 5 分钟快速上手\n\n### 步骤 1：安装工具（1 分钟）\n\n> ⚠️ **必须使用精确版本**。Skill 启动器在加载前会校验 `package.json` 的 `name` 与 `version`，任何不匹配都会被拒绝。请勿使用 `@latest` 或浮动范围。\n\n```bash\n# 安装前请先审计上游源码（CLI 与凭证加密）：\n#   - https://github.com/sipingme/wechat-md-publisher/blob/main/src/index.ts\n#   - https://github.com/sipingme/wechat-md-publisher/blob/main/src/services/account.ts\nnpm install -g wechat-md-publisher@1.0.7\n\n# 验证版本（必须精确等于 1.0.7）\nwechat-pub --version\n```\n\n### 步骤 2：配置账号（2 分钟）\n\n1. 获取微信公众号凭证：\n   - 登录 https://mp.weixin.qq.com/\n   - 进入「设置与开发」→「基本配置」\n   - 复制 AppID 和 AppSecret\n\n2. 添加账号：\n\n```bash\nwechat-pub account add \\\n  --name \"我的公众号\" \\\n  --app-id \"wx_your_app_id\" \\\n  --app-secret \"your_app_secret\" \\\n  --default\n```\n\n### 步骤 3：创建测试文章（1 分钟）\n\n```bash\ncat > test-article.md << 'EOF'\n---\ntitle: 测试文章\nauthor: 测试作者\n---\n\n# 欢迎使用 WeChat Publisher\n\n这是一篇测试文章。\n\n## 主要特性\n\n- 完整的草稿管理\n- 8 个精美主题\n- 智能图片处理\nEOF\n```\n\n### 步骤 4：发布文章（1 分钟）\n\n> 💡 **推荐先创建草稿，人工确认后再发布**。直接 `publish create` 会立即让文章对公众号粉丝可见，请在 AI / 自动化流程中默认走草稿路径。\n\n```bash\n# 推荐：先创建草稿（不会公开发布）\nwechat-pub draft create --file test-article.md --theme orangeheart\n\n# 仅在你已经审阅过渲染结果与图片后，再正式发布\nwechat-pub publish create --file test-article.md --theme orangeheart\n```\n\n### 验证成功\n\n如果看到以下输出，说明配置成功：\n\n```\n✓ 渲染完成\n✓ 图片处理完成\n✓ 创建草稿成功\n✓ 发布成功\n\n发布 ID: 2247483647_1\n```\n\n现在可以在微信公众平台查看你的文章了！\n\n## 常用命令速查\n\n```bash\n# 查看所有主题\nwechat-pub theme list\n\n# 创建草稿\nwechat-pub draft create --file article.md --theme lapis\n\n# 查看草稿列表\nwechat-pub draft list\n\n# 查看已发布文章\nwechat-pub publish list\n\n# 删除草稿\nwechat-pub draft delete <media-id>\n```\n\n## 下一步\n\n- 阅读完整文档：[SKILL.md](../SKILL.md)\n- 查看主题示例：[themes.md](./themes.md)\n- 了解 API 用法：https://github.com/sipingme/wechat-md-publisher"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1205,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T22:00:24.513Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T23:24:22.597Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}