RPA 核心组件(Node.js + Playwright)POC 示例
基于 Node.js + Playwright + 后端RPA 的方案。
这个脚本模拟了服务器接收到指令后,启动一个浏览器实例,通过代理访问 TikTok,并尝试使用已保存的登录态(Cookie)进行操作。
1. 前提条件
- Node.js 环境:已安装。
- Playwright:在您的项目目录下执行安装:
npm install playwright - Session 存储目录:创建用于存储登录 Cookie 的文件夹(例如
mkdir session_data)。
2. RPA 脚本代码 (rpa_inviter.js)
const { chromium } = require('playwright');
const fs = require('fs');
// ----------------- 【关键配置区】 -----------------
// **重要**:请替换为您的动态住宅代理 (Residential Proxy) 信息。
const PROXY_SERVER = 'http://username:password@your.residential.proxy:port';
// 用于存储/加载商家 A 账号登录态(Cookie/LocalStorage等)。
// 每一个商家/账号都需要独立的文件来防止关联。
const STORAGE_PATH = 'session_data/seller_A_tiktok_state.json';
// ----------------- 【核心执行函数】 -----------------
/**
* @description 执行 TikTok 邀约任务的自动化脚本
* @param {string} targetProfileUrl - 目标达人主页 URL
*/
async function executeTikTokTask(targetProfileUrl) {
let browser;
try {
console.log('--- 1. 启动无头浏览器并配置代理 ---');
// 启动浏览器,配置代理、无沙箱等基础反检测参数
browser = await chromium.launch({
headless: true, // 生产环境使用无头模式
proxy: { server: PROXY_SERVER },
args: [
'--no-sandbox', // 规避一些Linux环境的权限问题
'--disable-setuid-sandbox',
// 更多反指纹参数(如修改语言、时区)可以在这里添加
],
});
// 2. 加载或创建上下文 (Session 管理)
let context;
if (fs.existsSync(STORAGE_PATH)) {
// 如果存在 session 文件,则加载,快速恢复登录态
context = await browser.newContext({ storageState: STORAGE_PATH });
console.log('--- 2.1 成功加载已保存的 Session,尝试免登录 ---');
} else {
// 否则创建新上下文,系统会尝试进行完整登录流程(例如扫码或账号密码)
context = await browser.newContext();
console.log('--- 2.2 Session 文件不存在,创建新上下文,需要执行登录 ---');
// 注意: 在这里需要插入完整的登录脚本 (如: 扫码登录流程)
}
const page = await context.newPage();
// 3. 设置 User-Agent (反指纹,模仿真实设备)
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36');
// 4. 执行业务逻辑 (以访问示例网站代替 TikTok)
await page.goto(targetProfileUrl, { waitUntil: 'domcontentloaded', timeout: 60000 }); // 等待页面加载
// 模拟真人行为 (滑动、停留)
await page.evaluate(() => window.scrollBy(0, 500));
await page.waitForTimeout(2000);
// 【实际操作】
// 在这里执行:寻找“Send Message”按钮 -> 填写邀约内容 -> 点击发送
// 示例:获取页面标题
const pageTitle = await page.title();
console.log(`[RPA 任务成功] 访问页面标题: ${pageTitle}`);
// 5. 保存登录态 (将最新的 Cookies/LocalStorage 保存,用于下次任务)
await context.storageState({ path: STORAGE_PATH });
console.log(`--- 3. Session 已更新并保存到 ${STORAGE_PATH} ---`);
} catch (error) {
// **关键**:这里需要捕获特定错误,如代理失败、验证码、元素找不到(TikTok改版)等
console.error('🚨 RPA 任务执行失败:', error.message);
// 在生产环境中,应将失败信息推入任务失败队列,并通知运营人员
} finally {
if (browser) {
await browser.close();
console.log('--- 4. 浏览器已关闭,任务结束 ---');
}
}
}
// ----------------- 【调用示例】 -----------------
console.log('RPA 脚本启动...')
// **请将此 URL 替换为实际的 TikTok 达人主页 URL**
executeTikTokTask('https://www.example.com/'); 3. 代码中的关键点和挑战
| 代码块 | 目的 | 您的主要挑战 |
|---|---|---|
proxy: { server: ... } | 反风控:将所有流量导向住宅代理,模仿真实用户网络环境,避免服务器 IP 被 TikTok 封禁。 | 需要稳定的、支持高并发的动态住宅代理服务商。这是成本最高但最必要的环节。 |
storageState: ... | 会话管理:通过保存和加载浏览器上下文的状态,可以跳过重复的登录流程,实现“免密”快速启动任务。 | 首次登录态获取(例如:如何远程获取二维码供商家扫描?)是一个难题。 |
headless: true | 性能/部署:启用无头模式可以节省服务器的内存和 CPU 资源,实现大规模并发运行。 | 无头模式更容易被检测。需要配合 Playwright 的 args 和 Stealth 插件来优化反检测能力。 |
page.waitForTimeout | 模仿真人:增加随机的等待时间和模拟滑动/点击等行为,降低被识别为机器人的风险。 | 脚本的鲁棒性。TikTok 的 DOM 结构(CSS Selector)经常变动,每次改动都会导致脚本失效,需要快速响应。 |
page.goto | 异常处理:timeout 参数至关重要。如果代理连接慢或遇到验证码卡住,必须及时超时终止任务,防止任务节点被阻塞。 | 任务失败后,需要自动重试、切换代理或上报运营。 |
4. 落地建议:构建 RPA 中台
为了让这个 POC 真正成为一个可用的服务,而不是一个单独的脚本,您需要一个RPA 中台来管理它:
| 中台功能模块 | 职责 | 对应“系统耦合问题”的分离点 |
|---|---|---|
| 任务队列 (Task Queue) | 接收商家端的批量邀约请求,进行排队、去重、优先级排序。 | 属于后端服务层,由 Seller API 写入,RPA Cluster 读取。 |
| 账号池 (Account Pool) | 存储所有商家账号的 STORAGE_PATH 文件、IP 绑定信息、上次登录时间、当前状态(正常/被封禁/需验证码)。 | 核心数据服务,独立于商家和运营 API。 |
| 执行集群 (RPA Cluster) | 部署多台高性能服务器,专门运行 Playwright 脚本,并处理内存和 CPU 的高消耗。 | 独立于所有业务服务,只通过队列交互。 |
| 监控面板 (Admin Console) | 运营人员通过 Admin Console 查看当前总共有多少任务在队列中、哪台服务器负载过高、哪些账号被封禁。 | 运营控制台的核心功能,负责对 RPA 系统的可观测性。 |
Last updated on