From 182f9c9fadc62038ae2376a78ad2728b6f21da05 Mon Sep 17 00:00:00 2001 From: XiaoGe-LiBai <2381919454@qq.com> Date: Thu, 5 Dec 2024 15:02:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20dxhfmh.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dxhfmh.py | 480 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 dxhfmh.py diff --git a/dxhfmh.py b/dxhfmh.py new file mode 100644 index 0000000..39c6d22 --- /dev/null +++ b/dxhfmh.py @@ -0,0 +1,480 @@ +import requests +import re +import time +import json +import random +import datetime +import base64 +import threading +import ssl +import execjs +import os +import sys + +from bs4 import BeautifulSoup + +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_v1_5 +from Crypto.Cipher import DES3 +from Crypto.Util.Padding import pad, unpad +from Crypto.Util.strxor import strxor +from Crypto.Cipher import AES +from http import cookiejar # Python 2: import cookielib as cookiejar +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.ssl_ import create_urllib3_context + + +class BlockAll(cookiejar.CookiePolicy): + return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False + netscape = True + rfc2965 = hide_cookie2 = False + +def printn(m): + print(f'\n{m}') +ORIGIN_CIPHERS = ('DEFAULT@SECLEVEL=1') + +ip_list = [] +class DESAdapter(HTTPAdapter): + def __init__(self, *args, **kwargs): + """ + A TransportAdapter that re-enables 3DES support in Requests. + """ + CIPHERS = ORIGIN_CIPHERS.split(':') + random.shuffle(CIPHERS) + CIPHERS = ':'.join(CIPHERS) + self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5' + super().__init__(*args, **kwargs) + + def init_poolmanager(self, *args, **kwargs): + context = create_urllib3_context(ciphers=self.CIPHERS) + kwargs['ssl_context'] = context + return super(DESAdapter, self).init_poolmanager(*args, **kwargs) + + def proxy_manager_for(self, *args, **kwargs): + context = create_urllib3_context(ciphers=self.CIPHERS) + kwargs['ssl_context'] = context + return super(DESAdapter, self).proxy_manager_for(*args, **kwargs) + + +requests.packages.urllib3.disable_warnings() +ssl_context = ssl.create_default_context() +ssl_context.check_hostname = False +ssl_context.verify_mode = ssl.CERT_NONE +ssl_context.set_ciphers('DEFAULT@SECLEVEL=0') +ss = requests.session() +ss.ssl=ssl_context +ss.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"} +ss.mount('https://', DESAdapter()) +yc = 0.1 +wt = 0 +kswt = 0 +yf = datetime.datetime.now().strftime("%Y%m") + + +jp = {"9":{},"12":{},"13":{},"23":{}} + + +try: + with open('电信金豆换话费.log') as fr: + dhjl = json.load(fr) +except: + dhjl = {} +if yf not in dhjl: + dhjl[yf] = {} + + + + +wxp={} +errcode = { + "0":"兑换成功", + "412":"兑换次数已达上限", + "413":"商品已兑完", + "420":"未知错误", + "410":"该活动已失效~", + "Y0001":"当前等级不足,去升级兑当前话费", + "Y0002":"使用翼相连网络600分钟或连接并拓展网络500分钟可兑换此奖品", + "Y0003":"使用翼相连共享流量400M或共享WIFI:2GB可兑换此奖品", + "Y0004":"使用翼相连共享流量2GB可兑换此奖品", + "Y0005":"当前等级不足,去升级兑当前话费", + "E0001":"您的网龄不足10年,暂不能兑换" +} + + + +#加密参数 +key = b'1234567`90koiuyhgtfrdews' +iv = 8 * b'\0' + +public_key_b64 = '''-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB +-----END PUBLIC KEY-----''' + +public_key_data = '''-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+ugG5A8cZ3FqUKDwM57GM4io6JGcStivT8UdGt67PEOihLZTw3P7371+N47PrmsCpnTRzbTgcupKtUv8ImZalYk65dU8rjC/ridwhw9ffW2LBwvkEnDkkKKRi2liWIItDftJVBiWOh17o6gfbPoNrWORcAdcbpk2L+udld5kZNwIDAQAB +-----END PUBLIC KEY-----''' + + +def t(h): + date = datetime.datetime.now() + date_zero = datetime.datetime.now().replace(year=date.year, month=date.month, day=date.day, hour=h, minute=59, second=59) + date_zero_time = int(time.mktime(date_zero.timetuple())) + return date_zero_time + + + +def encrypt(text): + cipher = DES3.new(key, DES3.MODE_CBC, iv) + ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size)) + return ciphertext.hex() + +def decrypt(text): + ciphertext = bytes.fromhex(text) + cipher = DES3.new(key, DES3.MODE_CBC, iv) + plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size) + return plaintext.decode() + + + +def b64(plaintext): + public_key = RSA.import_key(public_key_b64) + cipher = PKCS1_v1_5.new(public_key) + ciphertext = cipher.encrypt(plaintext.encode()) + return base64.b64encode(ciphertext).decode() + +def encrypt_para(plaintext): + public_key = RSA.import_key(public_key_data) + cipher = PKCS1_v1_5.new(public_key) + ciphertext = cipher.encrypt(plaintext.encode()) + return ciphertext.hex() + + +def encode_phone(text): + encoded_chars = [] + for char in text: + encoded_chars.append(chr(ord(char) + 2)) + return ''.join(encoded_chars) + +def ophone(t): + key = b'34d7cb0bcdf07523' + utf8_key = key.decode('utf-8') + utf8_t = t.encode('utf-8') + cipher = AES.new(key, AES.MODE_ECB) + ciphertext = cipher.encrypt(pad(utf8_t, AES.block_size)) + return ciphertext.hex() + +def send(uid,content): + r = requests.post('https://wxpusher.zjiecode.com/api/send/message',json={"appToken":"AT_3hr0wdZn5QzPNBbpTHFXawoDIsSUmPkN","content":content,"contentType":1,"uids":[uid]}).json() + return r + + +def userLoginNormal(phone,password): + alphabet = 'abcdef0123456789' + uuid = [''.join(random.sample(alphabet, 8)),''.join(random.sample(alphabet, 4)),'4'+''.join(random.sample(alphabet, 3)),''.join(random.sample(alphabet, 4)),''.join(random.sample(alphabet, 12))] + timestamp=datetime.datetime.now().strftime("%Y%m%d%H%M%S") + loginAuthCipherAsymmertric = 'iPhone 14 15.4.' + uuid[0] + uuid[1] + phone + timestamp + password[:6] + '0$$$0.' + + r = ss.post('https://appgologin.189.cn:9031/login/client/userLoginNormal',json={"headerInfos": {"code": "userLoginNormal", "timestamp": timestamp, "broadAccount": "", "broadToken": "", "clientType": "#9.6.1#channel50#iPhone 14 Pro Max#", "shopId": "20002", "source": "110003", "sourcePassword": "Sid98s", "token": "", "userLoginName": phone}, "content": {"attach": "test", "fieldData": {"loginType": "4", "accountType": "", "loginAuthCipherAsymmertric": b64(loginAuthCipherAsymmertric), "deviceUid": uuid[0] + uuid[1] + uuid[2], "phoneNum": encode_phone(phone), "isChinatelecom": "0", "systemVersion": "15.4.0", "authentication": password}}}).json() + + + + l = r['responseData']['data']['loginSuccessResult'] + + if l: + load_token[phone] = l + with open(load_token_file, 'w') as f: + json.dump(load_token, f) + ticket = get_ticket(phone,l['userId'],l['token']) + return ticket + + return False +def get_ticket(phone,userId,token): + r = ss.post('https://appgologin.189.cn:9031/map/clientXML',data='getSingle'+datetime.datetime.now().strftime("%Y%m%d%H%M%S")+'#9.6.1#channel50#iPhone 14 Pro Max#20002110003Sid98s'+token+''+phone+'test'+encrypt(userId)+'4a6862274835b451',headers={'user-agent': 'CtClient;10.4.1;Android;13;22081212C;NTQzNzgx!#!MTgwNTg1'}) + + #printn(phone, '获取ticket', re.findall('(.*?)',r.text)[0]) + + tk = re.findall('(.*?)',r.text) + if len(tk) == 0: + return False + + + return decrypt(tk[0]) + + + +def queryInfo(phone,s): + global rs + a = 1 + while a < 10: + if rs: + bd = js.call('main').split('=') + ck[bd[0]] = bd[1] + + r = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryInfo',cookies=ck).json() + + try: + printn(f'📱:【{phone}】 🎁金豆余额 {r["biz"]["amountTotal"]}') + amountTotal= r["biz"]["amountTotal"] + except: + amountTotal = 0 + if amountTotal< 3000: + if rs == 1: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + + + res = s.post('http://wapact.189.cn:9000/gateway/stand/detail/exchange',json={"activityId":jdaid},cookies=ck).text + + if '$_ts=window' in res: + first_request() + rs = 1 + + time.sleep(3) + else: + return r + a += 1 + + + return r + + +def exchange(phone,s,title,aid, uid): + + try: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + r = s.post('https://wapact.189.cn:9001/gateway/stand/detailNew/exchange',json={"activityId":aid},cookies=ck) + print(f"📱:【{phone}】响应码: {r.status_code} 💰️{title} {r.text}") + + if '$_ts=window' in r.text: + + first_request(r.text) + return + r = r.json() + + if r["code"] == 0: + if r["biz"] != {} and r["biz"]["resultCode"] in errcode: + #printn(str(datetime.datetime.now())[11:22], phone, title,errcode[r["biz"]["resultCode"]]) + print(f'📱:【{phone}】{str(datetime.datetime.now())[11:22]} 💰️{title} {errcode[r["biz"]["resultCode"]]}☑️\n') + + + if r["biz"]["resultCode"] in ["0","412"]: + if r["biz"]["resultCode"] == "0": + msg = "【高新顺和】📱:【"+phone + "】\n💰️" + title + " 兑换成功👍" + send(uid, msg) + if phone not in dhjl[yf][title]: + dhjl[yf][title] += "#"+phone + with open('电信金豆换话费.log', 'w') as f: + json.dump(dhjl, f, ensure_ascii=False) + + + else: + #printn(str(datetime.datetime.now())[11:22], phone, r["message"]) + printn(f'📱:【{phone}】开始兑换⌚️ {r}') + + except Exception as e: + #print(e) + pass + + +def dh(phone,s,title,aid,wt, uid): + + while wt > time.time(): + pass + + printn(f"📱:【{phone}】开始兑换⌚️{str(datetime.datetime.now())[11:22]} 💰️{title} 🚀\n") + + if rs: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + for cs in range(cfcs): + threading.Thread(target=exchange,args=(phone,s,title,aid, uid)).start() + #time.sleep(5) + + + +def lottery(s): + for cishu in range(3): + try: + if rs: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + else: + cookie = {} + r = s.post('https://wapact.189.cn:9001/gateway/golden/api/lottery',json={"activityId":"6384b49b1e44396da4f1e4a3"},cookies=ck) + except: + pass + time.sleep(3) + + +def ks(phone, ticket, uid): + global wt + + wxp[phone] = uid + s = requests.session() + s.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"} + s.cookies.set_policy(BlockAll()) + s.mount('https://', DESAdapter()) + s.timeout = 30 + if rs: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + + + login = s.post('https://wapact.189.cn:9001/unified/user/login',json={"ticket":ticket,"backUrl":"https%3A%2F%2Fwapact.189.cn%3A9001","platformCode":"P201010301","loginType":2}, cookies=ck).json() + if login['code'] == 0: + printn(f"📱:【{phone}】 获取token成功✔️") + s.headers["Authorization"] = "Bearer " + login["biz"]["token"] + + queryInfo(phone,s) + + + if rs: + bd = js.call('main').split('=') + ck [bd[0]] = bd[1] + + queryBigDataAppGetOrInfo = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryBigDataAppGetOrInfo?floorType=0&userType=1&page&1&order=2&tabOrder=',cookies=ck).json() + #printn(queryBigDataAppGetOrInfo) + for i in queryBigDataAppGetOrInfo["biz"]["ExchangeGoodslist"]: + if '话费' not in i["title"]:continue + + if '0.5元' in i["title"] or '5元' in i["title"]: + jp["9"][i["title"]] = i["id"] + elif '1元' in i["title"] or '10元' in i["title"]: + jp["13"][i["title"]] = i["id"] + else: + jp["12"][i["title"]] = i["id"] + + + + h = datetime.datetime.now().hour + if 11 > h > 1: + h = 9 + + elif 23 > h > 1: + h = 13 + + else: + h = 23 + + if len(sys.argv) ==2: + h = int(sys.argv[1]) + #h=23 + d = jp[str(h)] + + wt = t(h) + kswt + + if jp["12"] != {}: + d.update(jp["12"]) + wt = 0 + + for di in d: + #if '5' in di: + if di not in dhjl[yf]: + dhjl[yf][di] = "" + if phone in dhjl[yf][di] : + print(f"📱:【{phone}】 💰️{di} 已兑换✔️") + + else: + + print(f"📱:【{phone}】 💰️{di} 未兑换❌️") + if wt - time.time() > 20 * 60: + print("等待时间超过20分钟") + return + + + threading.Thread(target=dh,args=(phone,s,di,d[di],wt, uid)).start() + + + else: + + printn(f"📱:【{phone}】 获取token {login['message']}") + + + +def first_request(res=''): + global js, fw + url = 'https://wapact.189.cn:9001/gateway/stand/detail/exchange' + if res == '': + response = ss.get(url) + res = response.text + soup = BeautifulSoup(res, 'html.parser') + scripts = soup.find_all('script') + for script in scripts: + if 'src' in str(script): + rsurl = re.findall('src="([^"]+)"', str(script))[0] + + if '$_ts=window' in script.get_text(): + ts_code = script.get_text() + + + urls = url.split('/') + rsurl = urls[0] + '//' + urls[2] + rsurl + #print(rsurl) + ts_code += ss.get(rsurl).text + content_code = soup.find_all('meta')[1].get('content') + with open("瑞数通杀.js") as f: + js_code_ym = f.read() + js_code = js_code_ym.replace('content_code', content_code).replace("'ts_code'", ts_code) + js = execjs.compile(js_code) + + for cookie in ss.cookies: + ck[cookie.name] = cookie.value + return content_code, ts_code, ck + + + +def main(): + global wt,rs + r = ss.get('https://wapact.189.cn:9001/gateway/stand/detailNew/exchange') + if '$_ts=window' in r.text: + rs = 1 + print("瑞数加密✅已开启") + first_request() + else: + print("瑞数加密❎️已关闭") + rs = 0 + if os.environ.get('jdhf')!= None: + chinaTelecomAccount = os.environ.get('jdhf') + else: + chinaTelecomAccount = jdhf + + for i in chinaTelecomAccount.split('&'): + + i = i.split('@') + phone = i[0] + password = i[1] + uid = i[-1] + ticket = False + + #ticket = get_userTicket(phone) + + if phone in load_token: + printn(f'📱:【{phone}】 使用缓存登录💾') + ticket = get_ticket(phone,load_token[phone]['userId'],load_token[phone]['token']) + + if ticket == False: + printn(f'📱:【{phone}】 使用密码登录🗝️') + ticket = userLoginNormal(phone,password) + + if ticket: + threading.Thread(target=ks,args=(phone, ticket, uid)).start() + + time.sleep(1) + else: + printn(f'📱:【{phone}】 登录失败🈲') + +appToken="" +uid = "" +jdhf = "13335094753@199221&13365322463@137054" +cfcs = 5 +jdaid = '60dd79533dc03d3c76bdde30' +ck = {} +load_token_file = 'chinaTelecom_cache.json' +try: + with open(load_token_file, 'r') as f: + load_token = json.load(f) +except: + load_token = {} + +main()