news 2026/5/11 10:08:18

基于MCP协议的AI浏览器自动化工具集:原理、实践与智能体集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于MCP协议的AI浏览器自动化工具集:原理、实践与智能体集成

1. 项目概述:一个让AI“看见”并操作浏览器的工具集

最近在折腾AI应用开发,特别是想让大语言模型(LLM)能更深入地与真实世界交互,浏览器自动化一直是个绕不开的“硬骨头”。传统的路子,要么是写一堆复杂的Selenium或Playwright脚本,然后让AI去调用这些预定义的函数,灵活性很差;要么是让AI直接生成操作代码,再执行,这中间的错误处理和状态管理能把人逼疯。直到我深度体验了AgentDeskAI/browser-tools-mcp这个项目,才感觉找到了一个更优雅的解法。

简单来说,browser-tools-mcp是一个实现了模型上下文协议(Model Context Protocol, MCP)的工具集,专门设计用来让AI智能体(Agent)能够安全、可控地“看见”和操作网页浏览器。它不是一个独立的桌面应用,而是一套服务端工具,通过MCP服务器暴露给兼容MCP的客户端(比如Claude Desktop、Cursor等)。你可以把它想象成给AI装上了一双“眼睛”和一双“手”,并且这双手眼是通过一套标准、安全的协议来指挥的。

这个项目解决的核心痛点在于标准化安全性。过去,每个AI应用想要集成浏览器功能,都得自己从头造轮子,处理页面截图、DOM解析、元素定位、模拟点击输入等一系列繁琐且容易出错的事情。browser-tools-mcp把这些能力封装成了标准的MCP工具(Tools)和资源(Resources),任何支持MCP的AI前端都能直接调用,极大地降低了开发门槛。更重要的是,它通过MCP协议实现了权限隔离,AI只能通过你明确暴露的工具来操作浏览器,而不能为所欲为,这在实际部署中至关重要。

如果你正在构建需要网页信息获取、自动化操作、RPA(机器人流程自动化)或者仅仅是需要一个“AI上网助手”的应用,这个项目提供的思路和工具集非常值得深入研究。它不仅提供了开箱即用的基础功能,其基于MCP的架构设计,更是为构建复杂、可组合的AI智能体系统指明了方向。

2. 核心架构与MCP协议深度解析

2.1 为什么是MCP?—— 重新定义AI与工具的交互方式

要理解browser-tools-mcp的价值,必须先搞懂MCP是什么。MCP是由Anthropic提出的一种开放协议,旨在标准化LLM与外部工具、数据源之间的交互方式。你可以把它类比成计算机硬件里的“驱动程序”标准。在没有MCP之前,每个AI应用(客户端)想要连接一个新的工具(比如数据库、浏览器、API),都需要专门为这个工具编写适配代码,耦合度很高,且难以复用。

MCP的核心思想是服务端/客户端分离声明式接口。工具提供方(如browser-tools-mcp)实现一个MCP服务器,这个服务器对外声明:“我这里有这些工具(Tools,即可执行函数)和这些资源(Resources,即可读取的数据)”。AI客户端(如Claude Desktop)通过标准化的方式(如stdio或SSE)连接到这个服务器,就能自动发现并使用所有这些能力,无需任何额外的硬编码。

对于浏览器工具而言,采用MCP带来了几个决定性优势:

  1. 工具发现与组合:AI客户端可以同时连接多个MCP服务器(浏览器工具、数据库工具、文件系统工具等),动态形成一个强大的工具生态,智能体可以根据任务需要,自主选择调用哪个工具。
  2. 安全边界清晰:MCP服务器运行在独立的进程或环境中。浏览器操作这种高风险动作被隔离在服务器内,客户端通过严格的协议进行调用。服务器可以实现自己的权限控制和审计日志,防止AI的指令越界。
  3. 开发与使用解耦:工具开发者只需关注实现MCP服务器,无需关心客户端是Claude、Cursor还是其他什么。客户端开发者只需集成MCP客户端库,就能接入所有兼容的工具,生态效应明显。

browser-tools-mcp正是这一理念的完美实践。它将自己定位为一个功能丰富的MCP服务器,专门处理所有与浏览器相关的交互。

