我正在寻找一种方法,可以从chrome浏览器中获取Cookie(默认),并通过请求使用它。
我当然已经搜索了,例如发现了这个。 How to get cookies from web-browser with Python? 但这不再起作用,因为Chrome一直在更新。他们在答案中命名的模块最后一次测试是在2016年。
所以,他们在回答中给出的代码是+我多余的东西,用来取回cookie
import win32crypt
import browsercookie
import requests
session = requests.Session()
cj = browsercookie.chrome()
r = session.get("https://stackoverflow.com/", cookies=cj)
print session.cookies.get_dict()
但是,当我运行它时(在浏览器中登录到stackoverflow时),它返回{}
。那不是很多(不是我想要的结果)
答案 0 :(得分:2)
Toms答案对我来说非常有效,甚至是我在Windows 7中搜寻需要登录的站点的唯一方法。但是,在Windows 10和Chrome 80 cookie处理(SameSite Cookies)中,似乎有了一种新的加密方式-“ get_cookies”方法提供的cookie的值都是空的。
现在对我有用的是browser_cookie3(浏览器Cookie的叉子,几天前已更新为可与Chrome 80配合使用)。我将此与请求和硒一起使用。
安装,在带有
的提升提示中pip3 install browser-cookie3
与请求一起使用:
import browser_cookie3
cookies = browser_cookie3.chrome(domain_name='.google.com')
response = requests.get('http://www.google.com', verify=False, headers=headers, cookies=cookies, timeout=3)
将google.com与所需cookie的域交换。并确保包含timeout参数,否则脚本可能会冻结。 标头只是具有所有标头的对象,例如
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
"Accept-Encoding":"gzip, deflate",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"DNT":"1",
"Connection":"close",
"Upgrade-Insecure-Requests":"1"
}
或类似的东西。
硒的使用:
import browser_cookie3
driver = webdriver.Chrome('./chromedriver')
cookies = browser_cookie3.chrome(domain_name='.google.com')
for c in cookies:
cookie = {'domain': c.domain, 'name': c.name, 'value': c.value, 'secure': c.secure and True or False}
driver.add_cookie(cookie)
driver.get('http://www.google.com')
./ chromedriver是我的chromedriver.exe所在的地方。
答案 1 :(得分:0)
我有一个很好的脚本,可以直接在 / Default / Cookies 上读取Chrome cookie。我想你会没事的。
import sqlite3
import sys
from os import getenv, path
import os
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
import keyring
def get_cookies(url, cookiesfile):
def chrome_decrypt(encrypted_value, key=None):
dec = AES.new(key, AES.MODE_CBC, IV=iv).decrypt(encrypted_value[3:])
decrypted = dec[:-dec[-1]].decode('utf8')
return decrypted
cookies = []
if sys.platform == 'win32':
import win32crypt
conn = sqlite3.connect(cookiesfile)
cursor = conn.cursor()
cursor.execute(
'SELECT name, value, encrypted_value FROM cookies WHERE host_key == "' + url + '"')
for name, value, encrypted_value in cursor.fetchall():
if value or (encrypted_value[:3] == b'v10'):
cookies.append((name, value))
else:
decrypted_value = win32crypt.CryptUnprotectData(
encrypted_value, None, None, None, 0)[1].decode('utf-8') or 'ERROR'
cookies.append((name, decrypted_value))
elif sys.platform == 'linux':
my_pass = 'peanuts'.encode('utf8')
iterations = 1
key = PBKDF2(my_pass, salt, length, iterations)
conn = sqlite3.connect(cookiesfile)
cursor = conn.cursor()
cursor.execute(
'SELECT name, value, encrypted_value FROM cookies WHERE host_key == "' + url + '"')
for name, value, encrypted_value in cursor.fetchall():
decrypted_tuple = (name, chrome_decrypt(encrypted_value, key=key))
cookies.append(decrypted_tuple)
else:
print('This tool is only supported by linux and Mac')
conn.close()
return cookies
if __name__ == '__main__':
pass
else:
salt = b'saltysalt'
iv = b' ' * 16
length = 16
#get_cookies('YOUR URL FROM THE COOKIES', 'YOUR PATH TO THE "/Default/Cookies" DATA')