media-auto-publisher

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

媒体自动发布工具 (Media Auto Publisher)

媒体自动发布工具 (Media Auto Publisher)

通用自媒体文章自动发布助手,支持百家号、搜狐号、知乎三个平台。
通用自媒体文章自动发布助手,支持百家号、搜狐号、知乎三个平台。

快速开始

快速开始

基本用法

基本用法

用户: 打开百家号发布页面
用户: 帮我进入知乎写文章
用户: 切换到搜狐号发布文章
用户: 帮我发布文章到百家号
用户: 打开百家号发布页面
用户: 帮我进入知乎写文章
用户: 切换到搜狐号发布文章
用户: 帮我发布文章到百家号

支持的平台

支持的平台

平台代码平台名称发布页面URL自动化状态
baijiahao
百家号https://baijiahao.baidu.com/builder/rc/edit?type=news✅ 完全支持
sohu
搜狐号https://mp.sohu.com/api/author/article/new✅ 完全支持
zhihu
知乎https://zhuanlan.zhihu.com/write✅ 支持Cookie登录
重大更新: 使用 Playwright MCP 后,知乎可以通过
storageState
管理登录态,不再需要调试端口!
平台代码平台名称发布页面URL自动化状态
baijiahao
百家号https://baijiahao.baidu.com/builder/rc/edit?type=news✅ 完全支持
sohu
搜狐号https://mp.sohu.com/api/author/article/new✅ 完全支持
zhihu
知乎https://zhuanlan.zhihu.com/write✅ 支持Cookie登录
重大更新: 使用 Playwright MCP 后,知乎可以通过
storageState
管理登录态,不再需要调试端口!

工作流程

工作流程

标准发布流程

标准发布流程

  1. 确认平台 - 识别用户指定的平台(百家号/搜狐/知乎)
  2. 打开平台 - 使用
    mcp__plugin_playwright_playwright__browser_navigate
    导航到平台首页
  3. 检查登录 - 通过页面快照验证用户是否已登录
  4. 关闭弹窗 - 自动检测并关闭广告/活动弹窗
  5. 进入发布页 - 导航到文章发布页面
  6. 收集信息 - 询问文章标题、内容、封面等信息
  7. 自动填写 - 填写所有收集到的信息
  8. 发布文章 - 点击发布按钮并验证成功

  1. 确认平台 - 识别用户指定的平台(百家号/搜狐/知乎)
  2. 打开平台 - 使用
    mcp__plugin_playwright_playwright__browser_navigate
    导航到平台首页
  3. 检查登录 - 通过页面快照验证用户是否已登录
  4. 关闭弹窗 - 自动检测并关闭广告/活动弹窗
  5. 进入发布页 - 导航到文章发布页面
  6. 收集信息 - 询问文章标题、内容、封面等信息
  7. 自动填写 - 填写所有收集到的信息
  8. 发布文章 - 点击发布按钮并验证成功

完整自动发布工作流 ⭐

完整自动发布工作流 ⭐

工作流触发条件

工作流触发条件

当用户说以下任意指令时启动完整发布流程:
  • "帮我发布文章到[平台]"
  • "自动发布到[平台]"
  • "我要发布文章"
  • "[平台]发布文章"
当用户说以下任意指令时启动完整发布流程:
  • "帮我发布文章到[平台]"
  • "自动发布到[平台]"
  • "我要发布文章"
  • "[平台]发布文章"

发布前信息收集

发布前信息收集

在执行发布前,需要按顺序收集以下信息(使用AskUserQuestion工具):
在执行发布前,需要按顺序收集以下信息(使用AskUserQuestion工具):

第一阶段:基础内容(必填)

第一阶段:基础内容(必填)

字段说明示例
文章标题文章的标题"如何用Python自动化发布文章"
正文内容Markdown格式的文章内容"# 引言\n这是正文..."
字段说明示例
文章标题文章的标题"如何用Python自动化发布文章"
正文内容Markdown格式的文章内容"# 引言\n这是正文..."

第二阶段:增强内容(可选)

第二阶段:增强内容(可选)

字段说明适用平台
封面图片本地图片路径或图片URL全平台
文章摘要文章的简短摘要百家号/搜狐号
字段说明适用平台
封面图片本地图片路径或图片URL全平台
文章摘要文章的简短摘要百家号/搜狐号

第三阶段:分类与标签(可选)

