| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- # -*- 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
|