diff --git a/团币.py b/团币.py new file mode 100644 index 0000000..24ee402 --- /dev/null +++ b/团币.py @@ -0,0 +1,288 @@ +""" + +time:2023.10.24 +定时:一天至少3-5次 +正常是每天700+币 +new Env('美团小团币游戏中心'); +抓包小程序或者app或者网页的token=Agxxxx 只要token后面的值 +环境变量: 名称:bd_mttoken 值:Agxxxxxxxxxx +多账号新建变量或者用 & 分开 +并发变量: bd_xtbbf = 1 默认不设置为1 + +更新日志: +10.24: 关闭授权,开源 +9.26: 优化报错,并发变量 +9.24: 新增账号并发运行 +9.23: 新增每日获取小团币,异常重试 + +""" +import random +import base64 +import os +import requests +import time +import string +from functools import partial +from user_agent import generate_user_agent +import threading + + +class Mttb: + def __init__(self, ck, num): + self.num = num + self.ck = ck + self.name = None + self.name = None + self.usid = None + self.actoken = None + self.xtb = None + self.wcxtb = None + self.ids = [] + self.ids1 = [] + self.id = None + self.tid = None + self.ua = generate_user_agent(os='android') + self.t_h = None + self.msg = '' + self.start = '' + self.end = '' + + def main(self): + if self.login(): + self.act() + self.cxtb() + if self.get_ids(): + self.get_id() + + def login(self): + try: + url = "https://open.meituan.com/user/v1/info/auditting?fields=auditAvatarUrl%2CauditUsername" + h = { + 'Connection': 'keep-alive', + 'Origin': 'https://mtaccount.meituan.com', + 'User-Agent': self.ua, + 'token': self.ck, + 'Referer': 'https://mtaccount.meituan.com/user/', + 'Accept-Encoding': 'gzip, deflate', + 'Accept-Language': 'zh-CN,en-US;q=0.9', + 'X-Requested-With': 'com.sankuai.meituan', + } + r = requests.get(url, headers=h) + + if 'username' in r.text: + rj = r.json() + self.name = rj["user"]["username"] + self.usid = rj["user"]["id"] + xx = f'😶账号{self.num}\n🆔{self.name}\n' + self.start += xx + return True + else: + print(r.json()) + except Exception as e: + print(f'登录异常:{e}') + exit(0) + + def act(self): + try: + url = 'https://game.meituan.com/mgc/gamecenter/front/api/v1/login' + h = { + 'Accept': 'application/json, text/plain, */*', + 'Content-Length': '307', + 'x-requested-with': 'XMLHttpRequest', + 'User-Agent': self.ua, + 'Content-Type': 'application/json;charset=UTF-8', + 'cookie': f'token={self.ck}' + } + sing = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) + data = { + "mtToken": self.ck, + "deviceUUID": '0000000000000A3467823460D436CAB51202F336236F6A167191373531985811', + "mtUserId": self.usid, + "idempotentString": sing + } + r = requests.post(url, headers=h, json=data) + if r.json()['data']['loginInfo']['accessToken'] is not None: + self.actoken = r.json()['data']['loginInfo']['accessToken'] + else: + print(r.json()) + except Exception as e: + print(f'获取token异常:{e}') + exit(0) + + def cxtb(self): + try: + url = 'https://game.meituan.com/mgc/gamecenter/skuExchange/resource/counts?sceneId=3&gameId=10102' + self.t_h = { + 'Accept': 'application/json, text/plain, */*', + 'x-requested-with': 'XMLHttpRequest', + 'User-Agent': self.ua, + 'Content-Type': 'application/json;charset=UTF-8', + 'mtgsig': '', + 'actoken': self.actoken, + 'mtoken': self.ck, + 'cookie': f'token={self.ck}' + } + r = requests.get(url, headers=self.t_h) + rj = r.json() + if rj['msg'] == 'ok': + data = rj['data'] + for d in data: + if self.xtb is not None: + self.wcxtb = d['count'] + xx = f'💰当前小团币: {int(self.wcxtb)}({int(self.wcxtb) / 1000}元)\n' + self.end += xx + else: + self.xtb = d['count'] + xx = f'💰小团币: {int(self.xtb)}({int(self.xtb) / 1000}元)\n' + self.start += xx + print(self.start) + except Exception as e: + print(f'🆔{self.name}>>>⚠️查询团币异常:{e}') + + def get_ids(self): + try: + url = 'https://game.meituan.com/mgc/gamecenter/front/api/v1/mgcUser/task/queryMgcTaskInfo' + data = { + "externalStr": "", + "riskParams": {} + } + r = requests.post(url, headers=self.t_h, json=data) + rj = r.json() + if rj['msg'] == 'ok': + data_list = r.json()['data']['taskList'] + for i in data_list: + self.ids.append(i['id']) + if self.ids: + random.shuffle(self.ids) + # print(self.ids) + return True + else: + print(f'{self.name}>>>获取任务失败!') + except Exception as e: + print(f'获取任务异常:{e}') + exit(0) + + def get_id(self): + for idd in self.ids: + self.id = idd + if self.get_game(): + self.post_id() + xx = f'😊账号{self.num}\n🆔{self.name}>>>🎉运行完成!\n' + self.end += xx + self.cxtb() + bchd = int(self.wcxtb) - int(self.xtb) + xx = f'🔔获取小团币: {bchd}\n' + self.end += xx + print(self.end) + + def b64(self): + y_bytes = base64.b64encode(self.tid.encode('utf-8')) + y_bytes = y_bytes.decode('utf-8') + return y_bytes + + def get_game(self): + try: + self.tid = f'mgc-gamecenter{self.id}' + self.tid = self.b64() + url = f'https://game.meituan.com/mgc/gamecenter/common/mtUser/mgcUser/task/finishV2?taskId={self.tid}' + r = requests.get(url, headers=self.t_h) + if r.status_code == 200: + if r.json()['msg'] == 'ok': + # print(f'{self.name}>>>{self.id} 领取任务成功!') + time.sleep(1) + return True + elif '完成过' in r.text: + # print(f'{self.name}>>>{self.id} 完成过领取任务成功!') + time.sleep(1) + return True + else: + print(f'🆔{self.name}>>>🌚任务状态: {r.text}') + else: + print(f'🆔{self.name}>>>请求错误: ', r.status_code) + except Exception as e: + print(f'🆔{self.name}>>>⚠️获取任务异常:{e}') + + def post_id(self): + try: + url = 'https://game.meituan.com/mgc/gamecenter/front/api/v1/mgcUser/task/receiveMgcTaskReward?yodaReady=h5&csecplatform=4&csecversion=2.1.0&mtgsig={}' + data = { + "taskId": self.id, + "externalStr": "", + "riskParams": {} + } + r = requests.post(url, headers=self.t_h, json=data) + if r.status_code == 200: + if r.json()['msg'] == 'ok': + # print(f'{self.name}>>>{self.id},完成任务!\n') + time.sleep(1) + elif '异常' in r.text: + # print(f'{self.name}>>>{self.id},状态异常,任务不可领奖!\n') + time.sleep(1) + else: + print(f'{self.name}>>>{self.id},{r.text}\n') + time.sleep(1) + else: + print('请求错误!') + except Exception as e: + print(f'🆔{self.name}>>>⚠️完成任务异常:{e}') + + +if __name__ == '__main__': + print = partial(print, flush=True) + print('🔔当前版本V10.24\n🔔tg频道:https://t.me/dzr_byg') + + token = os.environ.get("bd_mttoken") + if token is None: + print(f'⛔️未获取到ck变量:请检查变量是否填写') + exit(0) + if '&' in token: + tokens = token.split('&') + else: + tokens = [token] + + bf = os.environ.get("bd_xtbbf") + if bf is None: + print(f'⛔️为设置并发变量,默认1') + bf = 2 + + print(f'✅获取到{len(tokens)}个账号') + print(f'🔔设置并发数: {bf}') + + + def run_account(tk, n): + run = Mttb(tk, n) + run.main() + + + threads = [] + s_e = [] + for i in range(len(tokens)): + a = i + 1 + s_e.append(a) + t = threading.Thread(target=run_account, args=(tokens[i], a,)) + threads.append(t) + if str(len(threads)) == str(bf): + print(f'==================⏳账号{s_e[0]}-{s_e[-1]}==================') + for t in threads: + t.start() + time.sleep(5) + print(f'⏳账号{s_e[0]}-{s_e[-1]}任务运行中!') + for t in threads: + t.join() + threads = [] + s_e = [] + time.sleep(5) + if threads == [] and s_e == []: + print(f'🔔全部账号运行完成!!!') + else: + print(f'==================账号{s_e[0]}-{s_e[-1]}==================') + for t in threads: + t.start() + time.sleep(3) + print(f'⏳账号{s_e[0]}-{s_e[-1]}任务运行中!') + for t in threads: + t.join() + threads = [] + s_e = [] + time.sleep(5) + print(f'🔔全部账号运行完成!!!')