第三阶段:分类与标签(可选)

字段说明适用平台
文章话题/标签相关话题标签,多个用逗号分隔全平台
投稿至问题将文章投稿到的知乎问题知乎
分类/栏目文章所属分类百家号/搜狐号
字段说明适用平台
文章话题/标签相关话题标签,多个用逗号分隔全平台
投稿至问题将文章投稿到的知乎问题知乎
分类/栏目文章所属分类百家号/搜狐号

第四阶段:发布设置(可选)

第四阶段:发布设置(可选)

字段说明适用平台
创作声明原创声明/转载声明全平台
可见性设置公开/仅自己可见/定时发布全平台
专栏发布到指定专栏知乎

字段说明适用平台
创作声明原创声明/转载声明全平台
可见性设置公开/仅自己可见/定时发布全平台
专栏发布到指定专栏知乎

各平台详细发布步骤

各平台详细发布步骤

百家号完整发布流程

百家号完整发布流程

python
python

步骤1:导航到百家号首页

步骤1:导航到百家号首页

mcp__plugin_playwright_playwright__browser_navigate(url="https://baijiahao.baidu.com/")
mcp__plugin_playwright_playwright__browser_navigate(url="https://baijiahao.baidu.com/")

步骤2:检查登录状态

步骤2:检查登录状态

mcp__plugin_playwright_playwright__browser_snapshot()
mcp__plugin_playwright_playwright__browser_snapshot()

步骤3:关闭百家号特有弹窗

步骤3:关闭百家号特有弹窗

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['下一步', '立即体验', '我知道了', '知道了']; for (const selector of closeSelectors) { try { const element = await page.getByText(selector).first(); if (await element.isVisible()) { await element.click(); await page.waitForTimeout(500); } } catch (e) {} } await page.evaluate(() => { document.querySelectorAll('dialog, [role="dialog"], .tooltip').forEach(el => el.remove()); }); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['下一步', '立即体验', '我知道了', '知道了']; for (const selector of closeSelectors) { try { const element = await page.getByText(selector).first(); if (await element.isVisible()) { await element.click(); await page.waitForTimeout(500); } } catch (e) {} } await page.evaluate(() => { document.querySelectorAll('dialog, [role="dialog"], .tooltip').forEach(el => el.remove()); }); return { success: true }; } ''')

步骤4:进入发布页面(直接导航)

步骤4:进入发布页面(直接导航)

mcp__plugin_playwright_playwright__browser_navigate(url="https://baijiahao.baidu.com/builder/rc/edit?type=news")
mcp__plugin_playwright_playwright__browser_navigate(url="https://baijiahao.baidu.com/builder/rc/edit?type=news")

步骤5:填写文章标题

步骤5:填写文章标题

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('input[placeholder*="请输入标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('input[placeholder*="请输入标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')

步骤6:填写正文内容(百家号在iframe中)

步骤6:填写正文内容(百家号在iframe中)

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const frame = page.frame({ url: /editor/ }) || page.mainFrame(); await frame.locator('[contenteditable="true"], .editor-body').first().fill('{正文内容}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const frame = page.frame({ url: /editor/ }) || page.mainFrame(); await frame.locator('[contenteditable="true"], .editor-body').first().fill('{正文内容}'); return { success: true }; } ''')

步骤7:上传封面图(如果提供)

步骤7:上传封面图(如果提供)

if 封面图片: mcp__plugin_playwright_playwright__browser_click(ref="三图模式") for 图片路径 in 封面图片列表: mcp__plugin_playwright_playwright__browser_file_upload(paths=["{图片路径}"])
if 封面图片: mcp__plugin_playwright_playwright__browser_click(ref="三图模式") for 图片路径 in 封面图片列表: mcp__plugin_playwright_playwright__browser_file_upload(paths=["{图片路径}"])

步骤8:填写摘要(如果提供)

步骤8:填写摘要(如果提供)

if 文章摘要: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const summaryInput = await page.locator('textarea[placeholder*="摘要"]').first(); await summaryInput.fill('{文章摘要}'); return { success: true }; } ''')
if 文章摘要: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const summaryInput = await page.locator('textarea[placeholder*="摘要"]').first(); await summaryInput.fill('{文章摘要}'); return { success: true }; } ''')

步骤9:选择分类(如果提供)

步骤9:选择分类(如果提供)

if 文章分类: mcp__plugin_playwright_playwright__browser_click(ref="分类选择器") mcp__plugin_playwright_playwright__browser_click(ref="{分类}按钮")
if 文章分类: mcp__plugin_playwright_playwright__browser_click(ref="分类选择器") mcp__plugin_playwright_playwright__browser_click(ref="{分类}按钮")

步骤10:发布前确认

步骤10:发布前确认

mcp__plugin_playwright_playwright__browser_take_screenshot(path="百家号发布前预览.png")
mcp__plugin_playwright_playwright__browser_take_screenshot(path="百家号发布前预览.png")

步骤11:点击发布

步骤11:点击发布

mcp__plugin_playwright_playwright__browser_click(ref="发布按钮")
mcp__plugin_playwright_playwright__browser_click(ref="发布按钮")

步骤12:验证发布成功

步骤12:验证发布成功

mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功提示", timeout=10000)
undefined
mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功提示", timeout=10000)
undefined

搜狐号完整发布流程

搜狐号完整发布流程

python
python

步骤1:导航到搜狐号发布页

步骤1:导航到搜狐号发布页

mcp__plugin_playwright_playwright__browser_navigate(url="https://mp.sohu.com/api/author/article/new")
mcp__plugin_playwright_playwright__browser_navigate(url="https://mp.sohu.com/api/author/article/new")

步骤2:检查登录状态

步骤2:检查登录状态

mcp__plugin_playwright_playwright__browser_snapshot()
mcp__plugin_playwright_playwright__browser_snapshot()

步骤3:关闭弹窗(如有)

步骤3:关闭弹窗(如有)

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['我知道了', '知道了', '关闭']; for (const selector of closeSelectors) { try { await page.getByText(selector).first().click(); await page.waitForTimeout(300); } catch (e) {} } return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['我知道了', '知道了', '关闭']; for (const selector of closeSelectors) { try { await page.getByText(selector).first().click(); await page.waitForTimeout(300); } catch (e) {} } return { success: true }; } ''')

步骤4:填写文章标题

步骤4:填写文章标题

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('input[name="title"], input[placeholder*="标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('input[name="title"], input[placeholder*="标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')

步骤5:填写正文内容

步骤5:填写正文内容

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const editor = await page.locator('#editor, .editor-content, [contenteditable="true"]').first(); await editor.fill('{正文内容}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const editor = await page.locator('#editor, .editor-content, [contenteditable="true"]').first(); await editor.fill('{正文内容}'); return { success: true }; } ''')

步骤6:上传封面图(如果提供)

步骤6:上传封面图(如果提供)

if 封面图片: mcp__plugin_playwright_playwright__browser_click(ref="封面上传按钮") mcp__plugin_playwright_playwright__browser_file_upload(paths=["{封面图片路径}"])
if 封面图片: mcp__plugin_playwright_playwright__browser_click(ref="封面上传按钮") mcp__plugin_playwright_playwright__browser_file_upload(paths=["{封面图片路径}"])

步骤7:填写摘要(如果提供)

步骤7:填写摘要(如果提供)

if 文章摘要: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const summaryInput = await page.locator('textarea[name="summary"]').first(); await summaryInput.fill('{文章摘要}'); return { success: true }; } ''')
if 文章摘要: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const summaryInput = await page.locator('textarea[name="summary"]').first(); await summaryInput.fill('{文章摘要}'); return { success: true }; } ''')

步骤8:选择栏目(如果提供)

步骤8:选择栏目(如果提供)

if 文章栏目: mcp__plugin_playwright_playwright__browser_click(ref="栏目选择器") mcp__plugin_playwright_playwright__browser_click(ref="{栏目}按钮")
if 文章栏目: mcp__plugin_playwright_playwright__browser_click(ref="栏目选择器") mcp__plugin_playwright_playwright__browser_click(ref="{栏目}按钮")

步骤9:设置原创声明(如果需要)

步骤9:设置原创声明(如果需要)

if 创作声明 == "原创": mcp__plugin_playwright_playwright__browser_click(ref="原创声明开关")
if 创作声明 == "原创": mcp__plugin_playwright_playwright__browser_click(ref="原创声明开关")

步骤10:发布前确认

步骤10:发布前确认

mcp__plugin_playwright_playwright__browser_take_screenshot(path="搜狐号发布前预览.png")
mcp__plugin_playwright_playwright__browser_take_screenshot(path="搜狐号发布前预览.png")

