使用 Playwright MCP 实现小红书全自动发布的完整流程

news/2025/9/23 14:19:32/文章来源:https://www.cnblogs.com/hogwarts/p/19107105

你是否曾为自动化脚本中的小红书登录验证而头疼?是否曾因登录态频繁失效而不得不手动介入,让所谓的“全自动”名存实亡?

Playwright Model Context Protocol (MCP) 的推出,彻底改变了这一局面。它不再是简单的浏览器控制,而是通过直接连接到你已登录的浏览器会话,实现了真正的“无感知”自动化。这意味着,你只需要手动登录一次小红书,之后的发布、互动等所有操作都可以交给脚本,无需再关心复杂的登录验证流程。

本文将为你带来一份零基础的保姆级教程,手把手教你如何利用 Playwright MCP 实现小红书图文的无人值守自动发布。

一、环境准备与配置:打下坚实基础
1.1 安装 Playwright
确保你的 Python 环境在 3.7 以上,然后安装 Playwright:

pip install playwright
playwright install chromium
1.2 安装配置 MCP 服务器
Playwright MCP 需要一个服务器来协调浏览器和你的自动化脚本:

通过 npm 全局安装

npm install -g @playwright/mcp

或者使用 npx 直接运行

npx @playwright/mcp
1.3 安装浏览器扩展
这是实现会话复用的关键步骤:

下载 Playwright MCP Chrome 扩展(ZIP 文件)
打开 Chrome,进入 chrome://extensions/
开启“开发者模式”
点击“加载已解压的扩展程序”,选择解压后的文件夹
完成安装后,记得在扩展管理界面启用它
二、连接已登录的浏览器会话
2.1 启动浏览器并手动登录
首先,你需要让浏览器以调试模式运行:

Windows

chrome.exe --remote-debugging-port=9222

macOS

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
然后在打开的浏览器中手动登录小红书账号,完成所有必要的验证步骤。

2.2 编写连接代码
创建一个 Python 文件,写入以下代码来连接已登录的浏览器:

import asyncio
from playwright.async_api import async_playwright

asyncdef connect_to_logged_in_browser():
asyncwith async_playwright() as p:
# 连接到正在运行的浏览器实例
browser = await p.chromium.connect_over_cdp("http://localhost:9222")

    # 获取默认的浏览器上下文default_context = browser.contexts[0]# 使用现有的页面或创建新页面if default_context.pages:page = default_context.pages[0]else:page = await default_context.new_page()# 检查是否已登录await page.goto('https://www.xiaohongshu.com')try:# 等待用户头像或其他登录后可见元素出现await page.wait_for_selector('[data-testid="user-avatar"]', timeout=5000)print("✅ 检测到已登录状态")return pageexcept:print("❌ 未检测到登录状态,请先手动登录")returnNone

测试连接

asyncdef test_connection():
page = await connect_to_logged_in_browser()
if page:
await page.screenshot(path='login_status.png')
print("截图已保存,请查看登录状态")
await browser.disconnect()

asyncio.run(test_connection())
三、完整的小红书图文发布脚本
以下是一个完整的自动化发布脚本,包含了异常处理和详细注释:

import asyncio
from playwright.async_api import async_playwright
import random
import os

class XiaohongshuAutoPublisher:
def init(self):
self.browser = None
self.page = None

