Install any skill in seconds. Free to start, no credit card required.
Get Started Free →专为开源版 awesome-poetize-open 设计的 POETIZE 博客自动化技能。通过 `/api/api/*` 接口完成文章发布、更新、隐藏、分类标签维护、主题切换、数据分析和 SEO 运维。Use only when the task explicitly targets a POETIZE site or POETIZE admin API workflow. Do not use for generic writing, generic SEO advice, or non-POETIZE CMS work.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 462% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 177% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 137% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 525% | 0% |
Use this skill to operate a POETIZE blog as a personal publishing and maintenance system. It is built on the existing POETIZE API feature, not browser automation. It is free-first, growth-first, and maintenance-first. It is not monetization-first.
/api/api/* 接口进行文章发布、更新、隐藏、分类标签维护、主题切换、数据分析和 SEO 运维。awesome-poetize-open 开源分支,不适用于原版 POETIZE。awesome-poetize-open 设计。awesome-poetize-open-blog-automation so the registry entry stays tied to the open-source project.awesome-poetize-open.{baseDir} for any file path that points inside this skill folder.python in examples and switch to python3 when that is the installed binary.scripts/render_openclaw_config.py to generate OpenClaw config instead of hand-writing JSON.scripts/openclaw_smoke_test.py before the first real write action on a new OpenClaw environment.POETIZE_BASE_URL at the public nginx/domain origin.${POETIZE_BASE_URL}/api/api/...; do not append /api inside the variable value itself.Read references/poetize-api.md before publishing, updating, querying, or operating articles. Read references/openclaw-setup.md when connecting the skill to OpenClaw. Read references/strategy-playbook.md before deciding whether to create, refresh, or hide content. Read references/decision-matrix.md before setting publish posture, search posture, or paywall posture. Read references/creativity-workflow.md before drafting article copy. Read references/evaluation-scenarios.md when validating the strategy layer. Run scripts/run_strategy_evals.py to verify the local strategy layer before shipping skill changes.
Breaking change:
--brief-file.assets/article-brief.template.json and assets/ops-brief.template.json as the starting point for strategy briefs.Decide whether the user wants a draft or a public article. Decide whether the task is new content, old-content maintenance, taxonomy cleanup, SEO follow-up, or article takedown by hiding. Default to free content unless the user explicitly asks for a draft or a paywalled post. Create a strategy brief before any mutating action.
Use {baseDir}/assets/article-brief.template.json for article creation or article refresh work. Use {baseDir}/assets/ops-brief.template.json for update or hide operations. Fill primaryGoal, reasoning, and the required brief fields before calling any mutating script. If required brief information is missing, stop and ask for it.
Produce 2 or 3 candidate angles first. Choose one final direction and record it as selectedAngle. Record the rejected candidates in alternativesConsidered.
Prefer a single H1 at the top. Keep the body as clean Markdown. Use short lead paragraphs, clear section headings, lists only when they improve readability, and avoid HTML unless required. If the article includes images, save them as local files first and reference them from the Markdown file with relative paths such as . publish_post.py will upload those local article images through /api/resource/upload before publishing and replace them with returned URLs. When the task is maintenance, prefer revising existing articles over creating duplicates.
Use the front matter keys documented in references/poetize-api.md. At minimum provide title, sort or sortId, and label or labelId. Prefer existing sort and label names when IDs are unknown. The script will query /api/categories and /api/tags first and reuse exact matches. If exact matches fail, the script may return close category or tag candidates for confirmation. Close matches are suggestions only and must not be auto-selected. It will not create a new category or tag unless you explicitly allow it. Be explicit about article switches when the user mentions them: commentStatus for comments recommendStatus for recommendation viewStatus for visibility submitToSearchEngine for search-engine push Only set paid fields when the user explicitly wants a paywall and the content clearly deserves it. For most personal blogs, keep payType: 0. When the user does not want to upload a cover, set coverBlank: true or cover: " ".
Use {baseDir}/scripts/publish_post.py for create or content update flows driven by Markdown. OpenClaw runtime only needs: POETIZE_BASE_URL POETIZE_API_KEY --brief-file is mandatory. If the markdown body references local images or local <img src="..."> files, the script uploads them automatically before sending the article payload. For paid posts, the script will check /api/payment/plugin/status first, but paid publishing is not the default path for this skill. If the payment plugin is installed but not configured, provide paymentPluginKey in front matter and optionally pass --payment-config-file payment.json.
Use {baseDir}/scripts/manage_blog.py. It supports: article listing exact-title lookup article detail article update article hide global article theme switching article analytics site visit trends controlled SEO config sitemap update It does not support article deletion. If the user wants a post effectively removed from public view, hide it by setting viewStatus: false. update-article and hide-article now require --brief-file.
Prefer --wait so the script polls until the async task finishes. Report the returned articleId, articleUrl, task status, visibility state, and any follow-up analytics when requested.
viewStatus: false or run with --draft.commentStatus, recommendStatus, viewStatus, and submitToSearchEngine explicitly when the user mentions them.viewStatus: false, the script will auto-fill a draft password and preview tip when omitted.sortId or labelId. Use sort and label names when IDs are unknown.sort or label does not exist, stop and ask for confirmation unless allowCreateTaxonomy, allowCreateSort, or allowCreateLabel is explicitly set.pendingTranslationLanguage, pendingTranslationTitle, and pendingTranslationContent.viewStatus: false.payType explicit. Do not guess a paywall mode from prose alone.payType: 0.coverBlank: true over inventing a fake cover URL.publish_post.py uses hard strategy validation.manage_blog.py update-article and hide-article use hard strategy validation.Generate a usable OpenClaw config that points OpenClaw at this repo's openclaw-skills directory:
bashpython {baseDir}/scripts/render_openclaw_config.py --output openclaw.poetize.local.json --api-key "replace-with-poetize-api-key"
Run a read-only smoke test before the first publish or update:
bashpython {baseDir}/scripts/openclaw_smoke_test.py --base-url "https://your-blog.example.com" --api-key "replace-with-poetize-api-key"
Start from the bundled strategy templates:
Create article-brief.json from {baseDir}/assets/article-brief.template.json. Create ops-brief.json from {baseDir}/assets/ops-brief.template.json.
Front matter example with the common publish switches:
md--- title: "示例文章" sort: "AI实践" label: "自动化" commentStatus: true recommendStatus: false viewStatus: true submitToSearchEngine: true --- # 示例文章 正文...
Markdown image example with local files:
md--- title: "带图文章示例" sort: "AI实践" label: "自动化" --- # 带图文章示例 这里是一张本地图片: 
At publish time, publish_post.py uploads ./assets/flow.png and rewrites the Markdown image target to the returned URL.
Publish a new draft and wait:
bashpython {baseDir}/scripts/publish_post.py --markdown-file draft.md --brief-file article-brief.json --draft --wait
Publish a public article and wait:
bashpython {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --publish --wait
Update an existing article:
bashpython {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --article-id 123 --publish --wait
Publish a paid article and require payment readiness:
bashpython {baseDir}/scripts/publish_post.py --markdown-file paid-article.md --brief-file article-brief.json --payment-plugin-key afdian --payment-config-file payment.json --require-paid --publish --wait
Start an async task without waiting:
bashpython {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json
Allow creating a missing category and tag only when explicitly confirmed:
bashpython {baseDir}/scripts/publish_post.py --markdown-file article.md --brief-file article-brief.json --allow-create-taxonomy --publish --wait
List articles for运营筛选:
bashpython {baseDir}/scripts/manage_blog.py list-articles --search-key "AI" --sort-name "AI实践" --label-name "自动化" --current 1 --size 10
If an exact category or tag name does not match, the management script returns close candidates and stops. OpenClaw should surface those candidates for confirmation instead of guessing.
Hide an existing article:
bashpython {baseDir}/scripts/manage_blog.py hide-article --article-id 123 --brief-file ops-brief.json --wait
Deletion policy:
viewStatus to false.Switch the global article theme:
bashpython {baseDir}/scripts/manage_blog.py activate-theme --plugin-key academic
Update controlled SEO config:
bashpython {baseDir}/scripts/manage_blog.py seo-set-config --config-file seo.json
taskId and task status URL when not waitingarticleIdarticleUrlOther measured skills in the registry, with their headline benchmark lift.