mirror of
https://github.com/hlt1995/qlScripts.git
synced 2026-11-05 23:26:44 +08:00
Update SFExpress_Year.py
This commit is contained in:
1 parent
961a2d29aa
commit
cb3303659b
1 file changed
+100
-11
+100
-11
@@ -5,8 +5,8 @@
|
||||
|
||||
顺丰33周年活动 - 完成任务抽勋章
|
||||
Author: 爱学习的呆子
|
||||
Version: 1.0.0
|
||||
Date: 2026-03-17
|
||||
Version: 1.1.0
|
||||
Date: 2026-03-19
|
||||
|
||||
顺丰暗号环境变量:sfsyah
|
||||
|
||||
@@ -27,6 +27,7 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
|
||||
|
||||
# 禁用SSL警告
|
||||
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
||||
inviteId = ['C6E5C3BDD7624520AB869D2AF9E75D95']
|
||||
|
||||
# ==================== 配置常量 ====================
|
||||
PROXY_TIMEOUT = 15
|
||||
@@ -58,7 +59,7 @@ SKIP_TASK_TYPES = [
|
||||
'CHARGE_COLLECT_ALL', # 充值1000元一键集齐
|
||||
'OPEN_FAMILY_HOME_MUTUAL', # 开通家庭8折互寄权益
|
||||
'BUY_ANNIVERSARY_LIMITED_PACKET', # 33周年宠粉券包
|
||||
'INTEGRAL_EXCHANGE', # 积分兑换抽勋章次数
|
||||
# 'INTEGRAL_EXCHANGE', # 积分兑换抽勋章次数(已特殊处理)
|
||||
]
|
||||
|
||||
|
||||
@@ -236,9 +237,11 @@ class SFHttpClient:
|
||||
|
||||
# ==================== 周年活动任务执行器 ====================
|
||||
class AnniversaryExecutor:
|
||||
def __init__(self, http: SFHttpClient, logger: Logger):
|
||||
# MODIFIED: 增加 user_id 参数
|
||||
def __init__(self, http: SFHttpClient, logger: Logger, user_id: str):
|
||||
self.http = http
|
||||
self.logger = logger
|
||||
self.user_id = user_id
|
||||
|
||||
# ---------- API 方法 ----------
|
||||
|
||||
@@ -274,6 +277,24 @@ class AnniversaryExecutor:
|
||||
return True
|
||||
return False
|
||||
|
||||
# ========== 新增:专用接口-领取寄件会员权益 ==========
|
||||
def receive_vip_benefit(self) -> bool:
|
||||
"""领取寄件会员权益(特殊任务)"""
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberManage~memberEquity~commonEquityReceive'
|
||||
data = {"key": "surprise_benefit"}
|
||||
resp = self.http.request(url, data=data)
|
||||
if resp and resp.get('success'):
|
||||
self.logger.success(f'[领取寄件会员权益] 完成成功')
|
||||
# 可选:解析返回的奖励信息
|
||||
if resp.get('obj'):
|
||||
self.logger.info(f'领取详情: {resp["obj"]}')
|
||||
return True
|
||||
else:
|
||||
error_msg = resp.get('errorMessage', '未知错误') if resp else '请求失败'
|
||||
self.logger.warning(f'[领取寄件会员权益] 完成失败: {error_msg}')
|
||||
return False
|
||||
# =================================================
|
||||
|
||||
def fetch_tasks_reward(self) -> Optional[Dict]:
|
||||
"""领取已完成任务的奖励(获得抽勋章次数)"""
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2026TaskService~fetchTasksReward'
|
||||
@@ -309,6 +330,17 @@ class AnniversaryExecutor:
|
||||
self.logger.error(f'抽勋章失败: {error_msg}')
|
||||
return None
|
||||
|
||||
def give_countdown_chance(self) -> Optional[Dict]:
|
||||
"""领取倒计时奖励(每日一次免费抽勋章机会)"""
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2026CardService~giveClaimChance'
|
||||
resp = self.http.request(url, data={})
|
||||
if resp and resp.get('success'):
|
||||
return resp.get('obj', {})
|
||||
else:
|
||||
error_msg = resp.get('errorMessage', '未知错误') if resp else '请求失败'
|
||||
self.logger.warning(f'领取倒计时奖励失败: {error_msg}')
|
||||
return None
|
||||
|
||||
def get_user_rest_integral(self) -> int:
|
||||
"""查询用户剩余积分"""
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~getUserRestIntegral'
|
||||
@@ -325,14 +357,16 @@ class AnniversaryExecutor:
|
||||
if points < 10:
|
||||
self.logger.warning(f'积分不足10,无法兑换(当前: {points})')
|
||||
return False
|
||||
# TODO: 需要抓取实际的积分兑换curl来确认接口
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~integralExchange'
|
||||
|
||||
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2026TaskService~integralExchange'
|
||||
data = {
|
||||
"activityCode": ACTIVITY_CODE,
|
||||
"channelType": "MINI_PROGRAM"
|
||||
"exchangeNum": 1, # 一次兑换1次机会
|
||||
"activityCode": ACTIVITY_CODE # 当前活动码
|
||||
}
|
||||
|
||||
resp = self.http.request(url, data=data)
|
||||
if resp and resp.get('success'):
|
||||
self.logger.success('积分兑换成功,获得1次抽勋章次数')
|
||||
return True
|
||||
else:
|
||||
error_msg = resp.get('errorMessage', '未知错误') if resp else '请求失败'
|
||||
@@ -371,6 +405,29 @@ class AnniversaryExecutor:
|
||||
self.logger.warning(f'提交暗号失败: 请求失败')
|
||||
return None
|
||||
|
||||
# ---------- 新增:邀请初始化 ----------
|
||||
def do_invite(self):
|
||||
"""发送邀请初始化请求(借鉴自第二段代码)"""
|
||||
try:
|
||||
# 从全局 inviteId 列表中排除自己的 user_id
|
||||
available_invites = [inv for inv in inviteId if inv != self.user_id]
|
||||
if not available_invites:
|
||||
self.logger.warning("没有可用的邀请码(排除自身后为空),跳过邀请")
|
||||
return
|
||||
random_invite = random.choice(available_invites)
|
||||
# self.logger.info(f"随机选择邀请码: {random_invite} (排除自身 {self.user_id})")
|
||||
# 构造邀请请求 URL,使用 commonNoLoginPost
|
||||
url = "https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2026IndexService~index"
|
||||
data = {"inviteType": 1, "inviteUserId": random_invite}
|
||||
resp = self.http.request(url, data=data)
|
||||
# if resp and resp.get('success'):
|
||||
# self.logger.success(f"邀请初始化成功,邀请码: {random_invite}")
|
||||
# else:
|
||||
# error_msg = resp.get('errorMessage', '未知错误') if resp else '请求失败'
|
||||
# self.logger.warning(f"邀请初始化失败: {error_msg}")
|
||||
except Exception as e:
|
||||
self.logger.error(f"邀请初始化异常: {str(e)}")
|
||||
|
||||
# ---------- 业务逻辑 ----------
|
||||
|
||||
def do_guess_game(self) -> bool:
|
||||
@@ -504,7 +561,15 @@ class AnniversaryExecutor:
|
||||
result['tasks_completed'] += 1
|
||||
continue
|
||||
|
||||
# 有taskCode的任务尝试自动完成
|
||||
# ========== 新增:领取寄件会员权益特殊处理 ==========
|
||||
if task_type == 'RECEIVE_VIP_BENEFIT':
|
||||
self.logger.task(f'[{task_name}] 尝试专用接口领取...')
|
||||
if self.receive_vip_benefit():
|
||||
result['tasks_completed'] += 1
|
||||
continue
|
||||
# =================================================
|
||||
|
||||
# 有taskCode的任务尝试自动完成(通用接口)
|
||||
if task_code:
|
||||
self.logger.task(f'[{task_name}] 尝试完成任务 (taskCode: {task_code})')
|
||||
if self.finish_task(task_code):
|
||||
@@ -540,6 +605,27 @@ class AnniversaryExecutor:
|
||||
milestones = ', '.join([f'{k}个任务得{v}次' for k, v in sorted(config.items(), key=lambda x: int(x[0]))])
|
||||
self.logger.info(f'累计完成任务数: {progress} (里程碑: {milestones})')
|
||||
|
||||
def do_countdown_chance(self, result: Dict) -> None:
|
||||
"""领取倒计时奖励(每日免费抽勋章机会)"""
|
||||
self.logger.info('领取倒计时奖励...')
|
||||
time.sleep(1)
|
||||
resp = self.give_countdown_chance()
|
||||
if resp:
|
||||
if resp.get('todayCountdownChanceGiven'):
|
||||
received = resp.get('receivedAccountList', [])
|
||||
if received:
|
||||
for item in received:
|
||||
currency = item.get('currency', '')
|
||||
amount = item.get('amount', 0)
|
||||
self.logger.success(f'倒计时奖励: {currency} x{amount}')
|
||||
else:
|
||||
self.logger.success('倒计时奖励已领取')
|
||||
else:
|
||||
self.logger.info('今日倒计时奖励未到领取时间')
|
||||
else:
|
||||
self.logger.warning('倒计时奖励领取失败')
|
||||
|
||||
|
||||
def do_claim_medals(self, result: Dict) -> None:
|
||||
"""抽勋章直到没有次数"""
|
||||
# 先查看当前状态
|
||||
@@ -616,6 +702,9 @@ class AnniversaryExecutor:
|
||||
'claim_balance': 0,
|
||||
}
|
||||
|
||||
# MODIFIED: 在任务开始前先发送邀请
|
||||
self.do_invite()
|
||||
|
||||
# 0. 获取活动首页信息
|
||||
index_info = self.get_activity_index()
|
||||
if index_info:
|
||||
@@ -673,8 +762,8 @@ def run_account(account_url: str, index: int) -> Dict[str, Any]:
|
||||
# 随机延迟
|
||||
time.sleep(random.uniform(1, 3))
|
||||
|
||||
# 执行周年活动
|
||||
executor = AnniversaryExecutor(http, logger)
|
||||
# MODIFIED: 将 user_id 传递给 AnniversaryExecutor
|
||||
executor = AnniversaryExecutor(http, logger, user_id)
|
||||
activity_result = executor.run()
|
||||
|
||||
return {
|
||||
|
||||
Reference in new issue
Block a user