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)