2.2 browser-tools-mcp 的组件构成

这个项目不是单一工具,而是一个工具集合,主要围绕两大核心能力构建:导航/交互内容提取。其内部组件设计清晰地反映了这一点。

核心引擎:Playwright项目底层基于微软的Playwright进行浏览器自动化。为什么是Playwright而不是Selenium或Puppeteer?这是经过深思熟虑的选择。Playwright支持Chromium、Firefox和WebKit三大浏览器引擎,且API设计现代、一致。它对现代Web应用(单页应用SPA)的支持更好,自动等待机制能大幅减少编写稳定脚本的心智负担。此外,Playwright原生支持无头(Headless)和有头(Headed)模式,并能够生成高质量的页面截图和PDF,这些特性都与项目目标高度契合。

核心MCP工具(Tools)举例:

  • navigate_browser: 让浏览器导航到指定URL。这不仅是简单的page.goto(),在MCP上下文中,它可能还涉及会话管理(同一个AI会话是否复用浏览器标签页)。
  • extract_content: 从当前页面提取结构化内容。这不仅仅是获取document.body.innerText,它可能综合运用了DOM选择、阅读模式(Reader Mode)算法,甚至简单的视觉布局分析,来提取文章主体、去除广告和导航栏噪音。
  • click_element/fill_form: 通过CSS选择器或XPath定位页面元素并执行点击或填写操作。这里的关键在于“元素描述”到“选择器”的转换,项目可能需要集成一些启发式方法或轻量级模型来提升AI指令的命中率。
  • screenshot_page: 捕获整个页面或指定区域的截图。截图是让AI“看见”页面的关键,如何设置截图质量、处理懒加载图片、捕获全页滚动长图,都是实现细节。

核心MCP资源(Resources)举例:

  • current_page_content: 一个动态资源,代表当前激活页面的文本内容。当AI客户端“读取”这个资源时,MCP服务器会实时执行内容提取并返回。
  • current_page_screenshot: 类似地,这是一个代表当前页面视觉状态的图片资源。结合多模态模型,AI可以“看图说话”,理解页面的视觉布局和元素。

配置与扩展点:一个设计良好的工具集必须考虑可配置性。browser-tools-mcplikely 允许通过配置文件或环境变量来设定:

  • 浏览器类型:默认Chromium,也可切换Firefox或WebKit。
  • 无头模式:生产环境为节省资源通常用无头模式,调试时则可开启有头模式观察。
  • 超时设置:导航、加载、选择器查找等操作的超时时间。
  • 代理设置:为浏览器实例配置网络代理。
  • 自定义工具/资源:高级用户可以通过继承和扩展,注入自己编写的Playwright脚本作为新的MCP工具,实现定制化自动化流程。

2.3 与其他方案的横向对比

为了更清楚它的定位,我们将其与常见方案做个对比:

方案优点缺点适用场景
直接调用 Playwright API功能最强大、控制最精细、性能最佳。需要大量编码,与AI集成困难,需要自己管理生命周期和错误。传统的、确定性的网页自动化脚本。
使用 LangChain/ToolCallAI框架原生支持,生态丰富,易于构建AI链。通常需要为每个功能编写包装函数,工具管理分散,安全边界模糊。在LangChain等特定AI框架内快速构建原型。
browser-use 等专用库专为AI设计,抽象程度高,开箱即用。耦合于特定库的API,可移植性差,功能可能受限。需要快速实现AI驱动浏览的简单场景。
browser-tools-mcp (本项目)标准化(MCP)、工具可发现、安全隔离、客户端无关。生态潜力大。相对较新,依赖MCP生态发展,可能需要理解MCP概念。构建标准化、可组合、需安全隔离的AI智能体应用;希望工具被多种AI客户端复用

注意:选择browser-tools-mcp不仅仅是选择一套工具,更是选择拥抱MCP这套即将成为主流的交互协议。如果你的目标是构建未来-proof、易于集成的AI能力,那么投资于MCP生态是明智的。

3. 从零开始:部署与核心工具实战

理解了架构,我们动手把它跑起来,并深入看看几个核心工具的实际表现。

3.1 环境准备与快速启动

项目是TypeScript编写的,所以你需要Node.js环境(建议v18+)。假设你已经有了npm或yarn。

