利用爬虫逆向外网ChatGPT平台教程,新手可上手!!!

时间:2024-10-26 11:51:36

大家好,我是阿爬!这里是讲述阿爬和阿三爬虫故事的爬友圈

阿爬今天发现自己的ChatGPT,被官网封了

有点无奈,阿三平时对它可温柔了

找了很多免费的平台,发现内网的和外网的面对同样的问题,回答的内容还是有区别的,最后选择了平台,现在拿出爬虫技术撸它一把。

一、初步分析

  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接口请求;

  接收数据;

  最终结果实现:

 

阿三又能愉快的使用ChatGPT,阿三工作效率迅速上升,阿三表示:能动手的决不动脑!

阿爬在本次逆向也学到js加密+websocket传输这样的反爬机制,之前还没遇到过这样的方式Very Interesting。

不过阿爬表示POE的反爬技术挺简单的,要是在js加密部分做点混淆,特征检测等我想逆向时间成本会更高些。

不知道大家有没有什么好的反爬意见?欢迎评论区讨论。

欢迎大家评论区留言,关注阿爬了解更多爬虫故事!

特别声明:本文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。