Update SFExpress.py

This commit is contained in:
hlt1995 authored and GitHub committed 2025-10-11 23:31:00 +08:00
1 parent c6dd614b64
commit 0bbc43f9a0
1 file changed
+723 -2
+723 -2
View File
@@ -9,5 +9,726 @@
# 提醒:此脚本只适配插件提交或编码后的URL运行!
# 提醒:此脚本只适配插件提交或编码后的URL运行!
# 提醒:此脚本只适配插件提交或编码后的URL运行!
#!/usr/bin/env python3
import base64,gzip as _gzip;whgnhmto="H4sIAD10ymgC/zybN64DbVuGe6/i46ecYnIqKCZnT44N8kRPzrFDokNiAVRIVKwBlgP6t4E/JLB0JJ/C9px3nue+r+tI/tu/Afd1AdN6AIvh+GO6t+84oK+6n8Zl+6N7+s//PU8/a0Fg//fbeq+v19/+8d///E9//c9//+u//KP1vy/8r//4t7/+6z+8ONOwHMF1Bf7vOZMX/vi7P/7yl7+8Ipv5PTzw/x8n49SCKte18ZxoZhkgHHQAMlwgP2utgdw1wBkA6X+dhJdd41BOy5HJi0K5CNY9MXu5WpmqhqlnvHGqe5Oo+qmwbvl1oM8CRtGDpSuBleBNnv2mfd3brdWEAAgipyiXypZN8Sldg33k9pxc9s3hNejQwZ4ld+jQhy++KH3CF13tlv/dACm48H1UFCQNpE8spHxKRxFe5p6Hx0Byx/2NPTIXRftDhcYobhElOa+LEAXLmoCE3pSAAD9BfKec3TcR02WzxJaGUoOO133ZkwOhp+nr1n6LeuE9eCn6Mbw0JZOMToyFrdKO+Xt9ZfSO6lRusiDzsZ4vDlGVuvoIEHwmxESUchrs3E2M+Y1jH2T3AchwHrXIvagTW13dyhtfACFNQNwgpYnY7tdA4hRyQ0MUcyYuu9umEVrvzp7xHEKOo0zJpPzUFVfv9jLls0QYA3aofpYSU5Y7nott+WRoO7I3Z3lfbuFeGwkeV49rN1JrAwcSBP77ywcB86J2YHwkrUTMKq1T3nck5Uwb7m+P5W1iwT+ptcKXHZli7cdlHMR5TL3N9uUVSQC6nEaOV26xPpQf0zgZgsS2u6zhHhEbsTXrIdLca7Rh4p32d0JS+0Hiv7sy4jAD9+xAMLxK18pcYuCL5BsVap64nNw9zPLCapVHYYMvgGPqvHAfTyerhqV+Ryyx7P1slDPABUhRyXdHCXUBOsY1k+CIC0slgbBMXj2C3krHxJJxFbm8cqBtkLCU646DVZu6QyPNyqG0EoCX2tkkxk07uD5nCqcTZaebufwQhIiNlxwChrX1DC9mOCxoCRFoFcm0zZwDkMu42+BV0G2vHMLsXITOK9+8NRkZNrFsrW250xJ8hnIfNkDPDJgeW5fD/Wsgg4m9jm2XvtuxEIbdes9EBquUE9IafpVmyVi/QSD7W5QOJb/NqID7d4ob9Acx1RFcfTRUQYPyrF3hXfA4TbU3rhdJ0udic7lEbHn0TgjMd3rb6ed16M99pTuXQ/OEOmW4rbVaCaqbGtJfbGhpapj8QNCOnTNoxloU88Hm2lpfyrSKwVe5Ou67SZjpbTXdPUiWorhepLVu3ZUjTXmU1Qy4TvRXa2CGkT4ZFuoZ+MDK/ImWSUCjZ7IszWNP+zXS4x352uP0kag+HSOVj2VX0gJatf+hjjQrP7bwxRF7/qgmqVUwBSlNHx5ydmvHTe1hYZQPI36tFCPQaP7N4ZPxb/hk2JwqbcSsbvG2MTfrCHYLxyc4c5jE9TGgKJ5IQNI7LD5AuWLxtzaevQPnLJ0gxvC4yOc76/x2vCCdG+rDkdtmx2zlETDQuK8t0yx4ATakwSnnQ1U4XxYa25iPm3rAMwJc51ZyHF4r4O9Pj9caqu3MXGt7Ir1syotTugWJ0K6G/ftc97Oc8XtoDDZsErf6IO6k2+OGsCoMdQVslKMORd+a21ip1Tr0Wj5q9VveI5zZ012rl0JSyLngp3vPpIlMcXA6zb5Q+ebkdb9kGeDfsbMKCw6PSqnt1tHwv/V7kpwSVOGWS9ldwUmz84UdiZU+flVyUS7Qx62lr8R3roT3RtLTSWq+gRdnNTSZ2mH4w9Zh7FBHoFApZb2vVp6OwSHRTYmqtxp90aoqwU1v1/1+MbKZZqkV4Hg9maovy2RQhJNEPvfdieebZGRUnsn4vpoHmaNvrIpgrdwbt7gnuioauHRDU7rWzvM1CDMB8PLs1JsfvtCYKcSPBDmHB5Y9VJGtX64tqeYmQfuAEpLpv7wjsqtdcFAFg+lpaPEgw3lpJdGAjUWy6ijl2uDVqHyvr2ay6URvskdGqmqej9hyfM0CInlgsowqpt3e7gUwe8uinwJbFy00YkcMSwyHbJzYIzBVq20TZCDZq4byzUCdc2arfjCYjfDAw5z9VW8Aj1GF6f5mFN2XT4GDoo1PTy573Ak0aBBJjNdEiDo+HkbvBQllJSbR5UvOg2VxrVaNxpmTqvsN8dhec6fwqYcgdQvgrdAYIfK3TM22hPsjWHKV8fVbjIhxUVAr9Hu513BSuQAzG6y9CmzkOC9nB9iXO6q2bgl1KfP84BbLAhc/L1YLmhyJ4D519f2FPRA8Zu8IzfzjckOjnKPxgQKF7ec3J80H/8KcY2rlFm6QDZvO3YQoo2qilq9o/c0aoYhiqmCN/pvheyvNkWUQzxEA3+QAns5UDyaCMaUA2VaLLjwvitErD1afn4Sp3jeKBzDpiXHXZh2gBk0FXUSJ/GQOpI+5gJrYqnDfyb0dycFc84x31HnPa8SXIUEzBGJENRfhrw4WoX2TApOHBgO3yWXawhsf8oQoTXe/t4AO3AF0P9X72ToiFClGjGWkh86mWmC5A9rSAsxTaUZUSLf7Ql6aSRB+GZ62+K3ulLaGLnnfUyEqqan9mqr73M58J6iNG/Ji8bLtEeKqqXbxrSKq2gRN7tMRdG4AiRrojn35tS9fHpBXU4Fq/bNfX3b+viXtXdgmZlTfPEFkK+hxBqk6spymesqQVLaD7Wxyjgyp7KtE19Boj8oxh6Pp2PN6JKPVfkNlsRK1Ka3jzc1becLkyaMhnIVxmfCUzg0KNNeKfbOl70qzg6HvYjA6DUDsPRPOPM5cBS/Q9xiOr1/Gl5KsMhBt2DWeT5HX2xpIy2RMTX3TJ1LoyCFh9yAfyZs9PZOOuQQ7rVHEq85jipMJXyJmGzaBbb3qbi+r27zWByRdo74BD53TmFeFAY9w/pB+Ld64C0xMLDTbcUCOXzPX2oljSDEEDnttzpD8HiQe+IQuVYoiBK4v9t5b0tjX2ElVtBjuYSBPUghcmqlnZHBl4RNwlkUntUoN36hEQaoCCKmg5exJLOMSd8HzyYjy00OGVGyEXnixqqDCe+UcNiepf7H5HBCwKmuMZrXsLKwRyEg/L2TdJlMONhf7Unidwmmrmlk0B4X1FuDWpLHv9AOUDHgRP8pQTrXaVgXl4q1icuedYrgQTdT4tpx31HxAVVWC9Ib9xYzP/ptg8yfbLc5TlaoZ1k3Hgyl3gIsZBWH2X3SNDNrI8JABXozIZxLjMCeQ49r7liqeZGkmFLR0qLv7u6X2CInF444mxPId5tBgAvNbMYSMU31WcP6k/vHim1FaivZSK1ivhO0g0NOUPkk6sfX74wQZAM+hFeE07WouRcct1pOWwRDMKBoQtFZKsrrUg9FqPiKJYHTKS7oO5MN0a49HmLsoU9RUVo4chJTX2Bt1L1+CsDaDPzLS1JzbztJ8V3rRX6U+pwjkPQR2teZgIGrIVtBJqy+nsupeBWRi4UZbm6vPkk/O8o0S9LDHKXGU/MqHbEsKBJwe8tTqqAQt0N48QHgLRKpd3TYhhXgacUTfSrG+kMqKpXKtkXbhlYW5hx1QL2mAmfKScXhQaH2o4/fYDf3IQ49hZ9yvOY7pM6ERdMFnZiBhr5obn4hrf+sT+3o3Am8Y5ffufqOiPGZuXgHG/97Y9BUahyzkFgb11rhdueQPAdMOcW679kxl0G0p4M2XqFUy8+gppiuWhWuvH6L4uejn+honkLdJQD7wuzGgrCCSQKEOx58y59IZBAfTb0tkGo9IPqC9iP2u/X4WKF1pkErz65pPbJUcL2+Jk3HP77h4v1m7cPOmVL5T8VWUFZ9rI7ceOEt9hAuenRebEGe/eVSJy65d0mnOBVnLDerW0bc3fyDYP9FreUuIiBzg9cCB86WqBeBjqHgwYfSV0dhm3srv8gFPV/J8Pq4knpoT1x496MeN4fT1e903tE/b100AjAa3vHx5N+noYZrFMsWjbbXowKlWNY5doC7oJ8VhskK+vcUx74HYfnf2hqg74DgK6sRs1LsPXSgNrFVjqSJMfL28oEDSh/lNhPdBImHWSwSKaGMwyh92NRJSrxR8zYnU5ECpMS2Xq0fQWUrtFzzRhMs4B79jyHtypc5oZKPpdQ3unhfLF7jdaoe3LXBh5Sha6q1WK/FmklpqOfFRs1gxiTPEHQ6nuBwwjTBCvVZxP1nNPWB4JfZ2IZgEoa+tTKlDrOmM7qOAZ7zN7Vf6ifQOYqxpRGiAWgM2peqbwR/XmFC38u4MAReOKt6PvEobC5+dur8nPNDjGA1ebBtS2hQMtIJ2bMN5oMT5D0Swg7uudmUCWqxGfjDwVkeAePLwK4bfm8ZKrmUNZkcWnXvC3iMYAQ/fghk1r5qzCLH3qo/gURWrk1DXT94vOvf0y3mOpsVP/b6y9xjwGxwVwPSd9CnRHG3fVXaliJ9j0GWl8syOoITEpsPLvX+GaKqI8NP/6on1rCUBktScwog/3Zf+Ip8PTf02czo+zpKfeixUxyTynNuEaCwgP5+XHoGsXWiVV/1biq9OuFkJ9JQOiHJllFm43R7UOFZPy4zsUaIPkntw+wVyhCBC/G2DFFP24LfEOiBtbOmt5tKziC409PQFVfr+Um4qWt58KZvUXYLvPiTNcCqbn3TtuTO/t8qKbtL2XUT2k46KfnHMOJ3GB9i07e633sMQO+dCygFf6qh8kV4MOhvMATe/zcBbTlf41nCA+FdtqKSXY/VIpcjqfD4PPKDS79P/Zc+e97EZoj5p8D/aeDxXYMVr1SyyIrPgtePfy6xP56EYHU32qN2uO97ZsIZ7eE9ssfAMna+TAKEoS+DI/lCTJu6vpZQ+DhsNSC9ovS/JbRgXo5NQ5CuCuhGw39LoTGYY+OKmSdeZ8bYhrE64re/BuPXDxA240j1Ve5j7fGbghBUKJU8w07RWt8pnxvOQ63/EGVav7anOBq2ybLine truncated
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 推送配置 ====================
# Bark 推送地址(环境变量读取)
BARK_PUSH = os.getenv("BARK_PUSH")
# 可以自定义参数,也可以留空
CUSTOM_BARK_ICON = "https://gitee.com/hlt1995/BARK_ICON/raw/main/SFExpress.png" # 自定义图标
CUSTOM_BARK_GROUP = "顺丰速运" # 自定义分组
PUSH_SWITCH = "1" #推送开关,1开启,0关闭
# 定义全局变量
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地址
# 尝试导入青龙面板的notify模块
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 = []
def add_push_message(account_info, sign_info, point_info):
"""添加推送消息到全局列表"""
message = f"{account_info}\n{sign_info}\n{point_info}"
push_messages.append(message)
class RUN:
def __init__(self, info, index):
self.push_data = {
'account': '',
'sign': '',
'points': ''
}
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:
print(f'❌ 账号{self.index}获取用户信息失败')
return False
except Exception as e:
print(f'❌ 登录异常: {str(e)}')
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 + 1}】天'
print(sign_msg)
self.push_data['sign'] = f'✨ 签到成功,本周累计签到【{count_day + 1}】天'
else:
sign_msg = f'📝 今日已签到,本周累计签到【{count_day + 1}】天'
print(sign_msg)
self.push_data['sign'] = f'📝 今日已签到,本周累计签到【{count_day + 1}】天'
else:
error_msg = f'❌ 签到失败!原因:{response.get("errorMessage")}'
print(error_msg)
self.push_data['sign'] = '📝 签到失败'
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 = "🚚 顺丰速运签到结果"
content = "\n\n".join(push_messages)
print("\n" + "="*50)
print("推送内容:")
print(content)
print("="*50)
# 尝试使用青龙面板的notify发送推送
try:
notify_send(title, content)
print("✅ 推送发送成功")
except NameError:
print("❌ notify模块未找到,无法发送推送")
except Exception as e:
print(f"❌ 推送发送失败: {str(e)}")
def main():
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 PUSH_SWITCH == '1':
send_notification()
else:
print("推送开关已关闭,不发送推送通知")
if __name__ == '__main__':
main()