我给闲鱼装了个AI客服,却发现阿里把MTOP接口的钥匙就挂在门上

前言:用油猴脚本给闲鱼装上AI客服后,发现AI对在售商品一无所知,只会让买家看详情页。本文分享如何借助页面自带的lib-mtop SDK直接调用MTOP商品详情接口,免去逆向签名与token续期,把商品标题、价格、运费与卖家完整长文案动态注入系统提示词,让闲鱼AI客服精准回答买家咨询,坚决不编造信息。

我给闲鱼装了个AI客服,然后发现阿里把钥匙就挂在门上

先说一个我最近折腾的事儿。

我在搞一个闲鱼的AI客服,油猴脚本,跑在闲鱼PC版的网页上。思路很简单,买家发来消息,脚本把上下文丢给大模型,让AI替我回。

想法很美好,直到我看了一眼它俩的聊天记录。

买家问,老板,这个行程规划服务,包含酒店优惠预订吗。

我的AI回,亲,这个问题建议查看商品详情页哦。

我盯着屏幕,一时间无语凝噎。买家问的,就是他此刻正挂在聊天窗口顶部的那个商品,八块钱的旅行路线规划服务。而我的AI,对那个商品一无所知。不知道标题,不知道价格,更不知道卖家在详情文案里写了什么。

它就像一个被空投到聊天现场的实习生,客户问啥,它都让你自己看详情页。

问题清楚了,那怎么让AI知道商品信息呢。

第一版方案很朴素,从聊天窗口顶部那张商品卡片里抠。卡片上有个链接,href里带着 goofish.com/item?id= 的字样,正则一跑,商品ID就出来了,比如 957990435196。卡片上还渲染着价格和运费,一并扒下来。

能跑。但很快我就发现不对劲。

卡片上只有标题和价格,没有卖家的完整长文案。而闲鱼这个平台,信息量的大头全在详情文案里。就拿那个八块钱的旅行服务来说,卖家在文案里写了,服务包含两条精选路线、精确预算、酒店优惠预订入口、详细合理的行程规划。这些东西,卡片上一个字都没有,AI自然也就答不上来。

想要完整文案,就得调商品详情接口。

然后我就卡住了。

稍微了解过阿里的朋友都知道,他们的接口不是你想调就能调的。有个东西叫MTOP,请求要带签名,签名要用token,token藏在cookie里,还有时间戳,还有appKey,一套组合拳打下来,我脑子里已经开始浮现「逆向从入门到放弃」的画面了。我都做好心理准备,要去找三天三夜的逆向教程了。

结果,转机来得特别戏剧。

我盯着闲鱼页面的网络请求发呆,顺手翻了翻页面的依赖,然后看到页面自己加载了一个js文件,https://g.alicdn.com/mtb/lib-mtop/2.7.3/mtop.js。

lib-mtop。阿里前端的统一网关SDK。

我抱着试试看的心态,在控制台里敲了一行,unsafeWindow.lib.mtop.request,api传 mtop.taobao.idle.pc.detail,data里就一个itemId。

回车。

然后,它真的毫秒级就吐了???

返回 SUCCESS,调用成功。商品标题、卖家写的完整长文案、售价、运费说明、在售状态,整整齐齐,全在里面。

只传了一个itemId,它把长文案全吐出来了
只传了一个itemId,它把长文案全吐出来了

我当时就愣住了。

我准备啃三天的逆向,人家页面自己早就把活儿全干完了。

我扒了一下这个SDK在底层到底做了什么,看完只有四个字,丧心病狂,褒义的那种。

它自动从cookie里读 _m_h5_tk 这个token。它自动取当前的毫秒时间戳。它自动注入闲鱼网页端的appKey,34839810。它用内部的MD5把签名算好。它自动带上闲鱼的平台参数。最骚的是,如果cookie里的token过期了,它会在底层自动拦截,重新换一个新token,然后把请求原样重发一遍,全程无需人工干预。

