diff --git a/sfsy.py b/sfsy.py index 69fc0c4..46ebcc2 100644 --- a/sfsy.py +++ b/sfsy.py @@ -1,72 +1,65 @@ -# !/usr/bin/python3 -# -- coding: utf-8 -- -# ------------------------------- -# @Author : github@arvinsblog https://github.com/arvinsblog/deepsea -# @Time : 2025-3-19 13:30:25 -# 收集和修复能用的脚本 -# ------------------------------- +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + """ -打开小程序或APP-我的-积分, 捉以下几种url之一,把整个url放到变量 sfsyUrl 里,多账号换行分割 -https://mcs-mimp-web.sf-express.com/mcs-mimp/share/weChat/shareGiftReceiveRedirect -https://mcs-mimp-web.sf-express.com/mcs-mimp/share/app/shareRedirect -每天跑一到两次就行 +顺丰速运自动化脚本 +来源: +- https://github.com/faintout/myself-script/blob/main/sfsy.py +- https://github.com/Xx1aoy1/scripts/blob/main/sf2.py + +功能: 遍历生活特权所有分组的券进行领券,完成任务领取丰蜜积分 +变量名: sfsyUrl +格式: 多账号用换行分割 +获取方式: +1. 顺丰APP绑定微信后,添加机器人发送“顺丰” +2. 打开小程序或APP-我的-积分,抓包以下URL之一: + - https://mcs-mimp-web.sf-express.com/mcs-mimp/share/weChat/shareGiftReceiveRedirect + - https://mcs-mimp-web.sf-express.com/mcs-mimp/share/app/shareRedirect +编码: 抓取URL后,使用 https://www.toolhelper.cn/EncodeDecode/Url 进行编码 + +Cron: 11 7 * * * """ -# cron: 11 6,9,12,15,18 * * * -# const $ = new Env("顺丰速运"); + import hashlib import json import os import random import time -import re from datetime import datetime, timedelta -from sys import exit import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning +from urllib.parse import unquote # 禁用安全请求警告 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) -IS_DEV = False - -if os.path.isfile('notify.py'): - from notify import send - print("加载通知服务成功!") -else: - print("加载通知服务失败!") +# 全局日志变量 send_msg = '' one_msg = '' - def Log(cont=''): + """记录日志""" global send_msg, one_msg print(cont) if cont: one_msg += f'{cont}\n' send_msg += f'{cont}\n' - -# 1905 #0945 #6332 #6615 2559 -inviteId = [ - '7B0443273B2249CB9CDB7B48B94DEC13', '809FAF1E02D045D7A0DB185E5C91CFB1', '', - '', ''] - +inviteId = [''] class RUN: def __init__(self, info, index): + """初始化账号信息""" global one_msg one_msg = '' split_info = info.split('@') url = split_info[0] - len_split_info = len(split_info) - last_info = split_info[len_split_info - 1] - self.send_UID = None - if len_split_info > 0 and "UID_" in last_info: - self.send_UID = last_info + self.send_UID = split_info[-1] if len(split_info) > 1 and "UID_" in split_info[-1] else None self.index = index + 1 - Log(f"\n---------开始执行第{self.index}个账号>>>>>") + self.s = requests.session() self.s.verify = False + self.headers = { 'Host': 'mcs-mimp-web.sf-express.com', 'upgrade-insecure-requests': '1', @@ -78,47 +71,55 @@ class RUN: 'sec-fetch-dest': 'document', 'accept-language': 'zh-CN,zh', 'platform': 'MINI_PROGRAM', - } + + # 32周年活动相关属性 + self.ifPassAllLevel = False + self.surplusPushTime = 0 + self.lotteryNum = 0 self.anniversary_black = False self.member_day_black = False self.member_day_red_packet_drew_today = False self.member_day_red_packet_map = {} - self.login_res = self.login(url) self.today = datetime.now().strftime('%Y-%m-%d') - self.answer = False self.max_level = 8 self.packet_threshold = 1 << (self.max_level - 1) + self.login_res = self.login(url) + def get_deviceId(self, characters='abcdef0123456789'): + """生成随机设备ID""" result = '' for char in 'xxxxxxxx-xxxx-xxxx': if char == 'x': result += random.choice(characters) - elif char == 'X': - result += random.choice(characters).upper() else: result += char return result def login(self, sfurl): - ress = self.s.get(sfurl, headers=self.headers) - # print(ress.text) - self.user_id = self.s.cookies.get_dict().get('_login_user_id_', '') - self.phone = self.s.cookies.get_dict().get('_login_mobile_', '') - self.mobile = self.phone[:3] + "*" * 4 + self.phone[7:] - if self.phone != '': - Log(f'用户:【{self.mobile}】登陆成功') - return True - else: - Log(f'获取用户信息失败') + """登录顺丰账号""" + try: + ress = self.s.get(sfurl, headers=self.headers) + self.user_id = self.s.cookies.get_dict().get('_login_user_id_', '') + self.phone = self.s.cookies.get_dict().get('_login_mobile_', '') + self.mobile = self.phone[:3] + "*" * 4 + self.phone[7:] if self.phone else '' + if self.phone: + Log(f'👤 账号{self.index}:【{self.mobile}】登陆成功') + return True + else: + Log(f'❌ 账号{self.index}获取用户信息失败') + return False + except Exception as e: + Log(f'❌ 登录异常: {str(e)}') return False def getSign(self): - timestamp = str(int(round(time.time() * 1000))) + """生成请求签名""" + timestamp = str(int(time.time() * 1000)) token = 'wwesldfs29aniversaryvdld29' sysCode = 'MCS-MIMP-CORE' - data = f'token={token}×tamp={timestamp}&sysCode={sysCode}' + data = f'token={token}×tamp={timestamp}&sysCode={sysCode}' signature = hashlib.md5(data.encode()).hexdigest() data = { 'sysCode': sysCode, @@ -128,123 +129,100 @@ class RUN: self.headers.update(data) return data - def do_request(self, url, data={}, req_type='post'): + def do_request(self, url, data=None, req_type='post', max_retries=3): + """发送HTTP请求""" self.getSign() - try: - if req_type.lower() == 'get': - response = self.s.get(url, headers=self.headers) - elif req_type.lower() == 'post': - response = self.s.post(url, headers=self.headers, json=data) - else: - raise ValueError('Invalid req_type: %s' % req_type) - res = response.json() - return res - except requests.exceptions.RequestException as e: - print('Request failed:', e) - return None - except json.JSONDecodeError as e: - print('JSON decoding failed:', e) - return None + for retry_count in range(max_retries): + try: + if req_type.lower() == 'get': + enkelt = self.s.get(url, headers=self.headers, timeout=30) + elif req_type.lower() == 'post': + response = self.s.post(url, headers=self.headers, json=data or {}, timeout=30) + else: + raise ValueError(f'Invalid req_type: {req_type}') + + response.raise_for_status() + return response.json() + + except (requests.exceptions.RequestException, json.JSONDisposeError) as e: + Log(f'❌ 请求失败 ({retry_count + 1}/{max_retries}): {str(e)}') + if retry_count < max_retries - 1: + time.sleep(2) + continue + return {'success': False, 'errorMessage': str(e)} + return {'success': False, 'errorMessage': 'All retries failed'} def sign(self): - print(f'>>>>>>开始执行签到') + """执行签到任务""" + Log('🎯 开始执行签到') json_data = {"comeFrom": "vioin", "channelFrom": "WEIXIN"} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~integralTaskSignPlusService~automaticSignFetchPackage' response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True: + if response.get('success'): count_day = response.get('obj', {}).get('countDay', 0) - if response.get('obj') and response['obj'].get('integralTaskSignPackageVOList'): + if response.get('obj', {}).get('integralTaskSignPackageVOList'): packet_name = response["obj"]["integralTaskSignPackageVOList"][0]["packetName"] - Log(f'>>>签到成功,获得【{packet_name}】,本周累计签到【{count_day + 1}】天') + Log(f'✨ 签到成功,获得【{packet_name}】,本周累计签到【{count_day + 1}】天') else: - Log(f'今日已签到,本周累计签到【{count_day + 1}】天') + Log(f'📝 今日已签到,本周累计签到【{count_day + 1}】天') else: - print(f'签到失败!原因:{response.get("errorMessage")}') - + Log(f'❌ 签到失败!原因:{response.get("errorMessage", "未知错误")}') def superWelfare_receiveRedPacket(self): - print(f'>>>>>>超值福利签到') - json_data = { - 'channel': 'czflqflqdlhbxcx' - } + """领取超值福利签到奖励""" + Log('🎁 超值福利签到') + json_data = {"channel": "czflqdlhbxcx"} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberActLengthy~redPacketActivityService~superWelfare~receiveRedPacket' - - try: - response = self.do_request(url, data=json_data) - - if response.get('success') == True: - gift_list = response.get('obj', {}).get('giftList', []) - if gift_list is None: # 检查 gift_list 是否为 None - gift_list = [] - - if response.get('obj', {}).get('extraGiftList', []): - extra_gift_list = response['obj']['extraGiftList'] - if extra_gift_list is not None: - gift_list.extend(extra_gift_list) - - gift_names = ', '.join([gift['giftName'] for gift in gift_list]) - receive_status = response.get('obj', {}).get('receiveStatus') - status_message = '领取成功' if receive_status == 1 else '已领取过' - Log(f'超值福利签到[{status_message}]: {gift_names}') - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print(f'超值福利签到失败: {error_message}') - - except Exception as e: - print(f'超值福利签到发生错误: {str(e)}') + response = self.do_request(url, data=json_data) + if response.get('success'): + gift_list = response.get('obj', {}).get('giftList', []) + if response.get('obj', {}).get('extraGiftList', []): + gift_list.extend(response['obj']['extraGiftList']) + gift_names = ', '.join([gift['giftName'] for gift in gift_list]) or '无奖励' + receive_status = response.get('obj', {}).get('receiveStatus') + status_message = '领取成功' if receive_status == 1 else '已领取过' + Log(f'🎉 超值福利签到[{status_message}]: {gift_names}') + else: + Log(f'❌ 超值福利签到失败: {response.get("errorMessage", "未知错误")}') - - def get_SignTaskList(self, END=False): - if not END: print(f'>>>开始获取签到任务列表') - json_data = { - 'channelType': '1', - 'deviceId': self.get_deviceId(), - } + def get_SignTaskList(self, end=False): + """获取签到任务列表""" + Log('🎯 开始获取签到任务列表' if not end else '💰 查询最终积分') + json_data = {"channelType": "1", "deviceId": self.get_deviceId()} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~integralTaskStrategyService~queryPointTaskAndSignFromES' response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True and response.get('obj') != []: + if response.get('success') and response.get('obj'): totalPoint = response["obj"]["totalPoint"] - if END: - Log(f'当前积分:【{totalPoint}】') - return - Log(f'执行前积分:【{totalPoint}】') - for task in response["obj"]["taskTitleLevels"]: - self.taskId = task["taskId"] - self.taskCode = task["taskCode"] - self.strategyId = task["strategyId"] - self.title = task["title"] - status = task["status"] - skip_title = ['用行业模板寄件下单', '去新增一个收件偏好', '参与积分活动'] - if status == 3: - print(f'>{self.title}-已完成') - continue - if self.title in skip_title: - print(f'>{self.title}-跳过') - continue - else: - # print("taskId:", taskId) - # print("taskCode:", taskCode) - # print("----------------------") + Log(f'💰 {"执行前" if not end else "当前"}积分:【{totalPoint}】') + if not end: + for task in response["obj"]["taskTitleLevels"]: + self.taskId = task["taskId"] + self.taskCode = task["taskCode"] + self.strategyId = task["strategyId"] + self.title = task["title"] + status = task["status"] + skip_title = ['用行业模板寄件下单', '去新增一个收件偏好', '参与积分活动'] + if status == 3: + Log(f'✨ {self.title}-已完成') + continue + if self.title in skip_title: + Log(f'⏭️ {self.title}-跳过') + continue self.doTask() - time.sleep(3) - self.receiveTask() + time.sleep(2) + self.receiveTask() def doTask(self): - print(f'>>>开始去完成【{self.title}】任务') - json_data = { - 'taskCode': self.taskCode, - } + """完成签到任务""" + Log(f'🎯 开始去完成【{self.title}】任务') + json_data = {"taskCode": self.taskCode} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonRoutePost/memberEs/taskRecord/finishTask' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'>【{self.title}】任务-已完成') - else: - print(f'>【{self.title}】任务-{response.get("errorMessage")}') + Log(f'✨ 【{self.title}】任务-{"已完成" if response.get("success") else response.get("errorMessage", "失败")}') def receiveTask(self): - print(f'>>>开始领取【{self.title}】任务奖励') + """领取签到任务奖励""" + Log(f'🎁 开始领取【{self.title}】任务奖励') json_data = { "strategyId": self.strategyId, "taskId": self.taskId, @@ -253,99 +231,74 @@ class RUN: } url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~integralTaskStrategyService~fetchIntegral' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'>【{self.title}】任务奖励领取成功!') - else: - print(f'>【{self.title}】任务-{response.get("errorMessage")}') + Log(f'✨ 【{self.title}】任务奖励-{"领取成功" if response.get("success") else response.get("errorMessage", "失败")}') def do_honeyTask(self): - # 做任务 + """完成丰蜜任务""" + Log(f'🎯 开始完成【{self.taskType}】任务') json_data = {"taskCode": self.taskCode} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberEs~taskRecord~finishTask' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'>【{self.taskType}】任务-已完成') - else: - print(f'>【{self.taskType}】任务-{response.get("errorMessage")}') + Log(f'✨ 【{self.taskType}】任务-{"已完成" if response.get("success") else response.get("errorMessage", "失败")}') def receive_honeyTask(self): - print('>>>执行收取丰蜜任务') - # 收取 - self.headers['syscode'] = 'MCS-MIMP-CORE' - self.headers['channel'] = 'wxwdsj' - self.headers['accept'] = 'application/json, text/plain, */*' - self.headers['content-type'] = 'application/json;charset=UTF-8' - self.headers['platform'] = 'MINI_PROGRAM' + """领取丰蜜任务奖励""" + Log(f'🎁 领取【{self.taskType}】丰蜜任务') + self.headers.update({ + 'syscode': 'MCS-MIMP-CORE', + 'channel': 'wxwdsj', + 'accept': 'application/json, text/plain, */*', + 'content-type': 'application/json;charset=UTF-8', + 'platform': 'MINI_PROGRAM' + }) json_data = {"taskType": self.taskType} - # print(json_data) url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~receiveHoney' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'收取任务【{self.taskType}】成功!') - else: - print(f'收取任务【{self.taskType}】失败!原因:{response.get("errorMessage")}') - - def get_coupom(self): - print('>>>执行领取生活权益领券任务') - # 领取生活权益领券 - # https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberGoods~pointMallService~createOrder + Log(f'✨ 收取任务【{self.taskType}】-{"成功" if response.get("success") else response.get("errorMessage", "失败")}') + def get_coupom(self, goods): + """领取优惠券""" json_data = { "from": "Point_Mall", "orderSource": "POINT_MALL_EXCHANGE", - "goodsNo": self.goodsNo, + "goodsNo": goods['goodsNo'], "quantity": 1, "taskCode": self.taskCode } url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberGoods~pointMallService~createOrder' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'>领券成功!') - else: - print(f'>领券失败!原因:{response.get("errorMessage")}') + return response.get('success') def get_coupom_list(self): - print('>>>获取生活权益券列表') - # 领取生活权益领券 - # https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberGoods~pointMallService~createOrder - - json_data = { - "memGrade": 1, - "categoryCode": "SHTQ", - "showCode": "SHTQWNTJ" - } + """获取优惠券列表""" + json_data = {"memGrade": 2, "categoryCode": "SHTQ", "showCode": "SHTQWNTJ"} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberGoods~mallGoodsLifeService~list' response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True: - goodsList = response["obj"][0]["goodsList"] - for goods in goodsList: - exchangeTimesLimit = goods['exchangeTimesLimit'] - if exchangeTimesLimit >= 7: - self.goodsNo = goods['goodsNo'] - print(f'当前选择券号:{self.goodsNo}') - self.get_coupom() - break + if response.get('success'): + all_goods = [] + for obj in response.get("obj", []): + all_goods.extend(obj.get("goodsList", [])) + for goods in all_goods: + if goods.get('exchangeTimesLimit', 0) >= 1: + if self.get_coupom(goods): + Log('✨ 成功领取券,任务结束!') + return + Log('📝 所有券尝试完成,没有可用的券或全部领取失败。') else: - print(f'>领券失败!原因:{response.get("errorMessage")}') + Log(f'❌ 获取券列表失败!原因:{response.get("errorMessage", "未知错误")}') def get_honeyTaskListStart(self): - print('>>>开始获取采蜜换大礼任务列表') - # 任务列表 - json_data = {} + """获取丰蜜任务列表""" + Log('🍯 开始获取采蜜换大礼任务列表') self.headers['channel'] = 'wxwdsj' url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~taskDetail' - - response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True: + response = self.do_request(url, data={}) + if response.get('success'): for item in response["obj"]["list"]: self.taskType = item["taskType"] status = item["status"] if status == 3: - print(f'>【{self.taskType}】-已完成') - if self.taskType == 'BEES_GAME_TASK_TYPE': - self.bee_need_help = False + Log(f'✨ 【{self.taskType}】-已完成') continue if "taskCode" in item: self.taskCode = item["taskCode"] @@ -358,121 +311,207 @@ class RUN: time.sleep(2) def honey_damaoxian(self): - print('>>>执行大冒险任务') - # 大冒险 + """执行大冒险任务""" + Log('>>> 执行大冒险任务') gameNum = 5 - for i in range(1, gameNum): - json_data = { - 'gatherHoney': 20, - } - if gameNum < 0: break - print(f'>>开始第{i}次大冒险') + for i in range(1, gameNum + 1): + json_data = {"gatherHoney": 20} + Log(f'>> 开始第{i}次大冒险') url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeGameService~gameReport' response = self.do_request(url, data=json_data) - # print(response) - stu = response.get('success') - if stu: + if response.get('success'): gameNum = response.get('obj')['gameNum'] - print(f'>大冒险成功!剩余次数【{gameNum}】') + Log(f'> 大冒险成功!剩余次数【{gameNum}】') time.sleep(2) - gameNum -= 1 elif response.get("errorMessage") == '容量不足': - print(f'> 需要扩容') + Log('> 需要扩容') self.honey_expand() else: - print(f'>大冒险失败!【{response.get("errorMessage")}】') + Log(f'> 大冒险失败!【{response.get("errorMessage", "未知错误")}】') break def honey_expand(self): - print('>>>容器扩容') - # 大冒险 - gameNum = 5 - + """容器扩容""" + Log('>>> 容器扩容') url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~expand' response = self.do_request(url, data={}) - # print(response) - stu = response.get('success', False) - if stu: - obj = response.get('obj') - print(f'>成功扩容【{obj}】容量') + if response.get('success'): + Log(f'> 成功扩容【{response.get("obj", "未知")}】容量') else: - print(f'>扩容失败!【{response.get("errorMessage")}】') + Log(f'> 扩容失败!【{response.get("errorMessage", "未知错误")}】') - def honey_indexData(self, END=False): - if not END: print('\n>>>>>>>开始执行采蜜换大礼任务') - # 邀请 + def honey_indexData(self, end=False): + """执行采蜜换大礼任务""" + Log('🍯 开始执行采蜜换大礼任务' if not end else '🍯 查询最终丰蜜') random_invite = random.choice([invite for invite in inviteId if invite != self.user_id]) self.headers['channel'] = 'wxwdsj' json_data = {"inviteUserId": random_invite} url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~indexData' response = self.do_request(url, data=json_data) - if response.get('success') == True: + if response.get('success'): usableHoney = response.get('obj').get('usableHoney') - if END: - Log(f'当前丰蜜:【{usableHoney}】') - return - Log(f'执行前丰蜜:【{usableHoney}】') - taskDetail = response.get('obj').get('taskDetail') activityEndTime = response.get('obj').get('activityEndTime', '') - activity_end_time = datetime.strptime(activityEndTime, "%Y-%m-%d %H:%M:%S") - current_time = datetime.now() - - if current_time.date() == activity_end_time.date(): - Log("本期活动今日结束,请及时兑换") - else: - print(f'本期活动结束时间【{activityEndTime}】') - - if taskDetail != []: - for task in taskDetail: + if not end: + Log(f'📅 本期活动结束时间【{activityEndTime}】') + Log(f'🍯 执行前丰蜜:【{usableHoney}】') + for task in response.get('obj').get('taskDetail', []): self.taskType = task['type'] self.receive_honeyTask() time.sleep(2) + else: + Log(f'🍯 执行后丰蜜:【{usableHoney}】') def EAR_END_2023_TaskList(self): - print('\n>>>>>>开始32周年庆任务') - # 任务列表 - json_data = { - "activityCode": "ANNIVERSARY_2025", - "channelType": "MINI_PROGRAM" - } - self.headers['channel'] = '32annixcx' - self.headers['platform'] = 'MINI_PROGRAM' - self.headers['syscode'] = 'MCS-MIMP-CORE' - + """执行年终集卡任务""" + Log('🎭 开始年终集卡任务') + json_data = {"activityCode": "YEAREND_2024", "channelType": "MINI_PROGRAM"} + self.headers.update({'channel': '24nzdb', 'platform': 'MINI_PROGRAM', 'syscode': 'MCS-MIMP-CORE'}) url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' - response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True: + if response.get('success'): for item in response["obj"]: self.title = item["taskName"] self.taskType = item["taskType"] status = item["status"] if status == 3: - print(f'>【{self.taskType}】-已完成') + Log(f'✨ 【{self.taskType}】-已完成') continue if self.taskType == 'INTEGRAL_EXCHANGE': self.EAR_END_2023_ExchangeCard() - elif self.taskType == 'PLAY_ACTIVITY_GAME': - self.DRAGONBOAT_2024_index() - self.DRAGONBOAT_2024_Game_init() elif self.taskType == 'CLICK_MY_SETTING': self.taskCode = item["taskCode"] self.addDeliverPrefer() if "taskCode" in item: self.taskCode = item["taskCode"] self.doTask() - time.sleep(3) + time.sleep(2) self.EAR_END_2023_receiveTask() else: - print(f'暂时不支持【{self.title}】任务') - # if self.taskType == 'BEES_GAME_TASK_TYPE': - # self.honey_damaoxian() - self.EAR_END_2023_getAward() - #self.EAR_END_2023_GuessIdiom() + Log(f'⚠️ 暂时不支持【{self.title}】任务') + + def EAR_END_2023_ExchangeCard(self): + """年终集卡兑换""" + Log('>>> 执行年终集卡兑换') + # 占位符,需补充具体兑换逻辑 + pass + + def EAR_END_2023_receiveTask(self): + """领取年终集卡任务奖励""" + Log(f'🎁 领取年终集卡【{self.title}】任务奖励') + json_data = {"taskCode": self.taskCode, "activityCode": "YEAREND_2024"} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~fetchTaskReward' + response = self.do_request(url, data=json_data) + Log(f'✨ 【{self.title}】任务奖励-{"领取成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def activityTaskService_taskList(self): + """获取32周年活动任务列表""" + Log('🎭 开始32周年活动任务') + json_data = {"activityCode": "DRAGONBOAT_2025", "channelType": "MINI_PROGRAM"} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' + response = self.do_request(url, data=json_data) + if response.get('success'): + skip_task_types = [ + 'PLAY_ACTIVITY_GAME', 'SEND_SUCCESS_RECALL', 'OPEN_SUPER_CARD', + 'CHARGE_NEW_EXPRESS_CARD', 'OPEN_NEW_EXPRESS_CARD', 'OPEN_FAMILY_CARD', 'INTEGRAL_EXCHANGE' + ] + task_list = [x for x in response.get('obj', []) if x.get('status') == 2 and x.get('taskType') not in skip_task_types] + if not task_list: + Log('📝 没有可执行的任务') + return + Log(f'📝 获取到未完成任务: {len(task_list)}个') + for task in task_list: + Log(f'📝 开始任务: {task.get("taskName")} [{task.get("taskType")}]') + time.sleep(random.uniform(1.5, 3)) + self.activityTaskService_finishTask(task) + time.sleep(1.5) + else: + Log(f'❌ 获取活动任务失败: {response.get("errorMessage", "未知错误")}') + + def activityTaskService_finishTask(self, task): + """完成32周年活动任务""" + json_data = {"taskCode": task.get('taskCode')} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberEs~taskRecord~finishTask' + response = self.do_request(url, data=json_data) + Log(f'📝 完成任务[{task.get("taskName")}]: {"成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def dragonBoatGame2025ServiceWin(self, levelIndex): + """完成龙舟游戏关卡""" + json_data = {"levelIndex": levelIndex} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoatGame2025Service~win' + response = self.do_request(url, data=json_data) + Log(f'🎮 第{levelIndex}关通关-{"成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def dragonBoat2025HastenService(self): + """查询龙舟加速状态""" + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoat2025HastenService~getHastenStatus' + response = self.do_request(url, data={}) + if response.get('success'): + self.lotteryNum = response.get('obj', {}).get('remainHastenChance', 0) + Log(f'🎲 剩余加速次数: {self.lotteryNum}') + else: + Log(f'❌ 查询加速次数失败: {response.get("errorMessage", "未知错误")}') + + def hastenLottery(self): + """执行龙舟加速抽奖""" + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoat2025HastenService~hastenLottery' + response = self.do_request(url, data={}) + if response.get('success'): + remain = response.get('obj', {}).get('remainHastenChance', 0) + Log(f'🎲 加速成功,剩余加速次数: {remain}') + else: + Log(f'❌ 加速失败: {response.get("errorMessage", "未知错误")}') + + def prizeDraw(self, opt): + """领取龙舟活动奖励""" + json_data = {"currency": opt.get('currency')} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoat2025LotteryService~prizeDraw' + response = self.do_request(url, data=json_data) + if response.get('success'): + gift_name = response.get('obj', {}).get('giftBagName', '未知奖励') + Log(f'🎁 抽奖获得: {gift_name}') + else: + Log(f'❌ 抽奖失败: {response.get("errorMessage", "未知错误")}') + + def getUpgradeStatus(self): + """查询龙舟活动升级状态""" + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoat2025UpgradeService~getUpgradeStatus' + response = self.do_request(url, data={}) + if response.get('success'): + current_ratio = response.get('obj', {}).get('currentRatio', 0) + level_list = [x for x in response.get('obj', {}).get('levelList', []) if x.get('balance', 0) > 0] + if level_list: + Log(f'🎯 当前进度: {current_ratio}%,已达到兑换条件') + for item in level_list: + self.prizeDraw(item) + time.sleep(1.5) + else: + Log(f'⏳ 当前进度: {current_ratio}%') + else: + Log(f'❌ 查询加速状态失败: {response.get("errorMessage", "未知错误")}') + + def activityTaskService_integralExchange(self): + """执行积分兑换""" + json_data = {"exchangeNum": 1, "activityCode": "DRAGONBOAT_2025"} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoat2025TaskService~integralExchange' + response = self.do_request(url, data=json_data) + Log(f'✅ 积分兑换-{"成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def dragonBoatGame2025Service(self): + """获取龙舟游戏信息""" + json_data = {"channelType": "MINI_PROGRAM"} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~dragonBoatGame2025Service~indexInfo' + response = self.do_request(url, data=json_data) + if response.get('success'): + self.surplusPushTime = response.get('obj', {}).get('surplusPushTime', 0) + self.ifPassAllLevel = response.get('obj', {}).get('ifPassAllLevel', False) + Log(f'🎮 剩余游戏次数: {self.surplusPushTime}') + return True + Log(f'❌ 访问失败: {response.get("errorMessage", "未知错误")}') + return False def addDeliverPrefer(self): - print(f'>>>开始【{self.title}】任务') + """新增收件偏好""" + Log(f'>>> 开始【{self.title}】任务') json_data = { "country": "中国", "countryCode": "A000086000", @@ -508,1148 +547,179 @@ class RUN: } url = 'https://ucmp.sf-express.com/cx-wechat-member/member/deliveryPreference/addDeliverPrefer' response = self.do_request(url, data=json_data) - if response.get('success') == True: - print('新增一个收件偏好,成功') - else: - print(f'>【{self.title}】任务-{response.get("errorMessage")}') - - def EAR_END_2023_ExchangeCard(self): - print(f'>>>开始积分兑换年卡') - json_data = { - "exchangeNum": 2, - "activityCode": "YEAR_END_2023", - "channelType": "MINI_PROGRAM" - } - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonNoLoginPost/~memberNonactivity~yearEnd2023TaskService~integralExchange' - response = self.do_request(url, data=json_data) - if response.get('success') == True: - receivedAccountList = response['obj']['receivedAccountList'] - for card in receivedAccountList: - print(f'>获得:【{card["urrency"]}】卡【{card["amount"]}】张!') - else: - print(f'>【{self.title}】任务-{response.get("errorMessage")}') - - def EAR_END_2023_getAward(self): - print(f'>>>开始抽卡') - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2025ClaimService~claim' - for l in range(10): - for i in range(0, 3): - json_data = { - "cardType": i - } - response = self.do_request(url, data=json_data) - # print(response) - if response.get('success') == True: - receivedAccountList = response['obj']['receivedAccountList'] - for card in receivedAccountList: - print(f'>获得:【{card["currency"]}】卡【{card["amount"]}】张!') - elif response.get('errorMessage') == '用户账户余额不足': - break - elif response.get('errorMessage') == '用户信息失效,请退出重新进入': - break - else: - print(f'>抽卡失败:{response.get("errorMessage")}') - break - time.sleep(3) - - def EAR_END_2023_GuessIdiom(self): - print(f'>>>开始猜成语') - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~yearEnd2023GuessIdiomService~win' - for i in range(1, 11): - json_data = { - "index": i - } - response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'第{i}关成功!') - # receivedAccountList = response['obj']['receivedAccountList'] - # for card in receivedAccountList: - # print(f'>获得:【{card["urrency"]}】卡【{card["amount"]}】张!') - else: - print(f'第{i}关失败!') - - #查询新年回馈卡片数量 - def EAR_END_2023_query(self): - print(f'>>>开始查询卡片数量') - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2025ClaimService~claimStatus' - response = self.do_request(url, {}) - if response.get('success'): - obj = response.get('obj', None) - if obj == None: return False - currentAccountList = obj.get('currentAccountList', []) - if not currentAccountList: - print("当前没有卡片") - else: - print("当前卡片数量:") - for card in currentAccountList: - currency = card.get('currency') - totalAmount = card.get('totalAmount') - balance = card.get('balance') - if currency == 'DAI_BI': - currency_name = '坐以待币' - elif currency == 'CHENG_GONG': - currency_name = '成功人士' - elif currency == 'GAN_FAN': - currency_name = '干饭圣体' - elif currency == 'DING_ZHU': - currency_name = '都顶得住' - elif currency == 'ZHI_SHUI': - currency_name = '心如止水' - else: - currency_name = currency - print(f"卡片名称:{currency_name},数量:{balance}") - - totalFortuneTimes = obj.get('totalFortuneTimes', 0) - print(f"总卡片数量:{totalFortuneTimes}") - - return True - else: - print(f"查询失败:{response.get('errorMessage')}") - return False - - def EAR_END_2023_receiveTask(self): - print(f'>>>开始领取【{self.title}】任务奖励') - json_data = { - "taskType": self.taskType, - "activityCode": "YEAR_END_2023", - "channelType": "MINI_PROGRAM" - } - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonNoLoginPost/~memberNonactivity~yearEnd2023TaskService~fetchMixTaskReward' - response = self.do_request(url, data=json_data) - if response.get('success') == True: - print(f'>【{self.title}】任务奖励领取成功!') - else: - print(f'>【{self.title}】任务-{response.get("errorMessage")}') - - def anniversary2024_weekly_gift_status(self): - print(f'\n>>>>>>>开始周年庆任务') - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024IndexService~weeklyGiftStatus' - response = self.do_request(url) - if response.get('success') == True: - weekly_gift_list = response.get('obj', {}).get('weeklyGiftList', []) - for weekly_gift in weekly_gift_list: - if not weekly_gift.get('received'): - receive_start_time = datetime.strptime(weekly_gift['receiveStartTime'], '%Y-%m-%d %H:%M:%S') - receive_end_time = datetime.strptime(weekly_gift['receiveEndTime'], '%Y-%m-%d %H:%M:%S') - current_time = datetime.now() - # print(current_time) - # print(receive_start_time) - # print(receive_end_time) - if receive_start_time <= current_time <= receive_end_time: - self.anniversary2024_receive_weekly_gift() - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print(f'查询每周领券失败: {error_message}') - if '系统繁忙' in error_message or '用户手机号校验未通过' in error_message: - self.anniversary_black = True - - def anniversary2024_receive_weekly_gift(self): - print(f'>>>开始领取每周领券') - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024IndexService~receiveWeeklyGift' - response = self.do_request(url) - if response.get('success'): - product_names = [product['productName'] for product in response.get('obj', [])] - print(f'每周领券: {product_names}') - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print(f'每周领券失败: {error_message}') - if '系统繁忙' in error_message or '用户手机号校验未通过' in error_message: - self.anniversary_black = True - - def anniversary2024_taskList(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' - data = { - 'activityCode': 'ANNIVERSARY_2024', - 'channelType': 'MINI_PROGRAM' - } - response = self.do_request(url, data) - if response and response.get('success'): - tasks = response.get('obj', []) - # 过滤出状态为1的任务并尝试接收奖励 - for task in filter(lambda x: x['status'] == 1, tasks): - if self.anniversary_black: - return - for _ in range(task['canReceiveTokenNum']): - self.anniversary2024_fetchMixTaskReward(task) - # 过滤出状态为2的任务并完成任务 - for task in filter(lambda x: x['status'] == 2, tasks): - if self.anniversary_black: - return - if task['taskType'] in ['PLAY_ACTIVITY_GAME', 'PLAY_HAPPY_ELIMINATION', 'PARTAKE_SUBJECT_GAME']: - pass - elif task['taskType'] == 'FOLLOW_SFZHUNONG_VEDIO_ID': - pass - elif task['taskType'] in ['BROWSE_VIP_CENTER', 'GUESS_GAME_TIP', 'CREATE_SFID', 'CLICK_MY_SETTING', - 'CLICK_TEMPLATE', 'REAL_NAME', 'SEND_SUCCESS_RECALL', 'OPEN_SVIP', - 'OPEN_FAST_CARD', 'FIRST_CHARGE_NEW_EXPRESS_CARD', 'CHARGE_NEW_EXPRESS_CARD', - 'INTEGRAL_EXCHANGE']: - pass - else: - for _ in range(task['restFinishTime']): - if self.anniversary_black: - break - self.anniversary2024_finishTask(task) - - def anniversary2024_finishTask(self, task): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonRoutePost/memberEs/taskRecord/finishTask' - data = {'taskCode': task['taskCode']} - response = self.do_request(url, data) - if response and response.get('success'): - print('完成任务[%s]成功' % task['taskName']) - # 完成任务后获取任务奖励的逻辑 - self.anniversary2024_fetchMixTaskReward(task) - else: - print('完成任务[%s]失败: %s' % ( - task['taskName'], response.get('errorMessage') or (json.dumps(response) if response else '无返回'))) - - def anniversary2024_fetchMixTaskReward(self, task): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024TaskService~fetchMixTaskReward' - data = { - 'taskType': task['taskType'], - 'activityCode': 'ANNIVERSARY_2024', - 'channelType': 'MINI_PROGRAM' - } - response = self.do_request(url, data) - if response and response.get('success'): - reward_info = response.get('obj', {}).get('account', {}) - received_list = [f"[{item['currency']}]X{item['amount']}" for item in - reward_info.get('receivedAccountList', [])] - turned_award = reward_info.get('turnedAward', {}) - if turned_award.get('productName'): - received_list.append(f"[优惠券]{turned_award['productName']}") - print('领取任务[%s]奖励: %s' % (task['taskName'], ', '.join(received_list))) - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print('领取任务[%s]奖励失败: %s' % (task['taskName'], error_message)) - if '用户手机号校验未通过' in error_message: - self.anniversary_black = True - - def anniversary2024_unbox(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024CardService~unbox' - response = self.do_request(url, {}) - if response and response.get('success'): - account_info = response.get('obj', {}).get('account', {}) - unbox_list = [f"[{item['currency']}]X{item['amount']}" for item in - account_info.get('receivedAccountList', [])] - print('拆盒子: %s' % ', '.join(unbox_list) or '空气') - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print('拆盒子失败: %s' % error_message) - if '用户手机号校验未通过' in error_message: - self.anniversary_black = True - - def anniversary2024_game_list(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024GameParkService~list' - response = self.do_request(url, {}) - try: - if response['success']: - topic_pk_info = response['obj'].get('topicPKInfo', {}) - search_word_info = response['obj'].get('searchWordInfo', {}) - happy_elimination_info = response['obj'].get('happyEliminationInfo', {}) - - if not topic_pk_info.get('isPassFlag'): - print('开始话题PK赛') - # 这里调用话题PK赛列表相关函数 - self.anniversary2024_TopicPk_topicList() - - if not search_word_info.get('isPassFlag') or not search_word_info.get('isFinishDailyFlag'): - print('开始找字游戏') - for i in range(1, 11): - wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒 - time.sleep(wait_time) - if not self.anniversary2024_SearchWord_win(i): - break - - if not happy_elimination_info.get('isPassFlag') or not happy_elimination_info.get('isFinishDailyFlag'): - print('开始消消乐') - for i in range(1, 31): - wait_time = random.randint(2000, 4000) / 1000.0 # 转换为秒 - time.sleep(wait_time) - if not self.anniversary2024_HappyElimination_win(i): - break - else: - error_message = response['errorMessage'] or json.dumps(response) or '无返回' - print('查询游戏状态失败: ' + error_message) - if '用户手机号校验未通过' in error_message: - self.anniversary_black = True - except Exception as e: - print(str(e)) - - def anniversary2024_SearchWord_win(self, index): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024SearchWordService~win' - success = True - try: - data = {'index': index} - response = self.do_request(url, data) - if response and response.get('success'): - currency_list = response.get('obj', {}).get('currencyDTOList', []) - rewards = ', '.join([f"[{c.get('currency')}]X{c.get('amount')}" for c in currency_list]) - print(f'找字游戏第{index}关通关成功: {rewards if rewards else "未获得奖励"}') - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print(f'找字游戏第{index}关失败: {error_message}') - if '系统繁忙' in error_message: - success = False - except Exception as e: - print(e) - finally: - return success - - def anniversary2024_HappyElimination_win(self, index): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024HappyEliminationService~win' - success = True - data = {'index': index} - response = self.do_request(url, data) - try: - if response and response.get('success'): - is_award = response['obj'].get('isAward') - currency_dto_list = response['obj'].get('currencyDTOList', []) - rewards = ', '.join([f"[{c.get('currency')}]X{c.get('amount')}" for c in currency_dto_list]) - print(f'第{index}关通关: {rewards if rewards else "未获得奖励"}') - else: - error_message = response.get('errorMessage') or json.dumps(response) or '无返回' - print(f'第{index}关失败: {error_message}') - if '系统繁忙' in error_message: - success = False - except Exception as e: - print(e) - success = False - finally: - return success - - def anniversary2024_TopicPk_chooseSide(self, index): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024TopicPkService~chooseSide' - success = True - data = {'index': index, 'choose': 0} # 选择某一边 - response = self.do_request(url, data) - try: - if response and response.get('success'): - currency_dto_list = response['obj'].get('currencyDTOList', []) - rewards = ', '.join([f"[{c.get('currency')}]X{c.get('amount')}" for c in currency_dto_list]) - print(f'话题PK赛选择话题{index}成功: {rewards if rewards else "未获得奖励"}') - else: - error_message = response['errorMessage'] or json.dumps(response) or '无返回' - print(f'话题PK赛选择话题{index}失败: {error_message}') - if '系统繁忙' in error_message: - success = False - except Exception as e: - print(e) - success = False - finally: - return success - - def anniversary2024_TopicPk_topicList(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024TopicPkService~topicList' - response = self.do_request(url, {}) - try: - if response and response.get('success'): - topics = response['obj'].get('topics', []) - for topic in topics: - if not topic.get('choose'): - index = topic.get('index', 1) - wait_time = random.randint(2000, 4000) / 1000.0 # 转换为秒 - time.sleep(wait_time) # 等待 - if not self.anniversary2024_TopicPk_chooseSide(index): - break - else: - error_message = response['errorMessage'] or json.dumps(response) or '无返回' - print(f'查询话题PK赛记录失败: {error_message}') - except Exception as e: - print(e) - - def anniversary2024_queryAccountStatus_refresh(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024CardService~queryAccountStatus' - response = self.do_request(url, {}) - try: - if not response or not response.get('success'): - error_message = response['errorMessage'] or json.dumps(response) or '无返回' - print(f'查询账户状态失败: {error_message}') - except Exception as e: - print(e) - - def anniversary2024_TopicPk_chooseSide(self, index): - success = True - data = { - 'index': index, - 'choose': 0 - } - self.headers['channel'] = '31annizyw' - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024TopicPkService~chooseSide' - result = self.do_request(url, data, 'post') - - if result and result.get('success'): - currency_dto_list = result.get('obj', {}).get('currencyDTOList', []) - if currency_dto_list: - rewards = [f"[{currency['currency']}]{currency['amount']}次" for currency in currency_dto_list] - print(f'话题PK赛第{index}个话题选择成功: {", ".join(rewards)}') - else: - print(f'话题PK赛第{index}个话题选择成功') - else: - error_message = result.get('errorMessage') if result else '无返回' - print(f'话题PK赛第{index}个话题失败: {error_message}') - if error_message and '系统繁忙' in error_message: - success = False - - return success - - def anniversary2024_titleList(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024GuessService~titleList' - response = self.do_request(url) - - if response and response.get('success'): - - guess_title_info_list = response.get('obj', {}).get('guessTitleInfoList', []) - today_titles = [title for title in guess_title_info_list if title['gameDate'] == self.today] - for title_info in today_titles: - if title_info['answerStatus']: - print('今日已回答过竞猜') - else: - answer = self.answer - if answer: - self.anniversary2024_answer(title_info, answer) - print(f'进行了答题: {answer}') - else: - error_message = response.get('errorMessage') if response else '无返回' - print(f'查询每日口令竞猜失败: {error_message}') - - def anniversary2024_titleList_award(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024GuessService~titleList' - response = self.do_request(url) - - if response and response.get('success'): - - guess_title_info_list = response.get('obj', {}).get('guessTitleInfoList', []) - today_awards = [title for title in guess_title_info_list if title['gameDate'] == self.today] - - for award_info in today_awards: - if award_info['answerStatus']: - awards = award_info.get('awardList', []) + award_info.get('puzzleList', []) - awards_description = ', '.join([f"{award['productName']}" for award in awards]) - print(f'口令竞猜奖励: {awards_description}' if awards_description else '今日无奖励') - else: - print('今日还没回答竞猜') - else: - error_message = response.get('errorMessage') if response else '无返回' - print(f'查询每日口令竞猜奖励失败: {error_message}') - - # 向API发送答题请求 - def anniversary2024_answer(self, answer_info): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024GuessService~answer' - data = {'period': answer_info['period'], 'answerInfo': answer_info} - response = self.do_request(url, data) - if response and response.get('success'): - print('口令竞猜回答成功') - self.anniversary2024_titleList_award() # 通过奖励接口验证答案 - else: - error_message = response.get('errorMessage') if response else '无返回' - print(f'口令竞猜回答失败: {error_message}') - - # 查询账户状态 - def anniversary2024_queryAccountStatus(self): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024CardService~queryAccountStatus' - result = self.do_request(url) - if result.get('success'): - account_currency_list = result.get('obj', {}).get('accountCurrencyList', []) - unbox_chance_currency = [currency for currency in account_currency_list if - currency.get('currency') == 'UNBOX_CHANCE'] - unbox_chance_balance = unbox_chance_currency[0].get('balance') if unbox_chance_currency else 0 - - # print('可以拆' + str(unbox_chance_balance) + '次盒子') - # while unbox_chance_balance > 0: - # self.anniversary2024_unbox() - # unbox_chance_balance -= 1 - else: - error_message = result.get('errorMessage') or json.dumps(result) or '无返回' - print('查询已收集拼图失败: ' + error_message) - - result = self.do_request(url) - if result.get('success'): - account_currency_list = result.get('obj', {}).get('accountCurrencyList', []) - account_currency_list = [currency for currency in account_currency_list if - currency.get('currency') != 'UNBOX_CHANCE'] - if account_currency_list: - cards_li = account_currency_list - card_info = [] - self.cards = { - 'CARD_1': 0, - 'CARD_2': 0, - 'CARD_3': 0, - 'CARD_4': 0, - 'CARD_5': 0, - 'CARD_6': 0, - 'CARD_7': 0, - 'CARD_8': 0, - 'CARD_9': 0, - 'COMMON_CARD': 0 - } - for card in cards_li: - currency_key = card.get('currency') - if currency_key in self.cards: - self.cards[currency_key] = int(card.get('balance')) - card_info.append('[' + card.get('currency') + ']X' + str(card.get('balance'))) - - Log(f'已收集拼图: {card_info}') - cards_li.sort(key=lambda x: x.get('balance'), reverse=True) - - else: - print('还没有收集到拼图') - else: - error_message = result.get('errorMessage') or json.dumps(result) or '无返回' - print('查询已收集拼图失败: ' + error_message) - - def do_draw(self, cards): - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024CardService~collectDrawAward' - data = {"accountList": cards} - response = self.do_request(url, data) - if response and response.get('success'): - data = response.get('obj', {}) - productName = data.get('productName', '') - Log(f'抽奖成功,获得{productName}') - return True - else: - error_message = response.get('errorMessage') if response else '无返回' - print(f'抽奖失败: {error_message}') - return False - - def convert_common_card(self, cards, target_card): - # 如果共通卡(COMMON_CARD)的数量大于0,转化成目标卡 - if cards['COMMON_CARD'] > 0: - cards['COMMON_CARD'] -= 1 - cards[target_card] += 1 - return True - return False - - def can_draw(self, cards, n): - # 判断是否有足够的不同卡进行抽奖 - distinct_cards = sum(1 for card, amount in cards.items() if card != 'COMMON_CARD' and amount > 0) - return distinct_cards >= n - - def draw(self, cards, n): - drawn_cards = [] - for card, amount in sorted(cards.items(), key=lambda item: item[1]): - if card != 'COMMON_CARD' and amount > 0: - cards[card] -= 1 - drawn_cards.append(card) - if len(drawn_cards) == n: - break - if len(drawn_cards) == n: - "没有足够的卡进行抽奖" - if self.do_draw(drawn_cards): - return drawn_cards # 返回本次抽奖使用的卡 - else: - return None - - def simulate_lottery(self, cards): - while self.can_draw(cards, 9): - used_cards = self.draw(cards, 9) - print("进行了一次9卡抽奖,消耗卡片: ", used_cards) - while self.can_draw(cards, 7) or self.convert_common_card(cards, 'CARD_1'): - if not self.can_draw(cards, 7): - continue - used_cards = self.draw(cards, 7) - print("进行了一次7卡抽奖,消耗卡片: ", used_cards) - while self.can_draw(cards, 5) or self.convert_common_card(cards, 'CARD_1'): - if not self.can_draw(cards, 5): - continue - used_cards = self.draw(cards, 5) - print("进行了一次5卡抽奖,消耗卡片: ", used_cards) - while self.can_draw(cards, 3) or self.convert_common_card(cards, 'CARD_1'): - if not self.can_draw(cards, 3): - continue - used_cards = self.draw(cards, 3) - print("进行了一次3卡抽奖,消耗卡片: ", used_cards) - - def anniversary2024_task(self): - self.anniversary2024_weekly_gift_status() - if self.anniversary_black: - return - # self.anniversary2024_titleList() - # self.anniversary2024_game_list() - # self.anniversary2024_taskList() - self.anniversary2024_queryAccountStatus() - target_time = datetime(2024, 4, 3, 14, 0) - # self.simulate_lottery(self.cards) - if datetime.now() > target_time: - print('周年庆活动即将结束,开始自动抽奖') - self.simulate_lottery(self.cards) - else: - print('未到自动抽奖时间') + Log(f'✨ 新增一个收件偏好-{"成功" if response.get("success") else response.get("errorMessage", "失败")}') def member_day_index(self): - print('====== 会员日活动 ======') - try: - invite_user_id = random.choice([invite for invite in inviteId if invite != self.user_id]) - payload = {'inviteUserId': invite_user_id} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayIndexService~index' - - response = self.do_request(url, data=payload) - if response.get('success'): - lottery_num = response.get('obj', {}).get('lotteryNum', 0) - can_receive_invite_award = response.get('obj', {}).get('canReceiveInviteAward', False) - if can_receive_invite_award: - self.member_day_receive_invite_award(invite_user_id) - self.member_day_red_packet_status() - Log(f'会员日可以抽奖{lottery_num}次') - for _ in range(lottery_num): - self.member_day_lottery() - if self.member_day_black: - return - self.member_day_task_list() - if self.member_day_black: - return - self.member_day_red_packet_status() - else: - error_message = response.get('errorMessage', '无返回') - Log(f'查询会员日失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_receive_invite_award(self, invite_user_id): - try: - payload = {'inviteUserId': invite_user_id} - - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayIndexService~receiveInviteAward' - - response = self.do_request(url, payload) - if response.get('success'): - product_name = response.get('obj', {}).get('productName', '空气') - Log(f'会员日奖励: {product_name}') - else: - error_message = response.get('errorMessage', '无返回') - Log(f'领取会员日奖励失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_lottery(self): - try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayLotteryService~lottery' - - response = self.do_request(url, payload) - if response.get('success'): - product_name = response.get('obj', {}).get('productName', '空气') - Log(f'会员日抽奖: {product_name}') - else: - error_message = response.get('errorMessage', '无返回') - Log(f'会员日抽奖失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_task_list(self): - try: - payload = {'activityCode': 'MEMBER_DAY', 'channelType': 'MINI_PROGRAM'} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' - - response = self.do_request(url, payload) - if response.get('success'): - task_list = response.get('obj', []) - for task in task_list: - if task['status'] == 1: - if self.member_day_black: - return - self.member_day_fetch_mix_task_reward(task) - for task in task_list: - if task['status'] == 2: - if self.member_day_black: - return - if task['taskType'] in ['SEND_SUCCESS', 'INVITEFRIENDS_PARTAKE_ACTIVITY', 'OPEN_SVIP', - 'OPEN_NEW_EXPRESS_CARD', 'OPEN_FAMILY_CARD', 'CHARGE_NEW_EXPRESS_CARD', - 'INTEGRAL_EXCHANGE']: - pass - else: - for _ in range(task['restFinishTime']): - if self.member_day_black: - return - self.member_day_finish_task(task) - else: - error_message = response.get('errorMessage', '无返回') - Log('查询会员日任务失败: ' + error_message) - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_finish_task(self, task): - try: - payload = {'taskCode': task['taskCode']} - - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberEs~taskRecord~finishTask' - - response = self.do_request(url, payload) - if response.get('success'): - Log('完成会员日任务[' + task['taskName'] + ']成功') - self.member_day_fetch_mix_task_reward(task) - else: - error_message = response.get('errorMessage', '无返回') - Log('完成会员日任务[' + task['taskName'] + ']失败: ' + error_message) - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_fetch_mix_task_reward(self, task): - try: - payload = {'taskType': task['taskType'], 'activityCode': 'MEMBER_DAY', 'channelType': 'MINI_PROGRAM'} - - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~fetchMixTaskReward' - - response = self.do_request(url, payload) - if response.get('success'): - Log('领取会员日任务[' + task['taskName'] + ']奖励成功') - else: - error_message = response.get('errorMessage', '无返回') - Log('领取会员日任务[' + task['taskName'] + ']奖励失败: ' + error_message) - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_receive_red_packet(self, hour): - try: - payload = {'receiveHour': hour} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayTaskService~receiveRedPacket' - - response = self.do_request(url, payload) - if response.get('success'): - print(f'会员日领取{hour}点红包成功') - else: - error_message = response.get('errorMessage', '无返回') - print(f'会员日领取{hour}点红包失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_red_packet_status(self): - try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketStatus' - response = self.do_request(url, payload) - if response.get('success'): - packet_list = response.get('obj', {}).get('packetList', []) - for packet in packet_list: - self.member_day_red_packet_map[packet['level']] = packet['count'] - - for level in range(1, self.max_level): - count = self.member_day_red_packet_map.get(level, 0) - while count >= 2: - self.member_day_red_packet_merge(level) - count -= 2 - packet_summary = [] - remaining_needed = 0 - - for level, count in self.member_day_red_packet_map.items(): - if count == 0: - continue - packet_summary.append(f"[{level}级]X{count}") - int_level = int(level) - if int_level < self.max_level: - remaining_needed += 1 << (int_level - 1) - - Log("会员日合成列表: " + ", ".join(packet_summary)) - - if self.member_day_red_packet_map.get(self.max_level): - Log(f"会员日已拥有[{self.max_level}级]红包X{self.member_day_red_packet_map[self.max_level]}") - self.member_day_red_packet_draw(self.max_level) - else: - remaining = self.packet_threshold - remaining_needed - Log(f"会员日距离[{self.max_level}级]红包还差: [1级]红包X{remaining}") - - else: - error_message = response.get('errorMessage', '无返回') - Log(f'查询会员日合成失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_red_packet_merge(self, level): - try: - # for key,level in enumerate(self.member_day_red_packet_map): - # pass - payload = {'level': level, 'num': 2} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketMerge' - - response = self.do_request(url, payload) - if response.get('success'): - Log(f'会员日合成: [{level}级]红包X2 -> [{level + 1}级]红包') - self.member_day_red_packet_map[level] -= 2 - if not self.member_day_red_packet_map.get(level + 1): - self.member_day_red_packet_map[level + 1] = 0 - self.member_day_red_packet_map[level + 1] += 1 - else: - error_message = response.get('errorMessage', '无返回') - Log(f'会员日合成两个[{level}级]红包失败: {error_message}') - if '没有资格参与活动' in error_message: - self.member_day_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def member_day_red_packet_draw(self, level): - try: - payload = {'level': str(level)} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketDraw' - response = self.do_request(url, payload) - if response and response.get('success'): - coupon_names = [item['couponName'] for item in response.get('obj', [])] or [] - - Log(f"会员日提取[{level}级]红包: {', '.join(coupon_names) or '空气'}") - else: - error_message = response.get('errorMessage') if response else "无返回" - Log(f"会员日提取[{level}级]红包失败: {error_message}") - if "没有资格参与活动" in error_message: - self.memberDay_black = True - print("会员日任务风控") - except Exception as e: - print(e) - - def MIDAUTUMN_2024_index(self): - print('====== 查询活动状态 ======') + """执行会员日活动""" + Log('🎭 会员日活动') invite_user_id = random.choice([invite for invite in inviteId if invite != self.user_id]) - try: - self.headers['channel'] = 'newExpressWX' - self.headers[ - 'referer'] = f'https://mcs-mimp-web.sf-express.com/origin/a/mimp-activity/midAutumn2024?mobile={self.mobile}&userId={self.user_id}&path=/origin/a/mimp-activity/midAutumn2024&supportShare=&inviteUserId={invite_user_id}&from=newExpressWX' - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonNoLoginPost/~memberNonactivity~midAutumn2024IndexService~index' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - acEndTime = obj.get('acEndTime', '') - # 获取当前时间并格式化 - current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - comparison_time = datetime.strptime(acEndTime, "%Y-%m-%d %H:%M:%S") - # 比较当前时间是否小于比较时间 - is_less_than = datetime.now() < comparison_time - if is_less_than: - print('活动进行中....') - return True - else: - print('活动已结束') - return False - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - return False - except Exception as e: - print(e) - return False - - def MIDAUTUMN_2024_Game_indexInfo(self): - Log('====== 开始游戏 ======') - try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024GameService~indexInfo' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - maxPassLevel = obj.get('maxPassLevel', '') - ifPassAllLevel = obj.get('ifPassAllLevel', '') - if maxPassLevel != 30: - self.MIDAUTUMN_2024_win(maxPassLevel) - else: - self.MIDAUTUMN_2024_win(0) - - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - return False - except Exception as e: - print(e) - return False - - def MIDAUTUMN_2024_Game_init(self): - Log('====== 开始游戏 ======') - try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024GameService~init' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - currentIndex = obj.get('currentIndex', '') - ifPassAllLevel = obj.get('ifPassAllLevel', '') - if currentIndex != 30: - self.MIDAUTUMN_2024_win(currentIndex) - else: - self.MIDAUTUMN_2024_win(0) - - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - return False - except Exception as e: - print(e) - return False - - def MIDAUTUMN_2024_weeklyGiftStatus(self): - print('====== 查询每周礼包领取状态 ======') - try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024IndexService~weeklyGiftStatus' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - for gift in obj: - received = gift['received'] - receiveStartTime = gift['receiveStartTime'] - receiveEndTime = gift['receiveEndTime'] - print(f'>>> 领取时间:【{receiveStartTime} 至 {receiveEndTime}】') - if received: - print('> 该礼包已领取') - continue - receive_start_time = datetime.strptime(receiveStartTime, "%Y-%m-%d %H:%M:%S") - receive_end_time = datetime.strptime(receiveEndTime, "%Y-%m-%d %H:%M:%S") - is_within_range = receive_start_time <= datetime.now() <= receive_end_time - if is_within_range: - print(f'>> 开始领取礼包:') - self.MIDAUTUMN_2024_receiveWeeklyGift() - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def MIDAUTUMN_2024_receiveWeeklyGift(self): - invite_user_id = random.choice([invite for invite in inviteId if invite != self.user_id]) - try: - payload = {"inviteUserId": invite_user_id} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024IndexService~receiveWeeklyGift' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - if obj == [{}]: - print('> 领取失败') - return False - for gifts in obj: - productName = gifts['productName'] - amount = gifts['amount'] - print(f'> 领取【{productName} x {amount}】成功') - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def MIDAUTUMN_2024_taskList(self): - print('====== 查询推币任务列表 ======') - try: - payload = { - "activityCode": "MIDAUTUMN_2024", - "channelType": "MINI_PROGRAM" - } - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - for task in obj: - taskType = task['taskType'] - self.taskName = task['taskName'] - status = task['status'] - if status == 3: - Log(f'> 任务【{self.taskName}】已完成') - continue - self.taskCode = task.get('taskCode', None) - if self.taskCode: - self.MIDAUTUMN_2024_finishTask() - if taskType == 'PLAY_ACTIVITY_GAME': - self.MIDAUTUMN_2024_Game_init() - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def MIDAUTUMN_2024_coinStatus(self, END=False): - Log('====== 查询金币信息 ======') - # try: - payload = {} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024CoinService~coinStatus' - - response = self.do_request(url, payload) - # print(response) + payload = {'inviteUserId': invite_user_id} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayIndexService~index' + response = self.do_request(url, data=payload) if response.get('success'): - obj = response.get('obj', None) - if obj == None: return False - accountCurrencyList = obj.get('accountCurrencyList', []) - pushedTimesToday = obj.get('pushedTimesToday', '') - pushedTimesTotal = obj.get('pushedTimesTotal', '') - PUSH_TIMES_balance = 0 - self.COIN_balance = 0 - WELFARE_CARD_balance = 0 - for li in accountCurrencyList: - if li['currency'] == 'PUSH_TIMES': - PUSH_TIMES_balance = li['balance'] - if li['currency'] == 'COIN': - self.COIN_balance = li['balance'] - if li['currency'] == 'WELFARE_CARD': - WELFARE_CARD_balance = li['balance'] - - PUSH_TIMES = PUSH_TIMES_balance - if END: - if PUSH_TIMES_balance > 0: - for i in range(PUSH_TIMES_balance): - print(f'>> 开始第【{PUSH_TIMES_balance + 1}】次推币') - self.MIDAUTUMN_2024_pushCoin() - PUSH_TIMES -= 1 - pushedTimesToday += 1 - pushedTimesTotal += 1 - Log(f'> 剩余推币次数:【{PUSH_TIMES}】') - Log(f'> 当前金币:【{self.COIN_balance}】') - # Log(f'> 当前发财卡:【{WELFARE_CARD_balance}】') - Log(f'> 今日推币:【{pushedTimesToday}】次') - Log(f'> 总推币:【{pushedTimesTotal}】次') - else: - print(f'> 剩余推币次数:【{PUSH_TIMES_balance}】') - print(f'> 当前金币:【{self.COIN_balance}】') - # Log(f'> 当前发财卡:【{WELFARE_CARD_balance}】') - print(f'> 今日推币:【{pushedTimesToday}】次') - print(f'> 总推币:【{pushedTimesTotal}】次') - - self.MIDAUTUMN_2024_givePushTimes() + lottery_num = response.get('obj', {}).get('lotteryNum', 0) + can_receive_invite_award = response.get('obj', {}).get('canReceiveInviteAward', False) + if can_receive_invite_award: + self.member_day_receive_invite_award(invite_user_id) + self.member_day_red_packet_status() + Log(f'🎁 会员日可以抽奖{lottery_num}次') + for _ in range(lottery_num): + self.member_day_lottery() + if self.member_day_black: + return + self.member_day_task_list() + if self.member_day_black: + return + self.member_day_red_packet_status() else: error_message = response.get('errorMessage', '无返回') + Log(f'📝 查询会员日失败: {error_message}') if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - # except Exception as e: - # print(e) + self.member_day_black = True + Log('📝 会员日任务风控') - def MIDAUTUMN_2024_pushCoin(self): - try: - payload = {"plateToken": None} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024CoinService~pushCoin' + def member_day_receive_invite_award(self, invite_user_id): + """领取会员日邀请奖励""" + payload = {'inviteUserId': invite_user_id} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayIndexService~receiveInviteAward' + response = self.do_request(url, data=payload) + if response.get('success'): + product_name = response.get('obj', {}).get('productName', '空气') + Log(f'🎁 会员日奖励: {product_name}') + else: + error_message = response.get('errorMessage', '无返回') + Log(f'📝 领取会员日奖励失败: {error_message}') + if '没有资格参与活动' in error_message: + self.member_day_black = True + Log('📝 会员日任务风控') - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - drawAward = obj.get('drawAward', '') - self.COIN_balance += drawAward - print(f'> 获得:【{drawAward}】金币') + def member_day_lottery(self): + """会员日抽奖""" + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayLotteryService~lottery' + response = self.do_request(url, data={}) + if response.get('success'): + product_name = response.get('obj', {}).get('productName', '空气') + Log(f'🎁 会员日抽奖: {product_name}') + else: + error_message = response.get('errorMessage', '无返回') + Log(f'📝 会员日抽奖失败: {error_message}') + if '没有资格参与活动' in error_message: + self.member_day_black = True + Log('📝 会员日任务风控') + def member_day_task_list(self): + """获取会员日任务列表""" + payload = {'activityCode': 'MEMBER_DAY', 'channelType': 'MINI_PROGRAM'} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList' + response = self.do_request(url, data=payload) + if response.get('success'): + task_list = response.get('obj', []) + for task in task_list: + if task['status'] == 1: + if self.member_day_black: + return + self.member_day_fetch_mix_task_reward(task) + elif task['status'] == 2 and task['taskType'] not in [ + 'SEND_SUCCESS', 'INVITEFRIENDS_PARTAKE_ACTIVITY', 'OPEN_SVIP', + 'OPEN_NEW_EXPRESS_CARD', 'OPEN_FAMILY_CARD', 'CHARGE_NEW_EXPRESS_CARD', 'INTEGRAL_EXCHANGE' + ]: + for _ in range(task['restFinishTime']): + if self.member_day_black: + return + self.member_day_finish_task(task) + else: + error_message = response.get('errorMessage', '无返回') + Log(f'📝 查询会员日任务失败: {error_message}') + if '没有资格参与活动' in error_message: + self.member_day_black = True + Log('📝 会员日任务风控') + + def member_day_finish_task(self, task): + """完成会员日任务""" + payload = {'taskCode': task['taskCode']} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberEs~taskRecord~finishTask' + response = self.do_request(url, data=payload) + if response.get('success'): + Log(f'📝 完成会员日任务[{task["taskName"]}]: 成功') + self.member_day_fetch_mix_task_reward(task) + else: + error_message = response.get('errorMessage', '无返回') + Log(f'📝 完成会员日任务[{task["taskName"]}]: {error_message}') + if '没有资格参与活动' in error_message: + self.member_day_black = True + Log('📝 会员日任务风控') + + def member_day_fetch_mix_task_reward(self, task): + """领取会员日任务奖励""" + payload = {'taskType': task['taskType'], 'activityCode': 'MEMBER_DAY', 'channelType': 'MINI_PROGRAM'} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~fetchMixTaskReward' + response = self.do_request(url, data=payload) + Log(f'🎁 领取会员日任务[{task["taskName"]}]: {"成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def member_day_receive_red_packet(self, hour): + """领取会员日红包""" + payload = {'receiveHour': hour} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayTaskService~receiveRedPacket' + response = self.do_request(url, data=payload) + Log(f'🎁 会员日领取{hour}点红包-{"成功" if response.get("success") else response.get("errorMessage", "失败")}') + + def member_day_red_packet_status(self): + """查询会员日红包状态""" + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketStatus' + response = self.do_request(url, data={}) + if response.get('success'): + packet_list = response.get('obj', {}).get('packetList', []) + self.member_day_red_packet_map = {packet['level']: packet['count'] for packet in packet_list} + for level in range(1, self.max_level): + count = self.member_day_red_packet_map.get(level, 0) + while count >= 2: + self.member_day_red_packet_merge(level) + count -= 2 + packet_summary = [f"[{level}]X{count}" for level, count in self.member_day_red_packet_map.items() if count > 0] + Log(f"📝 会员日合成列表: {', '.join(packet_summary) or '无红包'}") + if self.member_day_red_packet_map.get(self.max_level): + Log(f"🎁 会员日已拥有[{self.max_level}级]红包X{self.member_day_red_packet_map[self.max_level]}") + self.member_day_red_packet_draw(self.max_level) else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) + remaining_needed = sum(1 << (int(level) - 1) for level, count in self.member_day_red_packet_map.items() if count > 0) + remaining = self.packet_threshold - remaining_needed + Log(f"📝 会员日距离[{self.max_level}级]红包还差: [1级]红包X{remaining}") + else: + error_message = response.get('errorMessage', '无返回') + Log(f'📝 查询会员日合成失败: {error_message}') + if '没有资格参与活动' in error_message: + self.member_day_black = True + Log('📝 会员日任务风控') - def MIDAUTUMN_2024_givePushTimes(self): - Log('====== 领取赠送推币次数 ======') - try: - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024CoinService~givePushTimes' + def member_day_red_packet_merge(self, level): + """合成会员日红包""" + payload = {'level': level, 'num': 2} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketMerge' + response = self.do_request(url, data=payload) + if response.get('success'): + Log(f'🎁 会员日合成: [{level}级]红包X2 -> [{level + 1}级]红包') + self.member_day_red_packet_map[level] = self.member_day_red_packet_map.get(level, 0) - 2 + self.member_day_red_packet_map[level + 1] = self.member_day_red_packet_map.get(level + 1, 0) + 1 + else: + Log(f'📝 会员日合成[{level}级]红包失败: {response.get("errorMessage", "无返回")}') - response = self.do_request(url) - # print(response) - if response.get('success'): - obj = response.get('obj', 0) - print(f'> 获得:【{obj}】次推币机会') - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('> 会员日任务风控') - print(error_message) - except Exception as e: - print(e) - - def MIDAUTUMN_2024_finishTask(self): - try: - payload = { - "taskCode": self.taskCode - } - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberEs~taskRecord~finishTask' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', False) - Log(f'> 完成任务【{self.taskName}】成功') - else: - error_message = response.get('errorMessage', '无返回') - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) - - def MIDAUTUMN_2024_win(self, level): - try: - for i in range(level, 31): - print(f'开始第【{i}】关') - payload = {"levelIndex": i} - url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~midAutumn2024GameService~win' - - response = self.do_request(url, payload) - # print(response) - if response.get('success'): - obj = response.get('obj', [{}]) - currentAwardList = obj.get('currentAwardList', []) - if currentAwardList != []: - for award in currentAwardList: - currency = award.get('currency', '') - amount = award.get('amount', '') - print(f'> 获得:【{currency}】x{amount}') - else: - print(f'> 本关无奖励') - # random_time =random.randint(10,15) - # print(f'>> 等待{random_time}秒 <<') - # time.sleep(random_time) - else: - error_message = response.get('errorMessage', '无返回') - print(error_message) - if '没有资格参与活动' in error_message: - self.MIDAUTUMN_2024_black = True - Log('会员日任务风控') - except Exception as e: - print(e) + def member_day_red_packet_draw(self, level): + """提取会员日红包""" + payload = {'level': str(level)} + url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~memberDayPacketService~redPacketDraw' + response = self.do_request(url, data=payload) + if response.get('success'): + coupon_names = [item['couponName'] for item in response.get('obj', [])] or ['空气'] + Log(f"🎁 会员日提取[{level}级]红包: {', '.join(coupon_names)}") + else: + Log(f"📝 会员日提取[{level}级]红包失败: {response.get('errorMessage', '无返回')}") def main(self): - global one_msg - wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒 - time.sleep(wait_time) # 等待 - one_msg = '' - if not self.login_res: return False + """主执行逻辑""" + if not self.login_res: + return False + time.sleep(random.uniform(1, 3)) + # 执行签到任务 self.sign() self.superWelfare_receiveRedPacket() @@ -1657,123 +727,69 @@ class RUN: self.get_SignTaskList(True) # 执行丰蜜任务 - self.honey_indexData() - # 获取任务列表并执行任务 self.get_honeyTaskListStart() + self.honey_indexData() self.honey_indexData(True) - # ####################################### - # # # 获取当前季度结束日期 - # # activity_end_date = get_quarter_end_date() - # # if is_activity_end_date(activity_end_date): - # # Log("今天采蜜活动截止兑换,请及时进行兑换") - # # send('顺丰速运挂机通知', "今天采蜜活动截止兑换,请及时进行兑换") - target_time = datetime(2025, 4, 8, 19, 0) - if datetime.now() < target_time: + # 检查活动截止时间 + activity_end_date = get_quarter_end_date() + days_left = (activity_end_date - datetime.now()).days + Log(f"⏰ 采蜜活动截止兑换还有{days_left}天,请及时进行兑换!!") + + # 执行32周年活动任务 + try: + self.activityTaskService_taskList() + self.activityTaskService_integralExchange() + if self.dragonBoatGame2025Service() and not self.ifPassAllLevel: + for index in range(1, 5): + self.dragonBoatGame2025ServiceWin(index) + time.sleep(1.5) + self.dragonBoat2025HastenService() + while self.lotteryNum > 0: + self.hastenLottery() + time.sleep(1) + self.getUpgradeStatus() + self.lotteryNum -= 1 + except Exception as e: + Log(f'❌ 32周年活动执行异常: {str(e)}') + + # 年终集卡任务 + if datetime.now() < datetime(2025, 4, 8, 19, 0): self.EAR_END_2023_TaskList() - self.EAR_END_2023_query() - # self.anniversary2024_task() else: - print('周年庆活动已结束') - # ####################################### - # self.member_day_index() - current_date = datetime.now().day - if 26 <= current_date <= 28: + Log('🎭 周年庆活动已结束') + + # 会员日任务 + if 26 <= datetime.now().day <= 28: self.member_day_index() - else: - print('未到指定时间不执行会员日任务') - - if self.MIDAUTUMN_2024_index(): - self.MIDAUTUMN_2024_weeklyGiftStatus() - self.MIDAUTUMN_2024_coinStatus() - self.MIDAUTUMN_2024_taskList() - # self.MIDAUTUMN_2024_Game_init() - self.MIDAUTUMN_2024_coinStatus(True) + Log('⏰ 未到指定时间不执行会员日任务') self.sendMsg() return True def sendMsg(self, help=False): - if self.send_UID: - push_res = CHERWIN_TOOLS.wxpusher(self.send_UID, one_msg, APP_NAME, help) - print(push_res) - + """发送通知(占位符)""" + pass def get_quarter_end_date(): + """计算当前季度结束日期""" current_date = datetime.now() current_month = current_date.month current_year = current_date.year - - # 计算下个季度的第一天 next_quarter_first_day = datetime(current_year, ((current_month - 1) // 3 + 1) * 3 + 1, 1) - - # 计算当前季度的最后一天 - quarter_end_date = next_quarter_first_day - timedelta(days=1) - - return quarter_end_date.strftime("%Y-%m-%d") - - -def is_activity_end_date(end_date): - current_date = datetime.now().date() - end_date = datetime.strptime(end_date, "%Y-%m-%d").date() - - return current_date == end_date - - -def down_file(filename, file_url): - print(f'开始下载:{filename},下载地址:{file_url}') - try: - response = requests.get(file_url, verify=False, timeout=10) - response.raise_for_status() - with open(filename + '.tmp', 'wb') as f: - f.write(response.content) - print(f'【{filename}】下载完成!') - - # 检查临时文件是否存在 - temp_filename = filename + '.tmp' - if os.path.exists(temp_filename): - # 删除原有文件 - if os.path.exists(filename): - os.remove(filename) - # 重命名临时文件 - os.rename(temp_filename, filename) - print(f'【{filename}】重命名成功!') - return True - else: - print(f'【{filename}】临时文件不存在!') - return False - except Exception as e: - print(f'【{filename}】下载失败:{str(e)}') - return False - - - + return next_quarter_first_day - timedelta(days=1) if __name__ == '__main__': + """主程序入口""" APP_NAME = '顺丰速运' - ENV_NAME = 'SFSY' - CK_NAME = 'url' - print(f''' -✨✨✨ {APP_NAME}脚本✨✨✨ - ''') - - #分割变量 - if ENV_NAME in os.environ: - tokens = re.split("@|#|\n",os.environ.get(ENV_NAME)) - elif "sfsyUrl" in os.environ: - print("调用拉菲变量") - tokens = re.split("@|#|\n",os.environ.get("sfsyUrl")) - else: - tokens =[''] - print(f'无{ENV_NAME}变量') - #exit() - local_version = '2024.06.02' - - # print(tokens) - if len(tokens) > 0: - print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<") + ENV_NAME = 'sfsyUrl' + token = os.getenv(ENV_NAME) + tokens = token.split('\n') if token else [] + if tokens: + Log(f"🚚 共获取到{len(tokens)}个账号") for index, infos in enumerate(tokens): - run_result = RUN(infos, index).main() - if not run_result: continue - if send: send(f'{APP_NAME}挂机通知', send_msg) + Log(f"==================================\n🚚 处理账号{index + 1}") + RUN(infos, index).main() + else: + Log("❌ 未获取到sfsyUrl环境变量")