Communitygithub.com

geoqiao/short-video-skills

发布短视频到抖音、视频号、小红书(B 站只写文案):先读抖音、小红书和 Google 的搜索联想词,写标题、描述、话题、封面字和置顶评论;再用 playwright-cli 在用户已登录的 Chrome 里代填发布表单,上传视频和封面,填合集、位置、AI 声明(用了 AI 时)、热点和活动。不管视频是怎么做的都能用。默认停在发布按钮前,用户明确说发布这一条之后才点。适用于写或改发布文案、查联想词、选话题、代发视频、换视频或封面、核对已填好的表单。

short-video-skills 是什么?

short-video-skills is a Claude Code agent skill that 发布短视频到抖音、视频号、小红书(B 站只写文案):先读抖音、小红书和 Google 的搜索联想词,写标题、描述、话题、封面字和置顶评论;再用 playwright-cli 在用户已登录的 Chrome 里代填发布表单,上传视频和封面,填合集、位置、AI 声明(用了 AI 时)、热点和活动。不管视频是怎么做的都能用。默认停在发布按钮前,用户明确说发布这一条之后才点。适用于写或改发布文案、查联想词、选话题、代发视频、换视频或封面、核对已填好的表单。.

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/geoqiao/short-video-skills/tree/HEAD/skills/video-publish

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Publish Short Videos

Two steps: write the copy, then fill in the form. Write the copy into post.md in the issue directory (see structure in references/post-template.md), then fill the form accordingly. Platform rules and references are in references/platform-rules.md; the submission page is the final authority.

1. Write the Copy

Write the copy based on search intent: first confirm that viewers actually ask this question and which term they use, then align the title, cover text, and first sentence of the description with that same question. On Douyin and WeChat Channels, most traffic comes from recommendations rather than search; these keywords primarily help the system push the video to the right audience.

First, Check Search Suggestions

  1. List the questions this video can answer. Each question corresponds to a type of intent: get to know the subject ("What is X?", "Is X good?"), compare tools ("X vs Y", "which is better?"), concepts ("What is a certain term?"), how-to ("How to use X?").
  2. Read the search suggestions to confirm that viewers actually search this way and which term they use. Search suggestions have no search volume; they only indicate someone searched. Re-read on the day of publication—don’t reuse results saved days ago.
    • Douyin: Open a logged-in Chrome (see "Connecting to Browser" below), open a www.douyin.com tab and switch to it, modify SEEDS in scripts/douyin-suggest.js, then run playwright-cli -s=chrome --raw run-code --filename=scripts/douyin-suggest.js.
    • Xiaohongshu: Open a www.xiaohongshu.com/explore tab, modify SEEDS in scripts/xhs-suggest.js, then run. Reload the page for each term, about 6 seconds per term; max 25 terms at a time.
    • Google: Run node scripts/google-suggest.mjs '[["seed phrase","zh-CN"],["seed","en"]]', no browser needed.
    • These three scripts are read-only. Close only the tabs you opened.
  3. Save the raw results as a JSON file with a date, and reference the filename in the copy.
  4. Focus on the intent that aligns perfectly with the video content—write it into the title, cover, and first sentence of the description. If the video only partially answers an intent (e.g., only compares two products but the question is "which is the best?"), only include it in the topic tags; otherwise, viewers will swipe away. If a question appears repeatedly in suggestions but the video doesn’t answer it, don’t force it—note it as a new topic.

Several proven experiences:

  • English terms alone as primary keywords often fail to attract relevant content. Use Chinese phrasing for the cover keyword, and put English in the description and tags.
  • When the terminology in the video differs from what viewers use (e.g., viewers search "context decay" instead of "context corruption"), follow the viewers’ language in the title, cover, and narration.
  • The two platforms often use different terms; use the term that appears on both in the title.

How to Write

  • Title: The question viewers will ask, plus a specific conclusion. Use the terminology they search for. Don’t include terms no one searches for. Ensure the title, cover text, and first sentence of the narration say the same thing.
  • Description: The first sentence restates the question from the title with a conclusion and numbers. Then list the key points covered in the video, including entity words and numbers that appear in the video. Finally, include data source limitations. If AI is used, add an AI disclaimer (e.g., "The voiceover is AI-generated"). Write for the audience, not about the production process.
  • Topic Tags: The accurate term for the subject, objects compared in the video, category words, and one high-traffic audience-appropriate term. Only use terms that actually appear in the video. When filling the form, enter #word on the publishing page to check the view count; replace overly broad tags with billions of views (e.g., #AI) immediately. Douyin web version allows max 5 tags; series names go into the collection, not tags. WeChat Channels allows one or two extra, including the series name.
  • Pinned Comment: A question viewers can answer based on their own experience, echoing the closing question in the video.
  • Cover Text: Two lines max—a title plus a hook with a number or conclusion. Use the Chinese phrasing for the keyword.
  • Do not include URLs or accounts from other platforms in the copy, cover, narration, or visuals. Don’t say "go to a certain website" or "search for something". You may guide viewers to comment, follow, or check out collections.
  • If AI voiceover, AI visuals, or digital humans are used, add an AI disclaimer; code-video voiceovers are AI-generated, so all videos made with it require a disclaimer. Platform-specific option names are in references/platform-rules.md.

