使用Python处理请求cookie.txt的文件(Using cookies.txt file w

2019-07-19 11:48发布

我试图用访问的认证的站点cookies.txt文件(用Chrome扩展所产生)与Python要求:

import requests, cookielib

cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)

它不会引发任何错误或异常,但产生的登录画面,不正确。 但是,我知道我的cookie文件是有效的,因为我可以用它成功地检索我的内容wget 。 任何想法,我做错了什么?

编辑:

我跟踪cookielib.MozillaCookieJar._really_load并且可以验证cookie被正确解析(即他们的正确的价值观domainpathsecure等标记)。 但是,随着交易仍然导致登录表单,似乎wget必须做一些额外的(如完全相同的cookies.txt文件适用于它)。

Answer 1:

MozillaCookieJar从继承FileCookieJar具有在其构造以下文档字符串:

Cookies are NOT loaded from the named file until either the .load() or
.revert() method is called.

你需要调用.load()方法即可。

此外,像杰梅因徐指出,文件的第一行需要包含任何# 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

Python脚本:

import cookielib

cj = cookielib.MozillaCookieJar('session_cookie.txt')
cj.load()
print len(cj)

输出: 0

编辑2

虽然我们设法饼干放进瓶子上面,他们随后被丢弃由cookielib ,因为他们仍然有0值在expires属性。 为了防止这种情况,我们必须设定的到期时间,像这样将来的某个时间:

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

编辑3

我查了一下这两个wget和卷曲,并都使用0到期时间表示会话cookie这意味着它的事实上的标准。 但是Python的实现使用为了同样的目的,因此在这个问题提出的问题,空字符串。 我认为Python在这方面的行为应该是什么线的wget和卷曲做,这就是为什么我提出的bug在http://bugs.python.org/issue17164
我会注意到,替换0空字符串输入文件的第五列S和传递ignore_discard=Trueload()是解决问题(无需改变到期时间在这种情况下)的另一种方法。



Answer 2:

我终于找到了一种方法,使其工作(我通过看上心curl的详细输出中),而不是从文件加载了我的饼干,我只是创建了一个dict与所需的value/name对:

cd = {'v1': 'n1', 'v2': 'n2'}
r = requests.get(url, cookies=cd)

和它的工作(尽管它并没有解释为什么以前的方法没有)。 感谢所有帮助,真的很感谢。



Answer 3:

我想因为考虑到彼得·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)



文章来源: Using cookies.txt file with Python Requests