也就是说,那个我以为要翻三天教程才能搞定的签名体系,在闲鱼页面里,就是一个现成的、稳定的、官方亲自维护的公共设施。

而阿里的前端,把这个设施,就这么明晃晃地挂在了 window.lib.mtop 上。

等于说,门没锁,钥匙就挂在门上。

后来我还较真了一下,如果哪天脱离浏览器环境,比如在Node里,这个sign能不能自己算。答案是能,而且简单得离谱。公式是公开的,把token、时间戳、appKey、请求参数这四样,用&连起来,扔进MD5,出来的32位十六进制字符串就是签名。token从cookie的 _m_h5_tk 里取下划线前半段,时间戳就是 Date.now(),appKey固定是 34839810,参数就是JSON字符串。五行代码的事儿。

但自己算它干嘛呢。页面自带的SDK,token自动续期,签名自动计算,jsv版本升级自动适配,我何必自己造一个更差的轮子。直接借原生的,才是维护成本最低的解。

剩下的活儿就顺了。

getCurrentItemId,从顶部卡片提取商品ID。fetchItemDetail,调mtop拉完整详情,拉到就存进内存缓存,同一个商品一次会话只拉一次,不浪费网络开销。万一网络抽风,就降级,退回用卡片DOM里已渲染的价格和运费兜底。

然后是关键一步,buildSystemPrompt。每次调AI之前,把商品标题、标价、运费说明、卖家完整文案,动态拼进系统提示词里。云端OpenAI和浏览器本地模型两条路都接上,谁在岗谁回答,外层调用者完全不用改。

我还给面板加了一行日志。脚本成功关联商品的时候,会打出来一行,📦 已关联咨询商品,提供旅行起始点和时间,高科技帮你生成优质路线 (¥8)。

看到这行日志的时候,说实话,这种感觉太爽了。

因为从这一刻起,我的AI客服不再是那个只会让你看详情页的废物了。买家再问包不包含酒店优惠,它知道,卖家文案就在它的系统提示词里躺着。买家问运费,它知道。买家问一个文案里压根没写的东西,按照提示词里的回答指导,它会老老实实说这个信息卖家没有提供,而不是现编一个。

不编造,比什么都重要。客服AI满嘴跑火车,比它哑巴更致命。

AI客服终于能看懂商品详情、认真回答买家提问
AI客服终于能看懂商品详情、认真回答买家提问

写到这儿,我忽然想起威廉·吉布森那句老话,街头会为万物找到自己的用途。赛博朋克的核心精神,High Tech, Low Life,说的就是普通人拿着大公司造出来的东西,玩出大公司根本没想过的花样。

而这次给我的感受更具体一点。很多时候我们觉得「逆向」「爬虫」「接口」这些词离自己很远,是黑客才玩的东西。但实际上,平台为了跑通自己的业务,早就把一整套能力挂在了页面上。你不需要破解什么,你只需要打开控制台,看一眼,然后借用它。

最好的逆向,是不用逆向。

当然,丑话说在前面,这套东西是跑在页面环境里的,阿里哪天要是把 window.lib.mtop 收回去了,或者接口版本一升级,脚本就得跟着动。好在sign的算法是公开的MD5,真到那一步,五行代码随时能自己顶上。手里有粮,心里不慌。

回到开头那个问题。买家问,老板,包含酒店优惠吗。

以前我的AI只会说,建议查看商品详情页哦。

现在它会看着卖家写的那四条服务,一条一条地告诉人家,包含的,兄弟。

技术这东西,说到底就是在磨平一些信息差。而这一次,磨平它的,是页面里那个早就挂好的 lib.mtop。

/ 注意,本项目仅在 SyncMein 的500人小群分享。
/ 谢谢你看完了我的文章,我们下次再见吧。
/ 作者:明察
/ 投稿或爆料,请联系邮箱:mingcha@gqmg.com

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容