Wechat Publisher DraftGet
ReviewAudited by ClawScan on May 15, 2026.
Overview
This is a coherent WeChat draft-publishing helper, but it uses official-account credentials and creates persistent local verification files, so only run it for drafts you intend to send to WeChat.
Install only if you trust the local md2wechat CLI and intend to let this skill create WeChat Official Account drafts. Confirm the selected article and cover before running, keep the md2wechat credential file protected, and review the generated verification JSON rather than relying only on the success message.
Findings (5)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Running the script will send the selected article and cover into the WeChat draft workflow.
The script uses the md2wechat CLI to upload a cover image and create a WeChat draft. This mutates the user’s WeChat Official Account draft box, but it is the central, disclosed purpose of the skill.
md2wechat upload_image "$COVER_ABS" --json > "$UPLOAD_JSON" ... md2wechat create_draft "$DRAFT_JSON" --json > "$CREATE_RESULT"
Use it only after confirming the article, cover, title, author, and digest are ready to be uploaded to the intended WeChat Official Account.
The skill can act with the privileges of the configured WeChat Official Account credentials for draft creation and verification.
The verification step reads WeChat Official Account credentials from the local md2wechat config or environment variables to obtain an access token for the official WeChat API. This is expected for the integration and the token is masked in saved output.
cfg_path=pathlib.Path.home()/'.config/md2wechat/config.yaml' ... appid=(cfg.get('wechat') or {}).get('appid') or os.getenv('WECHAT_APPID') ... secret=(cfg.get('wechat') or {}).get('secret') or os.getenv('WECHAT_SECRET')Use least-privilege, account-appropriate credentials where possible, protect the md2wechat config file, and rotate credentials if they are exposed.
The script may fail or use whatever local yaml/PyYAML package is installed in the user’s Python environment.
The script imports the non-stdlib yaml module, while the declared requirements list md2wechat and python3 but do not explicitly declare a Python package dependency. This is a dependency completeness issue rather than evidence of malicious behavior.
import json, os, pathlib, sys, urllib.parse, urllib.request, yaml
Install dependencies from trusted sources and consider documenting PyYAML or the expected Python environment explicitly.
Draft content and verification details may remain in local files after publishing.
The script saves the WeChat draft/get response and checks to a local verification JSON file. This is disclosed as part of verification, but it can persist article content and backend draft metadata on disk.
result.update({'draft_get_response':draft_resp,'checks':checks,'passed':checks['errcode_ok'] and checks['title_ok'] and checks['author_ok'] and checks['thumb_media_id_present'] and not checks['content_has_local_path']})
out.write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8')Store article directories securely and delete generated verification artifacts if they contain sensitive draft content you no longer need.
A successful script exit may not prove every documented quality check was enforced.
The code records content length and inline-style checks but does not include them in the final passed condition, even though the documentation describes content existence and publish-ready formatting as verification items.
'content_length': len(content), ... 'content_has_inline_style': 'style=' in content, ... 'passed':checks['errcode_ok'] and checks['title_ok'] and checks['author_ok'] and checks['thumb_media_id_present'] and not checks['content_has_local_path']
Review the generated verify JSON manually, especially content_length, content_has_inline_style, and any draft_get_response fields, before relying on the success message.
