如何将firefox cookie导入python请求

时间:2018-03-26 23:37:32

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

我已登录 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从FF分配到session.cookies时,请求可以正常工作,因为我什么都不导入。

2 个答案:

答案 0 :(得分:3)

Firefox似乎有两种类型的Cookie - 请求响应。可以在页面检查器>中看到它。网络>登录(发布)>饼干

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

请求 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,通常在会话结束时(或某些超时)到期,因此不存储它们。

答案 1 :(得分:1)

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,其中域名作为可选参数。