步骤11:点击发布

步骤11:点击发布

mcp__plugin_playwright_playwright__browser_click(ref="发布按钮")
mcp__plugin_playwright_playwright__browser_click(ref="发布按钮")

步骤12:验证发布成功

步骤12:验证发布成功

mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功", timeout=10000)
undefined
mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功", timeout=10000)
undefined

知乎完整发布流程

知乎完整发布流程

python
python

步骤1:导航到知乎写文章页面

步骤1:导航到知乎写文章页面

mcp__plugin_playwright_playwright__browser_navigate(url="https://zhuanlan.zhihu.com/write")
mcp__plugin_playwright_playwright__browser_navigate(url="https://zhuanlan.zhihu.com/write")

步骤2:检查登录状态

步骤2:检查登录状态

mcp__plugin_playwright_playwright__browser_snapshot()
mcp__plugin_playwright_playwright__browser_snapshot()

步骤3:关闭弹窗(如有)

步骤3:关闭弹窗(如有)

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['跳过', '以后再说', '不再提示']; for (const selector of closeSelectors) { try { await page.getByText(selector).first().click(); await page.waitForTimeout(300); } catch (e) {} } return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const closeSelectors = ['跳过', '以后再说', '不再提示']; for (const selector of closeSelectors) { try { await page.getByText(selector).first().click(); await page.waitForTimeout(300); } catch (e) {} } return { success: true }; } ''')

步骤4:填写文章标题

步骤4:填写文章标题

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('.WriteIndex-titleInput, input[placeholder*="请输入标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const titleInput = await page.locator('.WriteIndex-titleInput, input[placeholder*="请输入标题"]').first(); await titleInput.fill('{文章标题}'); return { success: true }; } ''')

步骤5:填写正文内容

步骤5:填写正文内容

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const editor = await page.locator('.PublicDraftEditor-content, [contenteditable="true"]').first(); await editor.fill('{正文内容}'); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const editor = await page.locator('.PublicDraftEditor-content, [contenteditable="true"]').first(); await editor.fill('{正文内容}'); return { success: true }; } ''')

步骤6:上传封面图(如果提供)

步骤6:上传封面图(如果提供)

if 封面图片: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('.UploadCoverButton, [class*="upload"]').first().click(); return { success: true }; } ''') mcp__plugin_playwright_playwright__browser_file_upload(paths=["{封面图片路径}"])
if 封面图片: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('.UploadCoverButton, [class*="upload"]').first().click(); return { success: true }; } ''') mcp__plugin_playwright_playwright__browser_file_upload(paths=["{封面图片路径}"])

步骤7:添加话题标签(如果提供)

步骤7:添加话题标签(如果提供)

if 文章话题: for 话题 in 文章话题列表: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=添加话题, .TopicEditor-input').first().click(); await page.locator('input[placeholder*="搜索话题"]').fill('{话题}'); await page.waitForTimeout(500); await page.locator('.TopicItem, [role="option"]').first().click(); return { success: true }; } ''')
if 文章话题: for 话题 in 文章话题列表: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=添加话题, .TopicEditor-input').first().click(); await page.locator('input[placeholder*="搜索话题"]').fill('{话题}'); await page.waitForTimeout(500); await page.locator('.TopicItem, [role="option"]').first().click(); return { success: true }; } ''')

步骤8:投稿至问题(如果提供)

步骤8:投稿至问题(如果提供)

if 投稿至问题: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=投稿至问题, .PublishToQuestion').first().click(); await page.locator('input[placeholder*="搜索问题"]').fill('{问题标题}'); await page.waitForTimeout(500); await page.locator('.QuestionItem, [role="option"]').first().click(); return { success: true }; } ''')
if 投稿至问题: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=投稿至问题, .PublishToQuestion').first().click(); await page.locator('input[placeholder*="搜索问题"]').fill('{问题标题}'); await page.waitForTimeout(500); await page.locator('.QuestionItem, [role="option"]').first().click(); return { success: true }; } ''')

步骤9:设置创作声明(如果需要)

步骤9:设置创作声明(如果需要)

if 创作声明: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('button[class*="setting"], text=设置').first().click(); await page.locator('text={声明类型}').first().click(); return { success: true }; } ''')
if 创作声明: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('button[class*="setting"], text=设置').first().click(); await page.locator('text={声明类型}').first().click(); return { success: true }; } ''')

