图片死活传不上去:事件是有出身的

简介: 阿杰的自动上传卡在媒体库:合成拖放处理器触发了,图却死活传不上去。老陈一句话点破:事件有出身,isTrusted 才是入场券。cda v0.26.0 的 trusted 拖放让浏览器替你拖——自己读盘、构造真实 File、盖章 isTrusted=true。

周日晚上十点,阿杰的公众号自动化就差最后一步:封面图自动上传。

他翻遍了媒体库页面,连一个 input[type=file] 都没找到。整个上传区就是一块虚线框,上面一行小字:把图片拖到这里。

阿杰不慌。cda 有 upload_dragdrop,专门收拾这种只认拖拽的组件——派发 dragenter、dragover、drop,把文件塞进 dataTransfer,页面自己的 drop 处理器接手上传。他上周刚用过,一次成功。

这次他敲了命令,返回 success。页面上那个虚线框闪了一下,进度条跳出来又缩回去。

然后,没了。

图没上去。

阿杰盯着屏幕看了十秒,重跑。虚线框再闪一下,进度条再跳一次,图还是没上去。第三遍的时候他已经在 console 里埋好了日志——drop 处理器明明执行了,文件也在 dataTransfer.files 里躺着,可页面的上传逻辑就是装死。

他顺着断点往里翻,最后停在一行判断上:

if (!event.isTrusted) return;

event.isTrusted: false。

阿杰瞬间不困了,但也更糊涂了:事件是他发的,处理器也跑了,就差这一个布尔值,卡死了整个流程。


第二天早上,老陈端着咖啡路过,看见阿杰的黑眼圈,瞥了一眼屏幕上的断点。

「你在跟浏览器的信任体系较劲。」老陈说,「事件是有出身的。人手拖出来的,isTrusted 是 true,浏览器盖章认证;代码 dispatchEvent 合成的,永远是 false——不管你模拟得多像。」

「那我模拟得再像也没用?」

「没用。isTrusted 是只读属性,脚本改不了,这是浏览器的防伪设计。微信媒体库这类组件就查户口:你的 drop 处理器跑得再欢,出身不对,不收货。」老陈拉开椅子坐下,「这叫反自动化校验,拦的就是你这种脚本。」

「那怎么办,我雇个人肉拖图?」

「让浏览器替你拖。」老陈放下咖啡,「cda 前两天升到 v0.26.0,upload_dragdrop 加了 trusted 模式。它不走 dispatchEvent,走 CDP——浏览器调试协议。你等于站到浏览器里面去下指令:Chrome 自己读盘,构造一个真实的 File,用浏览器级输入完成整个拖放。」

「isTrusted 呢?」

「浏览器自己动手,章自然是真的。」


阿杰半信半疑,改了命令。之前是这么写的:

# 合成拖放:派发 dragenter/dragover/drop,处理器会跑,但 isTrusted=false
upload_dragdrop current '{"selector":".upload-area","data":{"base64":"<b64>","filename":"cover.jpg","mime":"image/jpeg"}}'

现在只改了两处——加 trusted: true,data 从 base64 换成本机路径:

# 真实拖放(v0.26.0):浏览器读盘构造真实 File,isTrusted=true
upload_dragdrop current '{"selector":".upload-area","trusted":true,"data":{"path":"/Users/jay/Pictures/cover.jpg"}}'

回车。返回里多了一个字段:

{
   
  "success": true,
  "data": {
   
    "selector": ".upload-area",
    "filename": "cover.jpg",
    "x": 642,
    "y": 318,
    "trusted": true,
    "settledMs": 806
  }
}

trusted: true。

这一次,媒体库的缩略图安安静静地出现了。没有闪动,没有抗议,就像有人亲手拖进去的一样。

阿杰靠在椅背上,把这次升级跟之前的方案摆在一起,发现了几个「不一样」:

  1. 出身变了,不是演技变了。 合成事件是「让页面以为有人拖」,trusted 拖放是「让浏览器替你拖」。isTrusted=true 是浏览器亲手盖的章,脚本伪造不出来——但可以请浏览器自己盖。
  2. 文件是真的。 dataTransfer.files 里是真 File,大小、类型、内容都对,任何一层校验都挑不出毛病。
  3. 细节也顺手补了。 旧的合成路径加了 dragleave 收尾,拖完不再留下「亮灯」残留——就是那种高亮框悬在页面上死活不消失的尴尬。
  4. 上传三件套凑齐了。 找得到 input[type=file] 用 upload_file;只有拖拽区用 upload_dragdrop 合成路径;查出身的组件上 trusted: true。三种武器,对应三级防御。
  5. 前提只有一条。 文件得在跑 Chrome 的那台机器上——毕竟是 Chrome 自己读盘。

阿杰忽然想明白一件事:以前他以为自动化是把人的动作「翻译」给页面,一层事件一层事件地模仿。现在才明白,最高效的路是让浏览器自己动手——它本来就是执行者,何必隔着一层合成事件去冒充人。

老陈喝完最后一口咖啡,站起来留下一句话:

「反自动化的本质是信任问题。你伪造不了浏览器的章,但可以让浏览器亲手盖章。」


cda 的 README 里有 upload_dragdrop 的完整参数表:合成路径(base64 / URL 拉取)和真实拖放(trusted + 本机路径)三种写法都在。下一个卡住你自动化的上传组件,可能就差一个 trusted: true。

目录
相关文章
|
1月前
|
人工智能 API 开发工具
百炼AI模型API调用计费指南:按量、TokenPlan、CodingPlan计费逻辑与工具接入
阿里云百炼是AI大模型服务平台,免费提供千万级Tokens。支持三种计费方式:按量付费(依Token用量计费)、Token Plan(按Credits订阅)、Coding Plan(按调用次数限量抢购)。开通后可获取API Key,接入Cursor、Qwen Code、Claude Code等数十款主流AI工具。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
263 0
|
1月前
|
文字识别 测试技术 数据安全/隐私保护
医疗票据OCR与理赔规则自动化:从信息孤岛到智能审核的全链路技术解析
在商业医保与TPA理赔业务中,票据信息提取低效、规则适配脱节、数据标准混乱,长期制约着理赔时效与风控精度。本文从技术视角拆解OCR+知识图谱+规则引擎的融合方案,以快瞳医疗OCR的应用为样本,并附常见实施问题解答,助力企业构建可落地的智能化理赔底座。
185 2
|
1月前
|
人工智能 自然语言处理 监控
不止降本增效:AI智能客服如何成为企业业务增长新引擎
瓴羊Quick Service是阿里云推出的企业级智能客服平台,融合大模型与AI Agent技术,实现从“被动应答”到“主动服务+任务执行”的跃迁。支持多渠道接入、多模型灵活切换,AI问答准确率达93%,可自动查物流、改地址、催发货等,助力企业降本增效、转化销售、驱动决策,真正将客服升级为“增长引擎”。
|
2月前
|
文字识别 安全 Windows
【2026】Umi-OCR文字识别工具:截图/批量/PDF识别全支持
Umi-OCR是一款免费开源的离线OCR软件,支持截图、图片、扫描PDF文字识别,全程本地运行,保障隐私安全。提供Paddle(高性能)和Rapid(低配兼容)双引擎,操作简单,支持批量处理与多格式导出。
|
1月前
|
机器学习/深度学习 缓存 人工智能
Claude Fable 5.1 发布解读:科研智能体跑分翻倍,Agent 成本降45%
Claude Fable 5.1 于 2026 年 9 月发布:科研智能体基准翻倍、缓存降价 75%,Agent 成本最高降 45%,一文讲清升级点与价格。
389 1
Claude Fable 5.1 发布解读:科研智能体跑分翻倍,Agent 成本降45%
|
24天前
|
机器学习/深度学习 算法 前端开发
发动机故障诊断智能体(二):基础时序压缩与长短期记忆编码网络
在智能体完成气路多航段时序数据的采集与规整后,高维度的原始时序信号需要经过深度表征与降维处理,以消除高频测量噪声并提炼本质物理趋势。采用长短期记忆自编码器架构,在脱离人工标签监督的情况下,利用海量正常运行数据进行自监督重构训练,构建出能够压缩并表征发动机稳态工况与退化趋势的时序特征提取模型。
|
26天前
|
人工智能 Ubuntu 数据可视化
Ubuntu 本地部署Ollama+OpenWebUI教程
本文详解Ubuntu下零基础部署Ollama+OpenWebUI:一键安装Ollama(支持CPU/GPU)、拉取轻量qwen3.5:0.8b模型、虚拟环境隔离安装OpenWebUI、配置systemd自启服务,最终建成可远程访问、离线运行、稳定易用的本地AI对话网页。
402 2
|
29天前
|
JavaScript 开发者
DSH plugin 从零怎么写?最小插件目录、本地构建与装进 profile 调试的完整起步流程
写第一个 DSH plugin 只需要一个导出 apply 函数的模块:先用 patch 覆盖层把本地文件插进 Web 界面验证,再做成包用 dsh plugin --profile add 装进 profile,最后用 --dump-config 与日志排错。
220 2