|
# Created by John Jiang at 2018/8/22 10:42 |
|
import os |
|
import sqlite3 |
|
from pprint import pprint |
|
from typing import Dict |
|
|
|
try: |
|
from win32.win32crypt import CryptUnprotectData |
|
except ImportError: |
|
print('pywin32 package is required') |
|
raise |
|
|
|
DB_FILES = [ |
|
'Google/Chrome/User Data/Default/Cookies', |
|
'CentBrowser/User Data/Default/Cookies' |
|
] |
|
|
|
|
|
def _get_db_path(): |
|
if os.getenv('LOCALAPPDATA'): |
|
local = os.getenv('LOCALAPPDATA') |
|
for file in DB_FILES: |
|
path = os.path.join(local, file) |
|
if os.path.isfile(path): |
|
return path |
|
raise ValueError('Cannot find Chrome cookie database') |
|
|
|
|
|
def get_host_cookie(host, name=None, db_path=None): |
|
""" |
|
Extract cookies of a host from Chrome cookie database |
|
:param host: host name |
|
:param name: cookie name |
|
:param db_path: Chrome sqlite cookie database file path |
|
:return: a dict of cookie key values or a cookie value string |
|
""" |
|
sql_all = 'SELECT host_key, name, encrypted_value FROM cookies WHERE host_key = ?' |
|
sql_one = 'SELECT host_key, name, encrypted_value FROM cookies WHERE host_key = ? AND name = ?' |
|
|
|
if db_path is None: |
|
db_path = _get_db_path() |
|
|
|
cookies = {} |
|
|
|
with sqlite3.connect(db_path) as conn: |
|
c = conn.cursor() |
|
if name is None: |
|
c.execute(sql_all, (host,)) |
|
else: |
|
c.execute(sql_one, (host, name)) |
|
|
|
for row in c.fetchall(): |
|
key = row[1] |
|
value = CryptUnprotectData(row[2])[1] |
|
cookies[key] = value.decode() |
|
|
|
if name is not None: |
|
return cookies.get(name) |
|
|
|
return cookies |
|
|
|
|
|
if __name__ == '__main__': |
|
pprint(get_host_cookie('.zhihu.com', '_xsrf')) |