前言:卖家咨询量大,我用AI自动回复闲鱼消息,却被阿里风控滑块连续拦截三天。本文完整复盘排查过程:从CDP模拟拖拽、真人事件字段逐项对齐,到发现事件派发target才是关键,再拆解风控分轰击、punish弹窗叠加、油猴加戏反而被拒等坑,讲透闲鱼滑块自动化求解与AI自动回复脚本的落地经验。
我让AI替我回闲鱼消息,然后被一块滑块按在地上摩擦了三天
前阵子我在闲鱼上挂了几样东西。
买家咨询一多,我就有点扛不住。有人中午问能不能便宜点,我晚上十点才看到,人家早去别家买了。做闲鱼的兄弟应该都懂,这行的响应速度就是钱。
于是我做了一件很自然的事,写了个油猴脚本,让AI替我回。

脚本本身不复杂。扫消息,判断我是卖家还是买家,调AI生成一句像人话的回复,发出去。这里头我还塞了个自己挺得意的设计,判断身份不靠Cookie那些容易被改的东西,靠在售商品ID库,每天自动去个人主页把在售商品扒一遍存下来,会话里的商品ID在库里,我就是卖家,正常回复,不在,我就是买家,闭嘴别回。

那万一库没同步上、商品ID也没取到呢?
那就当卖家,兜底回复。
宁可多回一句,也不能漏掉一个客户。这个哲学我叫它fail-open,名字是我瞎起的,但道理我是真信的。
然后,跑起来的第一天,我就被教育了。
点开一个新会话,整个页面「啪」一下被一层全屏遮罩罩住,中间一块滑块,拖到底才能继续。页面瞬间失去可点击性,脚本直接躺平。
第一反应当然是点击太快了,机器味太重。我做了个对照实验,同一个浏览器环境,连点40次会话,屁事没有。一调商品详情接口,滑块立刻弹出来。???
点会话没事,调接口就死。那问题就不在手上,在嘴上。脚本每次点开新消息,都会顺手去调一个叫 mtop.taobao.idle.pc.detail 的接口拉商品详情,这个跨场景的调用,就是风控眼里的红灯。
根治手段很朴素,别调。改成模拟点击会话顶栏的商品卡片,新开一个标签页走正常浏览链路把详情拿回来,缓存24小时,拿完自动关页。风控分一点没涨,文案还更全。
说到这块,其实我以前有个毛病,总觉得把接口调通就完事了,调用姿势像不像人,那是玄学。
这块,阿里是真的在管。

因为商品详情页自己加载都会触发一次滑块,躲不掉的。我就琢磨,能不能让脚本自己把这块滑块拖过去。
然后我就掉坑里了。
先说背景,滑块本体在一个跨域的iframe里,油猴脚本受同源策略限制,根本摸不到里面的DOM,只能靠CDP从浏览器外部操作。这个好办,Playwright连上去,模拟拖拽就完了。
拖了,服务端返回码300,拒绝。
我不服。换轨迹,变速,加抖动,过冲再回修,走走停停,全300。用CDP的可信输入,把 buttons、movementX 这些字段全修正到位,还是300。
这就有点邪门了。轨迹已经像到不能再像了,凭什么拒?
后来我干了一件笨事,写了个脚本,在同一个挑战帧里,把真人手动拖拽和自动化拖拽的完整事件流都抓下来,一个字段一个字段对着看。
screenX减clientX,真人恒定是-546,我的合成事件恒为0。pointerType,真人是mouse,我的是空字符串。pressure,按下时真人0.5,我0。合并事件,真人有1到2个,我0个。时序,真人54个事件1170毫秒,我32个事件1710毫秒。
全补上。还是300。
那一刻我是真的有点破防。。。
直到我把注意力从「事件长什么样」挪到「事件派发给了谁」。
真人拖拽的时候,move事件的target不是固定的。光标滑过手柄,target是手柄,滑过滑道文字,target就变成文字元素,来回切。而我的合成事件,从头到尾全派发给document。
target永远是document,这是真人不可能出现的特征。
我改成每次移动前先做一次命中测试,把事件派发给光标底下那个真实的元素。
返回0。
通过了。

