ChatGPT的access_token获取(最新!!!)

article/2024/12/22 19:29:58

ChatGPT的access_token获取(最新!!!)

序言

最近在搞移动应用开发,心血来潮写了个chatGPT的app,但是接口只能用官网提供的,我自己的号没有免费额度,朋友的号也就5$的额度,用不了几下就没有了,于是我准备会一会这个chatGPT!

登录流程分析

1.准备工作

首先复制下面这个链接并进入,并打开抓包工具(F12),如图所示,把Cookie给删除掉

https://chat.openai.com/auth/login?iss=https%3A%2F%2Fauth0.openai.com%2F

删除完成以后点击Log in按钮,此时查看网络抓包数据如下所示:

我们观察到请求的内容有这些:csrf, auth0?prompt=login, authorize?client_id=..., identifier?state=hKF...,至此我们准备工作已经完毕。

2.获取csrfToken

我们就按顺序看一下,首先是csrf,这时候肯定有人问为什么不看providers?哈,因为它没什么用。

观察发现里面就是GET请求,但是这时候我点击预览却看不到数据,于是我就去ApiFox上测了一下这个接口,发现请求到的是个csrfToken,如下图:

好家伙,你小子深藏不露,浏览器抓包都看不见你,给我逮到了!

3.获取authorize_url

在上一步中我们拿到了csrfToken,那么他有什么用呢?这时候我们该看下一个了auth0?prompt=login,点击这个请求,我们可以看到如下图所示:

注意,这里是POST方法了,我们查看载荷,发现它带着如下参数:

惊喜这不就来了?大大的csrfToken在这摆着,懂了吧?这时候我点预览想查看响应数据,好家伙,又是无法加载响应数据,于是我只好去ApiFox里请求,但是我发现返回的是一大串html,嘶,怎么回事?经过我的比对,headers都一样了还是请求不到,于是我抱着试一试的心态用python来请求,打印结果惊喜的发现,有返回值,还是个url!

此时我们可以对比一下抓包抓到的url,发现这个url就是authorize那一大串那个,nice!又近了一步。

4.获取identify_url

有了上一步得到的authorize那个url,我们在抓包工具点击查看他的内容如下图:

可以看到,他的状态代码是302,这是什么意思呢?302状态码代表了重定向,可以看到响应标头里面有个键的名称叫Location:,后面那个值就是重定向所指向的url。我们看左侧的列表名称里面,发现authorize下面就有个identifier,对比一下发现,这就是重定向后的链接,所以这一步我们需要拿到的就是响应头里面的Location的值。在python中实现后经过拼接url可以得到如图所示:

到这里为止,我们已经完成了一半的工作量噢~惊不惊喜?

5.获取password_url

上一步我们得到了identifier_url,此时页面的内容如图所示

此时我们输入自己账号,点击continue,与此同时查看抓包内容,如下图所示:

可以发现这个identifier(我们刚刚拿到的链接)进行了302重定向!我查看载荷发现,他带上了如下的参数:

我们发现这个链接带上了自己url后面那一大串state参数,还有我们输入的username,以及其他的参数(我也不知道有什么用,不用管照着填就行)。参数看完了,那看看响应头吧。此时可以看到,响应头里有个Location参数,后面那一串就是重定向后的url,可以发现这就是下面的password那一串url的地址,讲到这,你有没有觉得这就像是个套娃哈哈哈,一层接一层的慢慢来。同样的使用python代码我成功提取到了他的password那一串url。

6.获取resume_url

我们首先登录一下自己的chatGPT账号,经过抓包可以看到如下列表:

好家伙这password还是个重定向,同样发现重定向后的链接就是resume那一串,所以我们可以类比上面identifier的方式照做,获取到resume到那一串url。

7.获取auth0_url

我们点击resume那个url可以看到如下图所示:

他重定向后的链接就是他下方的auth0链接,chatGPT你可真行啊,没完没了的套娃!同理我们继续拿到auth0的链接。

8.获取chat_openai_url

继续往下推导,我们同样可以请求到chat.openai.com这个url。至此,我们已经清楚了从登录开始到进入页面的整个流程,这时候大家应该比较疑惑,最后拿到个html有啥用啊?我token呢?别急,好戏马上来。

接口跳转揭密

阅读下方内容前请先把你的cookie给清了!!!如果刚刚你按照上面8步流程走了一遍,那么现在你就要删除cookie,准备工作中有介绍如何删除。

