import os import sys import json import hashlib import requests from base64 import b64decode try: from Cryptodome.Cipher import AES from Cryptodome.Util.Padding import unpad from Cryptodome.Protocol.KDF import PBKDF2 except ImportError: from Crypto.Cipher import AES from Crypto.Util.Padding import unpad from Crypto.Protocol.KDF import PBKDF2 def decrypt_cookie(server_url, uuid, password, crypto_type='legacy'): try: # 构建API URL url = f"{server_url}/get/{uuid}" # 如果指定了加密算法,添加查询参数 if crypto_type and crypto_type != 'legacy': url += f"?crypto_type={crypto_type}" # 发送请求获取加密数据 response = requests.get(url) response.raise_for_status() data = response.json() # 优先使用参数指定的算法,其次使用服务器返回的算法,最后使用legacy use_crypto_type = crypto_type or data.get('crypto_type', 'legacy') # 生成解密密钥 (MD5(uuid + '-' + password)的前16位) hash_str = hashlib.md5(f"{uuid}-{password}".encode()).hexdigest() key = hash_str[:16].encode() # 解密数据 try: # 解析加密文本 ciphertext = data['encrypted'] if use_crypto_type == 'aes-128-cbc-fixed': # 新的标准 AES-128-CBC 算法,使用固定 IV encrypted = b64decode(ciphertext) fixed_iv = b'\x00' * 16 # 16字节的0 # 创建cipher并解密 cipher = AES.new(key, AES.MODE_CBC, fixed_iv) pt = unpad(cipher.decrypt(encrypted), AES.block_size) else: # 原有的 legacy 算法 # 分离salt和IV (CryptoJS格式) encrypted = b64decode(ciphertext) salt = encrypted[8:16] ct = encrypted[16:] # 使用OpenSSL EVP_BytesToKey导出方式 key_iv = b"" prev = b"" while len(key_iv) < 48: prev = hashlib.md5(prev + key + salt).digest() key_iv += prev _key = key_iv[:32] _iv = key_iv[32:48] # 创建cipher并解密 cipher = AES.new(_key, AES.MODE_CBC, _iv) pt = unpad(cipher.decrypt(ct), AES.block_size) # 解析JSON return json.loads(pt.decode('utf-8')) except Exception as e: print(f"数据格式错误: {e}") return None except requests.exceptions.RequestException as e: print(f"请求错误: {e}") return None except Exception as e: print(f"解密错误: {e}") return None def main(): # 设置默认值 default_server = "http://127.0.0.1:8088" default_uuid = "default-uuid" default_password = "default-password" default_crypto_type = "legacy" # 网站和对应的环境变量名映射 WEBSITE_ENV_MAPPING = { 'bilibili.com': 'BILIBILI_COOKIE_12345678', 'zhihu.com': 'ZHIHU_COOKIES', 'xiaohongshu.com': 'XIAOHONGSHU_COOKIE' } if len(sys.argv) == 1: server_url = default_server uuid = default_uuid password = default_password crypto_type = default_crypto_type elif len(sys.argv) == 4: server_url = sys.argv[1] uuid = sys.argv[2] password = sys.argv[3] crypto_type = default_crypto_type elif len(sys.argv) == 5: server_url = sys.argv[1] uuid = sys.argv[2] password = sys.argv[3] crypto_type = sys.argv[4] else: print("使用方法: python decrypt.py [服务器地址] [uuid] [password] [crypto_type]") print("示例: python decrypt.py http://your-server:8088 your-uuid your-password legacy") print("示例: python decrypt.py http://your-server:8088 your-uuid your-password aes-128-cbc-fixed") print(f"未提供参数时使用默认值:") print(f"服务器地址: {default_server}") print(f"UUID: {default_uuid}") print(f"Password: {default_password}") print(f"加密算法: {default_crypto_type}") print("加密算法选项: legacy (兼容旧版), aes-128-cbc-fixed (标准AES-128-CBC)") sys.exit(1) decrypted_data = decrypt_cookie(server_url, uuid, password, crypto_type) if decrypted_data: print("解密成功!") cookie_data_all = json.dumps( decrypted_data['cookie_data'], ensure_ascii=False, indent=2) cookie_data = json.loads(cookie_data_all) # 删除已存在的 rsshub.env 文件 if os.path.exists('rsshub.env'): os.remove('rsshub.env') print("已删除现有的 rsshub.env 文件") # 收集所有支持的网站的cookie env_contents = [] # 处理每个网站的 cookie for website, cookies in cookie_data.items(): formatted_cookies = [] for cookie in cookies: formatted_cookies.append(f"{cookie['name']}={cookie['value']}") # 将格式化的 cookie 连接成一个字符串 result = '; '.join(formatted_cookies) # 打印网站和对应的结果 print(f"{website}:") print(result) print() # 添加空行以分隔不同网站的结果 # 检查是否是需要特殊处理的网站 website_lower = website.lower() if website_lower in WEBSITE_ENV_MAPPING: env_var = WEBSITE_ENV_MAPPING[website_lower] env_contents.append(f"{env_var} = {result}") print(f"已处理 {website} 的 cookie") # 将所有收集到的环境变量一次性写入文件 if env_contents: with open('rsshub.env', 'w', encoding='utf-8') as f: f.write('\n'.join(env_contents) + '\n') print("已将所有 cookie 写入 rsshub.env 文件") if __name__ == "__main__": main()