2. Fill in the Form

Each platform’s selectors, pitfalls, and practices:

  • Douyin Creator Center: references/douyin.md
  • WeChat Channels Assistant: references/weixin.md
  • Xiaohongshu Creator Platform: references/xiaohongshu.md

Rules

  • Do not publish on behalf of the user. Stop at the publish button and wait for the user to check. Click only after the user explicitly says "publish" for this particular video; permission for one video does not extend to the next.
  • After clicking publish, verify that the new work appears in the work list and that the collection number and episode are correct, then record the publish time in post.md.
  • Do not modify or delete already published content on the platform unless the user requests it.
  • For items that may change each time (location, collection, events, etc.), if in doubt, ask the user.
  • Close only the tabs you opened. If a tab contains an unpublished form, do not reload it or run other scripts in it.

Connecting to Browser

Requires playwright-cli and its companion Chrome extension. The user must be logged into the creator backends of each platform in Chrome.

playwright-cli -s=chrome attach --extension=chrome   # User clicks "Allow" on the popup from the extension
playwright-cli -s=chrome tab-new <publishing page URL>
playwright-cli -s=chrome tab-list
playwright-cli -s=chrome tab-select <index>            # tab-new does not switch the target for run-code
playwright-cli -s=chrome --raw run-code --filename=<script.js>
playwright-cli -s=chrome screenshot --filename=<image.png>

The script for run-code is an async page => { … } expression; its return value is printed. If the session disconnects and you attach again, previously opened tabs disappear, and the form must be filled from scratch.

General Practices

  • Start each script with await page.bringToFront(). If the user is using Chrome simultaneously, the publishing page often ends up in the background; drag-and-drop and clicks will time out. Before timeout, queued keyboard inputs will be applied after the page returns to focus, messing up the description. If a timeout occurs, clear the description box and fill it again.
  • One step per script; verify after each step. At each step, read the innerText of the relevant area or take a screenshot to confirm the value has changed before proceeding.
  • Uploading video: First try playwright-cli -s=chrome drop "<drop-zone selector>" --path=<mp4>. For platforms where drag-and-drop doesn’t trigger upload, use an injection script in scripts/: it converts the file to base64, writes it into a run-code script, uses DataTransfer to insert it into a file input, and dispatches a change event. In the extension mode, setInputFiles and file pickers don’t work.
  • Uploading cover: First open the cover popup, then run the injection script. All three platforms require two images: a 4:3 landscape cover and a 3:4 portrait cover. A 16:9 cover will have its title cropped.
  • Dropdowns and search fields: Many inputs are only visible when the dropdown is expanded. If fill or click reports "element is not visible", first click the box showing the current value (use boundingBox or get coordinates in evaluate then page.mouse.click if needed). Wait for the input field to appear before entering. Fields that trigger search require keyboard.type character by character; fill does not trigger.
  • Select dropdown items precisely: Use full text matching, or in evaluate, find an element whose innerText exactly matches and is visible within the dropdown area, then click its coordinates. Default to a nearby element with common label. After selection, read the current value once to confirm.
  • Buttons that appear only on hover: Move the mouse with page.mouse.move over the card, wait half a second, then click the button’s position.
  • English options: Some platforms display options in English (e.g., WeChat Channels video annotations); select based on the actual text shown on the page.

After Publishing

Check the "search terms" and the percentage of traffic from search in Douyin’s data center, and compare with the chosen keywords. Record videos with modified writing so you can later identify which change had an effect. Daily data can be collected using the video-data skill.

What to Explain When Delivering

  • The intent targeted by the copy, which search suggestions were used, which were not, and why.
  • What was filled in for each platform: title, number of topics, cover, collection and episode number, location, disclaimers, hot topics or events.
  • Where the process stopped, which items were not filled or differ from the copy, and why.
  • If published: publish time, verification results from the work list, collection episode.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能