# -*- coding: utf-8 -*- # 本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。 # 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。 from Crypto.Cipher import AES from base.spider import Spider from Crypto.Util.Padding import unpad from urllib.parse import unquote_plus import re,sys,time,json,base64,hashlib,urllib3 from Crypto.Util.number import bytes_to_long,long_to_bytes urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) sys.path.append('..') class DecryptShijie: def __call__(self, str_data, z=False): return self.decrypt(str_data, z) @staticmethod def decrypt(str_data, z=False): if not str_data: return None if z else str_data trim_str = str_data.strip() if trim_str.lower().startswith(' 2: result = self.ui9_decode(dat_vurl) if result: return result result = self.decode(dat_vurl) if result and self.is_valid_url(result): return result if result: result = self.ld_xor(result) if result: return result result = self.ld_xor(dat_vurl) if result: return result result = self.yd_xor(dat_vurl) if result: return result elif 'https://vod.baidu.com/' in dat_vurl: result = self.ld_xor(dat_vurl) if result: return result elif '6max.con' in dat_vurl: result = self.yd2(dat_vurl) if result: return result elif 'lvDou+' in dat_vurl: result = DecryptShijie()(dat_vurl) if result: return result elif dat_vurl.startswith('https://vod-parses.baidu.com/'): result = self.ui8(dat_vurl) if result: return result return None def ui9_decode(self, input_str): try: cleaned_input = re.sub(r'https://baidu\.con/|lvDou\+', '', input_str) if cleaned_input.count(':') < 2: return None parts = cleaned_input.split(':', 3) if len(parts) < 4: return None _, key, iv, data_part = parts cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode()) decrypted = unpad(cipher.decrypt(base64.b64decode(data_part)), AES.block_size) return decrypted.decode() except Exception: return None def decode(self, d): original_d = d try: while re.match(r'^https?://baidu\.con/', d, re.I): data = re.sub(r'^https?://baidu\.con/', '', d, flags=re.I) if len(data) < 16: return None key = data[:16].encode() encrypted_data = data[16:] cipher = AES.new(key, AES.MODE_CBC, key) decrypted = unpad(cipher.decrypt(base64.b64decode(encrypted_data)), AES.block_size) d = decrypted.decode() return d if d != original_d else None except Exception: return None def ld_xor(self, d): if not d: return None original_d = d try: if 'https://baidu.con/' in d or 'https://vod.baidu.com/' in d or d.startswith('2423'): d = d.replace('https://baidu.con/', '').replace('https://vod.baidu.com/', '') if d.startswith("2423"): d = d[6:] substring = str(int(time.time()))[:8] decoded = base64.b64decode(d) sb = '' length = len(substring) length2 = len(decoded) for i in range(length2): sb += chr(decoded[i] ^ ord(substring[i % length])) d = base64.b64decode(sb).decode() return d if d != original_d else None except Exception: return None def yd_xor(self, d): if not d or 'baidu.con/' not in d: return None try: parts = d.split('baidu.con/', 1) if len(parts) < 2: return None encoded_part = parts[1] decoded = base64.b64decode(encoded_part) split_parts = decoded.split(b'|', 1) if len(split_parts) != 2: return None str2, str3 = split_parts key = 'k3yM@$k2024' key_length = len(key) sb2 = '' for i in range(len(str2)): char = chr(str2[i] ^ ord(key[i % key_length])) sb2 += char sb3 = '' sb2_length = len(sb2) if sb2_length == 0: return None for i2 in range(len(str3)): pos1 = (i2 + 5) % sb2_length pos2 = i2 % sb2_length xor_value = (ord(sb2[pos1]) + ord(sb2[pos2])) % 256 char = chr(str3[i2] ^ xor_value) sb3 += char return sb3 except Exception: return None def yd2(self, d): if not d or '6max.con' not in d: return None try: data = d.replace('https://6max.con/', '') if len(data) < 16: return None key = data[:16][::-1] encrypted_data = data[16:] cipher = AES.new(key.encode(), AES.MODE_CBC, key.encode()) decrypted = unpad(cipher.decrypt(base64.b64decode(encrypted_data)), AES.block_size) return decrypted.decode() except Exception: return None def cc_decrypt(self, data, key): cipher = AES.new(key[:16].encode('utf-8'), AES.MODE_CBC, key[-16:].encode('utf-8')) decrypted = unpad(cipher.decrypt(base64.b64decode(data)), AES.block_size) return decrypted.decode('utf-8') def ui8_key(self, data): def remove_padding(data_bytes): if len(data_bytes) > 10 and data_bytes[0:2] == b'\x00\x02': separator_index = -1 for i in range(2, len(data_bytes)): if data_bytes[i] == 0x00: separator_index = i break if separator_index != -1 and separator_index >= 10: return data_bytes[separator_index + 1:] if len(data_bytes) > 10 and data_bytes[0:2] == b'\x00\x01': separator_index = data_bytes.find(b'\x00', 2) if separator_index != -1: return data_bytes[separator_index + 1:] leading_zeros = 0 for i, byte in enumerate(data_bytes): if byte == 0x00: leading_zeros += 1 else: break if 4 < leading_zeros < len(data_bytes) - 4: return data_bytes[leading_zeros:] return data_bytes try: ciphertext = base64.b64decode(data) e = 65537 key_size = 256 n = 21079562076490917015219587480852512299132282846588972509613626067512096161389328018952967457235862130835563213420479656634103575049300097161679204081658154497272581125245352803881834652019229809107820308002912749854520391970510245623300240009991722378306164668314002824501199929254049911331868110702469664803250702178374575823923934377743766444104491434605938939890181211241005585699358654598872394352374955459144334648826707577459995980217087014729507004998084715621911009102107688390105352539795259098849457413742825469024104523030276553490595865329453646012415093918163886593950079624681378051572920908409755103897 if len(ciphertext) > key_size: raise ValueError data_int = bytes_to_long(ciphertext) if data_int >= n: raise ValueError result_bytes = long_to_bytes(pow(data_int, e, n)) if len(result_bytes) < key_size: padding_length = key_size - len(result_bytes) result_bytes = b'\x00' * padding_length + result_bytes cleaned_bytes = remove_padding(result_bytes) try: result = cleaned_bytes.decode('utf-8') return result except UnicodeDecodeError: printable_bytes = bytes(b for b in cleaned_bytes if 32 <= b <= 126) if printable_bytes: try: return printable_bytes.decode('utf-8') except UnicodeDecodeError: return None return None except Exception: raise ValueError def ui8(self, data): try: if not data: return None processed = data.replace('https://vod-parses.baidu.com/', '').replace('"', '') parts = processed.split('81238', 1) if len(parts) < 2 or not parts[1]: return None aes_encrypted_part = parts[0] rsa_encrypted_part = parts[1] rsa_decrypted = self.ui8_key(rsa_encrypted_part) aes_key_iv = rsa_decrypted.split('|', 1) if len(aes_key_iv) < 2: return None aes_key = aes_key_iv[0].encode('utf-8') aes_iv = aes_key_iv[1].encode('utf-8') if len(aes_key) != 16 or len(aes_iv) != 16: raise ValueError aes_encrypted_bytes = base64.b64decode(aes_encrypted_part) cipher = AES.new(aes_key, AES.MODE_CBC, aes_iv) decrypted_padded = cipher.decrypt(aes_encrypted_bytes) decrypted = unpad(decrypted_padded, AES.block_size).decode('utf-8') return decrypted.strip('"') except Exception: return None def is_valid_url(self, url): """验证是否为有效的URL""" if not url or url == 'null': return False return re.match(r'https?://.*', url, re.I) is not None def json_encode(self,arr): return json.dumps(arr, ensure_ascii=False, indent=2) def init(self, extend=''): pass def homeContent(self, filter): pass def homeVideoContent(self): pass def categoryContent(self, tid, pg, filter, extend): pass def searchContent(self, key, quick, pg='1'): pass def detailContent(self, ids): pass def playerContent(self, flag, id, vipflags): pass def getName(self): pass def isVideoFormat(self, url): pass def manualVideoCheck(self): pass def destroy(self): pass