说实话我是不死心的,你想想看,一个字段的事,凭什么。于是做了个受控矩阵,每组都确保全新挑战、手柄在起点,只改一个变量。
精确终点256像素,命中测试派发,过。同样256,派发给document,拒。多拖12像素,命中测试,过。document,拒。
距离准不准、抖不抖,统统不重要。决定生死的只有一件事,你的事件,有没有站在真人会站的位置上。
顺着这个再聊聊另外几个坑,都挺有意思。
一个是风控分会轰击推高。40次高频调接口之后再拖,怎么拖都是300。改成单次自然触发,同一套拖拽逻辑,一次过。而且同一个会话里失败几次之后,后面会持续被拒,分是累积的,要么冷却,要么换个帐号重来。所以脚本里我加了个守卫,弹窗存在期间,页面自己发的接口调用直接本地拒绝,压根不发出去。跟人处关系一样,别轰炸,保持冷静。
一个是弹窗会叠罗汉。每触发一次风控就新增一个punish iframe,旧的从不移除。实测刷新后1个,调一次接口变2个,再调变3个。两个弹窗叠在一起,这本身就是真人不会有的异常特征。写了个清理逻辑,只留最顶层那个活动挑战,其余的模拟点右上角关闭按钮,关不掉的兜底移除。
还有一个,我觉得是最值得说的。
油猴那版帧内拖拽,我一开始额外做了三处加工,位置抖动正负1.6像素,释放后补一次点击,随机延时,想着更拟人嘛。
结果同一个状态下,独立脚本过,油猴版被拒。
我把这三处加工全删了,按验证过的最小实现忠实移植,连续两次,全过。
那一刻我在屏幕前愣了挺久。我以为拟人是做加法,多抖一点、多随机一点、更像一点。实际上服务端要的不是更像,是别不一样。每一次自作聪明的加工,都是在真人轨迹上刻一道疤。

现在这套东西长这样。
所有点击走完整指针事件链,带随机落点和微抖轨迹。打字是逐字符的keydown、keypress、input、keyup。滑块一出现就全流程暂停,没解决之前绝不关页面,帧内求解器自动接管拖拽,三轮不过自动刷新重来。通过之后服务端下发一个叫x5sec的凭证,后续请求自动免风控,相当于一张通行证。真人手动操作的时候,求解器检测到可信输入会让路,绝不抢活。
那个中午问价晚上就走的买家,现在AI是秒回的。
写完这些我一直在想一个事。
1950年图灵提那个著名测试的时候,方向是让机器模仿人,骗过人。2026年的我,在干一件完全倒过来的事,让机器向另一台机器证明自己是人。
更微妙的是,那台负责判定的机器,根本不看你的表演。轨迹漂不漂亮、抖动真不真实、时序自不自然,在它眼里都是次要参数。它只看一件事,你有没有站在真人会站的位置上。
isTrusted这个字段是浏览器焊死的,页内永远伪造不了,风控一紧它就是硬门槛。所以那些手动能过、脚本不能过的夜晚,差的从来不是技术,是身份。

我有时候觉得,这就是我们这代人要慢慢习惯的新关系。机器学我们说话做事,我们学着理解机器怎么判定真假,谁都在模仿谁,谁都在验证谁。
而所有诀窍里最反直觉的一条,其实特别朴素。
想通过人的测试,别急着表演人,先站到人的位置上去。
/ 注意,本项目仅在 SyncMein 的500人小群分享。
/ 谢谢你看完了我的文章,我们下次再见吧。
/ 作者:明察
/ 投稿或爆料,请联系邮箱:mingcha@gqmg.com














暂无评论内容