Overview
Through browser automation (profile=openclaw), control the Channels Assistant web version (channels.weixin.qq.com) to complete the full closed loop from login to video publishing.
Prerequisites
- Browser already started:
browser start profile=openclaw - The video file to be published is ready (usually output by the video-merge-send skill after merging)
- Video description copy (can be automatically generated by AI based on the storyboard script)
Complete Process
Step 1: Navigate to Channels Assistant
browser navigate url=https://channels.weixin.qq.com
Wait for the page to finish loading (2-3 seconds).
Step 2: Login Detection
Determine the login status based on the URL and page content:
Judgment method:
- Not logged in: URL redirects to
channels.weixin.qq.com/login.html, and the page displays a QR code - Logged in: URL is
channels.weixin.qq.com/platform/post/listor another non-login page, with a navigation menu on the left
() => {
return {
url: window.location.href,
isLoginPage: window.location.pathname.includes('login'),
title: document.title
};
}
Logged in → skip to Step 4
Not logged in → continue to Step 3
Step 3: QR Code Login
3.1 Capture the QR Code
The QR code on the login page is located in a iframe .
Method A: Directly screenshot the entire page(recommended, simplest)
browser screenshot profile=openclaw
The screenshot will include the QR code area on the right, and the user can scan it directly with WeChat.
Method B: Locate the QR code iframe and screenshot it
// 二维码在 iframe 内,结构:
// iframe → generic → img (二维码图片)
// snapshot 中 ref 前缀 f8 表示 iframe 内的元素
// 二维码图片 ref 类似 f8e7
3.2 Send the QR code screenshot to the user
message action=send channel=feishu message="📱 请用微信扫码登录视频号助手" filePath=<截图路径>
After sending the screenshot, inform the user:
"Please open WeChat → Scan → scan the QR code on the screen, then confirm the login on your phone."
3.3 Wait for login to complete
Poll to detect the login status (check every 5 seconds, wait up to 2 minutes):
() => {
return {
url: window.location.href,
isLoginPage: window.location.pathname.includes('login'),
title: document.title
};
}
Login success indicators:
- URL no longer contains
login - The page redirects to the management backend (usually
/platform/post/list)
QR Code Expiration Handling:
- If the text "QR code has expired, click to refresh" appears in the iframe (in the snapshot,
ref=f8e16) - Click the refresh link, take a new screenshot and send it
browser act kind=click ref=f8e16 # "二维码已过期,点击刷新"
3.4 Login State Persistence
After a successful login, the cookie is automatically saved in:
~/.openclaw/browser/openclaw/user-data
The next time the browser is opened, the login will be maintained automatically.
Step 4: Navigate to the Publish Video page
After logging in, navigate to the "Publish Video" page. There are two ways:
Method A: Direct URL navigation(recommended)
browser navigate url=https://channels.weixin.qq.com/platform/post/create
Method B: Navigate through the menu
- snapshot to find the left-side menu
- Click "Content Management" to expand the submenu
- Click "Video" to enter the video list
- Click the "Publish Video" button
# 依次查找并点击:
# 1. "内容管理" 菜单项
# 2. "视频" 子菜单
# 3. "发表视频" 按钮
Step 5: Upload the video file
The Publish Video page will have anupload area(usually a drag-and-drop area + a click-to-upload button).
5.1 Find the upload entry point
Take a snapshot to find upload-related elements:
- Usually there is a "Choose File" or "Click to Upload" button
- Or a
input[type="file"]hidden element
// 查找文件上传 input
() => {
const inputs = document.querySelectorAll('input[type="file"]');
const results = [];
inputs.forEach((input, i) => {
results.push({
index: i,
accept: input.accept,
id: input.id,
className: input.className,
parentClass: input.parentElement?.className
});
});
return results;
}
5.2 Upload the video
browser upload selector="input[type='file']" paths=["<视频文件路径>"]
Or use the specific selector found in the snapshot.
Video file pathUsually:
- Single shot:
/tmp/openclaw/jimeng-videos/01_xxx.mp4 - After merging:
/tmp/openclaw/jimeng-videos/final_merged.mp4
5.3 Wait for the upload to complete
Video uploads take time, depending on file size.
Poll to check upload progress (take a screenshot/snapshot every 5 seconds):
- Uploading: a progress bar or percentage is displayed
- Upload complete: the progress disappears and a video preview thumbnail is displayed
() => {
// 检查是否有上传进度元素
const progress = document.querySelector('[class*="progress"]');
const percent = document.querySelector('[class*="percent"]');
return {
hasProgress: !!progress,
progressText: progress?.textContent || '',
percentText: percent?.textContent || ''
};
}
Step 6: Fill in video information
6.1 Add description (body description)
Find the description input area and fill in the viral copy.
# snapshot 找到描述文本框(通常是 textarea 或 contenteditable div)
browser act kind=click ref=<描述输入框_ref>
browser act kind=type text="<描述文案>"
Description copy generation rules:
Automatically generate a viral description based on the video content (the theme of the storyboard script):
- Hook opening: Use a question or pain point to attract attention
- Core value: Explain in one sentence what the video is about
- Hashtags: Add 3-5 related topics
#标签 - Call to action: Guide likes/follows/saves
Example template:
🔥 [痛点问题]?看完这条视频你就懂了!
[一句话核心价值]
💡 关键要点:
1. [要点1]
2. [要点2]
3. [要点3]
👇 觉得有用就点赞收藏,关注我学更多干货!
#企业数字化 #创业干货 #门店经营 #中小企业 #田泽湘
6.2 Fill in the short title (6-16 characters)
Find the short title input box and fill it in. The short title is displayed on the video cover and must be 6-16 characters。
# snapshot 找到短标题输入框
browser act kind=click ref=<短标题输入框_ref>
browser act kind=type text="<短标题>"
Short title generation rules:
- 6-16 characters (Chinese counts as 1 character)
- Short and powerful, summarizing the core of the video
- With numbers, it is more attractive to click
- Example:
3万搞定门店数字化、利润翻倍的3个秘诀、老板必学的获客公式
6.3 Other optional settings
Depending on the page, there may also be:
- Cover selection: Automatically captured by default, or you can upload a custom cover
- Location: Optionally add a location
- Collection: Optionally add to an existing collection
- Scheduled publishing: You can set the publishing time
- Who can view: Public/Private/Partially visible
Generally, keep the default unless the user specifically specifies otherwise.
Step 7: Screenshot confirmation
Before publishing, take a screenshot of the entire page and send it to the user for confirmation:
browser screenshot profile=openclaw
message action=send channel=feishu message="📋 视频已准备好,请确认以下信息后告诉我:\n1️⃣ 立即发布\n2️⃣ 保存草稿\n3️⃣ 修改内容\n\n描述:[已填写的描述]\n短标题:[已填写的短标题]" filePath=<截图路径>
Wait for the user's reply instruction.
Step 8: Execute publish / save draft
Execute according to the user's instruction:
Publish
# snapshot 找到"发表"按钮
browser act kind=click ref=<发表按钮_ref>
After publishing, a confirmation pop-up may appear; click confirm.
Take a screenshot to confirm successful publishing:
browser screenshot profile=openclaw
message action=send channel=feishu message="✅ 视频已成功发布到视频号!" filePath=<截图路径>
Save draft
# snapshot 找到"存草稿"按钮
browser act kind=click ref=<存草稿按钮_ref>
Default configuration
Maintained in TOOLS.md :
### 视频号助手 (weixin-channels-publish)
- **默认话题标签**: #企业数字化 #创业干货 #门店经营 #中小企业 #田泽湘
- **默认描述模板**: 爆款描述(hook+价值+标签+CTA)
- **短标题风格**: 数字+痛点,6-16字
Key technical details
| Element | Description |
|---|---|
| Browser profile | openclaw |
| Login page URL | https://channels.weixin.qq.com/login.html |
| Backend homepage URL | https://channels.weixin.qq.com/platform/post/list |
| Publish video URL | https://channels.weixin.qq.com/platform/post/create |
| QR code location | Inside the iframe on the right side of the login page (img element) |
| Login method | WeChat scan code (no account and password login option) |
| Login state storage | ~/.openclaw/browser/openclaw/user-data(cookie automatically persisted) |
| Video upload limits | Maximum 4GB, duration 1 second to 60 minutes |
| Supported formats | mp4, mov, avi, wmv, flv, mkv, webm |
| Short title requirements | 6-16 characters |
| Description length limit | Maximum 1000 characters |
Complete workflow (end-to-end)
1. jimeng-storyboard skill → 生成分镜脚本
2. jimeng-digital-human skill → 逐镜头生成 + 下载视频
3. video-merge-send skill → 合并视频片段
4. weixin-channels-publish → 发布到视频号 ← 本 skill
├── Step 1-3: 登录检测/扫码
├── Step 4: 导航到发表页
├── Step 5: 上传合并视频
├── Step 6: 填写描述+短标题
├── Step 7: 截图确认
└── Step 8: 发布/草稿
FAQ
| Problem | Solution |
|---|---|
| QR code expired | Click the "QR code expired, click to refresh" link, take a new screenshot and send it to the user |
| No redirect after scanning | Confirm that the confirmation has been tapped on the phone, wait 5-10 seconds, then refresh the page |
| Upload progress stuck | Check whether the file size exceeds the limit (4GB) and whether the network is stable |
| Cannot find the upload button | Take a new snapshot; WeChat Channels Assistant may have been redesigned, use JS to search input[type="file"] |
| Short title character count does not match | Strictly control 6-16 characters; Chinese counts as 1 character |
| Publish button grayed out/disabled | Check whether all required fields have been filled in (description, short title, video upload complete) |
| After logging in, it jumps back to the login page | The cookie may have expired; you need to log in again by scanning the QR code |
| Description blocked for containing sensitive words | Avoid absolute wording such as "best", "number one", and "guaranteed profit" |
Precautions
- Compliance first: Avoid exaggerated promises and absolute wording in the description ("best", "guaranteed", "100%")
- User confirmation required before publishing: Never click publish automatically; you must take a screenshot for the user to confirm
- Draft priority: If the user hesitates, save as a draft by default instead of publishing
- Each snapshot must reacquire the ref: The WeChat Channels Assistant SPA page re-renders frequently