Могу ли я экспортировать куки из python в Chrome?

1

Вот что я пытаюсь сделать. Я хочу прочитать файлы cookie из файла sqlite из Chrome, использовать их на python и затем снова сохранить их в файле sqlite Chrome, поскольку они могли быть обновлены при использовании их с python.

Это более или менее код, который я должен проверить, я могу извлечь их и использовать их правильно, но я не могу их обновить на sqlite и продолжать использовать их в браузере.

Я даже не уверен, использую ли я правильные типы, или если я передаю правильный тип в UPDATE, должен ли я что-то сделать для newEncrypted, прежде чем передавать его в sqlite?

  • Тип encrypted_value() - буфер
  • дешифрованный тип() является unicode
  • 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()
    
Теги:
python-requests
sqlite3
cookies
pywin32

1 ответ

0

Страница документации 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()

Примечания:

  • Я разделил код в функциях как более модульный (многоразовый и параметризованный)
  • У меня нет установленного cookielib, поэтому я удалил все части, которые ссылаются на него, и вместо этого использовал кортежи для хранения данных cookie (я знаю, что dict или collections.namedtuple было бы лучше, но я не хотел добавлять дополнительный код, так как эта часть не будет сохранена)
  • Нет обработки ошибок
  • Некоторые функции предназначены только для печати
  • В качестве теста я выбрал одно из файлов cookie, и я сохраняю только 1- ю половину его (зашифрованных) данных. Конечно, это станет недействительным, но это только для демонстрационных целей
  • Ключ buffer(encrypted)update_cookie), так как cookies.encrypted_value столбец является BLOB
  • Это только Python2 (замечено #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)[]
  • 0
    Это ответило на ваш вопрос?
  • 0
    Привет, извините за поздний ответ. Я не нашел свободного времени, чтобы проверить его, и в итоге забыл об этом. В моем случае это не работает, потому что, я полагаю, файл Chrome Cookies всегда используется Chrome, поэтому я получаю «sqlite3.OperationalError: ошибка ввода-вывода диска». Я попытался скопировать файл, изменить, а затем перезаписать, но это не работает Я также пытался использовать sqlite изоляцию_level = "exclusive", но я все еще получаю ту же ошибку. Я использовал твой код и сделал класс. pastebin.com/khEWqhR2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню