diff --git a/dml.py b/dml.py new file mode 100644 index 0000000..2d856af --- /dev/null +++ b/dml.py @@ -0,0 +1,273 @@ +''' +name:达美乐最新脚本V2 +author:食翔狂魔 +desc:加密参数改为每个账号独立获取 +ck格式:备注#openid#Authorization 多号@连接,需要自行搭建接口,穿透出去后填到apiUrl那儿 +version:v3.7 +''' +import os +import asyncio +import aiohttp +from os import environ, path +import datetime +import requests +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +KAMI = "食翔狂魔" #卡密,不用动 +apiUrl = '自己搭建的接口' #必填 +KAMI2 = "" #狂魔自己用的其它人不需要不用管 +isAutoLogin = False #狂魔自己用的其它人不需要不用管 + +send="" +giftName = { + "001": '一等奖 免费披萨券', + "002": '二等奖 半价披萨券', + "003": '三等奖 免费嫩汁鸡块券', + "004": '四等奖 免费任意口味一对烤翅券', + "005": '五等奖 免费招牌蛋挞', + "006": '六等奖 免费当季特饮', +} +globalScore = {} + +TARGET_HOUR = 10 # 目标小时 +TARGET_MINUTE = 31 # 目标分钟 +TARGET_DELAY_MS = 1 # 提前xxx毫秒 + +# 加载通知服务函数保持不变 +def load_send(): + global send + cur_path = path.abspath(path.dirname(__file__)) + if path.exists(cur_path + "/notify.py"): + try: + from notify import send + print("加载通知服务成功!") + except ImportError: + send = None + print("加载通知服务失败~") + else: + send = None + print("加载通知服务失败~") + +#load_send() +def getJm(t,openid="",remark=""): + json_data = {'kami': KAMI, 'jmtype': t,'openid':openid} + + response = requests.post(apiUrl, json=json_data) + data = response.json() + if "error" not in data and len(data["result"]) > 0: + print(f"【{remark}】调用{t}加密接口成功! " + data["msg"]) + return data["result"] + else: + print(f"【{remark}】调用{t}加密接口失败! " + response.text) + getJm(t,openid) + return False +def getCode(): + json_data = {'kami': KAMI2, 'jmtype': "wxcode","openid":"132"} + + response = requests.post(apiUrl, json=json_data) + data = response.json() + return data["code"] +def login(e=""): + url = 'https://game.dominos.com.cn/spring/v2/onLogin?code=' + getCode() + response = requests.get(url) + return response.json()["content"]["accessToken"] +async def getIsPsza(session, account, message_list, remark, gameid,token): + try: + arrAc = account.split("#") + url = f"https://game.dominos.com.cn/{gameid}/v2/game/myPrize?pageSize=10000" + params = {'openid': arrAc[0]} + + headers = { + 'User-Agent': "Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro Zoom Edition Build/SKQ1.211006.001; wv) AppleWebKit/537.36", + 'Authorization':"Bearer " + token + } + + async with session.get(url, params=params, headers=headers) as response: + data = await response.json() + if data["errorMessage"] == "UNAUTHORIZED_ERROR": + print(f"【{remark}】:登录失效。") + id_counts = {} + for item in data["content"]: + gid = item['id'] + if gid in id_counts: + id_counts[gid] += 1 + else: + id_counts[gid] = 1 + for gid, count in id_counts.items(): + print(f"【{remark},{giftName[gid]}】:{count} 张。") + message_list.append(f"【{remark},{giftName[gid]}】:{count} 张。" + "
\n") + if data["statusCode"] == 0 and any(d.get("id") == "001" for d in data["content"]): + return f"{arrAc[0]},恭喜,已获得过免费披萨!" + elif data["statusCode"] == 0: + return f"{arrAc[0]},遗憾,还未获得免费披萨!" + else: + return "用户不存在" + except Exception as e: + print(f"getIsPsza error: {e}") + return str(e) + +async def share_done(session, openid, message_list, remark, gameid,token): + shrurl = f"https://game.dominos.com.cn/{gameid}/v2/game/sharingDone" + payload ={ + "openid": openid, + "from": 1, + "target": 0, + "encrypt": globalScore[openid+"gshare"] + } + headers = { + 'Content-Type': "application/x-www-form-urlencoded", + 'Referer': "https://servicewechat.com/wx887bf6ad752ca2f3/63/page-frame.html", + 'Authorization':"Bearer " + token + } + tag = True + while True: + try: + async with session.post(shrurl, data=payload, headers=headers) as res: + data = await res.json() + print(f"【{remark}】开始执行分享:") + if data['errorMessage'] == "UNAUTHORIZED_ERROR": + print(f"【{remark}】"+"登陆失效,重抓Authorization") + tag = False + break + if data['errorMessage'] == "今日分享已用完,请明日再来": + message_list.append(f"【{remark}】" + "分享:今日分享已用完,请明日再来" + "
\n") + print(f"【{remark}】"+f'分享:今日分享已用完,请明日再来') + break + elif data['errorMessage'] == "用户不存在": + message_list.append(f"【{remark}】" + "分享:用户不存在" + "
\n") + print(f"【{remark}】" + "分享:用户不存在") + tag = False + break + elif data['errorMessage'] == "异常": + print(f"【{remark}】" + "分享:异常") + message_list.append(f"【{remark}】" + "分享:异常" + "
\n") + tag = False + break + else: + print(f"【{remark}】" + "分享:成功!") + break + except Exception as e: + print(f"share_done: {e}") + break + return tag + +async def game_done(session, openid, score, message_list, remark, gameid,token): + url = f"https://game.dominos.com.cn/{gameid}/v2/game/gameDone" + payload = { + 'openid': "ojOaM5ILuObRk-csjx92hCR_ThhQ", + 'score': globalScore[openid+"gscore"], + 'tempId': "null" + } + headers = { + 'User-Agent': "Mozilla/5.0 (Linux; Android 15; PKG110 Build/UKQ1.231108.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.103 Mobile Safari/537.36 XWEB/1300333 MMWEBSDK/20240404 MMWEBID/9496 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android", + 'Accept-Encoding': "gzip,compress,br,deflate", + 'authorization': "Bearer " + token, + 'charset': "utf-8", + 'Referer': "https://servicewechat.com/wx887bf6ad752ca2f3/72/page-frame.html" + } + while True: + try: + async with session.post(url, data=payload, headers=headers) as response: + data = await response.json() + print(f"【{remark}】开始执行游戏:") + if data["statusCode"] == 0: + prize = data['content']['name'] + now = datetime.datetime.now() + formatted_time = now.strftime('%Y-%m-%d %H:%M:%S') + ',{:03d}'.format(now.microsecond // 1000) + print(f"【{remark}】{prize}") + message_list.append(f"【{remark}】{prize}
\n") + else: + err = data['errorMessage'] + print(f"【{remark}】{err}") + message_list.append(f'【{remark}】{err}
\n') + break + break + except Exception as e: + print(f"game_done error: {e}") + break + +async def process_account(session, account, message_list, stats, gameid): + arrAc = account.split("#") + if isAutoLogin == True and arrAc[0]=="狂魔2": + arrAc[2] = login() + print(arrAc[2]) + rshare = await share_done(session, arrAc[1], message_list, arrAc[0], gameid,arrAc[2]) + + # if rshare == False: + # return + await game_done(session, arrAc[1], "", message_list, arrAc[0], gameid,arrAc[2]) + + strispsza = await getIsPsza(session, account, message_list, arrAc[0], gameid,arrAc[2]) + message_part = f"
\n账号【{arrAc[0]}】:\n
{strispsza}\n
" + + if "恭喜" in strispsza: + stats['hasWin'].append(f"【{arrAc[0]}】") + stats['hasCount'] += 1 + message_list.append(message_part) + +async def main(): + # 定义需要并发处理的游戏ID元组及其对应的环境变量名 + gameids_and_envvars = ( + ("spring", "dmlck2"), + #("bocconcini", "dmlck") + ) + + async with aiohttp.ClientSession() as session: + tasks = [] + all_message_lists = {} + all_stats = {} + + for gameid, env_var in gameids_and_envvars: + accounts = environ.get(env_var) + if not accounts: + print(f'环境变量 {env_var} 未填写!') + continue + + accounts_list = accounts.split('@') + num_of_accounts = len(accounts_list) + print(f"获取到 {num_of_accounts} 个账号对于 gameid {gameid}") + + message_list = [] + stats = {'hasCount': 0, 'hasWin': [],'allCount':num_of_accounts} + all_message_lists[gameid] = message_list + all_stats[gameid] = stats + + for account in accounts_list: + aarr = account.split("#") + gscore = getJm("score",aarr[1],aarr[0]) + if gscore == False: + continue + globalScore[account.split("#")[1]+"gscore"] = gscore + gshare = getJm("share",aarr[1],aarr[0]) + if gshare == False: + continue + globalScore[account.split("#")[1]+"gshare"] = gshare + task = asyncio.create_task(process_account(session, account, message_list, stats, gameid)) + tasks.append(task) + + await asyncio.gather(*tasks) + + final_messages = [] + for gameid, message_list in all_message_lists.items(): + stats = all_stats[gameid] + message = ''.join(message_list) + message += f'中奖情况({gameid}):{stats["hasCount"]}/{stats["allCount"]}
\n' + message += f'部分已中奖名单({gameid}):{"、".join(stats["hasWin"])}
\n' + final_messages.append(message) + + final_message = '\n'.join(final_messages) + + if send: + print("\n\n\n\nfinal_message") + print(final_message) + #send('达美乐', final_message) + else: + print("\n\n\n\nfinal_message") + print(final_message) + +if __name__ == '__main__': + for i in range(30): + + asyncio.run(main()) + + time.sleep(30)