133 lines
16 KiB
Python
133 lines
16 KiB
Python
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","Portable%20Document%20Format"]],"cx":"6b5a85e2","ub":true,"xn":true,"zu":false,"tm":[false,false],"ut":true,"yp":true,"uz":true,"ch":true,"xx":{"chrome":true,"app":true},"um":[0]} '
|
||
# 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","body","exeJsonp","initSearchForm","showPage","getOS","getBrowser","userAgent","$Class","footer","SetTab","login","uploadImg","customDDl","_bdhm_loaded_fb481430f1a5a6c7044229532823b9fd","mini_tangram_log_dikjbw","mini_tangram_log_jzofcu","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","Portable%20Document%20Format"]],"cx":"73d1b57b","ub":true,"xn":true,"zu":false,"tm":[false,false],"ut":true,"yp":true,"uz":true,"ch":true,"xx":{"chrome":true,"app":true},"um":[1]}'
|
||
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
|