mirror of
https://github.com/hlt1995/qlScripts.git
synced 2026-11-05 23:26:44 +08:00
Rename SFExpress.py to Backup/#SFExpress.py
This commit is contained in:
1 parent
cb36fe6d6f
commit
777302794b
1 file changed
@@ -0,0 +1,747 @@
|
||||
# cron: 10 12 * * *
|
||||
# const $ = new Env('顺丰速运')
|
||||
|
||||
# 变量名:sfsyUrl
|
||||
# 格式:多账号用&分割或创建多个变量sfsyUrl
|
||||
# 关于参数获取如下两种方式:
|
||||
# ❶顺丰APP绑定微信后,前往该站点sm.linzixuan.work用微信扫码登录后,选择复制编码Token,不要复制错
|
||||
# 或者
|
||||
# ❷打开小程序或APP-我的-积分, 手动抓包以下几种URL之一
|
||||
# https://mcs-mimp-web.sf-express.com/mcs-mimp/share/weChat/activityRedirect?
|
||||
# 抓好URL后访问https://www.toolhelper.cn/EncodeDecode/Url 进行编码,请务必按提示操作
|
||||
# 提醒:此脚本只适配插件提交或编码后的URL运行!
|
||||
# 提醒:此脚本只适配插件提交或编码后的URL运行!
|
||||
# 提醒:此脚本只适配插件提交或编码后的URL运行!
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
from sys import exit
|
||||
import requests
|
||||
from requests.packages.urllib3.exceptions import InsecureRequestWarning
|
||||
from urllib.parse import unquote
|
||||
|
||||
# ==================== Bark 推送配置 ====================
|
||||
# 添加自定义参数,也可以留空
|
||||
CUSTOM_BARK_ICON = "https://gitee.com/hlt1995/BARK_ICON/raw/main/SFExpress.png" # 自定义图标
|
||||
CUSTOM_BARK_GROUP = "顺丰速运" # 自定义分组
|
||||
PUSH_SWITCH = "1" #推送开关,1开启,0关闭
|
||||
# =======================================================
|
||||
|
||||
BARK_PUSH = os.getenv("BARK_PUSH")
|
||||
BARK_ICON = CUSTOM_BARK_ICON or os.getenv("BARK_ICON", "")
|
||||
BARK_GROUP = CUSTOM_BARK_GROUP or os.getenv("BARK_GROUP", "")
|
||||
|
||||
os.environ["BARK_ICON"] = BARK_ICON
|
||||
os.environ["BARK_GROUP"] = BARK_GROUP
|
||||
os.environ["PUSH_SWITCH"] = PUSH_SWITCH
|
||||
|
||||
# 禁用安全请求警告
|
||||
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
||||
PROXY_API_URL = os.getenv('SF_PROXY_API_URL', '') # 从环境变量获取代理API地址
|
||||
|
||||
try:
|
||||
from notify import send as notify_send
|
||||
except ImportError:
|
||||
print("❌ 未找到notify模块,将使用普通输出")
|
||||
|
||||
def get_proxy():
|
||||
try:
|
||||
if not PROXY_API_URL:
|
||||
print('⚠️ 未配置代理API地址,将不使用代理')
|
||||
return None
|
||||
|
||||
response = requests.get(PROXY_API_URL, timeout=10)
|
||||
if response.status_code == 200:
|
||||
proxy_text = response.text.strip()
|
||||
if ':' in proxy_text:
|
||||
proxy = f'http://{proxy_text}'
|
||||
return {
|
||||
'http': proxy,
|
||||
'https': proxy
|
||||
}
|
||||
print(f'❌ 获取代理失败: {response.text}')
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f'❌ 获取代理异常: {str(e)}')
|
||||
return None
|
||||
|
||||
# 全局变量用于存储推送消息
|
||||
push_messages = []
|
||||
force_push = False
|
||||
|
||||
def add_push_message(account_info, sign_info, point_info):
|
||||
message = f"{account_info}\n{sign_info}\n{point_info}"
|
||||
push_messages.append(message)
|
||||
|
||||
def add_error_message(error_info):
|
||||
global force_push
|
||||
force_push = True
|
||||
push_messages.append(f"❌ {error_info}")
|
||||
|
||||
class RUN:
|
||||
def __init__(self, info, index):
|
||||
self.push_data = {
|
||||
'account': '',
|
||||
'sign': '',
|
||||
'points': ''
|
||||
}
|
||||
self.has_error = False # 标记当前账号是否有错误
|
||||
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.index = index + 1
|
||||
|
||||
self.proxy = get_proxy()
|
||||
if self.proxy:
|
||||
print(f"✅ 成功获取代理: {self.proxy['http']}")
|
||||
|
||||
self.s = requests.session()
|
||||
self.s.verify = False
|
||||
if self.proxy:
|
||||
self.s.proxies = self.proxy
|
||||
|
||||
self.headers = {
|
||||
'Host': 'mcs-mimp-web.sf-express.com',
|
||||
'upgrade-insecure-requests': '1',
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090551) XWEB/6945 Flue',
|
||||
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
|
||||
'sec-fetch-site': 'none',
|
||||
'sec-fetch-mode': 'navigate',
|
||||
'sec-fetch-user': '?1',
|
||||
'sec-fetch-dest': 'document',
|
||||
'accept-language': 'zh-CN,zh',
|
||||
'platform': 'MINI_PROGRAM',
|
||||
}
|
||||
|
||||
self.login_res = self.login(url)
|
||||
self.all_logs = []
|
||||
self.today = datetime.now().strftime('%Y-%m-%d')
|
||||
self.member_day_black = False
|
||||
self.member_day_red_packet_drew_today = False
|
||||
self.member_day_red_packet_map = {}
|
||||
self.max_level = 8
|
||||
self.packet_threshold = 1 << (self.max_level - 1)
|
||||
self.totalPoint = 0
|
||||
self.initial_points = 0 # 初始积分
|
||||
self.today_earned = 0 # 今日获得积分
|
||||
|
||||
def get_deviceId(self, characters='abcdef0123456789'):
|
||||
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):
|
||||
try:
|
||||
decoded_url = unquote(sfurl)
|
||||
ress = self.s.get(decoded_url, 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:
|
||||
print(f'👤 账号{self.index}:【{self.mobile}】登陆成功')
|
||||
self.push_data['account'] = f'👤 账号{self.index}:【{self.mobile}】'
|
||||
return True
|
||||
else:
|
||||
error_msg = f'账号{self.index}获取用户信息失败'
|
||||
print(f'❌ {error_msg}')
|
||||
self.push_data['account'] = f'❌ 账号{self.index}'
|
||||
add_error_message(error_msg)
|
||||
self.has_error = True
|
||||
return False
|
||||
except Exception as e:
|
||||
error_msg = f'登录异常: {str(e)}'
|
||||
print(f'❌ {error_msg}')
|
||||
self.push_data['account'] = f'❌ 账号{self.index}'
|
||||
add_error_message(error_msg)
|
||||
self.has_error = True
|
||||
return False
|
||||
|
||||
def getSign(self):
|
||||
timestamp = str(int(round(time.time() * 1000)))
|
||||
token = 'wwesldfs29aniversaryvdld29'
|
||||
sysCode = 'MCS-MIMP-CORE'
|
||||
data = f'token={token}×tamp={timestamp}&sysCode={sysCode}'
|
||||
signature = hashlib.md5(data.encode()).hexdigest()
|
||||
data = {
|
||||
'sysCode': sysCode,
|
||||
'timestamp': timestamp,
|
||||
'signature': signature
|
||||
}
|
||||
self.headers.update(data)
|
||||
return data
|
||||
|
||||
def do_request(self, url, data={}, req_type='post', max_retries=3):
|
||||
self.getSign()
|
||||
retry_count = 0
|
||||
|
||||
while retry_count < max_retries:
|
||||
try:
|
||||
if req_type.lower() == 'get':
|
||||
response = self.s.get(url, headers=self.headers, timeout=30)
|
||||
elif req_type.lower() == 'post':
|
||||
response = self.s.post(url, headers=self.headers, json=data, timeout=30)
|
||||
else:
|
||||
raise ValueError('Invalid req_type: %s' % req_type)
|
||||
|
||||
response.raise_for_status()
|
||||
|
||||
try:
|
||||
res = response.json()
|
||||
return res
|
||||
except json.JSONDecodeError as e:
|
||||
print(f'JSON解析失败: {str(e)}, 响应内容: {response.text[:200]}')
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
print(f'正在进行第{retry_count + 1}次重试...')
|
||||
time.sleep(2)
|
||||
continue
|
||||
return None
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
print(f'请求失败,正在切换代理重试 ({retry_count}/{max_retries}): {str(e)}')
|
||||
self.proxy = get_proxy()
|
||||
if self.proxy:
|
||||
print(f"✅ 成功获取新代理: {self.proxy['http']}")
|
||||
self.s.proxies = self.proxy
|
||||
time.sleep(2)
|
||||
else:
|
||||
print('请求最终失败:', e)
|
||||
return None
|
||||
|
||||
return None
|
||||
|
||||
def sign(self):
|
||||
print(f'🎯 开始执行签到')
|
||||
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)
|
||||
if response.get('success') == True:
|
||||
count_day = response.get('obj', {}).get('countDay', 0)
|
||||
if response.get('obj') and response['obj'].get('integralTaskSignPackageVOList'):
|
||||
packet_name = response["obj"]["integralTaskSignPackageVOList"][0]["packetName"]
|
||||
sign_msg = f'✨ 签到成功,获得【{packet_name}】,本周累计签到【{count_day}】天'
|
||||
print(sign_msg)
|
||||
self.push_data['sign'] = f'✨ 签到成功,本周累计签到【{count_day}】天'
|
||||
else:
|
||||
sign_msg = f'📝 今日已签到,本周累计签到【{count_day}】天'
|
||||
print(sign_msg)
|
||||
self.push_data['sign'] = f'📝 今日已签到,本周累计签到【{count_day}】天'
|
||||
else:
|
||||
error_msg = f'签到失败!原因:{response.get("errorMessage")}'
|
||||
print(f'❌ {error_msg}')
|
||||
self.push_data['sign'] = '❌ 签到失败'
|
||||
add_error_message(error_msg)
|
||||
self.has_error = True
|
||||
|
||||
def superWelfare_receiveRedPacket(self):
|
||||
print(f'🎁 超值福利签到')
|
||||
json_data = {
|
||||
'channel': 'czflqdlhbxcx'
|
||||
}
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberActLengthy~redPacketActivityService~superWelfare~receiveRedPacket'
|
||||
response = self.do_request(url, data=json_data)
|
||||
if response.get('success') == True:
|
||||
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])
|
||||
receive_status = response.get('obj', {}).get('receiveStatus')
|
||||
status_message = '领取成功' if receive_status == 1 else '已领取过'
|
||||
print(f'🎉 超值福利签到[{status_message}]: {gift_names}')
|
||||
else:
|
||||
error_message = response.get('errorMessage') or json.dumps(response) or '无返回'
|
||||
print(f'❌ 超值福利签到失败: {error_message}')
|
||||
|
||||
def get_SignTaskList(self, END=False):
|
||||
if not END:
|
||||
print(f'🎯 开始获取签到任务列表')
|
||||
# 记录初始积分
|
||||
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)
|
||||
if response.get('success') == True and response.get('obj') != []:
|
||||
self.initial_points = response["obj"]["totalPoint"]
|
||||
print(f'💰 初始积分:【{self.initial_points}】')
|
||||
else:
|
||||
print(f'🎯 获取最终积分')
|
||||
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)
|
||||
if response.get('success') == True and response.get('obj') != []:
|
||||
self.totalPoint = response["obj"]["totalPoint"]
|
||||
self.today_earned = self.totalPoint - self.initial_points
|
||||
points_msg = f'💰 当前积分:【{self.totalPoint}】'
|
||||
if self.today_earned > 0:
|
||||
points_msg += f'(+{self.today_earned})'
|
||||
print(points_msg)
|
||||
self.push_data['points'] = points_msg
|
||||
return
|
||||
|
||||
if response.get('success') == True and response.get('obj') != []:
|
||||
self.totalPoint = response["obj"]["totalPoint"]
|
||||
if not END:
|
||||
print(f'💰 执行前积分:【{self.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:
|
||||
self.doTask()
|
||||
time.sleep(3)
|
||||
self.receiveTask()
|
||||
|
||||
def doTask(self):
|
||||
print(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")}')
|
||||
|
||||
def receiveTask(self):
|
||||
print(f'🎁 开始领取【{self.title}】任务奖励')
|
||||
json_data = {
|
||||
"strategyId": self.strategyId,
|
||||
"taskId": self.taskId,
|
||||
"taskCode": self.taskCode,
|
||||
"deviceId": self.get_deviceId()
|
||||
}
|
||||
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")}')
|
||||
|
||||
# 其他方法保持不变...
|
||||
def EAR_END_2023_TaskList(self):
|
||||
print('\n🎭 开始年终集卡任务')
|
||||
json_data = {
|
||||
"activityCode": "YEAREND_2024",
|
||||
"channelType": "MINI_PROGRAM"
|
||||
}
|
||||
self.headers['channel'] = '24nzdb'
|
||||
self.headers['platform'] = 'MINI_PROGRAM'
|
||||
self.headers['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)
|
||||
if response.get('success') == True:
|
||||
for item in response["obj"]:
|
||||
self.title = item["taskName"]
|
||||
self.taskType = item["taskType"]
|
||||
status = item["status"]
|
||||
if status == 3:
|
||||
print(f'✨ 【{self.taskType}】-已完成')
|
||||
continue
|
||||
if self.taskType == 'INTEGRAL_EXCHANGE':
|
||||
print(f'⚠️ 积分兑换任务暂不支持')
|
||||
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)
|
||||
self.receiveTask()
|
||||
else:
|
||||
print(f'⚠️ 暂时不支持【{self.title}】任务')
|
||||
|
||||
def addDeliverPrefer(self):
|
||||
print(f'>>>开始【{self.title}】任务')
|
||||
json_data = {
|
||||
"country": "中国",
|
||||
"countryCode": "A000086000",
|
||||
"province": "北京市",
|
||||
"provinceCode": "A110000000",
|
||||
"city": "北京市",
|
||||
"cityCode": "A111000000",
|
||||
"county": "东城区",
|
||||
"countyCode": "A110101000",
|
||||
"address": "1号楼1单元101",
|
||||
"latitude": "",
|
||||
"longitude": "",
|
||||
"memberId": "",
|
||||
"locationCode": "010",
|
||||
"zoneCode": "CN",
|
||||
"postCode": "",
|
||||
"takeWay": "7",
|
||||
"callBeforeDelivery": 'false',
|
||||
"deliverTag": "2,3,4,1",
|
||||
"deliverTagContent": "",
|
||||
"startDeliverTime": "",
|
||||
"selectCollection": 'false',
|
||||
"serviceName": "",
|
||||
"serviceCode": "",
|
||||
"serviceType": "",
|
||||
"serviceAddress": "",
|
||||
"serviceDistance": "",
|
||||
"serviceTime": "",
|
||||
"serviceTelephone": "",
|
||||
"channelCode": "RW11111",
|
||||
"taskId": self.taskId,
|
||||
"extJson": "{\"noDeliverDetail\":[]}"
|
||||
}
|
||||
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 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()
|
||||
print(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', '无返回')
|
||||
print(f'📝 查询会员日失败: {error_message}')
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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', '空气')
|
||||
print(f'🎁 会员日奖励: {product_name}')
|
||||
else:
|
||||
error_message = response.get('errorMessage', '无返回')
|
||||
print(f'📝 领取会员日奖励失败: {error_message}')
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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', '空气')
|
||||
print(f'🎁 会员日抽奖: {product_name}')
|
||||
else:
|
||||
error_message = response.get('errorMessage', '无返回')
|
||||
print(f'📝 会员日抽奖失败: {error_message}')
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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', '无返回')
|
||||
print('📝 查询会员日任务失败: ' + error_message)
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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'):
|
||||
print('📝 完成会员日任务[' + task['taskName'] + ']成功')
|
||||
self.member_day_fetch_mix_task_reward(task)
|
||||
else:
|
||||
error_message = response.get('errorMessage', '无返回')
|
||||
print('📝 完成会员日任务[' + task['taskName'] + ']失败: ' + error_message)
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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'):
|
||||
print('🎁 领取会员日任务[' + task['taskName'] + ']奖励成功')
|
||||
else:
|
||||
error_message = response.get('errorMessage', '无返回')
|
||||
print('📝 领取会员日任务[' + task['taskName'] + ']奖励失败: ' + error_message)
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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
|
||||
print('📝 会员日任务风控')
|
||||
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)
|
||||
|
||||
print("📝 会员日合成列表: " + ", ".join(packet_summary))
|
||||
|
||||
if self.member_day_red_packet_map.get(self.max_level):
|
||||
print(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
|
||||
print(f"📝 会员日距离[{self.max_level}级]红包还差: [1级]红包X{remaining}")
|
||||
|
||||
else:
|
||||
error_message = response.get('errorMessage', '无返回')
|
||||
print(f'📝 查询会员日合成失败: {error_message}')
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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'):
|
||||
print(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', '无返回')
|
||||
print(f'📝 会员日合成两个[{level}级]红包失败: {error_message}')
|
||||
if '没有资格参与活动' in error_message:
|
||||
self.member_day_black = True
|
||||
print('📝 会员日任务风控')
|
||||
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 []
|
||||
|
||||
print(f"🎁 会员日提取[{level}级]红包: {', '.join(coupon_names) or '空气'}")
|
||||
else:
|
||||
error_message = response.get('errorMessage') if response else "无返回"
|
||||
print(f"📝 会员日提取[{level}级]红包失败: {error_message}")
|
||||
if "没有资格参与活动" in error_message:
|
||||
self.memberDay_black = True
|
||||
print("📝 会员日任务风控")
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def main(self):
|
||||
wait_time = random.randint(1000, 3000) / 1000.0
|
||||
time.sleep(wait_time)
|
||||
if not self.login_res:
|
||||
return False
|
||||
|
||||
self.sign()
|
||||
self.superWelfare_receiveRedPacket()
|
||||
self.get_SignTaskList()
|
||||
self.get_SignTaskList(True)
|
||||
|
||||
current_date = datetime.now().day
|
||||
if 26 <= current_date <= 28:
|
||||
self.member_day_index()
|
||||
else:
|
||||
print('⏰ 未到指定时间不执行会员日任务\n==================================\n')
|
||||
|
||||
# 添加到推送消息列表
|
||||
if self.push_data['account'] and self.push_data['sign'] and self.push_data['points']:
|
||||
add_push_message(self.push_data['account'], self.push_data['sign'], self.push_data['points'])
|
||||
|
||||
return True
|
||||
|
||||
def send_notification():
|
||||
"""发送推送通知"""
|
||||
if not push_messages:
|
||||
print("❌ 没有可推送的消息")
|
||||
return
|
||||
|
||||
# 构建推送内容
|
||||
title = "🚚 顺丰速运签到结果\n"
|
||||
content = "\n\n".join(push_messages)
|
||||
|
||||
print("\n" + "="*50)
|
||||
print("推送内容:")
|
||||
print(content)
|
||||
print("="*50)
|
||||
|
||||
try:
|
||||
notify_send(title, content)
|
||||
print("✅ 推送发送成功")
|
||||
except NameError:
|
||||
print("❌ notify模块未找到,无法发送推送")
|
||||
except Exception as e:
|
||||
print(f"❌ 推送发送失败: {str(e)}")
|
||||
|
||||
def main():
|
||||
global force_push
|
||||
ENV_NAME = 'sfsyUrl'
|
||||
local_version = '2025.10.08'
|
||||
token = os.getenv(ENV_NAME)
|
||||
if not token:
|
||||
print(f"❌ 未找到环境变量 {ENV_NAME},请检查配置")
|
||||
return
|
||||
tokens = token.split('&')
|
||||
tokens = [t.strip() for t in tokens if t.strip()]
|
||||
if len(tokens) == 0:
|
||||
print(f"❌ 环境变量 {ENV_NAME} 为空或格式错误")
|
||||
return
|
||||
|
||||
print(f"==================================")
|
||||
print(f"📱 共获取到{len(tokens)}个账号")
|
||||
print(f"==================================")
|
||||
|
||||
for index, infos in enumerate(tokens):
|
||||
run_result = RUN(infos, index).main()
|
||||
if not run_result:
|
||||
continue
|
||||
|
||||
# 发送推送
|
||||
if force_push or PUSH_SWITCH == '1':
|
||||
send_notification()
|
||||
else:
|
||||
print("✅ 推送开关已关闭,所有账号CK有效,不发送推送通知")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in new issue
Block a user