Вот что я пытаюсь сделать. Я хочу прочитать файлы cookie из файла sqlite из Chrome, использовать их на python и затем снова сохранить их в файле sqlite Chrome, поскольку они могли быть обновлены при использовании их с python.
Это более или менее код, который я должен проверить, я могу извлечь их и использовать их правильно, но я не могу их обновить на sqlite и продолжать использовать их в браузере.
Я даже не уверен, использую ли я правильные типы, или если я передаю правильный тип в UPDATE, должен ли я что-то сделать для newEncrypted, прежде чем передавать его в sqlite?
newEncrypted type() - str
import shutil, cookielib, sqlite3, win32crypt
def decrypt(result):
cookies = []
for host_key,name,value,expires_utc,encrypted_value in result:
#print "Adding cookie"
if value == '':
print encrypted_value
decrypted = win32crypt.CryptUnprotectData(encrypted_value, None, None, None, 0)[1].decode('utf-8')
else:
decrypted = value
cookies.append(cookielib.Cookie(None, name, decrypted, '80', True, host_key, True, False, '/', True, False, (int(expires_utc)/1000000)-11644473600, False, None, None, None, False))
return cookies
cookie_file = "C:/Users/Daviid/AppData/Local/Google/Chrome/User Data/Default/Cookies"
conn = sqlite3.connect(cookie_file)
cursor = conn.cursor()
sql = 'select host_key,name,value,expires_utc,encrypted_value from cookies where host_key = ".google.com" or host_key = "www.google.com"'
cursor.execute(sql)
result = cursor.fetchall()[0]
cookies = decrypt(result)
###
# Use Cookies in urllib, Requests, whatever...
# cookies get updated
###
updatedCookie = cookies[0]
updatedCookie.value = "NewValue"
newEncrypted = win32crypt.CryptProtectData(updatedCookie.value, '', None, None, None, 0)
cursor.execute("UPDATE cookies SET encrypted_value=? WHERE host_key = ? AND name = ?",(newEncrypted, updatedCookie.domain, updatedCookie.name))
cursor.close()
conn.commit()
conn.close()
Страница документации sqlite: [Python]: sqlite3 - интерфейс DB-API 2.0 для баз данных SQLite.
code.py:
import sys
import sqlite3
import win32crypt
COOKIE_FILE = "ChromeCookies.db"
HOST_KEYS = ".google.com", "www.google.com"
def decrypt_cookies(query_result):
cookies = []
for host_key, name, value, expires_utc, encrypted in query_result:
if encrypted:
decrypted_descr, decrypted = win32crypt.CryptUnprotectData(encrypted, None, None, None, 0)
else:
decrypted_descr, decrypted = u"", u""
cookies.append((host_key, name, expires_utc, decrypted, decrypted_descr, value))
# Idx: 0 1 2 3 4 5
return cookies
def init_db(file_name=COOKIE_FILE):
conn = sqlite3.connect(file_name)
return conn, conn.cursor()
def shutdown_db(cursor, connection, commit=False):
cursor.close()
if commit:
connection.commit()
connection.close()
def get_cookies(cursor, host_keys=HOST_KEYS):
query_tmpl = "SELECT host_key, name, value, expires_utc, encrypted_value FROM cookies WHERE host_key IN {:}"
cursor.execute(query_tmpl.format(host_keys))
result = cursor.fetchall()
cookies = decrypt_cookies(result)
return cookies
def format_long_text(text, max_len=50):
length = len(text)
if length <= max_len:
format_string = "({:d})[{:s}]"
else:
format_string = "({:d})[{:s}...]"
return format_string.format(length, text[:max_len])
def print_cookie(idx, cookie_tuple, print_data=False):
print("\nIdx: {:d}\nHost key: {:s}\nName: {:s}\nExpires: {:d}".format(idx, *(cookie_tuple[:3])))
if print_data:
print("Decrypted: {:s}".format(format_long_text(cookie_tuple[3])))
print("Decrypted description: {:s}".format(format_long_text(cookie_tuple[4])))
print("Data: {:s}".format(format_long_text(cookie_tuple[5])))
def update_cookie(cursor, cookie_tuple):
decrypted_length = len(cookie_tuple[3])
encrypted = win32crypt.CryptProtectData(cookie_tuple[3][:decrypted_length // 2], cookie_tuple[4], None, None, None, 0)
cursor.execute("UPDATE cookies SET encrypted_value = ? WHERE host_key = ? AND name = ?", (buffer(encrypted), cookie_tuple[0], cookie_tuple[1]))
def main():
conn, cursor = init_db()
cookies = get_cookies(cursor)
cookie_idx = 8 % len(cookies) # For simplicity sake choose an index that references a cookie with an unique 'host_key' and 'name'
for idx, cookie_tuple in enumerate(cookies):
print_cookie(idx, cookie_tuple)
updated_cookie = cookies[cookie_idx]
print_cookie(cookie_idx, updated_cookie, print_data=True)
update_cookie(cursor, updated_cookie)
shutdown_db(cursor, conn, commit=True)
print("\nReopening DB...\n")
conn, cursor = init_db()
cookies = get_cookies(cursor)
print("Cookies: {:d}".format(len(cookies)))
#for idx, cookie_tuple in enumerate(cookies):
# print_cookie(idx, cookie_tuple)
updated_cookie = cookies[cookie_idx]
print_cookie(cookie_idx, updated_cookie, print_data=True)
shutdown_db(cursor, conn)
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
Примечания:
dict
или collections.namedtuple
было бы лучше, но я не хотел добавлять дополнительный код, так как эта часть не будет сохранена)buffer(encrypted)
(в update_cookie
), так как cookies.encrypted_value
столбец является BLOB
#print "Adding cookie"
в вопрос), потому что в Python3 строки являются unicode (а buffer
отсутствует)Выход:
(py27x64_test) e:\Work\Dev\StackOverflow\q050886719>"e:\Work\Dev\VEnvs\py27x64_test\Scripts\python.exe" code.py Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32 Idx: 0 Host key: .google.com Name: 1P_JAR Expires: 13176376602000000 Idx: 1 Host key: .google.com Name: AID Expires: 13194604800101431 Idx: 2 Host key: .google.com Name: APISID Expires: 13236602265411651 Idx: 3 Host key: .google.com Name: CGIC Expires: 13189118241681530 Idx: 4 Host key: .google.com Name: CGIC Expires: 13189118241681619 Idx: 5 Host key: .google.com Name: CONSENT Expires: 13791196798240053 Idx: 6 Host key: .google.com Name: GMAIL_RTT Expires: 0 Idx: 7 Host key: .google.com Name: HSID Expires: 13236602265411610 Idx: 8 Host key: .google.com Name: NID Expires: 13189336603638418 Idx: 9 Host key: .google.com Name: SAPISID Expires: 13236602265411673 Idx: 10 Host key: .google.com Name: SID Expires: 13236602265411550 Idx: 11 Host key: .google.com Name: SIDCC Expires: 13181563951325551 Idx: 12 Host key: .google.com Name: SNID Expires: 13189336552795314 Idx: 13 Host key: .google.com Name: SSID Expires: 13236602265411631 Idx: 14 Host key: .google.com Name: TAID Expires: 13174995823101361 Idx: 15 Host key: www.google.com Name: GAPS Expires: 13229834000111924 Idx: 8 Host key: .google.com Name: NID Expires: 13189336603638418 Decrypted: (254)[132=tqLTXZ4dOSPbstdv6oktg9VxbNX3LpwLKGpXzpMwnyVTis...] Decrypted description: (0)[] Data: (0)[] Reopening DB... Cookies: 16 Idx: 8 Host key: .google.com Name: NID Expires: 13189336603638418 Decrypted: (127)[132=tqLTXZ4dOSPbstdv6oktg9VxbNX3LpwLKGpXzpMwnyVTis...] Decrypted description: (0)[] Data: (0)[]