我已在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时,请求有效,因为我什么都不导入。
看起来Firefox中有两种Cookie:请求和响应。可以在页面检查器>网络>登录(发布)> 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
该请求的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的路径。取自此页面。
使用会话加载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,通常在会话结束(或某个超时)后过期,因此不存储它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句