别让登录流程卡住你的AI,直接把Agent连上你正在用的Chrome吧

更新日期: 2026-04-29 阅读: 13 标签: Agent

做自动化的时候,最烦的就是处理登录。写一堆代码去填账号密码,还得管验证码,搞到最后头都大了。现在有个新玩法:直接让 AI 去控制你电脑上已经打开的那个 Chrome。登录状态、Cookie 全都在,省事多了。

今年 Chrome 更新之后,官方出了一个叫 chrome-devtools-mcp 的工具,就是为了让 Agent 能直接连上浏览器。像 OpenClaw 这类开源项目,其实也是基于这个思路做的。

这篇文章就跟你聊聊这个东西怎么用,背后是怎么回事,以及怎么写到自己的自动化脚本里。


一、怎么让Agent连上你电脑上的Chrome

先把准备工作做好

  1. Chrome 版本要够新,最好是 146 以上。

  2. 打开 Chrome,在地址栏输入 chrome://inspect/#remote-debugging,然后把“允许调试”这个开关打开。

  3. 装一下 MCP 工具。

如果你用的是 Claude Code,可以直接执行下面这句:

claude mcp add chrome-devtools -- npx chrome-devtools-mcp@latest --autoConnect

要是手动配置,就找到 MCP 的配置文件,加上这段:

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["chrome-devtools-mcp@latest", "--autoConnect"]
    }
  }
}

一切就绪后,你给 AI 下一个指令,比如“帮我看看现在这个网页的性能怎么样”,它就会去连你的浏览器并干活。

需要注意一点:第一次连的时候,Chrome 会弹窗让你确认,这是为了保护安全。点“允许”就行。

这么连的好处是什么?

老办法新办法
每次都要新开一个浏览器窗口直接用你已经打开的那个
每次都得重新登录一遍登录状态直接跟着走
环境是独立干净的,跟平时用的不一样就是你平常上网的真实环境

二、这个直连到底是怎么实现的

其实没啥黑科技,Chrome 启用远程调试后,会在用户文件夹里自动生成一个叫 DevToolsActivePort 的小文件。这个文件里面就两行字:第一行是端口号,第二行是 WebSocket 的地址。

有了端口和地址,再把它们拼成一个 ws://127.0.0.1:端口号/路径 这样的链接,然后用 Puppeteer 的 connect 方法接上去就行了。不管是 OpenClaw 还是 Chrome 官方的 MCP 工具,走的基本都是这个路子。

Chrome 以前用 --remote-debugging-port 参数启动的是独立的用户数据目录,没法直接用你现在浏览器的登录状态。而现在新版 Chrome 允许 MCP 工具直接请求调试连接,又能复用你当前在用的用户数据,这才是直连能用的关键。


三、把这个思路用到你的自动化项目里

搞懂了原理,事情就好办了。我们完全可以在自己的 Puppeteer 脚本里,也通过读 DevToolsActivePort 文件,去连上正在用的 Chrome。

这样调试的时候就不用每次都跑一遍登录流程了,非常方便。

下面是一段可以直接用的代码,我已经帮你封装好了:

const puppeteer = require('puppeteer');
const fs = require('fs').promises;
const path = require('path');
const os = require('os');

