想使用python获取知乎的回答
在使用chrome的cookie时报错,因为chrome在80版本之后的解密方式和之前不同了,因此原作者的对于cookie的解密代码不可用,这个代码在util的Session文件中:
with sqlite3.connect(cookiepath) as conn: cu = conn.cursor() cookies = {name: CryptUnprotectData(encrypted_value)[1].decode( ) for host_key, name, encrypted_value in cu.execute(sql).fetchall()} texts = [] for k, v in cookies.items(): # if v.find('"') > -1: # v = v.replace('"', '') texts.append(f'{k}={v}')
替换Session文件,增加新的解密方式,将Session文件整个替换为下列代码即可:
from .. import config import os if config.is_use_chrome_cookies == True and os.name == 'nt': import sqlite3 import os import json import base64 import sqlite3 from cryptography.hazmat.primitives.ciphers.aead import AESGCM local_state = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data\Local State' 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 from win32.win32crypt import CryptUnprotectData host = '.zhihu.com' if config.cookiepath: # 使用自己配置的 cookiepath cookiepath = config.cookiepath if os.path.exists(os.environ['LOCALAPPDATA'] + r"\Google\Chrome\User Data\Default\Cookies"): # 使用 Chrome 的 cookiepath cookiepath = os.environ['LOCALAPPDATA'] + r"\Google\Chrome\User Data\Default\Cookies" elif os.path.exists(os.environ['LOCALAPPDATA'] + r"\CentBrowser\User Data\Default\Cookies"): # 使用百分的 cookiepath cookiepath = os.environ['LOCALAPPDATA'] + r"\CentBrowser\User Data\Default\Cookies" print(cookiepath) sql = "select host_key,name,encrypted_value from cookies where host_key='%s'" % host with sqlite3.connect(cookiepath) 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() texts = [] for k, v in cookies.items(): # if v.find('"') > -1: # v = v.replace('"', '') texts.append(f'{k}={v}') # print('Authorization maybe you should get it by yourself') hash = '' if config.show_cookies_in_loading == True: print('默认加载 Chrome 的 Cookies(这可以在 config.py 里面修改):' + '; '.join(texts)) headers = { 'Cookie': '; '.join(texts), 'Accept-Encoding': 'gzip', # 'User-Agent': 'com.zhihu.android/Futureve/5.21.2 Mozilla/5.0 (Linux; Android 5.1.1; SM-G925F Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36', 'User-Agent': 'ZhihuHybrid com.zhihu.android/Futureve/5.21.2 Mozilla/5.0 (Linux; Android 5.1.1; SM-G925F Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36', # 是个坑点 # 'Authorization': 'Bearer 2.1nT3nAgAAAAAAQCTkYHbtDQwAAABgAlVN5OR7WwDipjTIOQZzMdBwDlgXIdlLs0_Wsw', 'x-api-version': '3.0.76', 'x-app-version': '5.21.2', 'x-app-flavor': 'yybgg', 'x-app-build': 'release', 'x-network-type': 'WiFi', # 'X-SUGER': 'SU1FST04NjQ1Mzc3NDIxMzI3MTE7QU5EUk9JRF9JRD05MDE3MDQ0MTc0Mjc1ODE0', # 'X-ZST-82': '1.0AHDn446V-w0MAAAASwUAADEuMGbAX1sAAAAAOq9apOGfzFKL1bLw2B6sBVAhm4M=', # 'x-udid': 'AEAk5GB27Q1LBUlfpLUtrEBLk8F7KE62dbU=', 'x-requested-with': 'Fetch', 'x-app-za': 'OS=Android&Release=5.1.1&Model=SM-G925F&VersionName=5.21.2&VersionCode=764&Product=com.zhihu.android&Width=1080&Height=1920&Installer=%E5%BA%94%E7%94%A8%E5%AE%9D-%E5%B9%BF%E5%91%8A&DeviceType=AndroidPhone&Brand=samsung&OperatorType=46000', 'accept': 'application/json, text/plain, */*' } else: # 导入上层的敏感数据 # import sys # sys.path.append("..") from .. import config hash = config.hash headers = config.headers """ 位于上层目录的 config.py 内容示例: hash = '你的 Hash' headers = { 'Cookie': '_xsrf=...; z_c0=...' 'Accept-Encoding': 'gzip', 'User-Agent': 'ZhihuHybrid com.zhihu.android/Futureve/5.21.2 Mozilla/5.0 (Linux; Android 5.1.1; SM-G925F Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36', 'x-api-version': '3.0.76', 'Authorization': '...', 'x-app-za': 'OS=Android&Release=5.1.1&Model=SM-G925F&VersionName=5.21.2&VersionCode=764&Product=com.zhihu.android&Width=1080&Height=1920&Installer=%E5%BA%94%E7%94%A8%E5%AE%9D-%E5%B9%BF%E5%91%8A&DeviceType=AndroidPhone&Brand=samsung&OperatorType=46000', 'accept': 'application/json, text/plain, */*' } """