Create dml.py

达美乐
This commit is contained in:
sxkm 2025-04-08 13:59:03 +08:00 committed by GitHub
parent dffbcce02d
commit 837c4c5bc0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

273
dml.py Normal file
View File

@ -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} 张。" + "<br />\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}" + "分享:今日分享已用完,请明日再来" + "<br />\n")
print(f"{remark}"+f'分享:今日分享已用完,请明日再来')
break
elif data['errorMessage'] == "用户不存在":
message_list.append(f"{remark}" + "分享:用户不存在" + "<br />\n")
print(f"{remark}" + "分享:用户不存在")
tag = False
break
elif data['errorMessage'] == "异常":
print(f"{remark}" + "分享:异常")
message_list.append(f"{remark}" + "分享:异常" + "<br />\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}<br />\n")
else:
err = data['errorMessage']
print(f"{remark}{err}")
message_list.append(f'{remark}{err}<br />\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"<br />\n账号【{arrAc[0]}】:\n<br />{strispsza}\n<br />"
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"]}<br />\n'
message += f'部分已中奖名单({gameid}{"".join(stats["hasWin"])}<br />\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)