获取本地cookies
环境配置:
python3.8.8
pywin32:
- https://sourceforge.net/projects/pywin32/files/pywin32/Build%20222/
- pip install pywin32 -i https://pypi.org/
场景:解析谷歌cookies缓存
代码:
import os
import json
import base64
import sqlite3
from win32crypt import CryptUnprotectData
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def get_string(local_state):
with open(local_state, 'r', encoding='utf-8') as f:
s = json.load(f)['os_crypt']['encrypted_key']
return s
def pull_the_key(base64_encrypted_key):
encrypted_key_with_header = base64.b64decode(base64_encrypted_key)
encrypted_key = encrypted_key_with_header[5:]
key = CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
return key
def decrypt_string(key, data):
nonce, cipherbytes = data[3:15], data[15:]
aesgcm = AESGCM(key)
plainbytes = aesgcm.decrypt(nonce, cipherbytes, None)
plaintext = plainbytes.decode('utf-8')
return plaintext
def get_cookie_from_chrome(host='csdn.net'):
local_state = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data\Local State'
cookie_path = os.environ['LOCALAPPDATA'] + r"\Google\Chrome\User Data\Default\Cookies"
host='%'+host
sql = "select host_key,name,encrypted_value from cookies where host_key like '%s'" % host
host_key_dict = {}
with sqlite3.connect(cookie_path) as conn:
cu = conn.cursor()
res = cu.execute(sql).fetchall()
cu.close()
cookies = {}
key = pull_the_key(get_string(local_state))
for host_key, name, encrypted_value in res:
if encrypted_value[0:3] == b'v10':
cookies[name] = decrypt_string(key, encrypted_value)
else:
cookies[name] = CryptUnprotectData(encrypted_value)[1].decode()
if host_key not in host_key_dict.keys():
host_key_dict[host_key] = 1
else:
host_key_dict[host_key] += 1
print(host_key_dict)
return cookies
print(get_cookie_from_chrome())
使用cookieJar(底层session)
from urllib import request,parse
from http.cookiejar import CookieJar
# 1.创建一个cookiejar对象
cookiejar = CookieJar()
# 2.使用cookiejar创建一个HTTPCookieProcessor对象
handler = request.HTTPCookieProcessor(cookiejar)
# 3.使用上一步创建的Handler创建一个opener
opener = request.build_opener(handler)
# 4.使用opener发送登录请求
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
data = {
'email':"你的帐号",
'password':'你的密码'
}
url = 'http://www.renren.com/PLogin.do'
#构建一个请求
req = request.Request(url,headers = headers,data=parse.urlencode(data).encode('utf-8'))
#普通访问
#response = request.urlopen(req)
#使用opener登录成功后,opener对象会保存登录信息
opener.open(req)
# 5. 模拟登陆后访问(带有cookies)
req = request.Request(url,headers=headers)
resp = opener.open(req)
########################################################
# 也可以直接将cookie保存下来(或者使用它的子类FileCookieJar,MozillaCookieJar,LWPCookieJar)
cookie = cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
resp = opener.open(url)
cookieStr = ''
for item in cookie:
cookieStr = cookieStr + item.name + '=' + item.value + ';'
print(cookieStr)