首页/新闻资讯/正文详情

用Claude MCP与AdsPower搭建多账号自动化流水线:从开浏览器到订单抓取

发布时间:2026/9/24 20:03:59 来源:云帆数科 栏目:资讯中心
用Claude MCP与AdsPower搭建多账号自动化流水线:从开浏览器到订单抓取
先说一个我自己的体会以前我每天打开 AdsPower手动登录店铺后台、复制订单号、回消息、记库存一百个账号轮完差不多要一整天。后来我用 Claude MCP 把 AdsPower 的本地接口接进来让 AI 按照我的任务清单去打开浏览器、点页面、抓数据、做整理才真正理解什么叫“一人管百号”。这篇文章不聊虚的直接讲我怎么搭出一条跨境自动化流水线从 MCP server 怎么写、AdsPower 怎么配到订单抓取怎么做再到防封这件事为什么自动化反而更稳全程按我实际跑过的路径来。1. 先拆清楚这套流水线到底解决了什么问题很多人一听到“一人管百号”第一反应是“手速问题”只要我点的够快100 个账号也能搞定。但真正跑过的人都知道你崩溃的不是操作量而是“不一致”。1.1 一个人管一百个账号真正崩溃的不是“操作量”是“不一致”人不是机器连续登录第 20 个账号的时候你可能已经忘了第 17 个账号刚才有没有发货复制订单号的时候很容易把 A 店铺的订单贴到 B 店铺的回复框里登录状态、页面排版、平台每次改版都会让你的操作流程出现偏差。这种“不一致”在单账号时代无所谓但在批量管理的场景下会被无限放大。100 个账号每个账号差一点后台的数据就是乱的运营节奏也会乱。我见过不少人用 RPA 去录脚本录了三个月平台一改版脚本就废了。问题不在于 RPA 不好而在于传统的流程自动化是“死”的每一步都写死页面一变就崩。而 Claude MCP 这套思路是“活”的它先看页面长什么样再决定下一步点什么相当于把自动化测试那套“识别页面状态再操作”的能力搬到了日常运营上。1.2 AdsPower 负责“每个账号有独立的环境”Claude 负责“决定下一步干什么”这套流水线里两个工具的分工非常明确。AdsPower 是一个指纹浏览器能在一台电脑上开出多个隔离的浏览器环境。每个环境有独立的指纹、独立的缓存、独立的 cookie账号之间互不干扰。这是多账号运营的地基你不可能在同一个浏览器窗口里登录 100 个店铺这种操作在平台侧几乎一定会被判风险。Claude 负责的是“智力活”理解任务、规划步骤、根据页面变化做出判断。比如我告诉它“打开账号 37去订单中心看看有没有新的未发货订单有的话整理成表格”它会把这句话拆解成一个个动作然后调用工具去执行。“句号”之前的逻辑其实可以用一句话概括AdsPower 管手Claude 管脑MCP 是连接两者的神经系统。1.3 MCP 不是魔法它只是把“接口”翻译成了 Claude 能直接用的工具MCPModel Context Protocol很多朋友不熟我拿 USB-C 接口来类比。以前你给 Claude 接一个外部系统得写一堆适配代码现在 MCP 就是一个标准接口协议Claude 通过 MCP 暴露出来的“工具列表”就能直接调用 AdsPower 的能力。AdsPower 不需要把内部实现暴露给 Claude只需要提供一个符合 MCP 规范的中间层即可。这个中间层通常是一个很小的本地服务我用的是 FastMCP 封装了一个 server里面定义了几个工具列出所有浏览器环境、打开指定环境、在页面上点击、输入文字、读取页面内容。Claude 看到这些工具就知道自己能用什么、参数是什么、结果返回什么格式。注意MCP 本身不解决 AI 能不能“想明白”的问题它只解决 AI 能不能“够得着”的问题。真正让流水线跑得稳靠的是你给 Claude 的工具设计和任务描述。2. 开工前的两条腿AdsPower 本地 API 与 Claude 里的 MCP server下面进入实操。我把整个搭建过程分成 AdsPower 侧和 Claude 侧两条腿都站稳了流水线才走得动。2.1 AdsPower 侧先开本地 API端口和 Token 在哪看AdsPower 本身有一个设置项叫“本地 API”在软件的设置页面里找到 API 设置相关的入口把开关打开。打开之后记下两个关键信息本地 API 地址默认是http://127.0.0.1:50325和 API Token。验证是否开启成功可以直接在浏览器里访问一下http://127.0.0.1:50325/api/v1/user/list?token你的Token如果返回一串 JSON里面有账号配置列表就说明本地 API 已经通了。这个接口非常关键后面 MCP server 全是通过它来和 AdsPower 对话的。打开浏览器环境的接口是http://127.0.0.1:50325/api/v1/user/start?token你的Tokenuser_id某个环境IDopen_tabs1调用之后AdsPower 会返回一个 JSON里面有一个webdriver字段值是类似端口号的字符串这个就是 CDP 端口。拿到它之后Playwright 就能接管这个浏览器窗口实现真正的“远程控制”。我知道很多人第一次会卡在这一步因为默认不开启本地 API而且不同版本的 AdsPower 菜单位置略有差异找不到就先按版本号去搜对应文档别凭感觉乱点。2.2 给 Claude 写一个轻量 AdsPower MCP server如果你用的是 Claude Desktop需要在它的配置文件claude_desktop_config.json里声明 MCP server。下面这个配置是我在 Windows 上实际跑的{ mcpServers: { adspower: { command: python, args: [D:/tools/adspower_mcp_server.py] } } }adspower_mcp_server.py这个脚本就是我们的中间层。我用 FastMCP 来写代码量不大from fastmcp import FastMCP import requests import json ADS_API http://127.0.0.1:50325/api/v1 ADS_TOKEN 你的Token mcp FastMCP(adspower) mcp.tool() def list_profiles(): 获取 AdsPower 里的所有浏览器环境列表 resp requests.get(f{ADS_API}/user/list, params{token: ADS_TOKEN}) return json.dumps(resp.json(), ensure_asciiFalse) mcp.tool() def open_profile(profile_id: str): 打开指定浏览器环境返回 webdriver 端口 resp requests.get(f{ADS_API}/user/start, params{ token: ADS_TOKEN, user_id: profile_id, open_tabs: 1 }) data resp.json() if data.get(code) 0: return json.dumps(data[data], ensure_asciiFalse) return f启动失败: {data} mcp.tool() def stop_profile(profile_id: str): 关闭指定浏览器环境 resp requests.get(f{ADS_API}/user/stop, params{ token: ADS_TOKEN, user_id: profile_id }) return json.dumps(resp.json(), ensure_asciiFalse) if __name__ __main__: mcp.run()三个工具只是基础但足够跑通第一版。后面要加页面操作就在这个文件里继续加工具函数。2.3 第一个验证动作让 Claude 把指定账号的浏览器窗口打开配置完成并重启 Claude Desktop 后你可以直接在对话里输入列出 AdsPower 里所有浏览器环境找出名字包含“美国站”的那个然后把它打开。如果 Claude 调用了list_profiles然后又调用了open_profile最后你看到 AdsPower 那边真的弹出了一个独立的浏览器窗口恭喜这一步就算彻底打通了。我第一次跑通这个动作的时候说实话有点意外——平时要手动点好几下才能打开的特定账号环境一句话就完成了。不过这只是起点真正麻烦的是页面上的点击和输入这需要你把 MCP server 里的工具做得更细。3. 最小闭环从“开一个浏览器”到“登录-查单-整理”全自动环境能打开了下一步就是让 Claude 能干“活”。这里的核心思路是把页面操作拆成一个个工具让 Claude 像搭积木一样组合。3.1 把页面操作拆成 Claude 能调用的“积木工具”页面上的操作本质就三种找元素、点击、输入。所以我封装了三个工具再加上读取页面文本和截图就够覆盖绝大多数场景。这里我用了 Playwright 去连接 AdsPower 启动后暴露出来的 CDP 端口。from playwright.sync_api import sync_playwright def get_cdp_port(profile_id: str): # 调用 start 接口并解析返回的 webdriver 端口 resp requests.get(f{ADS_API}/user/start, params{ token: ADS_TOKEN, user_id: profile_id, open_tabs: 1 }) data resp.json() return data[data][webdriver] mcp.tool() def page_click(profile_id: str, selector: str, timeout: int 15): 在指定浏览器环境中点击某个页面元素 port get_cdp_port(profile_id) with sync_playwright() as p: browser p.chromium.connect_over_cdp(fhttp://127.0.0.1:{port}) page browser.contexts[0].pages[0] page.click(selector, timeouttimeout * 1000) return f已点击 {selector} mcp.tool() def page_fill(profile_id: str, selector: str, text: str): 在指定浏览器环境中输入文本 port get_cdp_port(profile_id) with sync_playwright() as p: browser p.chromium.connect_over_cdp(fhttp://127.0.0.1:{port}) page browser.contexts[0].pages[0] page.fill(selector, text) return f已向 {selector} 输入内容 mcp.tool() def page_get_text(profile_id: str, selector: str): 读取指定浏览器环境中某个元素的文本 port get_cdp_port(profile_id) with sync_playwright() as p: browser p.chromium.connect_over_cdp(fhttp://127.0.0.1:{port}) page browser.contexts[0].pages[0] text page.inner_text(selector) return text这里有一个性能问题每次工具调用都重新连接一次 CDP确实有些浪费。为了演示我故意写成这种直白方式实际长期跑的话建议在 MCP server 里维护一个连接缓存别每次都握手。3.2 用一段自然语言任务让 Claude 编排整条流程工具就位后给 Claude 的任务就不再是“点击某个按钮”这种机械指令了而是“帮我完成一次订单检查”。我实际使用的任务描述大概长这样打开 AdsPower 环境里叫“US-37”的账号等页面完全加载后访问店铺后台的订单页面然后选择“新订单”筛选把订单号、买家备注、金额全部读取出来整理成 Markdown 表格。Claude 会自己做判断如果页面还没加载完它可能会调用截图工具看一眼当前页面状态如果选择器没找到元素它可能会回去检查页面再换一个方式。这个“根据实际情况动态调整”的能力正是它和传统 RPA 最大的区别。3.3 实测一次订单抓取跑完人和机器分别干了什么我拿一个真实测试说下效果环境是“US-37”任务是把昨天的新订单抓出来。执行过程中Claude 先调用了open_profile几秒后 AdsPower 弹出窗口然后它调用page_click进入订单后台又用page_get_text读取了订单列表中间有一次因为页面弹出了一个通知弹窗挡住了列表Claude 自动识别到截图里的异常选择先关闭弹窗再重新读取。最终输出是这样的订单号买家备注金额OD-2025-001黄色M码$29.90OD-2025-002不急周末前到$12.50整轮跑下来我的操作只有输入任务描述、等待结果。过程中 Claude 大概调用了 14 次工具每次工具返回都是正常的。这个“小闭环”跑通之后你就有了扩充的能力基础。4. 搭一条能长期跑的订单抓取流水线单次任务能跑通离“流水线”还差一步。流水线是要反复跑的所以必须把输入、执行、输出都定义清楚不然每次换人换场景都会出问题。4.1 先把“输入-处理-输出”定死流水线才不会跑偏我把这条订单抓取流水线定义成三个部分输入账号 ID 列表、要访问的平台页面地址、要筛选的日期范围、输出格式要求。处理逐个账号打开环境并登录、进入订单页、筛选条件、读取数据、汇总。输出一张合并后的订单表格按账号分组方便核对。这个定义非常重要。因为 Claude 是一个对话模型你不给它明确边界它就容易自由发挥。比如你今天让它抓订单它可能输出文字描述明天再问它可能改成 CSV。把输入输出定死之后用一段固定的任务模板去驱动结果才具备一致性。4.2 一份可复用的任务清单模板下面是我放在一个tasks.md文件里的任务模板每次跑流水线时直接把文件内容丢给 Claude## 任务批量抓取新订单 - 账号环境列表US-37, US-42, DE-18 - 页面地址https://xxx.com/orders - 筛选条件近 24 小时新订单 - 输出格式Markdown 表格列包括 账号、订单号、买家备注、金额、下单时间 - 执行要求每个账号操作之前先等待页面加载完成如果遇到需要登录的情况停下来告诉我不要自行尝试绕过。注意最后一句“不要自行尝试绕过”这既是为了合规也是为了避免 Claude 在遇到登录校验时乱试造成账号风控。4.3 限速、断点、留一个人工确认口流水线长期跑三个细节决定了它会不会“翻车”第一限速。连续快速切换 100 个账号环境从人类直觉看就像机器在操作。我在工具里做了一层随机延迟每次页面跳转之间等 1 到 3 秒模拟真实人工阅读页面的节奏。这个延迟不能是固定值固定值反而更容易被识别。我自己的实现是给每个工具调用加了一个可配置的延迟参数。第二断点。账号跑了一半如果 Claude 调用出错我不希望它从第一个账号重新开始。所以我让 Claude 每处理完一个账号就在结果里记录“已完成 US-37、US-42”下次继续时它就知道从 DE-18 开始。第三人工确认口。订单金额大、买家留言特殊、库存异常这些情况我不会让 Claude 自动处理而是让它单独列出来等待人工决策。自动化负责把不确定性变少但不可能消灭所有不确定性。实践建议刚开始不要追求“全自动”先让 Claude 每天跑一遍并把结果发给你你只要看一眼有没有异常连续跑一周没问题了再考虑把人工确认环节收窄。5. 聊透“防封”自动化为什么能降低风险但别指望刀枪不入标题里那个“防封率翻倍”的说法我先泼盆冷水任何工具都无法给你百分之百的不封号承诺包括这套流水线。但为什么我仍然强调“自动化反而更稳”因为平台风控看的是规律性异常而手动操作恰恰更容易制造异常。5.1 平台风控在看什么环境关联和行为异常多账号场景下风控主要看两块环境关联和行为异常。环境关联很好理解100 个账号都从同一个浏览器指纹、同一个 IP 段、同一台设备上登陆这在平台侧几乎就是“批量操作”的代名词。行为异常则是看操作节奏深夜 2 点连续 100 次登录、刚登录就瞬间完成大量操作、每个账号的操作路径一模一样这些都是明显信号。AdsPower 解决的是环境关联问题自动化解决的是行为异常问题两者恰好互补。手动操作会因为在两个账号之间来回切、偶尔手滑点错、登录了 A 账号又去碰 B 账号的数据而产生“交叉污染”。自动化操作则是每次登录之后只做预设任务做完就关不碰不该碰的东西这就大大减少了环境层面的交叉风险。5.2 行为层把“像真人”做进调度里“像真人”不是玄学它的核心是两个词节奏变化和任务专一。节奏变化指操作间隔、操作顺序不要完全一致。我跑流水线时每个账号的延迟是random.uniform(1.2, 3.8)这种随机区间任务顺序也不是永远从 1 到 100而是打乱后依次执行避免形成固定的序列特征。任务专一是指一个浏览器环境在一段时间内只做一个平台的任务不在同一个环境里反复切换不同站点。手动操作时你可能这边看看 A 平台那边切到 B 平台这种“串场”在风控视角看是可疑的。而流水线每次只处理一个账号的一个任务边界清晰得多。5.3 环境层独立指纹只是起点别手动交叉登录AdsPower 给每个账号分配了独立的浏览器指纹和存储空间但如果你手动登录账号后又闲得慌去把另一个账号的 Cookie 复制过来那环境隔离就白做了。环境层的第一原则是一个环境只服务一个账号永远不要在一个环境里登录第二个账号。另一个容易被忽略的点是不要把浏览器环境随意删除重建。新建环境意味着指纹变化而指纹突变本身就是风险信号。我见过有人为了省空间把旧环境删了重新建结果账号频繁出现异常提示。所以环境建好后要稳定使用没事别动。还要注意自动化脚本也会暴露一些自动化特征。Claude 通过 CDP 接管浏览器时Playwright 默认会启用一些自动化标记。虽然 AdsPower 本身做了不少处理但为了安全尽量用connect_over_cdp这种方式去连接已有浏览器而不是新建一个带自动化标记的浏览器实例。6. 我实际踩过的四个坑代码和配置层面的排查思路这部分是我花时间最多的地方很多人配置 MCP 失败大概率逃不出这几个问题。6.1 Claude 说 MCP server 连不上十有八九是路径和 Node 环境我在 Windows 上第一次配置的时候Claude Desktop 一直提示 server 连接失败。排查了一圈发现是args里的脚本路径带了中文Claude 解析出了问题。把脚本挪到纯英文路径之后重启一次就好了。另外如果 MCP server 是用 Node.js 写的务必确认你的 Node 版本足够新。MCP 协议对运行时有一些新特性要求老版本 Node 跑不起来。最直接的排查方式在命令行手动执行一遍python D:/tools/adspower_mcp_server.py看有没有报错如果命令行能启动那么问题大概率出在 Claude Desktop 的配置格式上。6.2 AdsPower 本地 API 端口连不上先回去查跨域白名单有一次list_profiles在浏览器里直接访问是通的但 MCP server 调用时却超时。后来发现是 AdsPower 本地 API 有一个跨域访问控制的设置默认白名单里可能没有http://127.0.0.1之外的来源。解决方法很简单在 AdsPower 的 API 设置里把允许跨域访问打开或者把127.0.0.1加进白名单。这个坑很奇怪因为表面上“127.0.0.1 访问 127.0.0.1”不该有跨域问题但实际就是被拦了。如果你也遇到端口通、接口报错的情况优先检查这个开关。6.3 工具调用返回超时别急着怪 Claude先看浏览器启动耗时Claude 调用open_profile后如果 MCP server 在requests.get那一步卡了很久最后返回超时多半是因为浏览器冷启动太慢。AdsPower 启动一个新环境轻则几秒重则十几秒而 Claude 的默认超时设置可能不够长。我在 MCP server 里给open_profile做了轮询重试第一次请求后不直接返回而是循环等待webdriver端口真正可连接最多等 30 秒。这样 Claude 拿到的永远是“已经可用的端口”而不是一个还没启动完的地址。6.4 账号登录态莫名丢了先排查环境是不是被手动动过有次跑流水线时某个账号突然提示需要重新登录。我一查发现是前一天我在测试脚本时误用了browser.close()直接把 AdsPower 的浏览器进程给关掉了。正确做法是用 AdsPower 的close接口去关闭环境而不是用 Playwright 的browser.close()否则可能会破坏环境的持久化状态。如果你也遇到登录态丢失先从这几个方向排查有没有直接杀进程、有没有手动清过缓存、有没有在环境里登录过别的账号、有没有修改过环境指纹设置。我踩了几次坑之后总结了一条原则不要用 CDP 连接之外的方式去结束浏览器生命周期一切开关都用 AdsPower 的 API 来做。最后再分享一个我现在每天在用的习惯我会把账号清单、每个账号对应的后台地址、日常任务描述都写进同一个文档Claude 每次开工前先读一遍再按文档执行。这比反复复述任务要稳定得多也让“一人管百号”这件事从口号变成了真正可复制的流程。搭建这套流水线的过程最大的收获并不是省了多少时间而是我终于明白自动化不是为了让操作变快而是为了让每一个操作都变得可预期、可复盘、可优化。