# 1. 克隆项目 git clone https://github.com/AgentDeskAI/browser-tools-mcp.git cd browser-tools-mcp # 2. 安装依赖 npm install # 或 yarn install # 3. 构建项目 npm run build

最关键的步骤是配置MCP客户端来连接这个服务器。这里以目前最流行的Claude Desktop为例。你需要找到Claude Desktop的配置文件所在位置(通常在~/Library/Application Support/Claude/claude_desktop_config.jsonon macOS,或%APPDATA%\Claude\claude_desktop_config.jsonon Windows)。

编辑这个JSON文件,添加一个mcpServers配置项:

{ "mcpServers": { "browser-tools": { "command": "node", "args": [ "/ABSOLUTE/PATH/TO/browser-tools-mcp/build/index.js" ], "env": { "BROWSER_TYPE": "chromium", "HEADLESS": "false" // 调试时设为false,便于观察 } } } }

关键点解析

  • command: 告诉Claude Desktop用什么命令启动服务器。这里是用Node.js执行我们构建好的JS文件。
  • args: 传递给命令的参数,第一个就是构建产物的入口文件。务必使用绝对路径,相对路径很可能导致启动失败。
  • env: 这里可以设置项目支持的环境变量,用来控制浏览器行为。HEADLESS=false会让你在调试时看到浏览器窗口弹出,非常直观。

保存配置,重启Claude Desktop。如果一切顺利,你在和Claude对话时,应该能看到它新获得了一些工具,比如“Navigate to URL”或“Extract page content”。

3.2 核心工具详解与调用示例

让我们通过模拟的AI对话,来看看这些工具是如何被调用和工作的。假设AI(Claude)已经连接上了我们的browser-tools-mcp服务器。

场景一:信息搜集与摘要

  • 用户:“帮我看看Hacker News首页今天最热门的帖子是什么。”
  • AI思考:我需要打开Hacker News,然后提取页面内容进行分析。
  • AI行动(调用MCP工具)
    1. 首先调用navigate_browser,参数{“url”: “https://news.ycombinator.com”}。服务器会启动或复用浏览器,打开该页面。
    2. 等待页面加载完成后,AI可以调用extract_content。服务器会执行内容提取逻辑,可能专注于.titleline > a这类选择器对应的文章标题链接,并将结构化文本返回给AI。
    3. AI收到返回的标题列表后,进行本地分析,找出排名第一(或通过点数判断)的帖子,并总结回复给用户。

在这个过程中,AI不需要知道Playwright的任何API,它只需要按照MCP工具定义的JSON格式来调用即可。所有浏览器操作的复杂性都被封装在服务器内部。

场景二:自动化表单填写

  • 用户:“帮我在这个测试网站(http://example.com/login)上用‘testuser’和‘password123’登录。”
  • AI思考:我需要导航到登录页,找到用户名和密码输入框并填写,然后点击登录按钮。
  • AI行动
    1. navigate_browser到登录页。
    2. 调用extract_content获取页面HTML结构(或更智能地,服务器可能提供了get_page_html资源),AI分析后决定选择器。
    3. 调用fill_form,参数可能是{“selector”: “input[name=’username’]”, “value”: “testuser”}
    4. 再次调用fill_form填写密码字段。
    5. 调用click_element,参数{“selector”: “button[type=’submit’]”}“text=‘Login’”

这里暴露了一个关键挑战:元素定位。纯文本AI可能无法稳定地生成正确的CSS选择器。browser-tools-mcp的进阶能力可能包括:

  • 视觉定位:结合截图,使用多模态模型描述元素(如“红色的登录按钮”),服务器端将其转换为坐标或选择器。
  • 语义定位:提供find_element_by_semantic工具,接受自然语言描述,服务器利用DOM的语义信息(如aria-label, placeholder, nearby text)来查找元素。

3.3 高级配置与性能调优

在实际生产环境中,你需要考虑更多:

1. 浏览器实例管理:默认情况下,每次调用可能都会启动一个新的浏览器实例,这非常耗时。优秀的MCP服务器应该实现浏览器实例池会话持久化。查看项目配置,看是否支持通过BROWSER_WS_ENDPOINT连接到一个已经运行的远程浏览器(如通过playwright connect),或者服务器内部是否维护了一个可复用的浏览器上下文。

2. 资源控制与超时:在配置中,务必设置合理的超时:

"env": { "NAVIGATION_TIMEOUT": "30000", // 导航超时30秒 "EXTRACTION_TIMEOUT": "10000", // 内容提取超时10秒 "VIEWPORT": "{"width": 1280, "height": 720}" // 统一视口大小 }

视口大小影响截图和布局,统一设置有助于AI对页面布局的理解保持一致。

3. 安全沙箱:如果你运行的是不受完全信任的AI模型(或用户指令),务必以严格的沙箱模式启动浏览器。Playwright支持启动带有--no-sandbox(不推荐)或特定用户权限的浏览器。更关键的是,通过MCP服务器逻辑,严格限制可访问的URL域名(白名单),并禁止文件上传、下载等危险操作。

实操心得:在调试初期,一定要把HEADLESS设为false。亲眼看着浏览器被AI操控的过程,是理解问题、调试选择器错误最直接的方式。一旦流程稳定,再切换到无头模式以提升性能和节省资源。

4. 构建真实世界AI智能体:场景与集成方案

browser-tools-mcp的真正威力在于作为基石,嵌入到更大的AI智能体工作流中。下面探讨几个典型场景。

4.1 场景一:AI研究助手

目标:让AI能够自主浏览多个信息源,对比、总结并生成报告。工作流设计

  1. 规划阶段:AI接收用户指令“对比一下LangChain和LlamaIndex的最新特性”。AI首先规划需要访问的网站(官方文档、GitHub仓库、技术博客等)。
  2. 信息收集:AI依次调用navigate_browser访问规划好的URL列表。对每个页面,调用extract_content获取核心文本,并可能调用screenshot_page保存关键图表。
  3. 信息处理:AI在本地(或结合其他MCP工具如向量数据库)对收集到的文本进行摘要、对比分析。
  4. 报告生成:AI结合分析结果和截图,生成一份结构化的对比报告。

在这个流程中,browser-tools-mcp稳定地承担了“信息采集员”的角色,与AI的“分析师”角色解耦。

4.2 场景二:自动化工作流触发器

目标:监控特定网页的变化,触发后续操作。工作流设计

  1. 定期检查:通过cron job或调度系统,定期启动一个AI智能体流程。
  2. 获取状态:AI调用navigate_browserextract_content获取目标页面(如订单状态页、库存页面、监控仪表盘)的当前内容。
  3. 判断与决策:AI分析内容,判断是否满足预设条件(如“状态变为已发货”、“库存数小于10”、“错误率超过5%”)。
  4. 触发动作:如果条件满足,AI可以调用其他MCP工具(如发送邮件的工具、调用API的工具、发送Slack消息的工具)来执行后续操作。

这里体现了MCP的“可组合性”。browser-tools-mcp负责感知,其他工具负责执行,AI负责决策中枢。

4.3 与主流AI框架集成

虽然直接使用Claude Desktop很方便,但在开发自己的应用时,你需要将browser-tools-mcp集成到AI框架中。

与LangChain集成: LangChain社区正在积极拥抱MCP。你可以使用langchain-mcp适配器。大致步骤如下:

from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_mcp import McpServer from langchain_openai import ChatOpenAI # 1. 创建MCP服务器客户端(连接到正在运行的browser-tools-mcp进程) browser_server = McpServer( command="node", args=["/path/to/browser-tools-mcp/build/index.js"], # ... 其他连接参数 ) # 2. 获取该服务器提供的所有工具 browser_tools = browser_server.get_tools() # 3. 将这些工具提供给LangChain Agent llm = ChatOpenAI(model="gpt-4-turbo") agent = create_openai_tools_agent(llm, browser_tools, ...) agent_executor = AgentExecutor(agent=agent, tools=browser_tools, ...) # 4. 现在,你的Agent就可以使用浏览器工具了 result = agent_executor.invoke({"input": "去GitHub看看LangChain仓库的star数"})

关键点:你需要确保browser-tools-mcp的服务器进程在后台运行,并且LangChain应用能通过stdio或SSE连接到它。

与自主智能体框架集成: 如果你使用像agentkitcrewai或自主开发的智能体循环,集成模式类似:将MCP客户端库引入你的项目,连接到browser-tools-mcp服务器,然后将获取到的工具列表注册到你的智能体工具库中。智能体的决策循环在需要浏览器操作时,就会调用对应的工具。

5. 避坑指南与性能优化实战录

在实际开发和部署中,我踩过不少坑,也总结了一些优化经验。

5.1 常见问题与排查技巧

问题1:Claude Desktop重启后找不到工具

  • 现象:配置好之后,Claude Desktop没有显示新的浏览器工具。
  • 排查
    1. 检查配置文件路径和语法:JSON格式必须严格正确,路径必须是绝对路径。一个多余的逗号都会导致整个配置失效。
    2. 查看Claude Desktop日志:在macOS上,可以在终端运行log stream --predicate 'sender == "Claude"'来查看实时日志。Windows下可以查看事件查看器或Claude的安装目录日志文件。日志中通常会显示MCP服务器启动失败的原因,如“命令未找到”或“文件不存在”。
    3. 手动测试服务器:在终端直接运行配置中的命令,例如node /path/to/build/index.js。观察是否有错误输出。服务器正常启动后会等待stdio输入。

问题2:页面加载超时或元素找不到

  • 现象:AI报告导航超时,或者点击/填写操作失败。
  • 排查
    1. 启用有头模式:这是最有效的调试手段。亲眼看看页面卡在了哪里。是网络慢?是有Cloudflare验证?还是页面结构是动态加载的?
    2. 调整超时设置:适当增加NAVIGATION_TIMEOUTACTION_TIMEOUT。对于慢速网络或复杂SPA,默认时间可能不够。
    3. 检查选择器:让AI通过extract_content获取更详细的DOM信息,或者提供screenshot_page让人类协助分析正确的选择器。对于动态内容,可能需要使用page.waitForSelector的逻辑,这需要查看browser-tools-mcp的工具实现是否内置了等待。

问题3:内存泄漏与进程僵尸

  • 现象:运行一段时间后,系统内存占用越来越高,或者浏览器进程没有关闭。
  • 排查与解决
    1. 确保浏览器上下文关闭:在MCP服务器代码中,每个会话或任务结束后,必须正确关闭browserContextpage对象。检查项目源码,看是否有完善的try...catch...finally清理逻辑。
    2. 使用进程监控:使用htop或任务管理器,观察node进程和chromium进程的数量和内存。如果只增不减,就是泄漏。
    3. 实现健康检查与重启:为MCP服务器包装一个守护进程,定期检查其健康状态,或在处理一定数量请求后主动重启,以释放资源。

5.2 性能优化策略

1. 连接复用是王道

  • 策略:不要在每次工具调用时都启动和关闭浏览器。MCP服务器应该在启动时创建一个浏览器实例(或连接池),并在整个生命周期内复用。每个独立的AI会话(session)可以创建一个新的browserContext(轻量级,隔离cookie、缓存),而不是新的浏览器进程。
  • 实现提示:检查browser-tools-mcp的源码,看其BrowserManager或类似类是如何管理实例的。如果它没有实现连接池,可以考虑贡献代码或自己fork改进。

2. 并行化处理

  • 场景:AI需要同时从三个新闻网站抓取头条。
  • 策略:MCP服务器可以支持并行处理多个工具调用。但这需要服务器设计为异步非阻塞,并且为每个并行任务创建独立的Page(标签页)而非独立的Browser。Playwright支持一个BrowserContext下多个Page并行。
  • 注意:并行度受限于机器资源和网站反爬策略,需谨慎设置。

3. 缓存频繁访问的内容

  • 策略:对于AI经常查询的、相对静态的页面(如文档首页),可以在MCP服务器层面实现一个简单的内存缓存(如TTL为5分钟)。当AI请求extract_content时,先检查URL是否在缓存中且未过期,是则直接返回,避免不必要的网络请求和页面渲染。
  • 实现:这需要修改工具的实现逻辑,增加缓存层。注意缓存键要包含URL和可能的内容提取参数。

4. 截图与内容提取的权衡

  • 痛点:截图(尤其是全页截图)耗时耗资源,但多模态模型需要它来理解视觉布局。纯文本提取快,但可能丢失布局信息。
  • 策略:实现“按需截图”或“智能降级”。例如,只有当AI的工具调用描述中隐含视觉需求(如“点那个红色的按钮”),或者extract_content无法从文本中确定主要内容区域时,才触发截图。可以提供一个get_page_screenshot_if_needed这样的复合工具。

5.3 安全加固建议

  1. 严格的URL白名单:在生产环境中,绝对不要让AI能浏览任意URL。在MCP服务器启动时加载一个域名白名单,任何navigate_browser的请求都要先检查目标URL的域名是否在名单内。
  2. 禁用危险功能:在启动浏览器时,通过Playwright的launchOptions禁用JavaScript文件下载、禁用插件、禁用密码保存等。
    const browser = await playwright.chromium.launch({ headless: true, args: ['--disable-dev-shm-usage', '--no-sandbox'], // 谨慎使用--no-sandbox ignoreDefaultArgs: ['--disable-extensions'], });
  3. 资源限制:使用操作系统工具(如cgroups on Linux)或容器化技术(Docker),限制运行MCP服务器的容器的CPU、内存和网络带宽,防止恶意指令导致资源耗尽。
  4. 完整的审计日志:记录每一个MCP工具调用的详细信息:时间、调用者(会话ID)、工具名、参数(可过滤敏感参数如密码)、执行结果(成功/失败)。这既是安全审计的需要,也是后期排查问题的宝贵资料。

browser-tools-mcp投入生产环境,远不止是运行一个Node.js脚本那么简单。它要求开发者从架构视角出发,综合考虑性能、可靠性和安全性。这个项目提供了一个强大的基础,但围绕它构建一个健壮的系统,才是真正体现价值的地方。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 10:05:26

Context Engineering Kit:AI编码助手的工程化工具箱实战指南

1. 项目概述:一个为AI编码助手打造的“工程化工具箱”如果你和我一样,每天都在和Claude Code、Cursor、Windsurf这类AI编码助手打交道,那你肯定也经历过那种“又爱又恨”的时刻。助手能快速生成代码片段,这很棒,但当任…

作者头像 李华
网站建设 2026/5/11 10:04:51

重回 AWS 测试遇账户暂停,用户深刻记起离开原因!

2026 年 5 月 8 日重回 AWS 的经历 在 AWS 刚崭露头角时,作者就是最早一批拥护者,当时它主要有 SQS、S3、EC2、SimpleDB 等服务,规模比现在小得多。作者还组织了当地第一场 AWS 活动。云计算带来了巨大变革,初创公司能快速搭建计算…

作者头像 李华
网站建设 2026/5/11 10:01:56

sndcpy安卓音频转发:无需root的终极音频镜像指南

sndcpy安卓音频转发:无需root的终极音频镜像指南 【免费下载链接】sndcpy Android audio forwarding PoC (scrcpy, but for audio) 项目地址: https://gitcode.com/gh_mirrors/sn/sndcpy 想在电脑上实时收听Android设备的音频内容吗?sndcpy安卓音…

作者头像 李华
网站建设 2026/5/11 10:00:55

求解器(Solver):让计算机帮你解决世界难题

求解器(Solver):让计算机帮你解决世界难题 科普 技术认知 | 🧮 通俗易懂 🔬 原理揭秘 🌍 应用广泛 🚀 前沿探索 📖 写在前面: 当你打开导航软件,它在零点…

作者头像 李华
网站建设 2026/5/11 9:59:53

3步轻松掌控Windows浏览器:EdgeRemover让你的电脑真正属于你

3步轻松掌控Windows浏览器:EdgeRemover让你的电脑真正属于你 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover …

作者头像 李华
网站建设 2026/5/11 9:58:38

Fuzzz靶场学习笔记

前言正文1、端口扫描2、安卓端口反向代理3、目录遍历获取RSA密钥4、用户提权前言 本文介绍了Kali Linux的基本使用技巧和nmap常见命令,重点演示了端口扫描、安卓设备反向代理和权限提升过程。通过nmap扫描发现安卓设备5555端口开放,使用adb工具连接后&a…

作者头像 李华