文章12
标签11
分类3

AI 是怎么模仿人工操作浏览器上传文件的?

上一篇写了博客搬家的过程(三台主机、两次翻车、最终落在香港集群),里面提到一个细节:新主机 FTP 连不上,最后是 AI 助手打开一个真实的浏览器窗口,自己填账号密码、自己点按钮、自己上传文件。不少朋友好奇这是怎么做到的——是装了什么神秘的技能包吗?这篇就把它扒开讲清楚。

先回答最关心的问题:不是。没有什么预装的「网页操作技能包」,用的就是浏览器自带的调试协议,配上现场手写的临时脚本。用完就删,下次的脚本是根据当时的页面重新写的。听上去很土,但恰恰是这个思路最通用。


先说 FTP 那部分:命令行直连

在讲浏览器之前,先补一段更早的操作。旧主机时代(FTP 还能用的时候),AI 是怎么直接操作服务器文件的?答案朴素得惊人——curl:

  • 列目录:curl -u 账号:密码 "ftp://主机/路径/" --list-only
  • 上传单个文件:curl -T 本地文件 "ftp://主机/路径/文件名"
  • 下载:curl -u ... "ftp://主机/文件" -o 本地文件

中间还踩过一个很典型的坑:域名套了 Cloudflare 之后 FTP 突然全超时。原因是 Cloudflare 只代理 HTTP/HTTPS 流量,不代理 FTP。解法是绕过域名,直接用源站 IP 连。

排查端口用的是一个更底层的小技巧:Bash 里 echo > /dev/tcp/IP地址/端口,连得上就是端口开放,连不上就是关闭。没有 nmap 也能快速扫一圈。


重头戏:浏览器是怎么「自己动」的

1. 核心武器:Chrome DevTools Protocol(CDP)

你按 F12 打开的开发者工具,背后其实是浏览器开放的一套调试协议——Chrome DevTools Protocol。它能读取页面结构、执行任意 JavaScript、模拟点击、甚至操控文件上传框。Edge、Chrome 都基于 Chromium,所以都支持。

关键一步是带参数启动浏览器:

msedge.exe --remote-debugging-port=9861 --user-data-dir=独立目录 网址

--remote-debugging-port 打开后,浏览器就在本地开了一个调试端口,脚本可以通过 WebSocket 连上去发指令。用的是有头模式(就是正常的浏览器窗口),所以我能全程看见浏览器自己在动,哪一步点错了随时叫停。

2. 模拟人工的完整流程

脚本要干的事,就是把我平时手动上传文件的动作拆解成一条条协议指令:

人的动作脚本对应的指令
打开控制台网址启动参数里直接带 URL
在登录框输入账号密码Runtime.evaluate 执行 JS 给输入框赋值,然后触发表单提交
点「文件管理」菜单Runtime.evaluate 执行 element.click()
选择要上传的文件见下文,这是最难的一步
点「开始上传」按钮遍历所有 button,找到文字匹配的那个点它

3. 文件上传:最难的一环

你可能会说,填表单点按钮不就是执行 JS 吗?对,但文件选择框是个例外。网页里那个 <input type="file">,点击后会弹出操作系统级的文件选择窗口——那不是网页的一部分,JS 根本控制不了。

CDP 为此专门准备了一个接口:DOM.setFileInputFiles。它不走页面交互,而是直接告诉浏览器「把这个本地文件路径塞进这个 input 元素」,效果等同于你手动选好了文件。拿到这个接口的前提是先拿到目标元素的 nodeId,中间又踩了两个坑:

  • 页面的 DOM 树很深,一次性完整遍历会莫名其妙崩掉。解法是先在页面里执行 document.getElementById(...) 拿到元素对象,再用 DOM.requestNode 把它转成 nodeId,完全绕开树遍历
  • 上传对话框和文件输入框在主页面里,而文件列表在页面的一个 iframe 里(还是跨域的),结构必须先摸清楚才能下对指令

填好文件、点「开始上传」,然后读页面上的进度条元素确认到了 100%——一次真实的人工操作,就这样被完整复刻了。

4. 意外之喜:上传 zip 自动解压

第一次上传完,刷新文件列表,发现 zip 已经被面板自动解压开了——原本还要找解压按钮的步骤都省了。这类「平台行为」脚本事先不知道,所以每一步之后都要读页面实际状态来决定下一步,而不是死板地按剧本走。这也是模拟人工和按键精灵式录制的本质区别。


几个常见疑问

Q:为什么不用 FTP?
这家平台的 FTP 地址根本解析不出来,网页文件管理器是唯一入口。有 FTP 的时候谁愿意写脚本。

Q:为什么不用无头浏览器(headless)?
无头模式更快,但出问题时你看不见页面长什么样。这次是有头模式,浏览器窗口就摆在桌面上,相当于全程有人肉监控。调试阶段,看得见比快更重要。

Q:这算 AI 自动化吗?和按键精灵有什么区别?
本质区别在适应性。按键精灵是「录制-回放」,页面一改版就废。这次的做法是:先抓取页面分析结构(找登录表单的字段名、找按钮的 ID、分析接口地址),再根据当场的实际页面生成对应的操作指令,每步之后校验结果。页面变了,就重新分析重新写。脚本是一次性的,分析方法才是可复用的。

Q:安全吗?
脚本只在我自己的电脑上运行,连接的是本机调试端口(127.0.0.1),不经过任何第三方服务器。账号密码只出现在本地脚本和页面表单里。当然,让 AI 操作账号期间,你最好全程盯着屏幕——就像这次一样。


写在最后

这次搬家让我对「AI 帮忙」有了更具体的体感:它不是一句「帮我传个文件」就变出魔法,而是把一件人工操作拆解成分析页面 → 定位元素 → 转成协议指令 → 校验结果 → 出错重试的循环。工具都是现成的:curl、端口探测、CDP、十行 JS。稀缺的不是工具,是「知道下一步该点什么」的判断力。

博客搬家系列到此完结。有想交流的欢迎评论区见。

0 评论