baidu-reporter/app/utils/gen_cookie.py

133 lines
16 KiB
Python
Raw Normal View History

2025-03-30 22:49:37 +08:00
import random
import uuid
import time
import math
from urllib.parse import quote
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from app.utils import custom_base64
from app.utils.common import get_proxies
from app.utils.custom_base64 import CustomBase64
class GenCookie:
xft_key = "01hltm8JcnEfqy4t"
xft_iv = "Fsxdviz5BSekw320"
xfcs_key = "YuoCK92D8mhzMCIQ"
xfcs_iv = "MBwPm05VuDBq4sst"
url = 'https://xlab.baidu.com/jnmq'
headers = {
'Sec-Ch-Ua-Platform': '"Windows"',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
'Sec-Ch-Ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"',
'Content-Type': 'application/x-www-form-urlencoded',
'Sec-Ch-Ua-Mobile': '?0',
'Accept': '*/*',
'Origin': 'https://help.baidu.com',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://help.baidu.com/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Priority': 'u=1, i'
}
@staticmethod
def aes_decrypt(ciphertext_hex: str, key_str: str, iv_str: str) -> str:
# 将密钥和IV从字符串编码为字节
key = key_str.encode('utf-8')
iv = iv_str.encode('utf-8')
# 验证密钥和IV的长度AES-128要求16字节
if len(key) != 16:
raise ValueError("密钥长度必须为16字节")
if len(iv) != 16:
raise ValueError("IV长度必须为16字节")
# 将HEX密文字符串转换为字节
ciphertext = bytes.fromhex(ciphertext_hex)
# 创建AES-CBC解密器并解密数据
cipher = (
AES.new(key, AES.MODE_CBC, iv))
decrypted_data = cipher.decrypt(ciphertext)
# 去除填充并解码为明文
plaintext = unpad(decrypted_data, AES.block_size).decode('utf-8')
return plaintext
@staticmethod
def aes_encrypt(plaintext: str, key_str: str, iv_str: str) -> str:
key = key_str.encode('utf-8')
iv = iv_str.encode('utf-8')
if len(key) != 16:
raise ValueError("密钥长度必须为16字节")
if len(iv) != 16:
raise ValueError("IV长度必须为16字节")
# 将明文填充并转换为字节
to_encrypt_data = pad(plaintext.encode('utf-8'), AES.block_size)
# 创建AES-CBC加密器并加密数据
cipher = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(to_encrypt_data)
# 返回大写的HEX字符串
return ciphertext.hex().upper()
@staticmethod
def get_timestamp():
return math.ceil(time.time() * 1000)
@staticmethod
def get_uuid_str():
return str(uuid.uuid4()).lower()
@staticmethod
def get_cookie(cookie_name, timestamp=''):
if cookie_name == 'XFI':
return GenCookie.get_uuid_str()
if cookie_name == 'XFCS':
plain_text = f'{timestamp}#ooox'
return GenCookie.aes_encrypt(plain_text, GenCookie.xfcs_key, GenCookie.xfcs_iv)
@staticmethod
def get_xft_cookie(xfi, cookie, json_data_28='', json_data_ts='', json_data_x=''):
json_data_28 = r'''{"na":true,"fn":true,"wnd":true,"fnc":"J is not a function\nTypeError: J is not a function\n at Object.JnZbY (https://xlab.baidu.com/res/bundle.p.php:1:91494)\n at eval (eval at D (https://xlab.baidu.com/res/bundle.p.php:1:91853), <anonymous>:7:24)\n at D (https://xlab.baidu.com/res/bundle.p.php:1:91853)\n at C2 (https://xlab.baidu.com/res/bundle.p.php:1:131002)\n at Object.QGCWm (https://xlab.baidu.com/res/bundle.p.php:1:123081)\n at C3 (https://xlab.baidu.com/res/bundle.p.php:1:131494)","fns":"Function.prototype.toString requires that 'this' be a Function\nTypeError: Function.prototype.toString requires that 'this' be a Function\n at toString (<anonymous>)\n at Object.JnZbY (https://xlab.baidu.com/res/bundle.p.php:1:91494)\n at eval (eval at D (https://xlab.baidu.com/res/bundle.p.php:1:92223), <anonymous>:7:76)\n at D (https://xlab.baidu.com/res/bundle.p.php:1:92223)\n at C2 (https://xlab.baidu.com/res/bundle.p.php:1:131002)\n at Object.QGCWm (https://xlab.baidu.com/res/bundle.p.php:1:123081)\n at C3 (https://xlab.baidu.com/res/bundle.p.php:1:131494)","fnpc":"function call() { [native code] }","fnps":"function toString() { [native code] }","wglp":true} '''
json_data_29 = 'b30'
json_data_gd = xfi
json_data_sk = 'p'
json_data_ts = '{"d":' + str(
GenCookie.get_timestamp()) + ',"qc":"https://help.baidu.com/jubao?source=search","v":"error","iv":30,"vb":33,"pv":"ooxo","dw":"fine","fx":5,"pq":"1728*1117","c":"1728*1030","ra":"38-","ot":"landscape-primary","ls":"error","ks":"1728*1029","ke":false,"w":-480,"uy":"Asia/Shanghai","bx":1,"fh":5984,"tt":[0,false,false],"hd":[false,"visible"],"tx":2,"nw":["Google Inc. (Apple)","ANGLE (Apple, ANGLE Metal Renderer: Apple M3 Max, Unspecified Version)"],"bb":{"vendorSub":"","productSub":"20030107","vendor":"Google Inc.","maxTouchPoints":0,"scheduling":{},"userActivation":{"hasBeenActive":false,"isActive":false},"doNotTrack":{},"geolocation":{},"connection":{"onchange":{},"effectiveType":"4g","rtt":100,"downlink":2.2,"saveData":false},"pdfViewerEnabled":true,"webkitTemporaryStorage":{},"webkitPersistentStorage":{},"windowControlsOverlay":{"visible":false,"ongeometrychange":{}},"hardwareConcurrency":14,"cookieEnabled":true,"appCodeName":"Mozilla","appName":"Netscape","appVersion":"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","platform":"MacIntel","product":"Gecko","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","language":"zh-CN","languages":{"0":"zh-CN","1":"zh"},"onLine":true,"webdriver":false,"deprecatedRunAdAuctionEnforcesKAnonymity":false,"protectedAudience":{},"bluetooth":{},"storageBuckets":{},"clipboard":{},"credentials":{},"keyboard":{},"managed":{"onmanagedconfigurationchange":{}},"mediaDevices":{"ondevicechange":{}},"storage":{},"serviceWorker":{"controller":{},"ready":{},"oncontrollerchange":{},"onmessage":{},"onmessageerror":{}},"virtualKeyboard":{"boundingRect":{"x":0,"y":0,"width":0,"height":0,"top":0,"right":0,"bottom":0,"left":0},"overlaysContent":false,"ongeometrychange":{}},"wakeLock":{},"deviceMemory":8,"userAgentData":{"brands":{"0":{"brand":"Chromium","version":"134"},"1":{"brand":"Not:A-Brand","version":"24"},"2":{"brand":"Google Chrome","version":"134"}},"mobile":false,"platform":"macOS"},"login":{},"ink":{},"mediaCapabilities":{},"devicePosture":{"type":"continuous","onchange":{}},"hid":{"onconnect":{},"ondisconnect":{}},"locks":{},"gpu":{"wgslLanguageFeatures":{"size":4}},"mediaSession":{"metadata":{},"playbackState":"none"},"permissions":{},"presentation":{"defaultRequest":{},"receiver":{}},"usb":{"onconnect":{},"ondisconnect":{}},"xr":{"ondevicechange":{}},"serial":{"onconnect":{},"ondisconnect":{}},"w":false,"u":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","v":"Google Inc.","p":"MacIntel","t":0,"c":14},"tw":["navigation","trustedTypes","onbeforeinput","onbeforematch","onbeforetoggle","oncontentvisibilityautostatechange","scheduler","chrome","launchQueue","sharedStorage","documentPictureInPicture","getScreenDetails","queryLocalFonts","originAgentCluster","onpageswap","onpagereveal","credentialless","fence","onscrollend","onscrollsnapchange","onscrollsnapchanging","_hmt","T","baidu","$BAIDU$","baiduInstance","Sizzle","$","jQuery","isSingleInstanceProd","isLoginInstance","saveInitInstance","getInitInstance","passport","upsmsStore","YY_TPL_CONFIG","body","exeJsonp","initSearchForm","showPage","getOS","getBrowser","userAgent","$Class","footer","SetTab","login","uploadImg","customDDl","_bdhm_loaded_fb481430f1a5a6c7044229532823b9fd","mini_tangram_log_3g2jxp","a0K","a0C","sugapi","protocol","suggestParam","suggestion","searchSugCbk","parseJSON","reloadPage","proxy","TipTog","Popup","vaildForm","checkform","uploadControl","quesPage","searchPage","mmm","specialObject","popObject","tousuForm","jubaoForm"],"ps":[["PDF%20Viewer","internal-pdf-viewer","Portable%20Document%20Format"],["Chrome%20PDF%20Viewer","internal-pdf-viewer","Portable%20Document%20Format"],["Chromium%20PDF%20Viewer","internal-pdf-viewer","Portable%20Document%20Format"],["Microsoft%20Edge%20PDF%20Viewer","internal-pdf-viewer","Portable%20Document%20Format"],["WebKit%20built-in%20PDF","internal-pdf-viewer","Portab
# json_data_ts = '{"d":'+ str(gen_cookie.get_timestamp()) +',"qc":"https://help.baidu.com/jubao?source=search","v":"https://www.baidu.com/s?wd=aaa&rsv_spt=1&rsv_iqid=0xbfd5e8930195ecd1&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=4&rsv_sug1=4&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&prefixsug=aaa&rsp=5&inputT=375&rsv_sug4=557&p_tk=7492XAv14v6WVtYVmfp2uARL8xBGjUO8gSvuOCD5kvVwUHcZAYDBbXgYNJUEh1TsGb9FlyB3lreXpmYMtb08ujLbz%2Bfmeqo7pHumOknR%2Fgtz9Lq%2FfiuC2wL4oeRhnocw6FTp7ma5r34KLRI6RHYD2SqSPw%3D%3D&p_timestamp=1741793172&p_sign=2e0f6e82e90baec91b5b52700b20a9c3&p_signature=ee2b6b945968237e864b7fb77f042ae6&__pc2ps_ab=7492XAv14v6WVtYVmfp2uARL8xBGjUO8gSvuOCD5kvVwUHcZAYDBbXgYNJUEh1TsGb9FlyB3lreXpmYMtb08ujLbz%2Bfmeqo7pHumOknR%2Fgtz9Lq%2FfiuC2wL4oeRhnocw6FTp7ma5r34KLRI6RHYD2SqSPw%3D%3D|1741793172|ee2b6b945968237e864b7fb77f042ae6|2e0f6e82e90baec91b5b52700b20a9c3","iv":24,"vb":33,"pv":"oxxo","dw":"fine","fx":5,"pq":"2560*1440","c":"2560*1392","ra":"-","ot":"landscape-primary","ls":"error","ks":"2564*1396","ke":false,"w":-480,"uy":"Asia/Shanghai","bx":1,"fh":5984,"tt":[0,false,false],"hd":[false,"visible"],"tx":1.5,"nw":["Google Inc. (Google)","ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)"],"bb":{"vendorSub":"","productSub":"20030107","vendor":"Google Inc.","maxTouchPoints":0,"scheduling":{},"userActivation":{"hasBeenActive":true,"isActive":true},"doNotTrack":{},"geolocation":{},"connection":{"onchange":{},"effectiveType":"4g","rtt":50,"downlink":1.4,"saveData":false},"pdfViewerEnabled":true,"webkitTemporaryStorage":{},"webkitPersistentStorage":{},"windowControlsOverlay":{"visible":false,"ongeometrychange":{}},"hardwareConcurrency":12,"cookieEnabled":true,"appCodeName":"Mozilla","appName":"Netscape","appVersion":"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","platform":"Win32","product":"Gecko","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","language":"zh-CN","languages":{"0":"zh-CN"},"onLine":true,"webdriver":false,"deprecatedRunAdAuctionEnforcesKAnonymity":false,"protectedAudience":{},"bluetooth":{},"storageBuckets":{},"clipboard":{},"credentials":{},"keyboard":{},"managed":{"onmanagedconfigurationchange":{}},"mediaDevices":{"ondevicechange":{}},"storage":{},"serviceWorker":{"controller":{},"ready":{},"oncontrollerchange":{},"onmessage":{},"onmessageerror":{}},"virtualKeyboard":{"boundingRect":{"x":0,"y":0,"width":0,"height":0,"top":0,"right":0,"bottom":0,"left":0},"overlaysContent":false,"ongeometrychange":{}},"wakeLock":{},"deviceMemory":8,"userAgentData":{"brands":{"0":{"brand":"Chromium","version":"134"},"1":{"brand":"Not:A-Brand","version":"24"},"2":{"brand":"Google Chrome","version":"134"}},"mobile":false,"platform":"Windows"},"cookieDeprecationLabel":{},"login":{},"ink":{},"mediaCapabilities":{},"devicePosture":{"type":"continuous","onchange":{}},"hid":{"onconnect":{},"ondisconnect":{}},"locks":{},"gpu":{"wgslLanguageFeatures":{"size":4}},"mediaSession":{"metadata":{},"playbackState":"none"},"permissions":{},"presentation":{"defaultRequest":{},"receiver":{}},"usb":{"onconnect":{},"ondisconnect":{}},"xr":{"ondevicechange":{}},"serial":{"onconnect":{},"ondisconnect":{}},"w":false,"u":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","v":"Google Inc.","p":"Win32","t":0,"c":12},"tw":["navigation","trustedTypes","onbeforeinput","onbeforematch","onbeforetoggle","oncontentvisibilityautostatechange","scheduler","chrome","launchQueue","sharedStorage","documentPictureInPicture","getScreenDetails","queryLocalFonts","originAgentCluster","onpageswap","onpagereveal","credentialless","fence","onscrollend","onscrollsnapchange","onscrollsnapchanging","define","ethereum","_hmt","T","baidu","$BAIDU$","baiduInstance","Sizzle","$","jQuery","isSingleInstanceProd","isLoginInstance","saveInitInstance","getInitInstance","passport","upsmsStore","YY_TPL_CONFIG","
json_data_ub = '0.8.5'
json_data_x = '{"lz":"n/a","bz":[71,false],"gg":[1197130899456,0],"su":[176,{"others":157,"chrome":19}],"l":true,"nb":false,"e":[0,null,null,null],"t":true,"bn":false,"iu":[false,null,null,null],"io":"oooooooooooooooooooooooooooo","nh":"ooooooooooooooooooooooooooooooooooooooooooooooooo","p":"4565C4B32DBA773AF9F3978E7815A945","ud":"n/a","sf":"00000000000000"} '
plain_text = f'{{"28":"{CustomBase64.encode(json_data_28)}","29":"{(json_data_29)}","gd":"{json_data_gd}"' + \
f',"sk":"{json_data_sk}","ts":"{CustomBase64.encode(json_data_ts)}","ub":"{json_data_ub}"' + \
f',"x":"{CustomBase64.encode(json_data_x)}"}}'
# print(plain_text)
encrypted_text = GenCookie.aes_encrypt(plain_text, GenCookie.xft_key, GenCookie.xft_iv)
post_data = {'p': encrypted_text}
headers_copy = GenCookie.headers.copy()
headers_copy.update({'cookie': cookie})
resp = requests.post(url=GenCookie.url, headers=headers_copy, data=post_data, proxies=get_proxies())
return resp.json().get('s')
# post to https://xlab.baidu.com/jnmq p=enc
@staticmethod
def run(cookie):
try:
xfi_cookie = GenCookie.get_cookie('XFI')
xfcs_cookie = GenCookie.get_cookie('XFCS', str(GenCookie.get_timestamp()))
xft_cookie = GenCookie.get_xft_cookie(xfi_cookie, cookie=cookie)
# urlencode
xft_cookie = quote(xft_cookie)
time_stamp = math.ceil(time.time())
final_cookie = f'{cookie}; Hm_lvt_fb481430f1a5a6c7044229532823b9fd={time_stamp - random.randint(800, 1000)};Hm_lvt_fb481430f1a5a6c7044229532823b9fd={time_stamp}; XFI={xfi_cookie}; XFCS={xfcs_cookie}; XFT={xft_cookie};'
except Exception as e:
# 这里是什么意思?原来代码就这么写的,没动过
return
final_cookie = f'{cookie}; Hm_lvt_fb481430f1a5a6c7044229532823b9fd={time_stamp - random.randint(800, 1000)};Hm_lvt_fb481430f1a5a6c7044229532823b9fd={time_stamp}; XFI={xfi_cookie}; XFCS={xfcs_cookie}; '
return final_cookie