asyncdef init_browser(self):"""初始化浏览器连接"""try:playwright = await async_playwright().start()self.browser = await playwright.chromium.connect_over_cdp("http://localhost:9222")self.context = self.browser.contexts[0]self.page = self.context.pages[0] if self.context.pages elseawait self.context.new_page()# 设置超时时间self.page.set_default_timeout(30000)returnTrueexcept Exception as e:print(f"❌ 浏览器连接失败: {e}")returnFalseasyncdef goto_create_page(self):"""导航到创作中心"""try:await self.page.goto('https://www.xiaohongshu.com/create', waitUntil='networkidle')# 等待发布界面加载完成await self.page.wait_for_selector('div[contenteditable="true"]', timeout=15000)print("✅ 成功进入创作中心")returnTrueexcept Exception as e:print(f"❌ 进入创作中心失败: {e}")await self.page.screenshot(path='error_create_page.png')returnFalseasyncdef upload_images(self, image_paths):"""上传图片"""try:# 等待文件上传输入框await self.page.wait_for_selector('input[type="file"]', timeout=10000)# 获取文件上传句柄file_input = await self.page.query_selector('input[type="file"]')if isinstance(image_paths, str):image_paths = [image_paths]await file_input.set_input_files(image_paths)print("✅ 图片上传成功")# 等待图片处理完成await self.page.wait_for_selector('img[src*="upload"]', timeout=30000)await asyncio.sleep(2)  # 额外等待确保完全加载returnTrueexcept Exception as e:print(f"❌ 图片上传失败: {e}")await self.page.screenshot(path='error_upload.png')returnFalseasyncdef input_content(self, content, tags):"""输入正文内容和标签"""try:# 定位正文编辑器editor = await self.page.wait_for_selector('div[contenteditable="true"]', timeout=10000)# 清空现有内容await editor.click(clickCount=3)  # 三击全选await self.page.keyboard.press('Backspace')# 输入内容await editor.type(content)# 添加标签if tags:tag_text = ' ' + ' '.join([f'#{tag}'for tag in tags])await editor.type(tag_text)print("✅ 内容输入成功")# 添加随机延迟,模拟人类输入await asyncio.sleep(random.uniform(1, 3))returnTrueexcept Exception as e:print(f"❌ 内容输入失败: {e}")await self.page.screenshot(path='error_content.png')returnFalseasyncdef publish(self):"""执行发布操作"""try:# 定位发布按钮publish_button = await self.page.wait_for_selector('button:has-text("发布")', timeout=10000)await publish_button.click()print("✅ 已点击发布按钮")# 等待发布结果try:await self.page.wait_for_selector('text=发布成功', timeout=15000)print("🎉 发布成功!")returnTrueexcept:# 检查是否有错误提示error_element = await self.page.query_selector('text=/发布失败|错误/')if error_element:error_text = await error_element.inner_text()print(f"❌ 发布失败: {error_text}")else:print("⚠️  发布状态未知,请手动确认")returnFalseexcept Exception as e:print(f"❌ 发布操作失败: {e}")await self.page.screenshot(path='error_publish.png')returnFalseasyncdef run(self, content, image_paths, tags=None):"""执行完整发布流程"""ifnotawait self.init_browser():returnFalsetry:steps = [(self.goto_create_page, "进入创作中心"),(lambda: self.upload_images(image_paths), "上传图片"),(lambda: self.input_content(content, tags), "输入内容"),(self.publish, "发布内容")]for step_func, step_name in steps:print(f"▶️ 正在执行: {step_name}")ifnotawait step_func():print(f"❌ 流程中断于: {step_name}")returnFalse# 步骤间随机延迟await asyncio.sleep(random.uniform(1, 2))returnTruefinally:if self.browser:await self.browser.disconnect()

使用示例

asyncdef main():
publisher = XiaohongshuAutoPublisher()

# 发布内容配置
content = """
Playwright MCP 真是太强大了!🤖刚刚用全自动脚本发布了这篇小红书,完全不需要手动登录和验证。#技术分享 #自动化 #Playwright #小红书运营
"""image_paths = ['/path/to/your/image1.jpg','/path/to/your/image2.jpg'
]tags = ['技术分享', '自动化', 'Playwright']success = await publisher.run(content, image_paths, tags)
if success:print("🎉 自动化发布流程完成!")
else:print("❌ 发布流程失败")

if name == "main":
asyncio.run(main())
四、高级技巧与最佳实践
4.1 会话保持与状态管理

保存浏览器状态,避免重复登录

asyncdef save_browser_state():
asyncwith async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()

    # 手动登录过程...# 登录成功后保存状态await context.storage_state(path='xiaohongshu_auth.json')await browser.close()

使用保存的状态

asyncdef use_saved_state():
asyncwith async_playwright() as p:
browser = await p.chromium.launch()
context = await browser.new_context(storage_state='xiaohongshu_auth.json')
page = await context.new_page()
# 现在应该处于已登录状态
4.2 智能元素定位策略

使用多种选择器策略提高稳定性