相关推荐

MySQL数据可视化:从维度度量到SQL聚合的完整实战指南
MySQL数据可视化:从维度度量到SQL聚合的完整实战指南

1. 先搞清楚一件事:MySQL在这里不是画图的,是供图的1.1 可视化项目的完整链路里,MySQL到底站在哪我见过太多人一提到“MySQL 数据可视化”,第一反应就是赶紧打开一个图表工具,或者去 ECharts 官网抄一段炫酷大屏代码。… · 2026/9/24 20:03:59

金融数学专业如何把定价模型作业改造成有求职说服力的项目经历
金融数学专业如何把定价模型作业改造成有求职说服力的项目经历

本文直接面向正在参与2025至2026届校招的金融数学专业本科生、硕士生,如果你手里有衍生品定价、量化定价类的课程作业,目标投递岗位为券商量化交易岗、衍生品定价岗、风控模型岗,可按照下文的标准化改造路径,把原本得分不错的课程… · 2026/9/24 20:03:59

腾讯云Octop 1.0自托管多智能体部署实战与避坑指南
腾讯云Octop 1.0自托管多智能体部署实战与避坑指南

1. 从一条命令说起:Octop 1.0 到底解决了什么问题腾讯云发布 Octop 1.0 这件事,我第一反应不是去看它的功能列表,而是去翻它的部署方式。原因很简单——过去一年我帮不少团队落地过智能体项目,最头疼的从来不是模型能力不够&#… · 2026/9/24 20:03:46

