使用Python-Requests库获取Chrome浏览器的Cookies

18

我正在尝试使用我从Chrome会话中获取的cookies登录http://www.steampowered.com网站。

一旦我使用命令SELECT * FROM cookie WHERE host_key LIKE '%steam%'获取了所有cookie表格的数据,并使用列名:PRAGMA table_info(cookie)和列表解析式筛选出所有数据后,我不知道如何将它们全部传递给requests以使cookies可用。

requests文档中提到,您需要传递一个字典,即cookies={'cookies':'are_working'},但是其中一些键的name会相互覆盖,因为有一些name是:Steam_Language,尽管它们是不同的主机。

编辑:刚刚找到如何在Python中向现有的cookielib CookieJar实例添加cookie?,这可能会帮助我,但我不知道如何为cookielib格式化Chrome cookies。

我的问题是:我如何将几个不同站点的cookies传递给requests


为什么在向一个域名发出请求时要将 cookies 传递到所有域名? - starenka
大约有4个不同的cookie需要传递到该网站,我不确定如何在请求中传递它们。 - TankorSmash
2个回答

10

我创建了一个模块,可以从Firefox中加载cookies。 点击此处 查看。

使用requests的示例:

import requests
import browser_cookie
cj = browser_cookie.firefox()
r = requests.get(url, cookies=cj)

2
pypi入口是browsercookie,目前(2017年3月)看来仅支持Python2.x。 - ThorSummoner

3
请注意,您正在尝试做一些HTTP规范故意阻止的事情(即将cookie发送到它们没有来自的域)。因此,您可能从一开始就注定要失败。更糟糕的是,我粗略地查看了steampowered实现登录的方式,您需要做很多工作。
回到您的问题...
现在,假设您的steampowered会话cookie有效(根据登录页面执行的加密、密钥共享和验证码方法,它们可能无效),您可以像文档所述那样简单地提供一个有效的cookie字典来使用requests库进行登录。
my_cookies = {'cookiename1': 'cookievalue1', 'cookiename2': 'cookievalue2'}
response = requests.get(
    'http://www.steampowered.com/mystuff',
    cookies=my_cookies)

此外,我不知道从您获取cookie的数据库中存储了哪些数据,但请记住它们可能会存储与“Set-Cookie”标头一起传送的所有元数据(到期、路径、域等)。这是用户代理(Chrome、IE、请求库等)用于确定在请求中发送哪些cookie的信息,但它不包括在请求中。一个“Cookie”标头只有名称=值对。因此,在cookie字典中,您只需要提供这些信息即可。
如果您有两个名称相同的cookie,请选择其中一个。因为最终只有一个或者服务器将简单地返回错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接