步骤10:选择专栏(如果提供)

步骤10:选择专栏(如果提供)

if 发布专栏: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=选择专栏, .ColumnSelector').first().click(); await page.locator('text={专栏名称}').first().click(); return { success: true }; } ''')
if 发布专栏: mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { await page.locator('text=选择专栏, .ColumnSelector').first().click(); await page.locator('text={专栏名称}').first().click(); return { success: true }; } ''')

步骤11:发布前确认

步骤11:发布前确认

mcp__plugin_playwright_playwright__browser_take_screenshot(path="知乎发布前预览.png")
mcp__plugin_playwright_playwright__browser_take_screenshot(path="知乎发布前预览.png")

步骤12:点击发布

步骤12:点击发布

mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const publishBtn = await page.getByText('发布').first(); await publishBtn.click(); return { success: true }; } ''')
mcp__plugin_playwright_playwright__browser_run_code(code=''' async (page) => { const publishBtn = await page.getByText('发布').first(); await publishBtn.click(); return { success: true }; } ''')

步骤13:验证发布成功

步骤13:验证发布成功

mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功", timeout=10000)
undefined
mcp__plugin_playwright_playwright__browser_wait_for(element="发布成功", timeout=10000)
undefined

各平台字段选择器速查表

各平台字段选择器速查表

字段百家号选择器搜狐号选择器知乎选择器
标题输入框input[placeholder*="请输入标题"]input[name="title"].WriteIndex-titleInput
正文编辑器iframe .editor-body#editor.PublicDraftEditor-content
封面上传.upload-cover-btn.cover-upload.UploadCoverButton
摘要输入框textarea[placeholder*="摘要"]textarea[name="summary"]❌ 不支持
分类选择器.category-select.column-select❌ 用话题替代
话题输入框❌ 不支持.tag-input.TopicEditor-input
投稿问题❌ 不支持❌ 不支持.PublishToQuestion
发布按钮button:has-text("发布")button.publish-btnbutton:has-text("发布")

字段百家号选择器搜狐号选择器知乎选择器
标题输入框input[placeholder*="请输入标题"]input[name="title"].WriteIndex-titleInput
正文编辑器iframe .editor-body#editor.PublicDraftEditor-content
封面上传.upload-cover-btn.cover-upload.UploadCoverButton
摘要输入框textarea[placeholder*="摘要"]textarea[name="summary"]❌ 不支持
分类选择器.category-select.column-select❌ 用话题替代
话题输入框❌ 不支持.tag-input.TopicEditor-input
投稿问题❌ 不支持❌ 不支持.PublishToQuestion
发布按钮button:has-text("发布")button.publish-btnbutton:has-text("发布")

账号切换流程(推荐)

账号切换流程(推荐)

Playwright MCP 支持通过 storageState 管理多个账号:
保存登录态(首次):
javascript
// 1. 手动登录一次平台
await page.goto("https://www.zhihu.com")
// ... 用户手动登录 ...

// 2. 保存登录状态
await context.storageState({ path: 'zhihu_account1.json' })
切换账号:
javascript
// 加载已保存的登录态
const context = await browser.newContext({
  storageState: 'zhihu_account1.json'
})
Playwright MCP 支持通过 storageState 管理多个账号:
保存登录态(首次):
javascript
// 1. 手动登录一次平台
await page.goto("https://www.zhihu.com")
// ... 用户手动登录 ...

// 2. 保存登录状态
await context.storageState({ path: 'zhihu_account1.json' })
切换账号:
javascript
// 加载已保存的登录态
const context = await browser.newContext({
  storageState: 'zhihu_account1.json'
})

关键文件

关键文件

scripts/media_publisher.py 主执行脚本

scripts/media_publisher.py 主执行脚本

快速打开平台:
bash
python scripts/media_publisher.py baijiahao
python scripts/media_publisher.py open baijiahao
查看平台信息:
bash
python scripts/media_publisher.py info baijiahao
生成工作流程:
bash
python scripts/media_publisher.py workflow baijiahao
python scripts/media_publisher.py workflow sohu --output workflow.json --format json
检查登录状态:
bash
python scripts/media_publisher.py check-login baijiahao
python scripts/media_publisher.py check-login sohu --snapshot snapshot.txt
检测弹窗:
bash
python scripts/media_publisher.py detect-popup baijiahao
python scripts/media_publisher.py detect-popup sohu --snapshot snapshot.txt
快速打开平台:
bash
python scripts/media_publisher.py baijiahao
python scripts/media_publisher.py open baijiahao
查看平台信息:
bash
python scripts/media_publisher.py info baijiahao
生成工作流程:
bash
python scripts/media_publisher.py workflow baijiahao
python scripts/media_publisher.py workflow sohu --output workflow.json --format json
检查登录状态:
bash
python scripts/media_publisher.py check-login baijiahao
python scripts/media_publisher.py check-login sohu --snapshot snapshot.txt
检测弹窗:
bash
python scripts/media_publisher.py detect-popup baijiahao
python scripts/media_publisher.py detect-popup sohu --snapshot snapshot.txt

scripts/cookie_manager.py

scripts/cookie_manager.py

常用命令:
bash
python scripts/cookie_manager.py save zhihu --account "账号1"
python scripts/cookie_manager.py list
python scripts/cookie_manager.py switch zhihu "账号1"
常用命令:
bash
python scripts/cookie_manager.py save zhihu --account "账号1"
python scripts/cookie_manager.py list
python scripts/cookie_manager.py switch zhihu "账号1"

scripts/platform_navigator.py

scripts/platform_navigator.py

平台导航助手,提供各平台的导航配置和弹窗检测逻辑。
平台导航助手,提供各平台的导航配置和弹窗检测逻辑。

登录状态检测

登录状态检测

百家号:检测页面中是否存在 头像、发布作品、内容管理 等元素
搜狐号:检测页面中是否存在 发布文章、内容管理、个人中心 等元素
知乎:检测页面中是否存在 写文章、首页、通知、私信 等元素
百家号:检测页面中是否存在 头像、发布作品、内容管理 等元素
搜狐号:检测页面中是否存在 发布文章、内容管理、个人中心 等元素
知乎:检测页面中是否存在 写文章、首页、通知、私信 等元素

弹窗自动关闭

弹窗自动关闭

百家号特有弹窗处理

百家号特有弹窗处理

python
mcp__plugin_playwright_playwright__browser_run_code(code='''
async (page) => {
    const closeSelectors = ['下一步', '立即体验', '我知道了', '知道了'];
    for (const selector of closeSelectors) {
        try {
            const element = await page.getByText(selector).first();
            if (await element.isVisible()) {
                await element.click();
                await page.waitForTimeout(500);
            }
        } catch (e) {}
    }
    await page.evaluate(() => {
        document.querySelectorAll('dialog, [role="dialog"], .tooltip').forEach(el => el.remove());
    });
    return { success: true };
}
''')
python
mcp__plugin_playwright_playwright__browser_run_code(code='''
async (page) => {
    const closeSelectors = ['下一步', '立即体验', '我知道了', '知道了'];
    for (const selector of closeSelectors) {
        try {
            const element = await page.getByText(selector).first();
            if (await element.isVisible()) {
                await element.click();
                await page.waitForTimeout(500);
            }
        } catch (e) {}
    }
    await page.evaluate(() => {
        document.querySelectorAll('dialog, [role="dialog"], .tooltip').forEach(el => el.remove());
    });
    return { success: true };
}
''')

各平台常见弹窗关键词

各平台常见弹窗关键词

平台关闭按钮关键词
百家号我知道了、下一步、立即体验、关闭、×
搜狐号我知道了、知道了、关闭、×
知乎跳过、以后再说、不再提示、关闭
平台关闭按钮关键词
百家号我知道了、下一步、立即体验、关闭、×
搜狐号我知道了、知道了、关闭、×
知乎跳过、以后再说、不再提示、关闭

MCP工具调用序列

MCP工具调用序列

Playwright MCP 工具映射

Playwright MCP 工具映射

功能Chrome DevTools MCPPlaywright MCP
导航navigate_pagebrowser_navigate
快照take_snapshotbrowser_snapshot
点击clickbrowser_click
填写fillbrowser_fill_form / browser_type
截图-browser_take_screenshot
等待-browser_wait_for
执行代码-browser_run_code
文件上传-browser_file_upload
功能Chrome DevTools MCPPlaywright MCP
导航navigate_pagebrowser_navigate
快照take_snapshotbrowser_snapshot
点击clickbrowser_click
填写fillbrowser_fill_form / browser_type
截图-browser_take_screenshot
等待-browser_wait_for
执行代码-browser_run_code
文件上传-browser_file_upload

