【问题标题】:How to import firefox cookies to python requests如何将 firefox cookie 导入 python 请求
【发布时间】:2018-09-05 05:38:23
【问题描述】:

我在 Firefox 中登录了某个页面,我想获取 cookie 并尝试使用 python-requests 浏览网页.问题是在将 cookie 导入请求会话后,什么也没有发生(就像根本没有 cookie)。请求生成的 cookie 的结构也与 Firefox 不同。 这样可以加载FF cookie并在请求会话中使用它吗?

到目前为止我的代码:

import sys
import sqlite3
import http.cookiejar as cookielib
import requests
from requests.utils import dict_from_cookiejar

def get_cookies(final_cookie, firefox_cookies):
    con = sqlite3.connect(firefox_cookies)
    cur = con.cursor()
    cur.execute("SELECT host, path, isSecure, expiry, name, value FROM moz_cookies")
    for item in cur.fetchall():
        if item[0].find("mydomain.com") == -1:
            continue
        c = cookielib.Cookie(0, item[4], item[5],
            None, False,
            item[0], item[0].startswith('.'), item[0].startswith('.'),
            item[1], False,
            item[2],
            item[3], item[3]=="",
            None, None, {})
        final_cookie.set_cookie(c)



cookie = cookielib.CookieJar()
input_file = ~/.mozilla/firefox/myprofile.default/cookies.sqlite
get_cookies(cookie, input_file)

#print cookie given from firefox
cookies = dict_from_cookiejar(cookie)
for key, value in cookies.items():
    print(key, value)


s = requests.Session()
payload = {
"lang" : "en",
'destination': '/auth',
'credential_0': sys.argv[1],
'credential_1': sys.argv[2],
'credential_2': '86400',
}
r = s.get("mydomain.com/login", data = payload)
#print cookie from requests
cookies = dict_from_cookiejar(s.cookies)
for key, value in cookies.items():
    print(key, value)

Firefox 的 cookie 结构是:

_gid GA1.3.2145214.241324
_ga GA1.3.125598754.422212
_gat_is4u 1

来自请求的 cookie 的结构是:

UISTestAuth tesskMpA8JJ23V43a%2FoFtdesrtsszpw

毕竟,当尝试将 FF 中的 cookie 分配给 session.cookies 时,请求会正常工作,因为我什么都不导入。

【问题讨论】:

    标签: python-3.x firefox cookies python-requests session-cookies


    【解决方案1】:

    Firefox 中似乎有两种类型的 cookie - requestresponsePage inspector > Network > login (post) > Cookies:

    Response cookies:   
        UISAuth 
            httpOnly   true
            path       /
            secure     true
            value      tesskMpA8JJ23V43a%2FoFtdesrtsszpw
    Request cookies:    
        _ga            GA1.3.125598754.422212
        _gat_is4u      1
        _gid           GA1.3.2145214.241324
    

    request cookie 存储在 cookies.sqlite 文件中

    ~/.mozilla/firefox/*.default/cookies.sqlite
    

    并且可以通过更多方式加载到python对象中,例如:

    import sqlite3
    import http.cookiejar
    
    def get_cookies(cj, ff_cookies):
        con = sqlite3.connect(ff_cookies)
        cur = con.cursor()
        cur.execute("SELECT host, path, isSecure, expiry, name, value FROM moz_cookies")
        for item in cur.fetchall():
            c = cookielib.Cookie(0, item[4], item[5],
                None, False,
                item[0], item[0].startswith('.'), item[0].startswith('.'),
                item[1], False,
                item[2],
                item[3], item[3]=="",
                None, None, {})
            print c
            cj.set_cookie(c)
    

    其中 cj 是 CookieJar 对象,ff_cookies 是 Firefox cookies.sqlite 的路径。取自this page

    使用 session 加载 cookie 和导入 python 请求的整个代码如下所示:

     import requests
     import sys
    
     cj = http.cookiejar.CookieJar()
     ff_cookies = sys.argv[1] #pass path to the cookies.sqlite as an argument to the script
     get_cookies(cj, ff_cookies)
     s = requests.Session()
     s.cookies = cj
    

    响应 cookie 基本上是会话 ID,通常在会话结束时(或某些超时)过期,因此不会存储它们。

    【讨论】:

    • 示例代码缺少import cookielib。请求通过s.get("https://foo.bar.com") 发送
    【解决方案2】:

    PyPi 上有一个包,browser-cookie3,正是这样做的。

    import browser_cookie3
    import requests
    
    cookiejar = browser_cookie3.firefox(domain_name='signed-in-website.tld')
    resp = requests.get('https://signed-in-website.tld/path/', cookies=cookiejar)
    print(resp.content)
    

    browser_cookie3.firefox() 将 Firefox cookie 作为 cookiejar 检索,并将域名作为可选参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2016-03-28
      • 2019-06-20
      • 2017-09-29
      • 2012-10-13
      • 2015-10-11
      • 2018-04-16
      相关资源
      最近更新 更多