Skip to main content

96push

User-approved 96Push desktop client publishing helper — query platforms/accounts, create content, inspect platform rules, and publish only after explicit confirmation. Use when user mentions 96push, publishing, social media, multi-platform, or content distribution.

Source facts

Repository
RabbitAI-Lab/rabbit-plugins-upstream
Last source activity
July 26, 2026 at 20:50
Detected SKILL.md language
English
Stars
0
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
26 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
96push
description
User-approved 96Push desktop client publishing helper — query platforms/accounts, create content, inspect platform rules, and publish only after explicit confirmation. Use when user mentions 96push, publishing, social media, multi-platform, or content distribution.
homepage
https://push.96.cn
metadata
{"openclaw":{"homepage":"https://push.96.cn","requires":{"env":"[Truncated]"},"primaryEnv":"PUSH_API_KEY"}}
# 96Push Remote Control Use the bundled script to control the user's local 96Push desktop client via the 96.cn HTTPS proxy. This skill can affect logged-in social media accounts; treat publish, delete, queue cancel, and platform setting changes as high-impact actions. ## Safety First - Do not run `update`, `publish`, `delete-article`, `cancel-queue`, `create-plat-set`, `update-plat-set`, or `delete-plat-set` until the user explicitly approves that exact action. - Before asking for approval, show the content ID/title, content type, target account IDs/platforms, draft/live publish state, visibility, and platform settings. - Prefer draft mode or a single account first. Publishing to multiple accounts requires a second explicit confirmation for the full account list. - Never ask the user to paste `PUSH_API_KEY` into chat by default. Prefer that the user stores it locally in an environment variable or `~/.openclaw/.env`. - Never echo API keys, draft private content, or unpublished media URLs in responses. - Only use this skill when the user intends to operate 96Push and trusts the 96Push service at [https://push.96.cn](https://push.96.cn). ## Requirements - The user should provide the API key locally via either: - environment variable: `PUSH_API_KEY`, or - `~/.openclaw/.env` line: `PUSH_API_KEY=pk_...` - If the key is missing, the script will return setup instructions. Guide the user: 1. Download 96Push from [https://push.96.cn](https://push.96.cn) 2. Launch and login 3. Go to profile (bottom-left avatar) → API Key → Generate 4. Add it locally to `~/.openclaw/.env` or `PUSH_API_KEY`; do not paste it into chat unless they explicitly want the agent to write that local file. ## Commands All commands via `python3 {baseDir}/scripts/96push.py <command> [options]`. ### Query ```bash # health check python3 {baseDir}/scripts/96push.py check # platforms python3 {baseDir}/scripts/96push.py platforms python3 {baseDir}/scripts/96push.py platforms --article python3 {baseDir}/scripts/96push.py platforms --video # accounts python3 {baseDir}/scripts/96push.py accounts python3 {baseDir}/scripts/96push.py all-accounts # content python3 {baseDir}/scripts/96push.py articles --page 1 --size 10 --status 1 python3 {baseDir}/scripts/96push.py article --id 42 # publish records python3 {baseDir}/scripts/96push.py records --page 1 --size 10 python3 {baseDir}/scripts/96push.py record --id 7 # dashboard python3 {baseDir}/scripts/96push.py dashboard python3 {baseDir}/scripts/96push.py overview python3 {baseDir}/scripts/96push.py user # platform configs python3 {baseDir}/scripts/96push.py plat-sets --pid 3 # platform publishing rules (offline, no API key required) python3 {baseDir}/scripts/96push.py rules --list python3 {baseDir}/scripts/96push.py rules --platform wechat --type article python3 {baseDir}/scripts/96push.py rules --platform wechat,zhihu --type article ``` ### Upload Local Images OpenClaw runs on a server and cannot read arbitrary user-local paths like `/Users/...` or `C:\...`. Images must become URLs before they are used in `thumb`, `files`, or article body markup. - If the user attached/generated an image that exists in the OpenClaw runtime, upload it first and use the returned 96Push pix URL. - If the image only exists on the user's computer, ask the user to upload it through 96Push or another image host and provide the returned URL. Do not invent or use the local path. - `upload` returns a 96Push local pix URL (`http://127.0.0.1:.../pix/...`). It is already backed by the user's local 96Push client. Uploading sends a file available to the skill runtime to 96Push, so it requires explicit user approval immediately before running. ```bash python3 {baseDir}/scripts/96push.py upload --file "/workspace/uploads/cover.png" --confirm ``` ### Create Content ```bash # content type can be omitted when --files clearly indicates image/video # video files (.mp4/.mov/.avi/.mkv/.webm/.m4v/.flv/.wmv) are inferred as --type video # article — needs title + markdown (or content as HTML) python3 {baseDir}/scripts/96push.py create --type article --title "标题" --markdown "# 内容" --desc "摘要" # article with explicit cover image(s) python3 {baseDir}/scripts/96push.py create --type article --title "标题" --markdown "# 内容" --thumb '["https://example.com/cover.jpg"]' # graph_text — needs title + files (image URLs, at least 1) python3 {baseDir}/scripts/96push.py create --type graph_text --title "图集" --files '["url1","url2"]' # video — needs title + files (1 video URL), desc strongly recommended python3 {baseDir}/scripts/96push.py create --type video --title "视频" --files '["video_url"]' --desc "视频描述" python3 {baseDir}/scripts/96push.py create --title "视频" --files '["https://example.com/video.mp4"]' --desc "视频描述" ``` ### Update / Delete Content Updates change managed content in 96Push, and deletion is destructive. Both require explicit user approval immediately before running. ```bash python3 {baseDir}/scripts/96push.py update --id 42 --title "新标题" --markdown "# 新内容" --confirm python3 {baseDir}/scripts/96push.py delete-article --id 42 --confirm ``` ### Publish Publish is high-impact. First present the exact content, account list, draft/live state, and settings to the user. Run only after explicit approval. ```bash # single-account live publish after explicit approval python3 {baseDir}/scripts/96push.py publish --type article --id 42 --accounts "1" --confirm python3 {baseDir}/scripts/96push.py publish --type video --id 42 --accounts "5" --confirm # if --type is omitted, the script reads content detail and infers article/graph_text/video # publish prints a rules-file hint for each recognized target platform # use --show-rules only when you need the full rule text in the command output # advanced mode — full settings per account (see platform settings reference) python3 {baseDir}/scripts/96push.py publish --type article --id 42 --accounts-json '[{"id":1,"platName":"微信公众号","settings":{"publishType":"publish","origin":false}}]' --confirm --show-rules # multi-account draft after explicit approval of the full target list python3 {baseDir}/scripts/96push.py publish --type article --id 42 --accounts "1,5" --draft --confirm --confirm-multi-account # poll result python3 {baseDir}/scripts/96push.py poll --id 7 python3 {baseDir}/scripts/96push.py poll --id 7 --interval 10 --max 30 ``` ### Manage Platform Configs Platform config changes affect future publishing behavior and require explicit user approval. ```bash # create a reusable config python3 {baseDir}/scripts/96push.py create-plat-set --pid 1 --name "公众号默认" --setting '{"publishType":"publish","leave":true}' --confirm # update config python3 {baseDir}/scripts/96push.py update-plat-set --sid 1 --pid 1 --name "公众号原创" --setting '{"publishType":"publish","origin":true}' --confirm # delete config python3 {baseDir}/scripts/96push.py delete-plat-set --sid 1 --confirm ``` ## Typical Workflow 1. `check` — confirm client is online 2. `accounts` — list available accounts, let user pick targets 3. `rules` — read every target platform's rule file for the target content type before creating settings or choosing cover images 4. `create` — create content (see content creation rules below) 5. Ask the user to approve the exact content, target accounts, draft/live state, and settings. 6. `publish --confirm` — submit and wait for results (**call ONCE only**, see critical rules below). Use `--confirm-multi-account` only after the user approves every target account. The command automatically polls until completion — no need to call `poll` separately. 7. Report results to the user --- ## CRITICAL: Publish Anti-Spam Rules (MUST FOLLOW) **⚠️ NEVER call `publish` more than ONCE per content per batch of accounts.** The publish command triggers browser automation that takes 30-60 seconds to complete. The script has a built-in guard that rejects publish if another task is already running. Follow these rules strictly: 1. **ONE publish call per batch.** The `publish` command now automatically waits for completion — it submits the task and polls until done. Do NOT call `poll` separately unless you used `--no-wait`. 2. **Publish requires explicit approval.** Use `--confirm` only after the user approves the exact content, target accounts, draft/live state, and settings. 3. **Multi-account publish requires extra approval.** Use `--confirm-multi-account` only after the user approves every target account in the batch. 4. **If publish times out**, it does NOT mean publish failed — the browser automation may still be running. Do NOT retry publish. Instead, ask the user to check the 96Push client. 5. **If publish returns `PUBLISH_ALREADY_RUNNING`**, do NOT retry. Wait for the active task to complete. 6. **If publish returns HTTP 425**, another task is in progress. Wait and report to user, do NOT retry. 7. **NEVER loop or retry the publish command.** Each call creates a new browser automation task. Calling it 10 times creates 10 browser windows fighting for the same page. 8. **The complete sequence is always**: user approval → `publish --confirm` (once, waits automatically) → report result to user. --- ## Content Creation Rules (IMPORTANT) The CLI now validates and minimizes create/update payloads: - Article payloads do not send `files`; graph_text/video payloads do not send `markdown` or `content`. - `thumb` and `files` are rejected unless every value is an HTTP(S) URL. - `graph_text` requires at least one image URL in `files`. - `video` requires exactly one video URL in `files`. - `article` requires `markdown` or `content`. Before creating content for a known target platform, read its rule file: ```bash python3 {baseDir}/scripts/96push.py rules --platform <platform> --type <article|graph_text|video> ``` ### PublishData Fields | Field | Type | Required | Description | | --------- | -------- | ----------- | -------------------------------------------------------- | | title | string | **Yes** | Content title | | desc | string | No | Description/summary | | content | string | Conditional | HTML content (articles need this) | | markdown | string | Conditional | Markdown source (articles need this) | | autoThumb | bool | No | Auto-extract cover from content (default true) | | thumb | string[] | Conditional | Cover image HTTP(S) URLs. Upload/host local images first; no local paths or base64/data URLs. | | files | string[] | Conditional | Media HTTP(S) URLs — only for graph_text images and video media. NOT used for articles. | ### By Content Type **Type selection rule**: - If the user wants to create or publish a video, use `--type video` explicitly whenever possible. - If `--type` is omitted, the CLI now infers the type from `--files` or existing content detail. - If `--type article` is passed together with `files`, the CLI treats the explicit article type as authoritative and rejects/ignores the misplaced media instead of silently creating graph_text/video content. - Never create article content with video URLs in `files`; video URLs must be video content. **Article (文章)**: - **Must have**: `title` + `content` (HTML) or `markdown` - **Cover image (thumb)**: Some platforms require at least one cover. Set `autoThumb: true` to auto-extract from content images, or provide explicit `thumb` URLs. - **desc**: Optional summary text, some platforms use it. - **Do NOT set `files`** for articles — `files` is only for graph_text/video. Images in articles go into the markdown/content body. Cover images go into `thumb`. **Graph Text (图文/图集)**: - **Must have**: `title` + `files` (array of image URLs, at least 1) - **Cover**: Auto-generated from first image if `thumb` is empty. - **No content/markdown needed** — the images ARE the content. **Video (视频)**: - **Must have**: `title` + `files` (array with exactly 1 video URL) - **Cover**: Auto-generated from video frame if `thumb` is empty. Many platforms require a cover — provide one if possible. - **desc**: Strongly recommended — most video platforms use it as the video description. ### Cover Image Requirements by Platform Quick reference only. The source of truth is `references/platform-rules/<platform>.md`. | Platform | Article Cover | Graph Text Cover | Video Cover | | ------------------------- | --------------------- | ---------------- | --------------- | | WeChat (wechat) | Required (1 image) | Auto from images | Required | | Douyin (douyin) | N/A | Auto | Auto from video | | Toutiao (toutiaohao) | Required (1-3 images) | Auto | Auto | | Xiaohongshu (xiaohongshu) | N/A | Auto from images | Auto | | Bilibili (bilibili) | Optional (headerImg) | Auto | Required | | Zhihu (zhihu) | Optional | Auto | Auto | | Baijiahao (baijiahao) | Required (1-3 images) | Auto | Required | | CSDN (csdn) | Optional | N/A | Auto | | Weibo (sina) | N/A | Auto | Auto | | Kuaishou (kuaishou) | N/A | Auto | Auto | | Sohu (sohuhao) | Auto from content | Auto | Auto | **Rule**: When in doubt, always provide at least one `thumb` image. `autoThumb: true` will try to extract from content but may fail if content has no images. **IMPORTANT**: `thumb` and `files` only accept HTTP(S) URLs. Use `upload --file ... --confirm` only when the file already exists in the OpenClaw runtime; then use the returned pix URL in `thumb`, `files`, or article image `src`. If the image only exists on the user's machine, ask the user to upload it through 96Push/hosting first. Never pass local paths or base64/data URLs. At publish time, 96Push downloads `thumb`/`files` URLs into task-local files when a target platform needs file upload. Article body pix images are uploaded to temporary public storage only when the target platform needs public image URLs; that upload is cached by image hash for about 47 hours. --- ## Platform Settings Reference (IMPORTANT) When publishing, each account in `postAccounts` needs a `settings` object. **Different platforms require different fields.** Settings are passed as JSON in the `--accounts-json` parameter or pre-configured via `plat-sets`. **Before building settings, read only the target platform files in `references/platform-rules/`.** Do not copy settings from a different platform and do not include empty/unrelated fields just because they exist in the aggregate reference. ```bash
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub