- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这就是我正在尝试做的事情。我想从 Chrome 的 sqlite 文件中读取 cookie,在 python 上使用它们,然后再次将它们保存到 Chrome 的 sqlite 文件中,因为它们在与 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 interface for SQLite databases .
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's 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)[]
关于python - 我可以将 cookie 从 python 导出到 Chrome 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50886719/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!