我正在尝试使用 aiohttp/python 访问一些网站。目前我可以在 Google Chrome 中使用扩展程序导出网站的 cookie,格式如下
.domain.name TRUE / FALSE 1547016401 cookies 值
我可以加载它
import http.cookiejar
cj = http.cookiejar.MozillaCookieJar('cookies.txt')
cj.load()
cookies = {}
for each in cj:
cookies[each.name] = each.value
Run Code Online (Sandbox Code Playgroud)
并cookies在 aiohttp 中使用,例如:
async with ClientSession(cookies=cookies) as session:
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方法来做到这一点?浏览了 aiohttp 的文档,但没有找到它们。
下面的函数cookiejar_to_cookies可以转换http.cookiejar.CookieJar为list[tuple[str, http.cookies.Morsel]],然后可以传递给aiohttpas cookies。
警告:未经彻底测试,可能存在错误和/或安全风险。使用风险自负!
from datetime import datetime
from http.cookiejar import Cookie, CookieJar
from http.cookies import Morsel, BaseCookie, CookieError
def morsel(cookie: Cookie) -> Morsel | None:
base_cookie = BaseCookie()
try:
base_cookie[cookie.name] = cookie.value
except CookieError: # Illegal key
return
morsel = base_cookie[cookie.name]
for key in (
'path',
'comment',
'domain',
# 'max-age', Cookie converts 'max-age' to 'expires' internally
'secure',
'version',
):
if (value := getattr(cookie, key)) is not None:
morsel[key] = value
try:
morsel['expires'] = datetime.fromtimestamp(cookie.expires).strftime(
"%a, %d %b %Y %H:%M:%S GMT"
)
except (
OSError, # Invalid argument (value of cookie.expires is invalid)
TypeError, # cookie.expires is None
):
pass
for key in ('HttpOnly', 'SameSite'):
if (value := cookie.get_nonstandard_attr(key, None)) is not None:
morsel[key] = value
return morsel
def cookiejar_to_cookies(cj: CookieJar) -> list[tuple[str, Morsel]]:
return [(c.name, m) for c in cj if (m := morsel(c)) is not None]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |