Files
hlt1995-qlScripts/SFExpress.py
T
2025-10-24 14:54:58 +08:00

748 lines
32 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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}&timestamp={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()