使用带有Python请求的cookies.txt文件

cja*_*vin 12 python cookies cookielib python-requests

我正在尝试使用cookies.txtPython请求使用文件(使用Chrome扩展程序生成)访问经过身份验证的网站:

import requests, cookielib

cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)
Run Code Online (Sandbox Code Playgroud)

它不会抛出任何错误或异常,但会错误地生成登录屏幕.但是,我知道我的cookie文件是有效的,因为我可以使用它成功检索我的内容wget.知道我做错了什么吗?

编辑:

我跟踪cookielib.MozillaCookieJar._really_load,并且可以验证cookie被正确解析(即他们有正确的价值观为domain,path,secure等标记).但由于事务仍然导致登录表单,似乎wget必须做一些额外的事情(因为完全相同的cookies.txt文件适用于它).

Pio*_*ost 12

MozillaCookieJar继承自FileCookieJar其构造函数中具有以下docstring:

Cookies are NOT loaded from the named file until either the .load() or
.revert() method is called.
Run Code Online (Sandbox Code Playgroud)

你需要调用.load()方法.

此外,像Jermaine Xu一样,文件的第一行需要包含# Netscape HTTP Cookie File或者# HTTP Cookie File字符串.您使用的插件生成的文件不包含此类字符串,因此您必须自己插入.我在http://code.google.com/p/cookie-txt-export/issues/detail?id=5上提出了相应的错误

编辑

会话cookie在第5列中保存为0.如果未传递ignore_expires=Trueload()方法,则从文件加载时将丢弃所有此类cookie.

档案session_cookie.txt:

# Netscape HTTP Cookie File
.domain.com TRUE    /   FALSE   0   name    value
Run Code Online (Sandbox Code Playgroud)

Python脚本:

import cookielib

cj = cookielib.MozillaCookieJar('session_cookie.txt')
cj.load()
print len(cj)
Run Code Online (Sandbox Code Playgroud)

输出: 0

编辑2

虽然我们设法将cookie放入上面的jar中,但随后它们被丢弃,cookielib因为它们仍然具有属性0expires.为了防止这种情况,我们必须将过期时间设置为将来某个时间,如下所示:

for cookie in cj:
    # set cookie expire date to 14 days from now
    cookie.expires = time.time() + 14 * 24 * 3600
Run Code Online (Sandbox Code Playgroud)

编辑3

我检查了wget和curl,并且都使用0到期时间来表示会话cookie,这意味着它是事实上的标准.但是,Python的实现使用空字符串用于相同的目的,因此问题中出现了问题.我认为Python在这方面的行为应该与wget和curl的行为一致,这就是我在http://bugs.python.org/issue17164上提出错误的原因.
我会注意到0在第5列中用空字符串替换s使输入的文件和ignore_discard=Trueload()是解决问题(无需改变到期时间在此情况下)的另一种方法.


Tri*_*tan 7

我尝试考虑 Piotr Dobrogost 勇敢地想出的一切,MozillaCookieJar但无济于事。我受够了,只是cookies.txt自己解析了该死的东西,现在一切都很好:

import re
import requests

def parseCookieFile(cookiefile):
    """Parse a cookies.txt file and return a dictionary of key value pairs
    compatible with requests."""

    cookies = {}
    with open (cookiefile, 'r') as fp:
        for line in fp:
            if not re.match(r'^\#', line):
                lineFields = line.strip().split('\t')
                cookies[lineFields[5]] = lineFields[6]
    return cookies

cookies = parseCookieFile('cookies.txt')

import pprint
pprint.pprint(cookies)

r = requests.get('https://example.com', cookies=cookies)

Run Code Online (Sandbox Code Playgroud)


cmc*_*nty 5

这对我有用:

from http.cookiejar import MozillaCookieJar
from pathlib import Path
import requests

cookies = Path('/Users/name/cookies.txt')
jar = MozillaCookieJar(cookies)
jar.load()
requests.get('https://path.to.site.com', cookies=jar)
<Response [200]>
Run Code Online (Sandbox Code Playgroud)