正式开始

我们回到一开始,仔细想想我是不是说要把cookie给清空了,是的没错!最关键的点就在这个cookie,回到login这个url这里,查看此时的cookie我们可以发现:

嘶,请求响应中附带有cookie,我们在查看标头内容可以看到有set-cookie的键名称,而那个就是图上所显示的响应Cookie,当然这个看不出来什么,我们看下一个session这个附带的cookie,可以发现:

噢,这个请求的链接也有响应的cookie,有意思,那么我们往下继续看csrf附带的cookie,如图:

有意思!一层套一层,chatGPT你是懂套娃的。我们继续往下一一排查,如下:

在这会发现,这次没带cookie,但是得到响应的cookie,继续往下看:

在这会发现,嘶怎么请求cookie只有这几个,那之前的cookie比如_dd_s,_cfuvid等等那些之前响应得到的cookie去哪里了?你可以理解为cookie有个列表,类似于map一样,键值对,请求的时候只需要拿我需要用的那几个就可以了。

在这发现,__cf_bm已经有了,那响应得到的这个__cf_bm在哪?没错,直接替换了原来的内容,讲到这里你有没有恍然大悟?下面我把所有的流程全部放出来,大家可以自行比对一下每一步的cookie。

到这为止,就是所有的流程,这时候我们最关心的token就来了,点击session的响应数据我们看到如下:

woc!token来了,经历这么多步的来回跳转,我们终于找到了token。想必大家已经熟悉了整个登录到获取token的过程了吧,简单来讲,我们每一步跳转,都需要携带必要的参数和请求头,请求头里最关键的就是cookie了,每次请求都影响下一步的cookie,所以我们一步步的分析查看,搞清楚整个流程,思路这里已经解答完毕,接下来上代码。

代码分析

在上面的揭密中我们提到了cookie,我们可以模拟一下浏览器,新建一个cookie_list来存储所有的cookie,这时我们实现一个函数可以新增并且更新cookie_list的内容,代码如下:

# 存储cookie,可以新增并且更新,这里的cookies指的是请求后的响应头里的cookie
def add_or_update_cookie_list(cookies, cookie_list):# new_cookie即将cookie_list中所有的cookie转化成请求携带的cookie字符串格式new_cookie = ""if cookies != "":for name, value in cookies.items():cookie_list[name] = valuefor key, value in cookie_list.items():# cookie的格式就是name=value;name=value...new_cookie = new_cookie + key + "=" + value + ";"return new_cookie

按照顺序来,我们首先请求csrf_token,本来就是个get请求没什么难度,于是我用request库进行请求,但是死活403,我百思不得其解,用浏览器还有ApiFox请求都成功,后来经过查资料发现,这大概率是因为“原生模拟浏览器 TLS/JA3 指纹的验证”问题,于是我找到了解决办法:

使用curl_cffi库解决

pip install curl_cffi
from curl_cffi import requests
url = "xxx"
...
...
res = requests.get(url=url, impersonate="chrome101", headers=headers)
print(res.text)

使用这个库以后成功解决!我们继续看代码:

# 获取csrf_token
def csrf_token_get(cookie_list):try:csrf_url = "https://chat.openai.com/api/auth/csrf"res = requests.get(url=csrf_url, impersonate="chrome101")csrfToken = res.json()['csrfToken']if res.status_code == 200:# 打印日志,可以去掉loggerConfig.Log.log.info(f"获取csrfToken成功! {csrfToken}")# 将响应头的cookie还有cookie_list传入add_or_update_cookie_list中更新cookie_list内容csrf_cookies = add_or_update_cookie_list(res.cookies, cookie_list)# 保证cookie结尾没有";"csrf_cookies = csrf_cookies[:-1]return csrf_cookies, csrfTokenexcept:# 打印日志,可以去掉loggerConfig.Log.log.warning("Error: 请求失败!")

拿到csrfToken以后我们该获取authorize_url了,代码如下:

