大家好,我是阿爬!这里是讲述阿爬和阿三爬虫故事的爬友圈
阿爬今天发现自己的ChatGPT,被官网封了
有点无奈,阿三平时对它可温柔了
找了很多免费的平台,发现内网的和外网的面对同样的问题,回答的内容还是有区别的,最后选择了POE.COM平台,现在拿出爬虫技术撸它一把。
一、初步分析
1.抓包分析接口
打开fiddler,问一个“詹姆斯会退役吗?”,看到一个gql_POST的接口,查看一下请求头、请求数相关信息。
首先重放攻击一下看单次请求接口是否有动态变化的参数。
从结果来看可以重放攻击,能获得相同的数据,那么再修改参数请求一次。
本次请求可以看到状态是400,请求失败,初步猜测有参数和关键字绑定。
2.关键参数
于是多发几次正常的请求,通过多次抓包发现可变参数为:poe-tag-id、clientNonce
3.入口函数定位
接下来就找两个参数生成的地方,首先找poe-tag-id。
回到浏览器按下F12,点到XHR断点,提问一下,发现断点处就是请求地址(发请求的地方图,tagId入口函数图)
肉眼可见poe-tag-id的生成方法也在此处,包括所执行函数所需要的E值也在,由此poe-tag-id入口函数定位完成 。
再找cllientNonce,首先拿出搜索大法,快捷有效。
快速找到了其生成的地方。
关键参数都定位完成,后面就来调试跟进具体实现。
4.最终数据在哪里?
前面分析的接口返回结果中并没有最终数据结果,于是大胆的猜测是走的websocket传数最终数据,点开调式工具的WS栏果然发现猫腻,ws负责返回具体数据。
二、算法还原
1、首先还原clientNonce,为什么需要先还原它呢?因为调试后发现后面生成poe-tag-id需要用到它,因此首先还原clientNonce。
断点跟进,如图:
可以看到其生成逻辑非常简单,从固定字符串中随机生成16位,此时记录一下值:iNFJS0LC5kNCLzRa。
2、有了clientNonce值直接断点跳到poe-tag-id生成的地方。首先观察E的值,在控制台打印一下(tagId参数值打印)
继续单步跟进,直到找到主逻辑(主逻辑图)
只需要搞定框出的两个函数就可以了,扣代码的过程缺啥扣啥 就可以了,没有混淆,全局变量的检测等干扰,有兴趣的可以自己跟一遍,这里就不展示了。至此两个参数算法都搞定,执行一下看结果是否一致(算法结果验证1、2图)
3、websocket请求还原,在最初的分析中发现服务端只负责推送消息出来,并没有看到有客户发送给服务端的消息,于是又大胆的猜测客户端发消息是通过 “api/gql_POST”接口来与ws的服务端进行交互的,所以提交一次正确的接口,在去接收ws的数据即可拿到最终数据。
三、Python实现
模拟api/gql_POST接口,在模拟时传入的字符串格式化必须完全和调试时传入的一致(转义字符坑),否则请求会失败的。整体的代码流程为:
1.创建ws连接;
2.发送api/gql_POST接口请求;
3.ws接收数据;
最终结果实现:
阿三又能愉快的使用ChatGPT,阿三工作效率迅速上升,阿三表示:能动手的决不动脑!
阿爬在本次逆向也学到js加密+websocket传输这样的反爬机制,之前还没遇到过这样的方式Very Interesting。
不过阿爬表示POE的反爬技术挺简单的,要是在js加密部分做点混淆,特征检测等我想逆向时间成本会更高些。
不知道大家有没有什么好的反爬意见?欢迎评论区讨论。
欢迎大家评论区留言,关注阿爬了解更多爬虫故事!
特别声明:本文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。