# -*- coding: utf-8 -*- # Author : Charley # Python : 3.10.8 # Date : 2025/12/12 16:00 import time import requests import json import random from loguru import logger from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import base64 def generate_nonce_str(length=32): """生成随机字符串,对应JS中的s()函数""" chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678" return ''.join(random.choice(chars) for _ in range(length)) def generate_random_char(): """生成单个随机字符,对应JS中的c()函数""" chars = "abcdefghijklmnopqrstuvwxyz0123456789" return random.choice(chars) def obfuscate_encrypted_data(encrypted_data): """对加密数据进行混淆处理,对应JS中的d()函数""" data_list = list(encrypted_data) # 在索引3位置插入随机字符 data_list.insert(3, generate_random_char()) # 在索引5位置插入随机字符 data_list.insert(5, generate_random_char()) return ''.join(data_list) def sort_dict_by_key(data_dict): """对字典按键排序,对应JS中的a()函数""" sorted_keys = sorted(data_dict.keys()) sorted_dict = {} for key in sorted_keys: sorted_dict[key] = data_dict[key] return sorted_dict def aes_encrypt(plaintext: str) -> str: """ AES ECB 模式加密,PKCS7 填充 """ key = "pSlJACAvYnAgOIlluJgK2F==" # 将密钥转换为字节(UTF-8编码) key_bytes = key.encode('utf-8') # AES 要求密钥长度为 16/24/32 字节 # 如果密钥长度不符合要求,需要调整 # 这里密钥是24字节,符合AES-192的要求 # 创建 AES 加密器(ECB 模式) cipher = AES.new(key_bytes, AES.MODE_ECB) # 将明文转换为字节并进行 PKCS7 填充 plaintext_bytes = plaintext.encode('utf-8') padded_data = pad(plaintext_bytes, AES.block_size) # 加密 encrypted_bytes = cipher.encrypt(padded_data) # 返回 Base64 编码的密文 return base64.b64encode(encrypted_bytes).decode('utf-8') def create_request_data(original_data,nonce_field_name='nonceStr'): """创建完整的请求数据""" # 添加必要字段 data_with_fields = original_data.copy() data_with_fields['time'] = int(time.time() * 1000) # 时间戳 # data_with_fields['nonceStr'] = generate_nonce_str() # 随机字符串 data_with_fields[nonce_field_name] = generate_nonce_str() # 随机字符串 data_with_fields['miniName'] = 'YFSXZF' # 根据环境确定 # data_with_fields = {"miniName":"YFSXZF","nonceStr":"iCxy35dfFNJtQSKcrB8yZsRd7B4p3c2h","orderType":0,"pageNum":6,"pageSize":10,"status":0,"time":1765792372017,"type":1} # 按键排序 sorted_data = sort_dict_by_key(data_with_fields) # print(f'sorted_data: {sorted_data}') # 转换为JSON字符串 json_str = json.dumps(sorted_data, separators=(',', ':')) # print(f'json_str: {json_str}') # AES加密 encrypted_data = aes_encrypt(json_str) # "ssB0tJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr7ssvn71/Y5zDsys/XxOXoNXP3fNdhJdAymwswqYNCmd/7Fk3GT1+5xowXLd64Z7BErz3v1AZuI7yithKjcFlYbafeUkOXI9LPHdUWc7/m4YWpZI3EhJhhGs322ScFsr/31Lu5TN6M/SQ9mZf8IaaNl2xlI+wr+ADV5zC2nEFxg1A==" # ssB0tJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr7ssvn71/Y5zDsys/XxOXoNXP3fNdhJdAymwswqYNCmd/7Fk3GT1+5xowXLd64Z7BErz3v1AZuI7yithKjcFlYbafeUkOXI9LPHdUWc7/m4YWpZI3EhJhhGs322ScFsr/31Lu5TN6M/SQ9mZf8IaaNl2xlI+wr+ADV5zC2nEFxg1A== # print(f'encrypted_data: {encrypted_data}') # 混淆处理 final_data = obfuscate_encrypted_data(encrypted_data) # print(f'final_data: {final_data}') return final_data # ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- def deobfuscate_encrypted_data(obfuscated_data): """反混淆处理,移除d()函数插入的随机字符""" data_list = list(obfuscated_data) # 先移除索引5位置的字符(后插入的先移除) del data_list[5] # 再移除索引3位置的字符 del data_list[3] return ''.join(data_list) def aes_decrypt(ciphertext: str) -> str: """ AES ECB 模式解密,PKCS7 填充 """ key = "pSlJACAvYnAgOIlluJgK2F==" key_bytes = key.encode('utf-8') cipher = AES.new(key_bytes, AES.MODE_ECB) # Base64解码 encrypted_bytes = base64.b64decode(ciphertext) # 解密 decrypted_padded = cipher.decrypt(encrypted_bytes) # 移除PKCS7填充 decrypted_data = unpad(decrypted_padded, AES.block_size) return decrypted_data.decode('utf-8') def decrypt_request_data(obfuscated_data: str) -> dict: """解密请求数据,返回明文字典""" # 1. 反混淆 encrypted_data = deobfuscate_encrypted_data(obfuscated_data) # 2. AES解密 json_str = aes_decrypt(encrypted_data) # 3. 解析JSON return json.loads(json_str) # --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- def get_req(): # 原始数据对象 original_data = { # "miniName": "YFSXZF", # "nonceStr": nonce_str, "orderType": 0, "pageNum": 1, "pageSize": 10, "status": 0, # "time": timestamp, "type": 1, } # raw_data={"miniName":"YFSXZF","nonceStr":"iCxy35dfFNJtQSKcrB8yZsRd7B4p3c2h","orderType":0,"pageNum":6,"pageSize":10,"status":0,"time":1765792372017,"type":1} # "{"areaType":1,"awardType":2,"miniName":"YFSXZF","nonceStr":"iXbhcQ53iEJbdcwaC5mjpdbK43GsfxCP","pageNum":1,"pageSize":100,"time":1765949383885}" request_data = create_request_data(original_data) headers = { 'authority': 'wechatapp.ichibankuji.cn', 'accept': '*/*', 'accept-language': 'zh-CN,zh;q=0.9', 'content-type': 'application/json', 'referer': 'https://servicewechat.com/wxd21e3190b2a44f73/21/page-frame.html', # 'sec-fetch-dest': 'empty', # 'sec-fetch-mode': 'cors', # 'sec-fetch-site': 'cross-site', # 'terminalos': 'YFSXZF', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c33) XWEB/9129', 'authorization': 'c3e87jrY!1q!2QwQclRyFVXzctNU6lVSUiF9WkPqIzNPL5YN5P3pxQbmzGDyajASc5BcFFM!2MeZG39B2EPdxesjVngQbw==' } payload = { "da": request_data } # 发送POST请求 response = requests.post( 'https://wechatapp.ichibankuji.cn/wechat/yfs/getSetList', headers=headers, json=payload ) print("响应状态码:", response.status_code) print("响应内容:", response.text) def test_getsetlist(): headers = { "authority": "wechatapp.ichibankuji.cn", "accept": "*/*", "accept-language": "zh-CN,zh;q=0.9", # "authorization": "28380RBWRJQZN9UkYGYXeOZrd2GjFh9eteBx7Rz5rDxG3Tq!1m6vSq7EQTr!2ln2jtcinFZ2D8AuMyCjxckvBV2sRazTA==", "authorization": "6974cjrY!1q!2QwQclRyFVXzctNU5!2B7lMuGi5lR70PeegsV0vYbrPmb8JQT!2oQDnJG7J0qCJlt3CZC!29Fz8JNmlv3X1Q==", "content-type": "application/json", "referer": "https://servicewechat.com/wx57f3ee376518bba9/164/page-frame.html", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "terminalos": "YFSJJ", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c33) XWEB/9129", "xweb_xhr": "1" } url = "https://wechatapp.ichibankuji.cn/wechat/yfs/getSetList" raw_data = { # "miniName": "YFSXZF", # "nonceStr": nonce_str, "orderType": 0, "pageNum": 2, "pageSize": 10, "areaType": 2, # "time": timestamp, "type": 1, } resp = requests.post(url, headers=headers, json=raw_data) print(resp.text) print(resp) def test_boxdetail(): headers = { "authority": "wechatapp.ichibankuji.cn", "accept": "*/*", "accept-language": "zh-CN,zh;q=0.9", "authorization": "7d04b7ZDRB9Vb65wzF4G6!1xyVJssI4IR!1zre6RpycuTj2sZm3Fi8UAH6MWYSwNXxKdjcSYJ3sHeZm!1bVUMVa2A295TA==", "content-type": "application/json", "referer": "https://servicewechat.com/wxd21e3190b2a44f73/21/page-frame.html", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "terminalos": "YFSXZF", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c33) XWEB/9129", "xweb_xhr": "1" } url = "https://wechatapp.ichibankuji.cn/wechat/yfs/firstBoxDetail" # data = { # "da": "ssB20vtJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr7XIZ7YGVs8AcEOmSfhlz/+5BiZQXv6PS329MWxHrSbuhLwwyqZfHGNqP2CKzweRzmqwL/nj2D3zd8Su96eyrCx+0+4Q/6jBhNNiRg8eaW3E9Y+5PmRdyItuydMbDWc5uA=" # } """ "{"miniName":"YFSXZF","nonceStr":"eNjXXEYNNHiji3BCy6m8PFs7eBneZ6fB","queueMode":2,"setId":"9882","time":1765963408861}" "{"boxId":84301,"commentId":0,"miniName":"YFSXZF","nonceStr":"64PZEyTKQsC6cX8FWNKcAZ2Zr8QAEk7T","startTime":"","time":1765963457147}" "{"buyNum":80,"miniName":"YFSXZF","nonceStr":"EkjQQkSYarsWdjykFjAraQ2SXMmmXEPJ","pageNum":1,"pageSize":100,"productId":9882,"time":1765963504672,"type":1}" """ original_data = { "queueMode": 2, "setId": "9882" } request_data = create_request_data(original_data) payload = { "da": request_data } response = requests.post(url, headers=headers, json=payload) print(response.text) print(response) def test_draw(): headers = { "authority": "wechatapp.ichibankuji.cn", "accept": "*/*", "accept-language": "zh-CN,zh;q=0.9", # "authorization": "7d04b7ZDRB9Vb65wzF4G6!1xyVJssI4IR!1zre6RpycuTj2sZm3Fi8UAH6MWYSwNXxKdjcSYJ3sHeZm!1bVUMVa2A295TA==", "content-type": "application/json", "referer": "https://servicewechat.com/wxd21e3190b2a44f73/21/page-frame.html", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "terminalos": "YFSXZF", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c33) XWEB/9129", "xweb_xhr": "1" } url = "https://wechatapp.ichibankuji.cn/wechat/yfs/getBoxDrawLog" # data = { # "da": "uO9f53IZgBHpi/l7iN2eu3MfwMsBfYtK0eJTXuKAii4+3zCldZE24R/vWUbRFLfvwdm5QCsWJ5pSEq7f48nPOIfhaST5NZn2H3uJSbj/tcC/cXI5He79UNx2uULpFXxLhP6iVhvKmUuxt9bpZ8TzSIw/bAZNaSXafp5GgWORhDTMx/YBnhZGrFp345Y32X7Qpw" # } original_data = { "boxId": 84301, "pageSize": 30, "isMine": 0, "pageNum": 1 } """ "{"boxId":84301,"commentId":0,"miniName":"YFSXZF","nonceStr":"RRxbFkS66F4saYPMwJPDn5pswCfCfHeY","startTime":"2025-12-17 17:25:04","time":1765963725767}" "{"boxId":84301,"isMine":0,"miniName":"YFSXZF","nonceStr":"7sfHGRhdwp23bndHKzbBR67RG2EP4pxR","pageNum":1,"pageSize":30,"time":1765963927009}" """ request_data = create_request_data(original_data) payload = { "da": request_data } response = requests.post(url, headers=headers, json=payload) print(response.text) print(response) # 示例使用 if __name__ == "__main__": # get_req() # test_boxdetail() test_draw() # test_getsetlist() # en_data = {"miniName": "YFSJJ", "nonceStr": "Rmn4Ee8WajfDimtfCTPhRfGmGrp7pXrB", "orderType": 0, "pageNum": 2, "pageSize": 10, "status": 0, "time": 1765524424213, "type": 1} # generate_sign(en_data) # 404a70c1316dd2b0b234d6cb5d25d8c3 # y = "ssB0tJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr58IvkiE/orkJbZG+zg/g+fqP+J6wOBxsxo3+xBbc3J10pvq0el2y2mnxWMDL8TlBnNRnLu5l2SsmKM/C8QFg16" # print(d(y)) # "ssBp0ntJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr58IvkiE/orkJbZG+zg/g+fqP+J6wOBxsxo3+xBbc3J10pvq0el2y2mnxWMDL8TlBnNRnLu5l2SsmKM/C8QFg16" # ssBf0tnJIFaPpO+oDa/FVfaEedp/7js3I0kaRkoTVblr58IvkiE/orkJbZG+zg/g+fqP+J6wOBxsxo3+xBbc3J10pvq0el2y2mnxWMDL8TlBnNRnLu5l2SsmKM/C8QFg1