【Python】request.session的cookie如何导入aiohttp._cookie_jar
- 软件开发
- 2025-08-20 10:51:01

request.session的cookie导入aiohttp._cookie_jar的教程
1.起因我的 kook-valorant-bot 使用了两个开源库,用于riot账户的登录并获取token
其中最主要用的是基于aiohttp的floxay/python-riot-auth,但这个仓库不支持2fa用户(开启了邮箱双重验证的用户)作者去年就说会写上,但是他比较忙没有排期;于是我又去找了一个另外一个基于request的Prodzify/Riot-auth 支持2fa登录的,半月前已经给bot加上了这个缺失半年的功能。可是 Prodzify/Riot-auth 没有写cookie登录方法,其每次登录都需要账户密码,2fa用户每次都需要提供邮箱验证码;对于一个bot来说,每次操作这么麻烦,很是难受!
随后,我去询问了写discord valorant bot的作者,得知如果2fa用户使用cookie登录,其是不需要提供邮箱验证码的!
那么问题就变成了,如何将 request的cookie导入到aiohttp的_cookie_jar中,然后调用floxay/python-riot-auth已经写好的cookie登录方法呢?
1.1 前置声明
这里说明一下,我写bot全都是看khl.py的example自学的,到目前为止,我没有系统性的学习过python语法,关于py类和对象的知识全都得靠C++的存货来旁敲侧击;所以如果我的python博客中出现错误,那是很正常的,还请指正!
2.查找办法不多比比在互联网上大海捞针的困难了,我还是东平西凑才找到了一个办法
Python CookieJar.update_cookies方法代碼示例
该教程提到了下面的办法来导入cookie
# 需要導入模塊: from aiohttp import CookieJar [as 別名] # 或者: from aiohttp.CookieJar import update_cookies [as 別名] def test_domain_filter_ip_cookie_send(loop) -> None: jar = CookieJar(loop=loop) cookies = SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example ; " "subdomain1-cookie=third; Domain=test1.example ; " "subdomain2-cookie=fourth; Domain=test2.example ; " "dotted-domain-cookie=fifth; Domain=.example ; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure ; Secure; " "no-path-cookie=eighth; Domain=pathtest ; " "path1-cookie=nineth; Domain=pathtest ; Path=/; " "path2-cookie=tenth; Domain=pathtest ; Path=/one; " "path3-cookie=eleventh; Domain=pathtest ; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest ; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest ; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest ; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values ; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values ; " " Expires=string;" ) jar.update_cookies(cookies) cookies_sent = jar.filter_cookies(URL("http://1.2.3.4/")).output( header='Cookie:') assert cookies_sent == 'Cookie: shared-cookie=first'floxay/python-riot-auth 里正好封装了cookie jar,也就是说,我们只要想办法弄出来一个 SimpleCookie 对象,再调用 update_cookie 方法,就大功告成了!
3.最终实现关于这两个登录项目的源码,请去github仓库查看
下面只对cookie部分进行说明!
3.1 request和aiohttp的cookies差异因为cookie部分涉及到riot账户的登录信息,所以必须打码
首先当然是从request里面拿到cookie了
self.cookie = self.session.cookies print(self.cookie)这里直接打印,获取到的内容如下
而aiohttp的cookie打印出来是下面这样的
auth = riot_auth.RiotAuth("账户","密码") print(auth._cookie_jar._cookies)可以看到,两个库打印的内容不太相同,但是其键值是一致的,我们只需要把request的键值导入到SimpleCookie里面就可以了
3.2 request.session的cookie导出为dict要想导入到SimpleCookie里面,我们可以先来看看这个类的构造是什么
可以看到,该类其实是支持用dict来初始化的
现在问题又变成了,如何将request.session的cookie导出为dict
百度一下,这个问题的答案还是能找得到的
au = Auth(username="账户",password="密码") ck_dict = requests.utils.dict_from_cookiejar( au.cookie ) print(ck_dict)此时打印出来的结果如下,成功转换成了dict
再把这个dict丢进SimpleCookie,运行无报错,那么说明ojbk了
3.3 最终实现现在就只需要进行如下的操作,就能实现把2fa用户的cookie导入到riot_auth.RiotAuth()里面了!
import asyncio if __name__ == '__main__': print(f"Start") au = Auth(username="账户",password="密码") ck_dict = requests.utils.dict_from_cookiejar( au.cookie ) print(ck_dict) scookie = SimpleCookie(ck_dict) auth = riot_auth.RiotAuth() auth._cookie_jar._cookies auth._cookie_jar.update_cookies(scookie) ret = asyncio.run(auth.reauthorize()) print(ret) #成功!!!!auth.reauthorize()方法会返回一个bool值,标识是否登录成功
当然成功啦!
4.结语不得不说,这个问题的答案网上是真的无现成的,都得东平西凑,花了我差不多一个半小时才找到正确方法
不过现在终于可以保存2fa用户的登录信息了,也算是bot的功能升级吧!
【Python】request.session的cookie如何导入aiohttp._cookie_jar由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Python】request.session的cookie如何导入aiohttp._cookie_jar”