asyncdef smart_click(text):
selectors = [
f'button:has-text("{text}")',
f'div:has-text("{text}")',
f'//[contains(text(), "{text}")]',
f'[data-testid
="{text.lower()}"]'
]

for selector in selectors:try:element = await self.page.wait_for_selector(selector, timeout=2000)await element.click()returnTrueexcept:continueprint(f"❌ 找不到文本为 {text} 的元素")
returnFalse

4.3 完整的错误处理与重试机制
async def robust_operation(operation, max_retries=3):
"""带重试机制的操作执行"""
for attempt in range(max_retries):
try:
returnawait operation()
except Exception as e:
if attempt == max_retries - 1:
raise e
print(f"⚠️ 操作失败,第 {attempt + 1} 次重试: {e}")
await asyncio.sleep(2 ** attempt) # 指数退避

使用示例

asyncdef safe_publish():
await robust_operation(lambda: self.page.click('button:has-text("发布")'))
五、常见问题与解决方案
5.1 连接被拒绝
问题:无法连接到 http://localhost:9222

解决方案:

确保浏览器以调试模式启动
检查防火墙设置,确保端口可访问
尝试使用不同的端口号
5.2 元素找不到或操作超时
问题:选择器失效或页面加载过慢

解决方案:

使用多种选择器策略组合
增加等待时间和重试机制
添加页面状态检查
5.3 风控检测
问题:操作被限制或账号被暂时封锁

解决方案:

添加随机延迟和人类化操作模式
避免高频次操作
使用多个账号轮换操作
推荐学习
Playwright自动化测试框架与AI智能体应用课程,限时免费,机会难得。扫码报名,参与直播,希望您在这场公开课中收获满满,开启智能自动化测试的新篇章!

image

六、总结
Playwright MCP 为小红书自动化发布带来了革命性的改进:

无需处理复杂登录:直接复用已登录的浏览器会话
更高的稳定性:避免了登录态失效和验证码问题
更接近真人操作:使用真实浏览器实例,降低被风控的风险
灵活的部署选项:既可以在本地运行,也可以部署到服务器
通过本教程,你已经掌握了使用 Playwright MCP 实现小红书全自动发布的完整流程。现在,你可以根据自己的需求扩展这个基础脚本,实现更复杂的自动化场景,如自动回复评论、数据分析、多账号管理等。

记住,技术是用来提高效率的工具,请在遵守平台规则的前提下合理使用自动化技术。祝你自动化之旅顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团饿了么霸王餐 CPS 系统:外卖流量变现新选择

一、概述总结 会创科技推出的美团饿了么霸王餐 CPS 系统,是一款聚焦外卖领域流量变现与商家推广需求的创新工具,依托微擎云端实现交付。 该系统核心优势显著,无需运营者进行招商工作,也无需垫付资金,降低了前期投…

百家企业案例征集 | 让测试经验成为行业的共同财富

大家好,这里是霍格沃兹测试开发学社。 在软件行业快速演进的今天,测试工程师的角色正在发生深刻变化: 我们不再只是“问题的发现者”,而是系统稳定性的守护者; 不再只是“功能的验证者”,更是研发效能和交付质量…

Linux CAN 设备简介

Linux CAN 设备简介Linux CAN 设备简介 在 Linux 系统中,CAN(Controller Area Network)是一种用于嵌入式系统的可靠通信协议,广泛应用于汽车、工业自动化等领域。Linux 提供了对 CAN 的原生支持,通过 SocketCAN 子…

网站建设 招标任务书flash网站开发

k8s部署redis6节点,组成3主3从集群模式 一般来说,redis部署有三种模式。 单实例模式,一般用于测试环境。 哨兵模式 集群模式后两者用于生产部署 哨兵模式 在redis3.0以前,要实现集群一般是借助哨兵sentinel工具来监控master节点…

宁波静态网站建设深圳网站设计制作公司 维仆

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹(这个要求按顺序) zsh: permission denied TOMCAT的各部分含义: 引言 在密码中一般是:明文密钥->密文(加密) &#xff…

淮阴网站建设个人如何建设网站