def auth_post(csrf_cookies, csrf_token, cookie_list):try:# 我们每次都把上一步得到的cookie传给下一个请求,即使cookie比实际上请求需要的cookie内容多一些也无妨auth0_url = f"https://chat.openai.com/api/auth/signin/auth0?prompt=login"headers = {"Origin": "https://chat.openai.com","Cookie": csrf_cookies,"Referer": "https://chat.openai.com/auth/login?sso","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}data = {"callbackUrl": "/","csrfToken": csrf_token,"json": "true"}res = requests.post(url=auth0_url, headers=headers, data=data, impersonate="chrome101")auth_cookie = res.cookies# 更新cookie_listadd_or_update_cookie_list(auth_cookie, cookie_list)# 请求成功if res.status_code == 200:print(res.text)login_url = res.json()['url']# 打印日志loggerConfig.Log.log.info(f"获取auth_url成功! {login_url}]")return login_urlelse:# 打印日志loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:# 打印日志loggerConfig.Log.log.warning("Error: 请求失败!")

接下来是获取identifier_url,代码如下:

def login_indentify(url, cookie_list):try:headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",}res = requests.get(url=url, headers=headers, allow_redirects=False, impersonate="chrome101")if res.status_code == 302:# 获取响应头cookie,并处理成请求头cookie的格式set_cookie_string = res.cookiesnew_cookie = add_or_update_cookie_list(set_cookie_string, cookie_list)new_cookie = new_cookie[:-1]
​# 获取state参数值location = res.headers['location']state = location.split("state=")[1]
​# identify请求地址,此地址用来验证账号identify_url = "https://auth0.openai.com" + res.headers['location']loggerConfig.Log.log.info(f"获取identify_url成功! {identify_url}")
​return state, new_cookie, identify_urlelse:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

我们拿到了identifier_url以后该拿到password_url了,代码如下:

def username_identify(state, new_cookie, identify_url):try:# 这里的username换成你自己的就可以data = {"state": state,"username": "xxx","js-available": "true","webauthn-available": "true","is-brave": "false","webauthn-platform-available": "true","action": "default"}headers = {"Sec-Fetch-Site": "same-origin","Cookie": new_cookie,"Origin": "https://auth0.openai.com","Referer": identify_url,"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}res = requests.post(url=identify_url, data=data, headers=headers, impersonate="chrome101",allow_redirects=False)if res.status_code == 302:password_url = "https://auth0.openai.com" + res.headers['location']loggerConfig.Log.log.info(f"获取password_url成功! {password_url}")return password_url, state, new_cookieelse:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

继续按照顺序来,获取resume_url,代码如下:

def password_identify(password_url, state, new_cookie, cookie_list):try:# 账号密码输入自己的就可以data = {"state": state,"username": "xxx","password": "xxx","action": "default"}headers = {"Sec-Fetch-Site": "same-origin","Cookie": new_cookie,"Origin": "https://auth0.openai.com","Referer": password_url,"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}res = requests.post(url=password_url, headers=headers, data=data, impersonate="chrome101",allow_redirects=False)if res.status_code == 302:resume_url = "https://auth0.openai.com" + res.headers['location']loggerConfig.Log.log.info(f"获取resume_url成功! {resume_url}")password_set_cookie = res.cookiesnew_cookie = add_or_update_cookie_list(password_set_cookie, cookie_list)new_cookie = new_cookie[:-1]return resume_url, new_cookieelse:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

下一步要拿到auth0_url(代码里面我写的是callback_url),代码如下:

def resume_url_get(resume_url, new_cookie, cookie_list):try:headers = {"Cookie": new_cookie,"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}res = requests.get(url=resume_url, headers=headers, impersonate="chrome101", allow_redirects=False)if res.status_code == 302:callback_url = res.headers['location']loggerConfig.Log.log.info(f"获取callback_url成功! {callback_url}")callback_url_set_cookie = res.cookiesadd_or_update_cookie_list(callback_url_set_cookie, cookie_list)new_cookie = new_cookie[:-1]return callback_url, new_cookieelse:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

然后我们拿chat_openai_url,(坚持住,马上结束了!)代码如下:

def callback_url_get(callback_url, new_cookie, cookie_list):try:headers = {"Cookie": new_cookie,"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}res = requests.get(url=callback_url, headers=headers, impersonate="chrome101", allow_redirects=False)if res.status_code == 302:chat_openai_url = res.headers['location']loggerConfig.Log.log.info(f"获取chat_openai_url成功! {chat_openai_url}")chat_openai_cookies = res.cookiesadd_or_update_cookie_list(chat_openai_cookies, cookie_list)else:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

最后一步!拿token!代码如下:

def get_access_token(cookie_list):try:cookies = add_or_update_cookie_list("", cookie_list)cookies = cookies[:-1]headers = {"Cookie": cookies,"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}session_url = "https://chat.openai.com/api/auth/session"res = requests.get(url=session_url, headers=headers, impersonate="chrome101")if res.status_code == 200:loggerConfig.Log.log.info("获取accessToken成功!")return res.json()['accessToken']else:loggerConfig.Log.log.warning(f"Error: Response<{res.status_code}>")except:loggerConfig.Log.log.warning("Error: 请求失败!")

至此,chatGPT的access_token就可以拿到了,哎真的是,openai真会玩套娃,跳来跳去的。

总结

心路历程

我当时在一步步的分析请求的时候可遭老罪了,一个个的对比查看,无数次的实验,看了无数遍的报错,403,但是出来数据的那一刻整个人都是无比兴奋的,而且由于科学上网的问题,经常要等好久的响应,也有很多的429,哎不过还是很高兴,毕竟努力得到的一定的成果!

经验总结

通过这次的逆向,我对爬虫的掌握又高了一个层次(针对我自己,我很菜),知道以后可以对着cookie来当突破口,包括了解到了模拟浏览器指纹验证这种以前根本不知道的反爬虫机制,收获满满!


http://chatgpt.dhexx.cn/article/6pSLrsWP.shtml

相关文章

科大讯飞版ChatGPT提前内测!附申请方法

讯飞“星火”认知大模型是科大讯飞版的 ChatGPT&#xff0c;在内测阶段&#xff0c;目前已经开放内测申请。它可以学习和理解人类语言&#xff0c;进行多轮对话、回答问题并帮助人们快速获取知识和灵感&#xff0c;可用于写作诗歌、歌词、故事、代码和表格等&#xff0c;并能够…

GPT-4介绍&api申请(Chatgpt plus)

GPT-4 由于其更广泛的一般知识和解决问题的能力&#xff0c;可以更准确地解决难题。 Openai官网 https://openai.com/GPT4 https://openai.com/product/gpt-4GPT4 Api候补 https://openai.com/waitlist/gpt-4-apiChatGPT Plus可直接使用。 New Bing后续也会接入GPT-4。 创造…

谷歌版 ChatGPT Bard 开放内测申请了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 上个月初&#xff0c;Google 在巴黎开了一场技术发布会&#xff0c;对外展示一款可用于对抗 ChatGPT 的聊天机器人&#xff1a;Bard。 只可惜&#xff0c;出师未捷身先死&#xff0c;Bard …

你是时候拥抱chatgpt了

随着chatgpt热度不断上升&#xff0c;chatgpt已经广泛应用到各个行业了&#xff0c;很多人都感觉自己地位受到威胁&#xff0c;有人预测chatgpt会取代80%程序员的工作&#xff0c;我也用了chatgpt有几个月了&#xff0c;不得不说是真的牛逼。我甚至用它写了一个python的聊天脚本…

ChatGPT的申请之路(2)

https://chat.openai.com/ 1、账号已经申请成功&#xff0c;选择Login 2、选择Continue with Apple 3、输入苹果ID 4、输入密码 5、继续 6、ChatGPT的画面终于出来了&#xff0c;红框为输入信息框 7、聊天示例 8、换中文试试

Bing引擎引入ChatGPT申请候补名单方式

Bing引入ChatGPT申请候补名单方式 ChatGPT一、ChatGPT简介二、OpenAI和Google的"军备军赛"三、ChatGPT版本⭐Bing引擎引入ChatGPT申请候补名单方式1.下载chrome拓展程序2.配置拓展程序3.Bing 申请候补名单3.1旧版本Bing3.2新版本Bing4.等待获取 结尾 ChatGPT 一、Ch…

谷歌版ChatGPT申请:bard isn’t currently supported in your country. stay tuned!

申请地址&#xff1a;https://bard.google.com 申请谷歌版ChatGpt,失败&#xff0c;提示当前区域不支持。 由于在国内是用的魔法网络&#xff0c;区域显示Jappan,切换区域为US,即可看到如下页面 点击 Join waitlist&#xff0c;登录google 账号即可&#xff0c;如果浏览器登录后…

【申请教程】ChatGPT访问互联网插件

https://openai.com/blog/chatgpt-plugins 大家好&#xff0c;我是章北海mlpy 申请ChatGPT插件很久了&#xff0c;一直没下文 最近看到两种套路&#xff0c;我早上试了一下&#xff0c;看能否快速成功吧。 方法一&#xff1a;用ChatGPT帮忙写申请文案 [外链图片转存失败,源…

(第一集)ChatGPT prompt教程 - 让ChatGPT更好用,成为所有人的工作利器

未来所有人都会使用ChatGPT来提高自己的工作效率&#xff0c;为了让您更好的工作&#xff0c;小宋将为您整理一整套chatgpt使用教程。只需按照本系列教程学习&#xff0c;您终将成为使用ChatGPT的高手&#xff0c;工作效率高人一步。 欢迎加入我的gpt插件应用社区GPT-Kpi 社区…

【关于ChatGPT的30个问题】2、ChatGPT是如何工作的?/ By 禅与计算机程序设计艺术

2、ChatGPT是如何工作的? ChatGPT是如何工作的?写一篇文章,分2级目录,要10个目录,不少于5000字。markdown格式。 目录 ChatGPT是如何工作的? ChatGPT的工作原理

【ChatGPT】技术原理:ChatGPT怎么工作?

目录 简介:ChatGPT的工作原理概述 Transformer 架构原理

使用 OpenAI 的 ChatGPT 提高开发人员的工作效率

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 介绍 作为一名开发人…

【ChatGPT】ChatGPT 可能马上取代你,这是它能做的十个工作

ChatGPT(恰匹题)(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,于2022年11月30日发布。 ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊…

有了chatGPT,有哪些工作可以用它?

一直从事数据分析、数据处理相关的工作&#xff0c;最近chatGPT相关资料出来了之后&#xff0c;一直在想着怎么用。 从chatGPT.openapi到NewBing&#xff0c;到文心一言&#xff0c;GPT4.0&#xff0c;都是体验过了&#xff0c;GPT3.5和4.0算是深度使用&#xff0c;NewBing用了…

用一张图说一说 ChatGPT 内部技术工作流程

前沿 这几天ChatGPT可谓是热火朝天&#xff0c;很多同事和朋友都来找到勇哥&#xff0c;说能不能说一说相关话题&#xff0c;但是之前几天勇哥都在默默的干一件大事情&#xff0c;今天终于成型、有结果了&#xff0c;所有就抽了点时间来和大家一起聊聊ChatGPT背后的技术&#…

ChatGPT 原来是这样工作的(上)

大家好&#xff0c;我是技福的小咖老师。 ChatGPT 发布以来&#xff0c;蹿红的速度比马斯克设计的火箭还快。据报道&#xff0c;ChatGPT在开放试用的短短几天里&#xff0c;就吸引了超过 100 万互联网注册用户。ChatGPT如同是“搜索引擎社交软件”的结合体&#xff0c;能够在实…

给程序员的ChatGPT使用指南:优化工作流程的 3 种实用方法

ChatGPT for Coders: 3 Practical Ways to Optimise your Workflow 自从 ChatGPT 发布以来&#xff0c;我在互联网上看到了很多关于它对未来编程可能意味着什么的讨论。 肯定有很多“FUD”在那里传播&#xff0c;但它基本上归结为两个论点&#xff1a; 编程将继续有利可图&…

ChatGPT能承担哪些工作?

ChatGPT拥有高效的自然语言处理能力&#xff0c;它最容易取代的领域可能是&#xff1a;文本分类、聊天机器人、文本生成、问答系统、文字识别和自动翻译方面。最容易取代的职业可能是&#xff1a;客服人员、技术类、媒体类、教师、法律类、金融类。使相关的人员在工作生活中更加…

重磅!ChatGPT 网页版来啦!响应速度超快!

平替 ChatGPT 继公众号对接 ChatGPT 以来&#xff0c;经过大家的试用与提出的建议&#xff0c;上线、优化了诸多功能&#xff0c;使得我们的公众号几乎完美~ 在此之上&#xff0c;不负众望&#xff0c;五一假期掏粪三天三夜&#xff0c;平替 ChatGPT 网页版 已经上线&#xf…

2023 最新ChatGPT网页源码 无需KEY打开即用

买了些key放着也是放着&#xff0c;所以干脆集成到源码里面了&#xff0c;不需要大家输入key密钥就可以用&#xff0c;上传到宝塔搭建即可!