从继承到装饰器:Java通知模块重构实战,告别组合爆炸
从继承到装饰器:Java通知模块重构实战,告别组合爆炸

大概三年前的某个深夜,我盯着项目里那十七个以Notify开头的类,第一次认真琢磨装饰器模式(Decorator Pattern)到底能救多少代码。当时那是一个消息通知模块,需求方从“先发个短信就行”一路加码到“短信邮件站内信都要、… · 2026/9/24 22:35:31

深度学习毕设选题实操指南:从公开数据集到可复现代码
深度学习毕设选题实操指南:从公开数据集到可复现代码

每年三月到五月,总有一批学生拿着“深度学习毕设”这几个字来找我,开口第一句几乎都是:老师/学长,有没有那种**数据集能下载、代码能跑通**的题目?一开始我还觉得这是学生偷懒,看了几年答辩之后我反而理解了… · 2026/9/24 22:35:31

制冷系统核心参数:过热度与过冷度的测量、计算及故障判断实操
制冷系统核心参数:过热度与过冷度的测量、计算及故障判断实操

1. 从一次夜班维修说起:两个数救了整套冷库机组做制冷空调这行久了,你会发现一个规律:大多数“系统不冷”的疑难故障,最后都逃不过两个参数——过热度(Superheat)和过冷度(Subcooling&#xff0… · 2026/9/24 22:35:25

EMC电波暗室日常维护指南:从吸波材料到屏蔽壳体的关键细节
EMC电波暗室日常维护指南:从吸波材料到屏蔽壳体的关键细节

先讲个很多人容易忽略的事实:EMC电波暗室虽然看起来是一间“贴着海绵的房间”,本质上却是一台精密的电磁测量设备。它的价值既体现在屏蔽壳体的结构上,更体现在内部吸波材料、转台、天线塔和接口面板这些“细枝末节”的状态里。我见过不少实验… · 2026/9/24 22:35:25

传递路径分析(TPA)在齿轮箱故障诊断中的原理与Matlab实现
传递路径分析(TPA)在齿轮箱故障诊断中的原理与Matlab实现

去年处理一台矿山破碎机齿轮箱的振动异常时,我盯着测点屏幕上1300Hz左右一群密密麻麻的边带发了很久的呆。齿轮啮合频率的谐波和疑似轴承特征频率重叠在一起,时域波形上还能看到明显冲击,谁都不敢拍板说问题在齿轮还是轴承。拆机验证的结果是… · 2026/9/24 22:35:19

电波暗室维护全攻略:从部件原理到日常巡检与故障排查
电波暗室维护全攻略:从部件原理到日常巡检与故障排查

做EMC测试的都知道,暗室是整个实验室里最“金贵”的资产。一套合格的3米法或10米法电波暗室,从土建到屏蔽体安装、吸波材料铺设、转台天线塔进场、滤波器配齐,前前后后投入少则几百万,多则上千万。但很多实验室用起来却相当“糙”… · 2026/9/24 22:35:12

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码