// 根据你用的系统,找到 Chrome 存放数据的文件夹
function getUserDataDir(channel = 'stable') {
  const platform = os.platform();
  let basePath = '';

  if (platform === 'darwin') { // macOS
    basePath = path.join(os.homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
  } else if (platform === 'win32') { // Windows
    const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
    basePath = path.join(localAppData, 'Google', 'Chrome', 'User Data');
  } else { // Linux
    basePath = path.join(os.homedir(), '.config', 'google-chrome');
  }
  
  return basePath;
}

// 去 Chrome 的文件夹里,把 DevToolsActivePort 这个文件的内容读出来
async function readDevToolsActivePort(userDataDir) {
  const portPath = path.join(userDataDir, 'DevToolsActivePort');
  console.log(`正在找这个文件: ${portPath}`);

  try {
    const fileContent = await fs.readFile(portPath, 'utf8');
    const lines = fileContent.split('\n').filter(line => line.trim().length > 0);
    
    if (lines.length < 2) {
      throw new Error('文件格式不对,至少应该有两行(端口和路径)');
    }

    const port = parseInt(lines[0], 10);
    const wsPath = lines[1];
    
    return { port, wsPath };
  } catch (error) {
    if (error.code === 'ENOENT') {
      throw new Error(
        `没找到 DevToolsActivePort 文件。\n` +
        `请检查:\n` +
        `1. Chrome 是不是正在运行\n` +
        `2. 远程调试有没有开(去 chrome://inspect/#remote-debugging 看一眼)\n` +
        `3. 允许调试的弹窗有没有点“允许”\n` +
        `4. 用户文件夹路径对不对: ${userDataDir}`
      );
    }
    throw error;
  }
}

// 主函数:连接到你正在用的 Chrome
async function connectToChrome() {
  console.log('准备连接到你电脑上的 Chrome...\n');
  
  // 1. 找到文件夹
  const userDataDir = getUserDataDir();
  console.log(`用户数据文件夹: ${userDataDir}`);
  
  // 2. 读文件,拿到端口和路径
  const { port, wsPath } = await readDevToolsActivePort(userDataDir);
  
  // 3. 拼出 WebSocket 地址
  const browserWSEndpoint = `ws://127.0.0.1:${port}${wsPath}`;
  console.log(`WebSocket 地址是: ${browserWSEndpoint}\n`);
  
  // 4. 连上去!
  const browser = await puppeteer.connect({
    browserWSEndpoint,
    defaultViewport: null,
  });
  
  console.log('连上了!\n');
  return browser;
}

// 试一下
async function main() {
  const browser = await connectToChrome();
  
  // 看看现在打开了几个页面
  const pages = await browser.pages();
  console.log(`当前打开了 ${pages.length} 个页面`);
  
  // 用第一个页面去跳转
  let page = pages[0] || await browser.newPage();
  await page.goto('https://www.baidu.com');
  console.log('已经跳转到百度了');
  
  // 记得关掉连接
  // await browser.disconnect();
}

main();

跑这个脚本的时候记得把 Chrome 开着,不然会报错。连上之后,你就能像操作普通浏览器那样去操作它了,而且网站会认为你就是正常用户在访问,不需要重新登录。


总结

Agent 直连 Chrome 这个功能,说白了就是把 Puppeteer 的 connect 方法用得更巧妙了一些。Chrome 这边放开了普通用户的调试权限,也为了让 AI 更好地跟浏览器配合。

不管你是用现成的 OpenClaw,还是自己写脚本,这个功能都能省下不少事。下次写自动化脚本的时候,可以试试这个方法,至少不用再跟登录逻辑较劲了。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13731

相关推荐

Cursor 编辑代码功能的核心原理:Agent 如何高效工作?

像 Cursor、Copilot 这类 AI 编程助手正快速成为程序员的好帮手。很多人可能觉得它们内部非常复杂,其实核心思路很直接。为了实现高效运行,开发团队的重点往往在:保证流程稳定可控和优化性能以节省宝贵的上下文空间。

AgentKit与n8n对比:现代工作流自动化工具深度解析

工作流自动化是现代数字化基础设施的核心。无论是优化内部流程、集成第三方平台,还是减少人工操作,对灵活可靠的自动化需求已经成为基本要求,而不是奢侈品。

智能体Agent的经典构建方式:ReAct、Plan-and-Solve和Reflection

三种智能体构建方式各有特点,适用于不同场景:ReAct:适合需要与外部交互的实时任务,Plan-and-Solve:适合结构化的复杂任务,Reflection:适合对质量要求极高的关键任务

智能体|AI Agent 框架介绍

AI Agent(智能体)的核心作用,就是通过和环境交互,更好地完成用户的指令和任务。一个合格的智能体需要具备哪些能力?这些能力会遇到什么困难?又有哪些解决办法?为了帮大家建立完整的Agent知识体系,本文围绕AI Agent框架

Agent八大机制入门:Rules、Skills、Command等用法详解(Cursor实操版)

想要让AI听话、干活规范、效率更高,一定要弄懂Agent的八大核心机制。这八种机制分别是Rules、Skills、Command、Workflow、MCP、Subagent、Hooks、Memories

程序员如何自己开发一个Agent?保姆级实操指南(从极简版到工业级)

作为程序员,开发Agent不用从零开始造轮子。核心就三件事:搭骨架、填大脑、连手脚。骨架是任务调度逻辑,大脑是大模型,手脚是调用外部工具的能力。下面分三个版本来讲,从新手能跑的极简版,到能落地的进阶版

10个经过验证的Agent Skills,帮你省掉重复工作

现在Agent Skills越来越多了,开发者面临的问题已经不是“工具不够用”,而是“不知道选哪个”。不同平台上有大量功能差不多的技能,但质量差别很大,也没有统一的标准。要在短时间内找到好用的,确实不容易。

软件正在向Agent投降,这速度比想象中快

2026年过去不到三个月,一个趋势已经明摆着了:传统软件正在集体向Agent缴械。不是被淘汰,不是被替代,是主动打开大门,把自己变成Agent能调用的模块。这事快得谁都没想到。

软件行业正面临根本性转变:万亿 AI Agent 将重塑一切

最近读到 Box 公司 CEO Aaron Levie 关于 AI Agent 的一篇文章,读完后有种豁然开朗的感觉——我们可能正站在一场巨大变革的门槛上。过去几个月里,AI Agent 实现了质的飞跃。以前的 AI 助手,说白了就是能聊天、能调用几个简单工具的聊天机器人。

AI智能体开发实战:从目标定义到部署运营,完整流程解析

开发 AI 智能体(AI Agent)与传统的 AI 应用开发最大的区别在于:智能体具备自主规划、工具调用(Function Calling)和自我反思的能力。一个标准的 AI 智能体开发流程可以归纳为以下几个核心阶段:

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!