Skip to Content
系统设计文档RequirementsPoc Verification for Rpa

RPA 核心组件(Node.js + Playwright)POC 示例

基于 Node.js + Playwright + 后端RPA 的方案。

这个脚本模拟了服务器接收到指令后,启动一个浏览器实例,通过代理访问 TikTok,并尝试使用已保存的登录态(Cookie)进行操作。

1. 前提条件

  1. Node.js 环境:已安装。
  2. Playwright:在您的项目目录下执行安装:
    npm install playwright
  3. 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