FL Studio 21.2 带有 stem 分离和 FL Cloud,这是一项专为 FL Studio 打造的具有里程碑意义的新服务。其他新功能包括 FL Studio Fruity Edition 的 Audio Clips(音频剪辑)和一个新的模拟建模合成器 Kepler。 为庆祝 FL Studio 21.2 的发布&am…

做标准件网站网站建设需要哪些技术人员

金九银十,大家都铆足干劲想抓住机会涨薪进大厂。结合这几年的行业趋势,想要挑战大厂面试,首先必须吃透Selenium自动化测试框架设计。这里说一下原因:首先,一线互联网大厂无一例外,全都要求测试人掌握Seleni…

腾讯wordpress 建站制作微信小程序

需要像qt中添加模块,这里,缺少qtopenglwidgets模块

网站怎么吸引人合肥科技职业学院网站建设与管理

系列文章目录及链接 目录 前言 一、朴素贝叶斯通俗理解及定义 二、原理理解及公式 1、概率基础 2、贝叶斯公式 3、拉普拉斯平滑系数 三、**算法实现 四、接口实现 1、新闻数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、朴素贝叶…

什么行业最容易做网站互联网门户网站建设管理 总结

这是一个ATL开发实例的流程: 1. 在atl中插入一个atl实例,然后添加一个类,派生自ccmdtarget。 2. 添加相应的属性或者方法,在这里需要明白一点的是,这个属性和方法其实是一个概念,只是添加一个属…

网站备案平台网页设计广州网站

1、创建测试用例 为ComeOnBroadcastReceiverDo创建一个测试用例: 在导航栏File-->New-->Other 选择AndroidTestProject 2、点击next输入测试工程的name,选择测试工程路径 点击next,选择要测试的工程: 点击Finish完成测试工程的新建 被…

天津网站制作WordPress 延时加载

KlipC报道:据相关人士报道,苹果希望在未来2到3年内每年在印度生产超过5000万部iphone,要是该计划得以实现,印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示:“此次iPhone15推出是苹果印度制造计划的一…

容桂手机网站建设网站备案那个省份

原创/朱季谦 最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果,都是跳到一个新的图片网页,后来经过一番琢磨&…

CentOS 7下载教程vmware虚拟机安装centos 7保姆级安装步骤(附安装包) - 教程

CentOS 7下载教程vmware虚拟机安装centos 7保姆级安装步骤(附安装包) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

数字孪生 + 区块链:MyEMS 引领能源管理技术融合新趋势

能源管理领域正站在一场深刻技术变革的十字路口。随着物联网(IoT)、人工智能(AI)等技术的普及,企业已不再满足于简单的数据监测与报表生成,而是追求更深度的洞察、更可信的数据和更智能的决策。在此背景下,MyEM…

Python 完成 Markdown 与 Word 高保真互转(含批量转换)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python - SFTP files with paramiko

Python - SFTP files with paramiko import paramikoHOSTNAME = PORT = 22 USERNAME = PASSWORD = REMOTE_PATH = LOCAL_PATH = transport = paramiko.Transport((HOSTNAME, PORT)) transport.connect(username=US…

鹤壁市住房和城乡建设局网站住房和城乡建设部官网政务服务门户

目录 一、Vuex简介 1.1 定义 1.2 Vuex关键概念 1.3 使用Vuex的优势 1.4 Vuex中各个js文件的用途 1.5 Vuex各组件 1.5.1 图解 1.5.2 详解 1.6 变量传值的演变形式 二、Vuex获取值 2.1 安装 2.2 菜单栏 2.3 模块 2.4 引用 三、Vuex改变值 四、Vuex异步&请求后台…

有没有如何做网站的书网站建设大约多少钱

目录 Java后端接收数据 第一章、后端不写任何注解情况下接收参数1.1)后端不写注解postman发出get请求1.2)后端不写注解postman发出post请求 第二章、后端写RequestParam注解接收参数2.1)postman发出post请求2.2)postman发出get请求…

网站建站与优化网站编辑岗位

堆的概念 堆是一棵完全二叉树,一般使用数组来存储。通俗来讲堆其实就是利用数组来维护一个完全二叉树。 按照堆的特点可以把堆分为大顶堆和小顶堆 大顶堆:堆的每个结点的值都大于或等于其左右孩子结点的值 小顶堆:堆的每个结点的值都小于或…