知乎登录解决方案

知乎登录解决方案

方案一:使用 storageState(推荐)

方案一:使用 storageState(推荐)

javascript
await browser.newContext({
  storageState: 'zhihu_cookies.json'
})
步骤:
  1. 先用普通 Chrome 登录知乎
  2. 使用 browser_run_code 导出 cookies
  3. 保存为 storageState 文件
  4. 后续直接加载该文件实现免登录
javascript
await browser.newContext({
  storageState: 'zhihu_cookies.json'
})
步骤:
  1. 先用普通 Chrome 登录知乎
  2. 使用 browser_run_code 导出 cookies
  3. 保存为 storageState 文件
  4. 后续直接加载该文件实现免登录

故障处理

故障处理

问题解决方案
未登录提示用户先登录并保存 storageState
Cookie失效使用cookie_manager.py重新保存登录状态
弹窗无法关闭手动截图,分析弹窗结构后更新关闭规则
页面加载超时使用browser_wait_for增加等待时间
知乎反爬Playwright 的 storageState 可有效绕过检测
填写失败使用browser_run_code直接执行JavaScript
问题解决方案
未登录提示用户先登录并保存 storageState
Cookie失效使用cookie_manager.py重新保存登录状态
弹窗无法关闭手动截图,分析弹窗结构后更新关闭规则
页面加载超时使用browser_wait_for增加等待时间
知乎反爬Playwright 的 storageState 可有效绕过检测
填写失败使用browser_run_code直接执行JavaScript

Playwright MCP 优势

Playwright MCP 优势

特性Chrome DevToolsPlaywright
知乎登录需要调试端口storageState 支持
多浏览器仅 ChromeChrome/Firefox/Safari
Cookie管理手动导入storageState() API
反爬检测自动化特征明显可伪装真实浏览器
跨平台依赖 Chrome多引擎支持
文件上传需要特殊处理browser_file_upload
特性Chrome DevToolsPlaywright
知乎登录需要调试端口storageState 支持
多浏览器仅 ChromeChrome/Firefox/Safari
Cookie管理手动导入storageState() API
反爬检测自动化特征明显可伪装真实浏览器
跨平台依赖 Chrome多引擎支持
文件上传需要特殊处理browser_file_upload

注意事项

注意事项

  1. 首次登录 - 首次使用需要用户手动登录平台并保存 storageState
  2. StorageState位置 - 登录态保存在 ~/.claude/media-auto-publisher/storage_states/
  3. 平台更新 - 平台UI更新可能需要更新选择器和指示器
  4. 频率限制 - 避免频繁操作触发平台反爬机制
  5. 知乎支持 - Playwright 可以通过 storageState 实现知乎免登录发布
  6. 内容预览 - 发布前务必截图预览,确认内容无误
  1. 首次登录 - 首次使用需要用户手动登录平台并保存 storageState
  2. StorageState位置 - 登录态保存在 ~/.claude/media-auto-publisher/storage_states/
  3. 平台更新 - 平台UI更新可能需要更新选择器和指示器
  4. 频率限制 - 避免频繁操作触发平台反爬机制
  5. 知乎支持 - Playwright 可以通过 storageState 实现知乎免登录发布
  6. 内容预览 - 发布前务必截图预览,确认内容无误

Playwright 高级用法

Playwright 高级用法

伪装真实浏览器

伪装真实浏览器

javascript
async (page) => {
    await page.setExtraHTTPHeaders({
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    });
    await page.addInitScript(() => {
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        });
    });
    await page.goto('https://zhuanlan.zhihu.com/write');
}
javascript
async (page) => {
    await page.setExtraHTTPHeaders({
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    });
    await page.addInitScript(() => {
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        });
    });
    await page.goto('https://zhuanlan.zhihu.com/write');
}

批量发布管理

批量发布管理

bash
python scripts/cookie_manager.py list
python scripts/cookie_manager.py save zhihu --account "主账号"
python scripts/cookie_manager.py save zhihu --account "小号"
bash
python scripts/cookie_manager.py list
python scripts/cookie_manager.py save zhihu --account "主账号"
python scripts/cookie_manager.py save zhihu --account "小号"