diff --git a/BWCJ.py b/BWCJ.py
index c4f4760..833b5d5 100755
--- a/BWCJ.py
+++ b/BWCJ.py
@@ -1,286 +1,293 @@
-# !/usr/bin/python3
-# -- coding: utf-8 --
-# -------------------------------
-# cron "30 1 * * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('霸王茶姬小程序')
-
-import os
-import requests
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-# import CHERWIN_TOOLS
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-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'
-
-class RUN:
- def __init__(self,info,index):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- self.token = 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
- Log(f"\n---------开始执行第{self.index}个账号>>>>>")
- self.s = requests.session()
- self.s.verify = False
-
- self.headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555',
- 'work-wechat-userid': '',
- 'multi-store-id': '',
- 'gdt-vid': '',
- 'qz-gtd': '',
- 'scene': '1006',
- 'Qm-From': 'wechat',
- 'store-id': '49006',
- 'Qm-User-Token': self.token,
- 'channelCode': '',
- 'Qm-From-Type': 'catering',
- 'promotion-code': '',
- 'work-staff-name': '',
- 'work-staff-id': '',
- 'Accept': 'v=1.0',
- 'Accept-Encoding': 'gzip,compress,br,deflate',
- 'Referer': 'https://servicewechat.com/wxafec6f8422cb357b/87/page-frame.html'
- }
- self.s.headers.update(self.headers)
- self.appid = 'wxafec6f8422cb357b'
- self.activity_id='947079313798000641'
-
- def personal_info(self):
- personal_info_valid = False
-
- try:
- # 请求的参数
- params = {'appid': self.appid}
-
- # 发送GET请求
- response = self.s.get('https://webapi.qmai.cn/web/catering/crm/personal-info', json=params)
- result = response.json()
-
- # 检查请求是否成功
- if result.get('code','-1') == '0':
- personal_info_valid = True
- # 提取个人信息
- mobile_phone = result['data']['mobilePhone'] if 'data' in result and 'mobilePhone' in result[
- 'data'] else None
- self.mobile_phone = mobile_phone[:3] + "*" * 4 + mobile_phone[7:]
- self.name = result['data']['name'] if 'data' in result and 'name' in result['data'] else None
-
- Log(f"账号[{self.index}]登陆成功!\n用户名:【{self.name}】 \n手机号:【{self.mobile_phone}】")
- else:
- # 如果请求不成功,则打印错误信息
- message = result.get('message', '')
- Log(f'登录失败: {message}')
-
- except Exception as e:
- # 捕获任何异常并打印
- print(e)
-
- finally:
- # 最终返回请求是否成功的标志
- return personal_info_valid
-
- def user_sign_statistics(self):
- try:
-
- json_data = {
- 'activityId': self.activity_id,
- 'appid': self.appid
- }
-
- # Send the POST request
- response = self.s.post('https://webapi.qmai.cn/web/cmk-center/sign/userSignStatistics', json=json_data)
- result = response.json()
- status_code = response.status_code
-
- # Check if the request was successful
- if result.get('code', status_code) == 0:
- data = result.get('data', {})
- sign_days = data.get('signDays', '')
- sign_status = data.get('signStatus', 0) == 1
- Log(f'新版签到今天{"已" if sign_status else "未"}签到, 已连续签到{sign_days}天')
- if not sign_status:
- self.take_part_in_sign()
- return sign_status, sign_days
- else:
- message = result.get('message', '')
- Log(f'查询新版签到失败: {message}')
- return False, 0
- except Exception as e:
- print(e)
- return False, 0
-
- def take_part_in_sign(self):
- try:
- json_data = {
- 'activityId': self.activity_id,
- 'appid': self.appid
- }
- response = self.s.post('https://webapi.qmai.cn/web/cmk-center/sign/takePartInSign', json=json_data)
- result = response.json()
- status_code = response.status_code
-
- if result.get('code', status_code) == 0:
- data = result.get('data',{})
- rewardDetailList = data.get('rewardDetailList',[{}])
- if rewardDetailList:
- rewardName = rewardDetailList[0].get('rewardName','')
- sendNum = rewardDetailList[0].get('sendNum','')
- Log(f'新版签到成功,获得【{sendNum}】{rewardName}')
- return True
- else:
- Log(f'签到失败:【{result.get("message","")}】')
- return True
- else:
- message = result.get('message', '')
- Log(f'新版签到失败: {message}')
- return False
- except Exception as e:
- print(e)
- return False
-
- def points_info(self):
- try:
- json_data = {
- 'appid': self.appid
- }
-
- response = self.s.post('https://webapi.qmai.cn/web/catering/crm/points-info', json=json_data)
- result = response.json()
- status_code = response.status_code
-
- if result.get('code', status_code) == '0':
- data = result.get('data', {})
- soon_expired_points = data.get('soonExpiredPoints', 0)
- total_points = data.get('totalPoints', 0)
- expired_time = data.get('expiredTime', '')
-
- if soon_expired_points:
- Log(f'有【{soon_expired_points}】积分将于( {expired_time})过期')
-
- Log(f'当前积分: 【{total_points}】')
- return total_points, soon_expired_points, expired_time
- else:
- message = result.get('message', '')
- Log(f'查询积分失败: {message}')
- return None
- except Exception as e:
- print(e)
- return False
-
- def main(self):
- if not self.personal_info() :
- Log("用户信息无效,请更新CK")
- return False
- self.user_sign_statistics()
- self.points_info()
- 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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-
-
-if __name__ == '__main__':
- APP_NAME = '霸王茶姬小程序'
- ENV_NAME = 'BWCJ'
- CK_NAME = 'qm-user-token'
- print(f'''
-✨✨✨ {APP_NAME}签到✨✨✨
-✨ 功能:
- 积分签到
-✨ 抓包步骤:
- 打开{APP_NAME}
- 授权登陆
- 打开抓包工具
- 找请求头带{CK_NAME}的URl
- 复制里面的{CK_NAME}参数值
-✨ ✨✨wxpusher一对一推送功能,
- ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
- ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
-参数示例:Fks8FqmiTksnmZSj2fDvxxxxxxxxx@UID_xxxxx
-✨ 设置青龙变量:
-export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
-✨ 推荐cron:5 8 * * *
-✨✨✨ @Author CHERWIN✨✨✨
-''')
- local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- token = ENV if ENV else token
- if not token:
- print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
- exit()
- tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
- for index, infos in enumerate(tokens):
- run_result = RUN(infos, index).main()
- if not run_result: continue
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# cron "30 1 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('霸王茶姬小程序')
+
+import os
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+# import CHERWIN_TOOLS
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+
+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'
+
+class RUN:
+ def __init__(self,info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ self.token = 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
+ Log(f"\n---------开始执行第{self.index}个账号>>>>>")
+ self.s = requests.session()
+ self.s.verify = False
+
+ self.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555',
+ 'work-wechat-userid': '',
+ 'multi-store-id': '',
+ 'gdt-vid': '',
+ 'qz-gtd': '',
+ 'scene': '1006',
+ 'Qm-From': 'wechat',
+ 'store-id': '49006',
+ 'Qm-User-Token': self.token,
+ 'channelCode': '',
+ 'Qm-From-Type': 'catering',
+ 'promotion-code': '',
+ 'work-staff-name': '',
+ 'work-staff-id': '',
+ 'Accept': 'v=1.0',
+ 'Accept-Encoding': 'gzip,compress,br,deflate',
+ 'Referer': 'https://servicewechat.com/wxafec6f8422cb357b/87/page-frame.html'
+ }
+ self.s.headers.update(self.headers)
+ self.appid = 'wxafec6f8422cb357b'
+ self.activity_id='947079313798000641'
+
+ def personal_info(self):
+ personal_info_valid = False
+
+ try:
+ # 请求的参数
+ params = {'appid': self.appid}
+
+ # 发送GET请求
+ response = self.s.get('https://webapi.qmai.cn/web/catering/crm/personal-info', json=params)
+ result = response.json()
+
+ # 检查请求是否成功
+ if result.get('code','-1') == '0':
+ personal_info_valid = True
+ # 提取个人信息
+ mobile_phone = result['data']['mobilePhone'] if 'data' in result and 'mobilePhone' in result[
+ 'data'] else None
+ self.mobile_phone = mobile_phone[:3] + "*" * 4 + mobile_phone[7:]
+ self.name = result['data']['name'] if 'data' in result and 'name' in result['data'] else None
+
+ Log(f"账号[{self.index}]登陆成功!\n用户名:【{self.name}】 \n手机号:【{self.mobile_phone}】")
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = result.get('message', '')
+ Log(f'登录失败: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ finally:
+ # 最终返回请求是否成功的标志
+ return personal_info_valid
+
+ def user_sign_statistics(self):
+ try:
+
+ json_data = {
+ 'activityId': self.activity_id,
+ 'appid': self.appid
+ }
+
+ # Send the POST request
+ response = self.s.post('https://webapi.qmai.cn/web/cmk-center/sign/userSignStatistics', json=json_data)
+ result = response.json()
+ status_code = response.status_code
+
+ # Check if the request was successful
+ if result.get('code', status_code) == 0:
+ data = result.get('data', {})
+ sign_days = data.get('signDays', '')
+ sign_status = data.get('signStatus', 0) == 1
+ Log(f'新版签到今天{"已" if sign_status else "未"}签到, 已连续签到{sign_days}天')
+ if not sign_status:
+ self.take_part_in_sign()
+ return sign_status, sign_days
+ else:
+ message = result.get('message', '')
+ Log(f'查询新版签到失败: {message}')
+ return False, 0
+ except Exception as e:
+ print(e)
+ return False, 0
+
+ def take_part_in_sign(self):
+ try:
+ json_data = {
+ 'activityId': self.activity_id,
+ 'appid': self.appid
+ }
+ response = self.s.post('https://webapi.qmai.cn/web/cmk-center/sign/takePartInSign', json=json_data)
+ result = response.json()
+ status_code = response.status_code
+
+ if result.get('code', status_code) == 0:
+ data = result.get('data',{})
+ rewardDetailList = data.get('rewardDetailList',[{}])
+ if rewardDetailList:
+ rewardName = rewardDetailList[0].get('rewardName','')
+ sendNum = rewardDetailList[0].get('sendNum','')
+ Log(f'新版签到成功,获得【{sendNum}】{rewardName}')
+ return True
+ else:
+ Log(f'签到失败:【{result.get("message","")}】')
+ return True
+ else:
+ message = result.get('message', '')
+ Log(f'新版签到失败: {message}')
+ return False
+ except Exception as e:
+ print(e)
+ return False
+
+ def points_info(self):
+ try:
+ json_data = {
+ 'appid': self.appid
+ }
+
+ response = self.s.post('https://webapi.qmai.cn/web/catering/crm/points-info', json=json_data)
+ result = response.json()
+ status_code = response.status_code
+
+ if result.get('code', status_code) == '0':
+ data = result.get('data', {})
+ soon_expired_points = data.get('soonExpiredPoints', 0)
+ total_points = data.get('totalPoints', 0)
+ expired_time = data.get('expiredTime', '')
+
+ if soon_expired_points:
+ Log(f'有【{soon_expired_points}】积分将于( {expired_time})过期')
+
+ Log(f'当前积分: 【{total_points}】')
+ return total_points, soon_expired_points, expired_time
+ else:
+ message = result.get('message', '')
+ Log(f'查询积分失败: {message}')
+ return None
+ except Exception as e:
+ print(e)
+ return False
+
+ def main(self):
+ if not self.personal_info() :
+ Log("用户信息无效,请更新CK")
+ self.sendMsg()
+ return False
+ self.user_sign_statistics()
+ self.points_info()
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+
+if __name__ == '__main__':
+ APP_NAME = '霸王茶姬小程序'
+ ENV_NAME = 'BWCJ'
+ CK_NAME = 'qm-user-token'
+ print(f'''
+✨✨✨ {APP_NAME}签到✨✨✨
+✨ 功能:
+ 积分签到
+✨ 抓包步骤:
+ 打开{APP_NAME}
+ 授权登陆
+ 打开抓包工具
+ 找请求头带{CK_NAME}的URl
+ 复制里面的{CK_NAME}参数值
+✨ ✨✨wxpusher一对一推送功能,
+ ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
+ ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
+参数示例:Fks8FqmiTksnmZSj2fDvxxxxxxxxx@UID_xxxxx
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
+✨ 推荐cron:5 8 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{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 + TIPS_HTML)
\ No newline at end of file
diff --git a/CHERWIN_TOOLS.py b/CHERWIN_TOOLS.py
index 2ece9d4..05fe130 100755
--- a/CHERWIN_TOOLS.py
+++ b/CHERWIN_TOOLS.py
@@ -1,505 +1,452 @@
-import json
-import os
-import importlib.util
-import subprocess
-import sys
-import requests
-from http import HTTPStatus
-
-NOW_TOOLS_VERSION = '2024.05.04'
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-
-
-# 尝试导入包
-def import_or_install(package_name, import_name=None):
- # 如果传入了 import_name,则使用它来检查模块,否则默认与包名相同
- import_name = import_name or package_name
-
- try:
- # 检查模块是否已安装
- package_spec = importlib.util.find_spec(import_name)
-
- if package_spec is None:
- print(f"{package_name} 模块未安装. 开始安装...")
- subprocess.check_call([sys.executable, '-m', 'pip', 'install', package_name])
- print(f"{package_name} 模块安装完成。")
- else:
- print(f"{package_name} 模块已安装。")
-
- # 尝试导入模块检查是否安装成功
- __import__(import_name)
- module = importlib.import_module(import_name)
- print(f"{import_name} 模块导入成功.")
- return module
- except ImportError as e:
- print(f"无法导入 {import_name} 模块. 错误信息: {e}")
- except subprocess.CalledProcessError as e:
- print(f"安装 {package_name} 模块时出错. 错误信息: {e}")
- except Exception as e:
- print(f"处理 {package_name} 模块时发生错误. 错误信息: {e}")
-
-
-def SAVE_INVITE_CODE(file_name, new_data):
- # 读取现有JSON文件(如果存在)
- try:
- with open(file_name, 'r', encoding='utf-8') as file:
- data = json.load(file)
- except FileNotFoundError:
- # 如果文件不存在,创建所需目录并一个新的空JSON文件
- directory = os.path.dirname(file_name)
- if not os.path.exists(directory):
- os.makedirs(directory)
- data = {}
-
- # 检查是否已存在相同的键,如果存在,合并数据
- for key, value in new_data.items():
- if key in data:
- # 如果键已存在,将新数据合并到现有数据中
- data[key].update(value)
- else:
- # 如果键不存在,直接插入新数据
- data[key] = value
-
- # 将更新后的数据写入JSON文件
- with open(file_name, 'w', encoding='utf-8') as file:
- json.dump(data, file, indent=4)
-
-
-# 将参数转换为字典
-def create_dict_from_string(self, data_string):
- params = {}
- key_value_pairs = data_string.split(',')
- for pair in key_value_pairs:
- key, value = pair.split('=')
- params[key] = value
- return params
-
-
-def compare_versions(local_version, server_version):
- local_parts = local_version.split('.') # 将本地版本号拆分成数字部分
- server_parts = server_version.split('.') # 将服务器版本号拆分成数字部分
-
- for l, s in zip(local_parts, server_parts):
- if int(l) < int(s):
- return True # 当前版本低于服务器版本
- elif int(l) > int(s):
- return False # 当前版本高于服务器版本
-
- # 如果上述循环没有返回结果,则表示当前版本与服务器版本的数字部分完全相同
- if len(local_parts) < len(server_parts):
- return True # 当前版本位数较短,即版本号形如 x.y 比 x.y.z 低
- else:
- return False # 当前版本与服务器版本相同或更高
-
-
-def CHECK_UPDATE(local_version, server_version_url, server_script_url, script_filename):
- """
- 检查版本并更新
-
- Args:
- local_version (str): 本地版本号
- server_version_url (str): 服务器版本文件地址
- server_script_url (str): 服务器脚本地址
- script_filename (str): 要保存的脚本文件名
-
- Returns:
- bool: 是否进行了更新操作
- """
- try:
- # 获取服务器版本号
- response = requests.get(server_version_url, verify=False)
- response.raise_for_status() # Raises an HTTPError for bad responses
- # print(response.text)
- server_version = response.text.strip() # 去除首尾空格
- print(f'当前版本:【{local_version}】')
- print(f'服务器版本:【{server_version}】')
-
- if compare_versions(local_version, server_version):
- # 需要更新,下载服务器脚本
- AUTO_UPDATE = os.getenv("SCRIPT_UPDATE", "True").lower() != "false"
- # print(AUTO_UPDATE)
- if AUTO_UPDATE:
- print(">>>>>>>发现新版本的脚本,默认自动更新,准备更新...")
- print(">>>>>>>禁用更新请定义变量export SCRIPT_UPDATE = 'False'")
- response_script = requests.get(server_script_url, verify=False, timeout=10)
- response_script.raise_for_status()
-
- with open(script_filename, 'wb') as f:
- f.write(response_script.content)
- print(f'{script_filename} 下载完成!')
- print(f'尝试运行新脚本')
- import subprocess, sys
- # 使用 sys.executable 获取 Python 可执行文件的完整路径
- python_executable = sys.executable
- subprocess.Popen([python_executable, script_filename])
-
- else:
- print(">>>>>>>发现新版本的脚本,您禁用了自动更新,如需启用请删除变量SCRIPT_UPDATE")
- else:
- print(f'当前版本高于或等于服务器版本')
-
- except requests.exceptions.RequestException as e:
- print(f'发生网络错误:{e}')
-
- except Exception as e:
- print(f'发生未知错误:{e}')
-
- return False # 返回 False 表示没有进行更新操作
-
-
-def CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, server_version_url=None,
- APP_NAME=None):
- """
- 检查版本并更新
-
- Args:
- local_version (str): 本地版本号
- server_version_url (str): 服务器版本文件地址
- server_script_url (str): 服务器脚本地址
- script_filename (str): 要保存的脚本文件名
-
- Returns:
- bool: 是否进行了更新操作
- """
- print(f'当前检测:【{script_filename}】')
- try:
- if server_version_url:
- # 获取服务器版本号
- response = requests.get(server_version_url, verify=False)
- response.raise_for_status() # Raises an HTTPError for bad responses
- # print(response.text)
- server_version = response.text.strip() # 去除首尾空格
- if "code" in server_version:
- print('【获取远程版本号失败,设为本地同版本】')
- server_version = local_version
- if not server_version: server_version = NOW_TOOLS_VERSION
- print(f'本地版本:【{local_version}】')
- print(f'服务器版本:【{server_version}】')
-
- if compare_versions(local_version, server_version):
- # 需要更新,下载服务器脚本
- AUTO_UPDATE = os.getenv("SCRIPT_UPDATE", "True").lower() != "false"
- # print(AUTO_UPDATE)
- if AUTO_UPDATE:
- print(">>>>>>>发现新版本的脚本,默认自动更新,准备更新...")
- print(">>>>>>>禁用更新请定义变量export SCRIPT_UPDATE = 'False'")
- if down_file(script_filename, server_script_url):
- print(f'请重新运行新脚本\n')
- return True
- else:
- print(">>>>>>>发现新版本的脚本,您禁用了自动更新,如需启用请删除变量SCRIPT_UPDATE\n")
- else:
- print(f'无需更新\n')
- return False
-
- except requests.exceptions.RequestException as e:
- print(f'发生网络错误:{e}')
- server_base_url = f"https://py.cherwin.cn/{APP_NAME}/"
- server_script_url = f"{server_base_url}{script_filename}"
- CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, APP_NAME=APP_NAME)
-
- except Exception as e:
- print(f'发生未知错误:{e}')
-
- return False # 返回 False 表示没有进行更新操作
-
-
-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
-
-
-def get_AuthorInviteCode(url):
- global AuthorCode
- try:
- response = requests.get(url, verify=False, timeout=10)
- if response.status_code == 200:
- content = json.loads(response.text)
- AuthorCode = list(content.values())
- # print(f'获取到作者邀请码:{AuthorCode}')
- return AuthorCode
- else:
- # print("无法获取文件。状态代码:", response.status_code)
- return {}
-
- except Exception as e:
- print(f"An error occurred: {e}")
- return {}
-
-
-def GET_TIPS(server_base_url):
- url = f'{server_base_url}tips.txt'
- try:
- response = requests.get(url, verify=False)
- # 检查响应的编码
- encoding = response.encoding
- # print(f"编码: {encoding}")
- # 设置正确的编码(根据实际情况可能需要调整)
- response.encoding = 'utf-8'
- # 读取内容
- content = response.text
- if 'code' in content:
- content = None
- except:
- content = None
- print('获取通知内容失败')
- if content:
- return (f'''
-***********通知内容************\n
-{content}
-***********通知内容************\n
-''')
- else:
- return (f'''
-***********通知内容************\n
- @Author Cherwin
-***********通知内容************\n
-''')
-
-
-def CHECK_PARAMENTERS(index, input_string, required_parameters):
- # required_parameters = ['deviceid', 'jysessionid', 'shopid', 'memberid', 'access_token', 'sign']
-
- # 记录缺少的参数
- missing_parameters = []
-
- # 将输入字符串和参数列表中的所有字符都转换为小写
- input_string_lower = input_string.lower()
- required_parameters_lower = [param.lower() for param in required_parameters]
-
- # 判断字符串中是否包含所有必需的参数
- for param in required_parameters_lower:
- if param not in input_string_lower:
- missing_parameters.append(param)
-
- if missing_parameters:
- print(f"\n第【{index + 1}】个账号,缺少以下参数:【{missing_parameters}】")
- return False
- else:
- print(f"\n第【{index + 1}】个账号,URL包含所有必需的参数,开始执行脚本")
- return True
-
-
-def QIANWEN(tongyiSysPromt, content, api_key):
- print('开始调用通义千问')
- # 检查dashscope库是否已安装
- dashscope = import_or_install('dashscope')
- if dashscope:
- dashscope.api_key = api_key
- response = dashscope.Generation.call(
- model='qwen-max',
- messages=[
- {"role": "system",
- "content": tongyiSysPromt},
- {"role": "user", "content": content}],
- seed=1234,
- top_p=0.8,
- result_format='message',
- enable_search=False,
- max_tokens=1500,
- temperature=1.0,
- repetition_penalty=1.0,
- )
- if response.status_code == HTTPStatus.OK:
- # print(response)
- video_info = response.output['choices'][0]['message']['content']
- print('通义生成【成功】!')
- return video_info
- else:
- print(f"无法解析通义返回的信息:{response}")
- return None
- else:
- print('dashscope 模块无法导入,函数无法执行。')
-
-
-# 取环境变量,并分割
-def ENV_SPLIT(input_str):
- parts = []
- if '&' in input_str:
- amp_parts = input_str.split('&')
- for part in amp_parts:
- if '#' in part:
- hash_parts = part.split('#')
- for hash_part in hash_parts:
- parts.append(hash_part)
- else:
- parts.append(part)
- # print(parts)
- return (parts)
-
- elif '#' in input_str:
- hash_parts = input_str.split('#')
- # print(hash_parts)
- return (hash_parts)
- else:
- out_str = str(input_str)
- # print([out_str])
- return ([out_str])
-
-
-# 使用导入的模块进行验证码识别
-def CAPCODE(captcha_slider, captcha_bg):
- ddddocr = import_or_install('ddddocr')
- if ddddocr:
- slide = ddddocr.DdddOcr(det=False, ocr=False)
- with open(captcha_slider, 'rb') as f:
- target_bytes = f.read()
- with open(captcha_bg, 'rb') as f:
- background_bytes = f.read()
- res = slide.slide_match(target_bytes, background_bytes, simple_target=True)
- # print(res['target'][0])
- # print(type(res['target'][0]))
- return res['target'][0]
- else:
- print('ddddocr 模块无法导入,函数无法执行。')
- return False
-
-
-def BASE64_TO_IMG(base64_string, output_path):
- import base64
- import io
- Image = import_or_install('Pillow', 'PIL.Image')
-
- if Image:
- try:
- # 解码base64字符串
- image_data = base64.b64decode(base64_string)
- # 将字节数据转换为字节流
- image_buf = Image.open(io.BytesIO(image_data))
- # 转换为RGB模式
- image_buf = image_buf.convert('RGB')
- # 保存图片到指定路径
- image_buf.save(output_path, format='JPEG')
- return True
- except Exception as e:
- print(f'发生错误:{e}')
- return False
- else:
- print('需要的模块[PIL]无法导入,函数无法执行。')
- return False
-
-
-def send_wxpusher(UID, one_msg, APP_NAME, help=False):
- WXPUSHER = os.environ.get('WXPUSHER', False)
- if WXPUSHER:
- if help:
- push_res = wxpusher(WXPUSHER, APP_NAME + '互助', one_msg, UID, TIPS_HTML)
- else:
- push_res = wxpusher(WXPUSHER, APP_NAME, one_msg, UID, TIPS_HTML)
- print(push_res)
-
-
-def wxpusher(UID, msg, title, help=False):
- """利用 wxpusher 的 web api 发送 json 数据包,实现微信信息的发送"""
- WXPUSHER = os.environ.get('WXPUSHER', False)
- if WXPUSHER:
- if help: title = title + '互助'
- print('\n------开始wxpusher推送------')
- print(f'标题:【{title}】\n内容:{msg}')
- webapi = 'http://wxpusher.zjiecode.com/api/send/message'
- msg = msg.replace("\n", "
")
- tips = TIPS_HTML.replace("\n", "
")
- data = {
- "appToken": WXPUSHER,
- "content": f'{title}
{msg}
{tips}',
- # "summary": msg[:99], # 该参数可选,默认为 msg 的前10个字符
- "summary": title,
- "contentType": 2,
- "uids": [UID],
- "url": "https://gj.cherwin.cn"
- }
-
- try:
- result = requests.post(url=webapi, json=data)
- result.raise_for_status() # 对于非2xx状态码,抛出异常
- response_json = result.json()
- if response_json["success"]:
- return "------消息发送成功------\n"
- else:
- return f"消息发送失败。错误信息:{response_json['msg']}"
- except requests.exceptions.RequestException as e:
- return f"发送消息时发生错误:{str(e)}"
- except Exception as e:
- return f"发生意外错误:{str(e)}"
-
-
-def RESTART_SCRIPT(RESTART_SCRIPT_NAME):
- python = sys.executable
- os.execl(python, RESTART_SCRIPT_NAME, *sys.argv[1:])
-
-
-def CHECK():
- global CHERWIN_SCRIPT_CONFIG
- print('>>>>>>>开始获取版本信息...')
- baseurl = 'https://py.cherwin.cn/'
- TOOLS_NAME = 'CHERWIN_TOOLS.py'
- server_script_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{TOOLS_NAME}'
- try:
- response = requests.get(f'{baseurl}CHERWIN_SCRIPT_CONFIG.json', verify=False)
- response.encoding = 'utf-8'
- # 读取内容
- CHERWIN_SCRIPT_CONFIG = response.json()
- if 'code' in CHERWIN_SCRIPT_CONFIG:
- CHERWIN_SCRIPT_CONFIG = None
- server_version = CHERWIN_SCRIPT_CONFIG.get('TOOLS_VERSION', NOW_TOOLS_VERSION)
- if CHECK_UPDATE_NEW(NOW_TOOLS_VERSION, server_version, server_script_url, TOOLS_NAME):
- print('更新脚本完成')
- # print(f'重新检测[{TOOLS_NAME}]版本')
- return False
- else:
- return True
- except:
- print('获取CHERWIN_SCRIPT_CONFIG.json失败')
- return False
-
-
-def main(APP_NAME, local_script_name, ENV_NAME, local_version):
- global APP_INFO, TIPS, TIPS_HTML
- git_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{local_script_name}'
- if CHECK():
- APP_INFO = CHERWIN_SCRIPT_CONFIG.get("APP_CONFIG", {}).get(ENV_NAME, {})
- # print(APP_INFO)
- server_version = APP_INFO.get('NEW_VERSION', '')
- if CHECK_UPDATE_NEW(local_version, server_version, git_url, local_script_name, APP_NAME=APP_NAME):
- print('更新成功,请重新运行脚本!')
-
- if not APP_INFO.get('ENABLE', False):
- print('当前脚本未开放')
- exit()
- TIPS = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC', '')
-
- TIPS_HTML = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC_HTML',
- '')
- ENV = os.environ.get(ENV_NAME)
- AuthorCode = get_AuthorInviteCode(f'https://yhsh.ziyuand.cn/{ENV_NAME}_INVITE_CODE.json')
-
- return ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- else:
- exit()
-
-
-if __name__ == '__main__':
- pass
+import hashlib
+import json
+import os
+import importlib.util
+import random
+import string
+import subprocess
+import sys
+import time
+import requests
+from http import HTTPStatus
+from datetime import datetime
+
+NOW_TOOLS_VERSION = '2024.05.15'
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+else:
+ IS_DEV = False
+
+
+# 尝试导入包
+def import_or_install(package_name, import_name=None):
+ # 如果传入了 import_name,则使用它来检查模块,否则默认与包名相同
+ import_name = import_name or package_name
+ try:
+ # 检查模块是否已安装
+ package_spec = importlib.util.find_spec(import_name)
+ if package_spec is None:
+ print(f"{package_name} 模块未安装. 开始安装...")
+ subprocess.check_call([sys.executable, '-m', 'pip', 'install', package_name])
+ print(f"{package_name} 模块安装完成。")
+ else:
+ print(f"{package_name} 模块已安装。")
+ # 尝试导入模块检查是否安装成功
+ __import__(import_name)
+ module = importlib.import_module(import_name)
+ print(f"{import_name} 模块导入成功.")
+ return module
+ except ImportError as e:
+ print(f"无法导入 {import_name} 模块. 错误信息: {e}")
+ except subprocess.CalledProcessError as e:
+ print(f"安装 {package_name} 模块时出错. 错误信息: {e}")
+ except Exception as e:
+ print(f"处理 {package_name} 模块时发生错误. 错误信息: {e}")
+
+
+def SAVE_INVITE_CODE(file_name, new_data):
+ # 读取现有JSON文件(如果存在)
+ try:
+ with open(file_name, 'r', encoding='utf-8') as file:
+ data = json.load(file)
+ except FileNotFoundError:
+ # 如果文件不存在,创建所需目录并一个新的空JSON文件
+ directory = os.path.dirname(file_name)
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+ data = {}
+ # 检查是否已存在相同的键,如果存在,合并数据
+ for key, value in new_data.items():
+ if key in data:
+ # 如果键已存在,将新数据合并到现有数据中
+ data[key].update(value)
+ else:
+ # 如果键不存在,直接插入新数据
+ data[key] = value
+ # 将更新后的数据写入JSON文件
+ with open(file_name, 'w', encoding='utf-8') as file:
+ json.dump(data, file, indent=4)
+
+
+# 将参数转换为字典
+def create_dict_from_string(self, data_string):
+ params = {}
+ key_value_pairs = data_string.split(',')
+ for pair in key_value_pairs:
+ key, value = pair.split('=')
+ params[key] = value
+ return params
+
+
+def compare_versions(local_version, server_version):
+ local_parts = local_version.split('.') # 将本地版本号拆分成数字部分
+ server_parts = server_version.split('.') # 将服务器版本号拆分成数字部分
+ for l, s in zip(local_parts, server_parts):
+ if int(l) < int(s):
+ return True
+ # 当前版本低于服务器版本
+ elif int(l) > int(s):
+ return False
+ # 当前版本高于服务器版本
+ # 如果上述循环没有返回结果,则表示当前版本与服务器版本的数字部分完全相同
+ if len(local_parts) < len(server_parts):
+ return True # 当前版本位数较短,即版本号形如 x.y 比 x.y.z 低
+ else:
+ return False # 当前版本与服务器版本相同或更高
+
+
+
+def CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, server_version_url=None,
+ APP_NAME=None):
+ """
+ 检查版本并更新
+
+ Args:
+ local_version (str): 本地版本号
+ server_version_url (str): 服务器版本文件地址
+ server_script_url (str): 服务器脚本地址
+ script_filename (str): 要保存的脚本文件名
+
+ Returns:
+ bool: 是否进行了更新操作
+ """
+ print(f'当前检测:【{script_filename}】')
+ try:
+ if server_version_url:
+ # 获取服务器版本号
+ response = requests.get(server_version_url, verify=False)
+ response.raise_for_status() # Raises an HTTPError for bad responses
+ # print(response.text)
+ server_version = response.text.strip() # 去除首尾空格
+ if "code" in server_version:
+ print('【获取远程版本号失败,设为本地同版本】')
+ server_version = local_version
+ if not server_version: server_version = NOW_TOOLS_VERSION
+ print(f'本地版本:【{local_version}】')
+ print(f'服务器版本:【{server_version}】')
+ if compare_versions(local_version, server_version):
+ # 需要更新,下载服务器脚本
+ AUTO_UPDATE = os.getenv("SCRIPT_UPDATE", "True").lower() != "false"
+ # print(AUTO_UPDATE)
+ if AUTO_UPDATE:
+ print(">>>>>>>发现新版本的脚本,默认自动更新,准备更新...")
+ print(">>>>>>>禁用更新请定义变量export SCRIPT_UPDATE = 'False'")
+ if down_file(script_filename, server_script_url):
+ print(f'请重新运行新脚本\n')
+ return True
+ else:
+ print(">>>>>>>发现新版本的脚本,您禁用了自动更新,如需启用请删除变量SCRIPT_UPDATE\n")
+ else:
+ print(f'无需更新\n')
+ return False
+ except requests.exceptions.RequestException as e:
+ print(f'发生网络错误:{e}')
+ server_base_url = f"https://py.cherwin.cn/{APP_NAME}/"
+ server_script_url = f"{server_base_url}{script_filename}"
+ CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, APP_NAME=APP_NAME)
+ except Exception as e:
+ print(f'发生未知错误:{e}')
+ return False # 返回 False 表示没有进行更新操作
+
+
+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
+
+
+def get_AuthorInviteCode(url):
+ global AuthorCode
+ try:
+ response = requests.get(url, verify=False, timeout=10)
+ if response.status_code == 200:
+ content = json.loads(response.text)
+ AuthorCode = list(content.values())
+ # print(f'获取到作者邀请码:{AuthorCode}')
+ return AuthorCode
+ else:
+ # print("无法获取文件。状态代码:", response.status_code)
+ return {}
+ except Exception as e:
+ print(f"An error occurred: {e}")
+ return {}
+
+
+
+def CHECK_PARAMENTERS(index, input_string, required_parameters):
+ # required_parameters = ['deviceid', 'jysessionid', 'shopid', 'memberid', 'access_token', 'sign']
+
+ # 记录缺少的参数
+ missing_parameters = []
+ # 将输入字符串和参数列表中的所有字符都转换为小写
+ input_string_lower = input_string.lower()
+ required_parameters_lower = [param.lower() for param in required_parameters]
+ # 判断字符串中是否包含所有必需的参数
+ for param in required_parameters_lower:
+ if param not in input_string_lower:
+ missing_parameters.append(param)
+ if missing_parameters:
+ print(f"\n第【{index + 1}】个账号,缺少以下参数:【{missing_parameters}】")
+ return False
+ else:
+ print(f"\n第【{index + 1}】个账号,URL包含所有必需的参数,开始执行脚本")
+ return True
+
+
+def QIANWEN(tongyiSysPromt, content, api_key):
+ print('开始调用通义千问')
+ # 检查dashscope库是否已安装
+ dashscope = import_or_install('dashscope')
+ if dashscope:
+ dashscope.api_key = api_key
+ response = dashscope.Generation.call(
+ model='qwen-max',
+ messages=[
+ {"role": "system",
+ "content": tongyiSysPromt},
+ {"role": "user", "content": content}],
+ seed=1234,
+ top_p=0.8,
+ result_format='message',
+ enable_search=False,
+ max_tokens=1500,
+ temperature=1.0,
+ repetition_penalty=1.0,
+ )
+ if response.status_code == HTTPStatus.OK:
+ # print(response)
+ video_info = response.output['choices'][0]['message']['content']
+ print('通义生成【成功】!')
+ return video_info
+ else:
+ print(f"无法解析通义返回的信息:{response}")
+ return None
+ else:
+ print('dashscope 模块无法导入,函数无法执行。')
+
+
+# 取环境变量,并分割
+def ENV_SPLIT(input_str):
+ parts = []
+ if '&' in input_str:
+ amp_parts = input_str.split('&')
+ for part in amp_parts:
+ if '#' in part:
+ hash_parts = part.split('#')
+ for hash_part in hash_parts:
+ parts.append(hash_part)
+ else:
+ parts.append(part)
+ # print(parts)
+ return (parts)
+
+ elif '#' in input_str:
+ hash_parts = input_str.split('#')
+ # print(hash_parts)
+ return (hash_parts)
+ else:
+ out_str = str(input_str)
+ # print([out_str])
+ return ([out_str])
+
+
+# 使用导入的模块进行验证码识别
+def CAPCODE(captcha_slider, captcha_bg):
+ ddddocr = import_or_install('ddddocr')
+ if ddddocr:
+ slide = ddddocr.DdddOcr(det=False, ocr=False)
+ with open(captcha_slider, 'rb') as f:
+ target_bytes = f.read()
+ with open(captcha_bg, 'rb') as f:
+ background_bytes = f.read()
+ res = slide.slide_match(target_bytes, background_bytes, simple_target=True)
+ # print(res['target'][0])
+ # print(type(res['target'][0]))
+ return res['target'][0]
+ else:
+ print('ddddocr 模块无法导入,函数无法执行。')
+ return False
+
+
+def send_wxpusher(UID, one_msg, APP_NAME, help=False):
+ WXPUSHER = os.environ.get('WXPUSHER', False)
+ if WXPUSHER:
+ if help:
+ push_res = wxpusher(WXPUSHER, APP_NAME + '互助', one_msg, UID, TIPS_HTML)
+ else:
+ push_res = wxpusher(WXPUSHER, APP_NAME, one_msg, UID, TIPS_HTML)
+ print(push_res)
+
+
+def wxpusher(UID, msg, title, help=False):
+ """利用 wxpusher 的 web api 发送 json 数据包,实现微信信息的发送"""
+ WXPUSHER = os.environ.get('WXPUSHER', False)
+ if WXPUSHER:
+ if help: title = title + '互助'
+ print('\n------开始wxpusher推送------')
+ print(f'标题:【{title}】\n内容:{msg}')
+ webapi = 'http://wxpusher.zjiecode.com/api/send/message'
+ msg = msg.replace("\n", "
")
+ # tips = TIPS_HTML.replace("\n", "
")
+ data = {
+ "appToken": WXPUSHER,
+ "content": f'{title}
{msg}
{TIPS_HTML}',
+ # "summary": msg[:99], # 该参数可选,默认为 msg 的前10个字符
+ "summary": title,
+ "contentType": 2,
+ "uids": [UID],
+ "url": "https://gj.cherwin.cn"
+ }
+ try:
+ result = requests.post(url=webapi, json=data)
+ result.raise_for_status() # 对于非2xx状态码,抛出异常
+ response_json = result.json()
+ if response_json["success"]:
+ return "------消息发送成功------\n"
+ else:
+ return f"消息发送失败。错误信息:{response_json['msg']}"
+ except requests.exceptions.RequestException as e:
+ return f"发送消息时发生错误:{str(e)}"
+ except Exception as e:
+ return f"发生意外错误:{str(e)}"
+
+
+def RESTART_SCRIPT(RESTART_SCRIPT_NAME):
+ python = sys.executable
+ os.execl(python, RESTART_SCRIPT_NAME, *sys.argv[1:])
+
+
+def CHECK():
+ global CHERWIN_SCRIPT_CONFIG
+ print('>>>>>>>开始获取版本信息...')
+ baseurl = 'https://py.cherwin.cn/'
+ TOOLS_NAME = 'CHERWIN_TOOLS.py'
+ server_script_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{TOOLS_NAME}'
+ try:
+ response = requests.get(f'{baseurl}CHERWIN_SCRIPT_CONFIG.json', verify=False)
+ response.encoding = 'utf-8'
+ # 读取内容
+ CHERWIN_SCRIPT_CONFIG = response.json()
+ if 'code' in CHERWIN_SCRIPT_CONFIG:
+ CHERWIN_SCRIPT_CONFIG = None
+ server_version = CHERWIN_SCRIPT_CONFIG.get('TOOLS_VERSION', NOW_TOOLS_VERSION)
+ if CHECK_UPDATE_NEW(NOW_TOOLS_VERSION, server_version, server_script_url, TOOLS_NAME):
+ print('更新脚本完成')
+ # print(f'重新检测[{TOOLS_NAME}]版本')
+ return False
+ else:
+ return True
+ except:
+ print('获取CHERWIN_SCRIPT_CONFIG.json失败')
+ return False
+def GJJJ_SIGN():
+ app_id = "667516"
+ app_crypto = "FH3yRrHG2RfexND8"
+ timestamp = int(time.time() * 1000)
+ # timestamp = 1715180892075
+ text = f"{app_id}{app_crypto}{timestamp}"
+ sign = hashlib.md5(text.encode()).hexdigest()
+ new_data = {
+ 'timestamp': str(timestamp),
+ "sign": sign
+ }
+ return new_data
+def KWW_SIGN(memberId):
+ timestamp = int(time.time() * 1000)
+ random_num = random.randint(0, 31)
+ u = [
+ "A", "Z", "B", "Y", "C", "X", "D", "T", "E", "S", "F", "R", "G", "Q", "H", "P", "I", "O", "J", "N", "k",
+ "M", "L", "a", "c", "d", "f", "h", "k", "p", "y", "n"]
+ r = f"{timestamp}{memberId}{u[random_num]}"
+ sign = hashlib.md5(r.encode()).hexdigest()
+ update_headers = {
+ "user-sign": sign,
+ "user-paramname": "memberId",
+ "user-timestamp": str(timestamp),
+ "user-random": str(random_num)
+ }
+ return update_headers
+def TYQH_SIGN(parameters={}, body=None):
+ sorted_keys = sorted(parameters.keys())
+ parameter_strings = []
+ for key in sorted_keys:
+ if isinstance(parameters[key], dict):
+ parameter_strings.append(f"{key}={json.dumps(parameters[key])}")
+ else:
+ parameter_strings.append(f"{key}={parameters[key]}")
+
+ current_time = int(datetime.now().timestamp() * 1000)
+ secret_chars = list('BxzTx45uIGT25TTHIIBU2')
+ last_three_digits = str(current_time)[-3:]
+ for digit in last_three_digits:
+ secret_chars.insert(int(digit), digit)
+
+ secret = hashlib.md5(''.join(secret_chars).encode()).hexdigest()
+ nonce_str = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
+
+ sign_data = {
+ 'client_id': 'game',
+ 'nonstr': nonce_str,
+ 'timestamp': current_time,
+ 'body': json.dumps(body) if body else '',
+ 'query': '&'.join(parameter_strings) if parameter_strings else '',
+ 'secret': secret
+ }
+
+ sign_string = '|'.join([str(v) for v in sign_data.values()])
+ sign = hashlib.md5(sign_string.encode()).hexdigest().upper()
+ sign_header = {
+ 'client_id': 'game',
+ 'timestamp': str(current_time),
+ 'nonstr': sign_data['nonstr'],
+ 'sign': sign
+ }
+ return sign_header
+
+def main(APP_NAME, local_script_name, ENV_NAME, local_version,need_invite=False):
+ global APP_INFO, TIPS, TIPS_HTML
+ git_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{local_script_name}'
+ if CHECK():
+ APP_INFO = CHERWIN_SCRIPT_CONFIG.get("APP_CONFIG", {}).get(ENV_NAME, {})
+ # print(APP_INFO)
+ server_version = APP_INFO.get('NEW_VERSION', '')
+ if CHECK_UPDATE_NEW(local_version, server_version, git_url, local_script_name, APP_NAME=APP_NAME):
+ print('更新成功,请重新运行脚本!')
+
+ if not APP_INFO.get('ENABLE', False) and not IS_DEV:
+ print('当前脚本未开放')
+ exit()
+ TIPS = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC', '')
+ TIPS_HTML = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC_HTML','')
+ ENV = os.environ.get(ENV_NAME)
+ if need_invite:
+ AuthorCode = get_AuthorInviteCode(f'https://yhsh.ziyuand.cn/{ENV_NAME}_INVITE_CODE.json')
+ else:
+ AuthorCode = ''
+ return ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ else:
+ exit()
+
+if __name__ == '__main__':
+ print(NOW_TOOLS_VERSION)
\ No newline at end of file
diff --git a/DBKD.py b/DBKD.py
index 7d19a45..34b622f 100755
--- a/DBKD.py
+++ b/DBKD.py
@@ -3,8 +3,8 @@
# -------------------------------
# ✨✨✨ @Author CHERWIN✨✨✨
# -------------------------------
-# cron "0 7 * * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('德邦快递小程序签到')
+# cron "0 6 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('中通快递小程序签到')
import os
import requests
@@ -13,9 +13,10 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -46,14 +47,12 @@ class RUN:
self.index = index + 1
self.s = requests.session()
self.s.verify = False
-
- self.token = token
+ self.token = f'ECO_TOKEN={token};'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/9079',
+ 'Cookie':self.token,
'Referer': 'https://servicewechat.com/wxa1ebeeb0ed47f0b2/633/page-frame.html'
}
- self.baseUrl = 'https://api.ztomember.com/api/'
-
def do_request(self, method, url, params=None, data=None, headers=None):
if not headers:
@@ -86,6 +85,26 @@ class RUN:
print(f"查询账户异常: {e}")
return False
+ def queryUserInfo(self):
+ try:
+ self.headers['Content-Type'] = 'application/json'
+ self.headers['Accept'] = '*/*'
+ response = self.do_request('GET', 'https://www.deppon.com/ndcc-gwapi/userService/eco/user/secure/queryUserInfo')
+ if response and response.get('message') == 'ok':
+ # print(response)
+ result = response.get('result', {})
+ phone = result.get('mobile', '')
+ self.mobile = phone[:3] + "*" * 4 + phone[7:]
+ self.userName = result.get('userName', '')
+ Log(f'\n用户名:【{self.userName}】\n手机号:【{self.mobile}】')
+ return True
+ else:
+ Log(f"登录验证失败: {response}")
+ return False
+ except Exception as e:
+ print(f"登录验证异常: {e}")
+ return False
+
def generate_tmp_token(self):
try:
response = self.do_request('GET', 'https://www.deppon.com/ndcc-gwapi/userService/eco/user/token/secure/generateTmpToken')
@@ -107,11 +126,11 @@ class RUN:
if response and response.get('code') == 200:
# print(response)
Log(f"登录验证成功!")
- self.phone = response['data']['mobile']
- self.token = response['data']['token']
- self.headers['mobile'] = self.phone
+ data = response.get('data', {})
+ self.token = data.get('token','')
+ self.phone = data.get('mobile','')
self.headers['token'] = self.token
- #
+ self.headers['mobile'] = self.phone
# print(f"PHONE:【{self.phone}】")
# print(f"TOKEN:【{self.token}】")
return True
@@ -248,7 +267,7 @@ class RUN:
"rightsClaimStatus":1,
"taskRuleId":self.taskRuleId
}
- response = self.do_request('POST', 'https://mas.deppon.com/crm-api/deppon/pay/member/add/package/query',data = data)
+ response = self.do_request('POST', 'https://mas.deppon.com/crm-api/deppon/points/task/changeStatus',data = data)
if response and response.get('code') == 200:
Log(f'完成任务:【{self.name}】成功!')
return response['msg']
@@ -276,14 +295,15 @@ class RUN:
def lottery(self):
try:
- data = {"phone": self.phone,"gameId":'Zv8i7IsOPZIQrvvupKXE1w=='}
- response = self.do_request('POST', 'https://mas.deppon.com/crm-api/game/draw/lottery',data = data)
+ data = {"mobile": self.phone,"gameId":'67'}
+ response = self.do_request('POST', 'https://mas.deppon.com/admin/envelops/game/lottery',data = data)
- if response and response.get('code') == 200:
- print('抽奖成功')
- print(response)
- self.pointsAvailableValue -= 1
- return response['msg']
+ if response and response.get('code') == 0:
+ # print(response)
+ data = response.get('data','')
+ name = data.get('name','')
+ Log(f'抽奖成功,获得:{name}')
+ return
else:
print(f"抽奖失败: {response}")
return None
@@ -318,16 +338,20 @@ class RUN:
def main(self):
Log(f"\n开始执行第{self.index}个账号--------------->>>>>")
- if self.login():
+ # if self.login():
+
+ if self.queryUserInfo():
+ self.generate_tmp_token()
self.getSvipNewestInfo()
self.signIn_info()
self.points_signIn_info()
self.task_list()
- self.lottery_query2()
+ self.lottery()
self.getSvipNewestInfo('执行后')
self.sendMsg()
return True
else:
+ self.sendMsg()
return False
def sendMsg(self):
@@ -374,8 +398,8 @@ def import_Tools():
if __name__ == '__main__':
APP_NAME = '德邦快递小程序'
ENV_NAME = 'DBKD'
- CK_NAME = 'code'
- CK_URL = 'https://www.deppon.com/ndcc-gwapi/userService/eco/user/login'
+ CK_NAME = 'ECO_TOKEN=里面的值;'
+ CK_URL = 'https://www.deppon.com/ndcc-gwapi/userService/eco/user/secure/queryUserInfo'
print(f'''
✨✨✨ {APP_NAME}签到✨✨✨
✨ 功能:
@@ -384,7 +408,7 @@ if __name__ == '__main__':
打开{APP_NAME}
授权登陆
打开抓包工具
- 找{CK_URL}请求body里面的[{CK_NAME}]
+ 找{CK_URL}请求Cookies里面的[{CK_NAME}]
复制里面的[{CK_NAME}]参数值
参数示例:0f1bjLFa1ZdedHxxxxxxxx
✨ ✨✨wxpusher一对一推送功能,
@@ -398,16 +422,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.18'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
@@ -422,4 +449,4 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
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 + TIPS_HTML)
+ # if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
\ No newline at end of file
diff --git a/EMS.py b/EMS.py
new file mode 100755
index 0000000..c71cb84
--- /dev/null
+++ b/EMS.py
@@ -0,0 +1,274 @@
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# ✨✨✨ @Author CHERWIN✨✨✨
+# -------------------------------
+# cron "0 10 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('EMS邮惠中心小程序')
+
+import os
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+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'
+
+class RUN:
+ def __init__(self,info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ token = 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:
+ print('检测到设置了UID')
+ print(last_info)
+ self.send_UID = last_info
+ self.index = index + 1
+ self.s = requests.session()
+ self.s.verify = False
+ self.openId = token
+ self.headers = {
+ 'Host': 'ump.ems.com.cn',
+ '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 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/6945',
+ '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',
+ }
+
+
+ def do_request(self, url, method="POST",params=None, data=None, headers=None):
+ if not headers:
+ headers = self.headers
+ try:
+ response = self.s.request(method, url, params=params, json=data, headers=headers)
+ response.raise_for_status()
+ return response.json()
+ except Exception as e:
+ print(f"请求错误: {e}")
+ return None
+
+ def findByOpenIdAppId(self):
+ Log(f"====== 获取TOKEN ======")
+ try:
+ params = {
+ "appId":"wx52872495fb375c4b",
+ "openId":self.openId,
+ "source":"JD"
+ }
+ response = self.do_request('https://ump.ems.com.cn/memberCenterApiV2/member/findByOpenIdAppId',data=params)
+ if response and response.get('code') == '000000':
+ # print(response)
+ info = response.get('info', {})
+ self.token = info.get('token', '')
+ self.memberId = info.get('memberId', '')
+ self.headers['MC-TOKEN'] = self.token
+ Log(f'>>获取token成功✅')
+ # print(f'>用户ID:【{self.memberId}】')
+ return True
+ else:
+ Log(f">获取TOKEN失败❌: {response}")
+ return False
+ except Exception as e:
+ print(f"获取TOKEN异常❌: {e}")
+ return False
+
+ def details(self):
+ Log(f"====== 获取用户信息 ======")
+ try:
+ params = {}
+ response = self.do_request('https://ump.ems.com.cn/memberCenterApiV2/member/details',data=params)
+ if response and response.get('code') == '000000':
+ # print(response)
+ info = response.get('info', {})
+ phone = info.get('phone', '')
+ Log(f'>>获取用户信息成功✅')
+ Log(f'>用户ID:【{self.memberId}】\n手机号:【{phone}】')
+ return True
+ else:
+ Log(f">获取TOKEN失败❌: {response}")
+ return False
+ except Exception as e:
+ print(f"获取TOKEN异常❌: {e}")
+ return False
+
+
+ def sign(self):
+ Log(f"====== 开始签到 ======")
+ try:
+ params = {
+ "appId":"wx52872495fb375c4b",
+ "userId":self.memberId,
+ "openId":self.openId,
+ "activId":'d191dce0740849b1b7377e83c00475d6'
+ }
+ response = self.do_request('https://ump.ems.com.cn/activCenterApi/signActivInfo/sign',data=params)
+ if response and response.get('code') == '000000':
+ # print(response)
+ info = response.get('info', {})
+ prizeSize = info.get('prizeSize', {})
+ Log(f'>签到成功✅获得:【{prizeSize}】积分')
+ return True
+ elif response and response.get('code') == '600001':
+ msg = response.get('msg')
+ Log(f'>签到失败❌ 【{msg}】')
+ else:
+ Log(f"签到失败❌: {response}")
+ return False
+ except Exception as e:
+ print(f"登录验证异常❌: {e}")
+ return False
+
+ def memberGoldsInfo(self):
+ Log(f"====== 获取积分信息 ======")
+ try:
+ params = {}
+ response = self.do_request('https://ump.ems.com.cn/memberCenterApiV2/golds/memberGoldsInfo',data=params)
+ if response and response.get('code') == '000000':
+ # print(response)
+ info = response.get('info', {})
+ availableGoldsTotal = info.get('availableGoldsTotal', {})
+ Log(f'>当前积分:【{availableGoldsTotal}】')
+ return True
+ else:
+ Log(f"获取积分信息失败❌: {response}")
+ return False
+ except Exception as e:
+ print(f"获取积分信息异常❌: {e}")
+ return False
+
+
+ def main(self):
+ Log(f"\n开始执行第{self.index}个账号--------------->>>>>")
+ # if self.login():
+
+ if self.findByOpenIdAppId():
+ self.details()
+ self.sign()
+ self.memberGoldsInfo()
+ self.sendMsg()
+ return True
+ else:
+ self.sendMsg()
+ return False
+
+ def sendMsg(self):
+ if self.send_UID:
+ push_res = CHERWIN_TOOLS.wxpusher(self.send_UID, one_msg, APP_NAME)
+ print(push_res)
+ return True
+
+
+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
+
+
+def import_Tools():
+ global CHERWIN_TOOLS, ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,
+ local_version)
+
+
+if __name__ == '__main__':
+ APP_NAME = 'EMS邮惠中心小程序'
+ ENV_NAME = 'EMS'
+ CK_NAME = 'openId'
+ CK_URL = 'https://ump.ems.com.cn/memberCenterApiV2/member/findByOpenIdAppId'
+ print(f'''
+✨✨✨ {APP_NAME}签到✨✨✨
+✨ 功能:
+ 积分签到
+✨ 抓包步骤:
+ 打开{APP_NAME}
+ 授权登陆
+ 打开抓包工具
+ 找{CK_URL}请求body里面的[{CK_NAME}]
+ 复制里面的[{CK_NAME}]参数值
+参数示例:o-7675D-prmxxxxxxxxxx
+✨ ✨✨wxpusher一对一推送功能,
+ ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
+ ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
+✨ 推荐cron:0 10 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ access_token = []
+ 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 + TIPS_HTML)
\ No newline at end of file
diff --git a/GJJJ.py b/GJJJ.py
new file mode 100755
index 0000000..00f701f
--- /dev/null
+++ b/GJJJ.py
@@ -0,0 +1,493 @@
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# ✨✨✨ @Author CHERWIN✨✨✨
+# -------------------------------
+# cron "1 9 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('顾家家居小程序')
+import os
+import random
+import time
+
+import requests
+
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+
+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'
+
+class RUN:
+ def __init__(self,info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+
+ # self.token = json.loads(split_info[0])
+ len_split_info = len(split_info)
+ if len_split_info < 3:return False
+ identityValue = split_info[0]
+ openid = split_info[1]
+ unionid = split_info[2]
+ self.token = {
+ "identityType":"mobile",
+ "identityValue":identityValue,
+ "type2":"wechat-unionid",
+ "value2":"",
+ "source":"顾家小程序",
+ "contentName":"",
+ "openid":openid,
+ "unionid":unionid
+ }
+ # print(self.token)
+ last_info = split_info[len_split_info - 1]
+ self.send_UID = None
+ if len_split_info > 0 and "UID_" in last_info:
+ print('检测到设置了UID')
+ print(last_info)
+ self.send_UID = last_info
+ self.index = index + 1
+ self.max_try = 3
+ self.headers = {
+ "Host": "mc.kukahome.com",
+ "E-Opera": "",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) XWEB/8555",
+ "Content-Type": "application/json",
+ # "timestamp": "1715180892075",
+ "xweb_xhr": "1",
+ "brandCode": "K001",
+ # "X-Customer": "4802198",
+ "appid": "667516",
+ # "sign": "7acf4f02413bd9855047cc345be6da21",
+ "Accept": "*/*",
+ "Sec-Fetch-Site": "cross-site",
+ "Sec-Fetch-Mode": "cors",
+ "Sec-Fetch-Dest": "empty",
+ "Referer": "https://servicewechat.com/wx0770280d160f09fe/179/page-frame.html",
+ "Accept-Language": "zh-CN,zh;q=0.9",
+ }
+
+ def generate_sign(self):
+ new_data = CHERWIN_TOOLS.GJJJ_SIGN()
+ self.headers.update(new_data)
+
+
+ def make_request(self, url, method='post', headers={}, params={}):
+ self.generate_sign()
+ if headers == {}:
+ headers = self.headers
+ # if params == {}:
+ # params = self.default_data
+ try:
+ if method.lower() == 'get':
+ response = requests.get(url, headers=headers, verify=False)
+
+ elif method.lower() == 'post':
+ response = requests.post(url, headers=headers, json=params, verify=False)
+ else:
+ raise ValueError("不支持的请求方法❌: " + method)
+ return response.json()
+ except requests.exceptions.RequestException as e:
+ print("请求异常❌:", e)
+ except ValueError as e:
+ print("值错误或不支持的请求方法❌:", e)
+ except Exception as e:
+ print("发生了未知错误❌:", e)
+
+ def automaticLogin(self):
+ Log('======= 刷新用户信息 =======')
+ url = 'https://mc.kukahome.com/club-server/member/automaticLogin'
+ response = self.make_request(url,params=self.token)
+ # print(response)
+ if response.get('msg')== "成功":
+ data = response.get('data','')
+ AccessToken = data.get('AccessToken','')
+ membership = data.get('membership', {})
+ point = membership.get('point', '')
+ # systemSource = membership.get('systemSource', '')
+ self.membershipId = membership.get('id', '')
+ self.brandCode = membership.get('brandCode', '')
+ self.mobile = membership.get('mobile', '')
+ oneId = membership.get('oneId', '')
+ memberLevel = membership.get('memberLevel', '')
+ new_headers={
+ "brandCode":self.brandCode,
+ "X-Customer": str(self.membershipId),
+ "AccessToken":AccessToken
+ }
+ self.headers.update(new_headers)
+ Log(f'>手机号:【{self.mobile}】')
+ print(f'>ID:【{self.membershipId}】')
+ print(f'>等级:【{memberLevel}】')
+ print(f'>oneId:【{oneId}】')
+ Log(f'>当前积分:【{point}】')
+
+ return True
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+ def personal(self):
+ Log('======= 查询用户信息 =======')
+ url = 'https://mc.kukahome.com/club-server/front/member/personal'
+ response = self.make_request(url,params=self.token)
+ # print(response)
+ if response:
+ point = response.get('point','')
+ Log(f'>执行后积分:【{point}】')
+ return True
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+
+ def selectPointTask(self):
+ Log('======= 获取任务列表 =======')
+ url = 'https://mc.kukahome.com/club-server/front/member/selectPointTask'
+ data={"brandCode":self.brandCode}
+ response = self.make_request(url,params=data)
+ print(response)
+ if response.get('code')== 0:
+ data = response.get('data',[{}])
+ for li in data:
+ pass
+ return True
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+
+ def checkSign(self):
+ Log('======= 查询签到状态 =======')
+ url = 'https://mc.kukahome.com/club-server/front/member/calendar'
+ data={
+ "t":int(time.time()*1000),
+ "membershipId":self.membershipId
+ }
+ response = self.make_request(url,params=data)
+ if response:
+ isTodaySigned = response.get('isTodaySigned',False)
+ if not isTodaySigned:
+ Log('>今日未签到')
+ self.signIn()
+ else:
+ Log('>今日已签到✅')
+ return True
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+
+ def signIn(self):
+ Log('======= 开始签到 =======')
+ url = 'https://mc.kukahome.com/club-server/front/member/signIn'
+ data={
+ "identityType":"mobile",
+ "identityValue":self.mobile,
+ "membershipId":self.membershipId
+ }
+ response = self.make_request(url,params=data)
+ # print(response)
+ if response.get('status')== 200:
+ data = response.get('data',[])
+ success = data.get('success',False)
+ if success:
+ Log('>签到成功!✅')
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+
+ def selectPage(self):
+ print('======= 获取帖子列表 =======')
+ url = 'https://mc.kukahome.com/club-server/applet/waterfall/selectPage'
+ random_topicId = str(random.randint(0,27))
+ data={"source":1,"pageNum":1,"pageSize":5,"topicId":random_topicId}
+ response = self.make_request(url,params=data)
+ # print(response)
+ if response.get('code')== 0:
+ data = response.get('data',{})
+ list = data.get('list',[{}])
+ if list:
+ print('>获取帖子列表成功✅')
+ randomlist=random.choices(list)
+ # print(randomlist)
+ self.postLikeTask(randomlist)
+ self.postCollectTask(randomlist)
+ self.postCollectTask(randomlist)
+ return True
+ else:
+ if self.max_try > 0:
+ print('>获取帖子列表失败❌!正常重试....')
+ self.selectPage()
+ self.max_try -= 1
+ else:
+ Log(f'>可能token失效了❌,{response}')
+ return False
+
+ def like_post(self, post_id):
+ url = 'https://mc.kukahome.com/club-server/front/postOrder/like'
+ data = {"id": post_id}
+ response = self.make_request(url, params=data)
+ return response
+
+ def likeSendPoint(self, post_id,triggerType,content):
+ url = 'https://mc.kukahome.com/club-server/front/member/likeSendPoint'
+ data = {
+ "postOrderId": post_id,
+ "triggerType": triggerType,
+ "content": content
+ }
+ response = self.make_request(url, params=data)
+ return response
+
+
+ def collect_post(self, post_id):
+ url = 'https://mc.kukahome.com/club-server/front/postOrder/collect'
+ data = {"id": post_id}
+ response = self.make_request(url, params=data)
+ return response
+
+
+ def submit_comment(self, post_id, content, post_member_id, parent_id="", is_flag=False):
+ url = 'https://mc.kukahome.com/club-server/user/post/comment/insert'
+ data = {
+ "postId": post_id,
+ "parentId": parent_id,
+ "content": content,
+ "postMemberId": post_member_id,
+ "commentMemberId": self.access_token,
+ "isFlag": is_flag
+ }
+ response = self.make_request(url, params=data)
+ return response
+
+ def insert_foot_point(self, buried_point_logo, subordinate_terminal, business_name, business_code,current_page_link):
+ url = 'https://mc.kukahome.com/club-server/front/foot/point/insertFootPoint'
+ data = {
+ "brandCode": "K001",
+ "buriedPointLogo": buried_point_logo,
+ "subordinateTerminal": subordinate_terminal,
+ "businessName": business_name,
+ "businessCode": business_code,
+ "currentPageLink": current_page_link
+ }
+ response = self.make_request(url, params=data)
+ return response
+
+ def push_event(self, event_id, content, target_id, target_name, business_id, business_name):
+ url = 'https://mc.kukahome.com/club-server/front/member/pushEvent'
+ data = {
+ "eventId": event_id,
+ "content": content,
+ "targetId": target_id,
+ "targetName": target_name,
+ "businessId": business_id,
+ "businessName": business_name
+ }
+ response = self.make_request(url, params=data)
+ return response
+
+ def like_send_point(self, post_order_id, trigger_type, content):
+ url = 'https://mc.kukahome.com/club-server/front/member/likeSendPoint'
+ data = {
+ "postOrderId": post_order_id,
+ "triggerType": trigger_type,
+ "content": content
+ }
+ response = self.make_request(url, params=data)
+ return response
+
+ def resp_result(self,even,response):
+ if response.get('message','') == '提示:保存成功!':
+ print(f'{even}保存成功✅')
+ else:
+ print(f'{even}保存失败❌')
+
+ def postLikeTask(self,postlist):
+ # 点赞帖子
+ post_id = postlist[0]['id']
+ title = postlist[0]['title']
+ print("======= 进入点赞流程------>>>")
+ # 推送点赞事件
+ event_response = self.push_event(event_id="c_showhome_like", content="晒家-点赞", target_id="300001",target_name="晒家-点赞", business_id=post_id,business_name=title)
+
+ self.resp_result("推送点赞事件:", event_response)
+
+ # 点赞事件
+ like_response = self.like_post(post_id)
+ self.resp_result("点赞帖子:", like_response)
+
+ # 插入点赞足迹
+ foot_point_response = self.insert_foot_point(buried_point_logo="do_good_btn",subordinate_terminal="会员小程序", business_name="",business_code="", current_page_link="")
+ self.resp_result("插入点赞足迹:", foot_point_response)
+ #
+ # 点赞送积分
+ like_point_response = self.like_send_point(post_order_id=post_id, trigger_type="1",content="点赞")
+ self.resp_result("点赞送积分响应:", like_point_response)
+
+ print("------>>>点赞结束\n")
+ print("======= 进入取消点赞流程------>>>")
+ # 取消点赞帖子
+ like_response = self.like_post(post_id)
+ self.resp_result("取消点赞帖子:", like_response)
+
+ # 插入取消点赞足迹
+ foot_point_response = self.insert_foot_point(buried_point_logo="cancel_good_btn", subordinate_terminal="会员小程序",business_name="", business_code="", current_page_link="")
+ self.resp_result("插入取消点赞足迹:", foot_point_response)
+ #
+ # 推送取消点赞事件
+ event_response = self.push_event(event_id="c_showhome_unlike", content="晒家-取消点赞", target_id="300002",target_name="晒家-取消点赞", business_id=post_id, business_name=title)
+ self.resp_result("推送取消点赞事件:", event_response)
+ print("------>>>取消点赞结束\n")
+
+ def postCollectTask(self,postlist):
+
+ post_id = postlist[0]['id']
+ title = postlist[0]['title']
+
+ print("======= 进入收藏帖子流程------>>>")
+ # 收藏帖子
+ collect_response = self.collect_post(post_id)
+ self.resp_result("收藏帖子:", collect_response)
+
+ # 插入收藏足迹
+ foot_point_response = self.insert_foot_point(buried_point_logo="buriedPointLogo", subordinate_terminal="会员小程序", business_name="", business_code="", current_page_link="")
+ self.resp_result("插入收藏足迹:", foot_point_response)
+ #
+ #收藏送积分
+ likeSendPoint_response = self.likeSendPoint(post_id, 2, "收藏")
+ self.resp_result("收藏送积分:", likeSendPoint_response)
+
+ print("------>>>收藏帖子结束\n")
+ print("======= 进入取消收藏帖子流程------>>>")
+ # 取消收藏足迹
+ foot_point_response = self.insert_foot_point(buried_point_logo="cancel_collect_btn", subordinate_terminal="会员小程序",business_name="", business_code="", current_page_link="")
+ self.resp_result("取消收藏足迹:", foot_point_response)
+
+ # 取消收藏帖子
+ uncollect_response = self.collect_post(post_id)
+ self.resp_result("取消收藏帖子:", uncollect_response)
+
+ print("------>>>取消收藏帖子结束\n")
+
+ def main(self):
+ Log(f"\n======= 开始执行第{self.index}个账号 =======")
+ if self.automaticLogin():
+ self.checkSign()
+ # self.selectPointTask()
+ self.selectPage()
+ self.personal()
+ self.sendMsg()
+ return True
+ else:
+ self.sendMsg()
+ return False
+
+ def sendMsg(self):
+ if self.send_UID:
+ push_res = CHERWIN_TOOLS.wxpusher(self.send_UID, one_msg, APP_NAME)
+ print(push_res)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+if __name__ == '__main__':
+ APP_NAME = '顾家家居小程序'
+ ENV_NAME = 'GJJJ'
+ CK_URL = 'https://mc.kukahome.com/club-server/member/automaticLogin'
+ CK_NAME = 'identityValue@openid@o98mO0xrQ9Jqp0DUsGpmfHpQm_pQ'
+ print(f'''
+✨✨✨ {APP_NAME}签到✨✨✨
+✨ 功能:
+ 积分签到
+ 社区互动
+✨ 抓包步骤:
+ 打开{APP_NAME}
+ 授权登陆
+ 打开抓包工具
+ 找{CK_URL}返回值[{CK_NAME}]
+参数示例:3ee9ceccccscscscscscscsc
+✨ ✨✨wxpusher一对一推送功能,
+ ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
+ ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
+✨ 推荐cron:1 9 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.09'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ access_token = []
+ for index, infos in enumerate(tokens):
+ s = requests.session()
+ s.verify = False
+ run_result = RUN(infos, index).main()
+ if not run_result: continue
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
\ No newline at end of file
diff --git a/HDL.py b/HDL.py
index 3ab4962..a99ae21 100755
--- a/HDL.py
+++ b/HDL.py
@@ -1,10 +1,11 @@
# !/usr/bin/python3
# -- coding: utf-8 --
# -------------------------------
+# ✨ 推荐cron:0 6 * * *
# ✨✨✨ @Author CHERWIN✨✨✨
# -------------------------------
-# cron "1 8 * * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('海底捞小程序签到')
+# cron "0 6 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('中通快递小程序签到')
import os
from os import path
@@ -15,8 +16,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
+
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -237,6 +241,7 @@ class RUN:
self.sendMsg()
return True
else:
+ self.sendMsg()
return False
def sendMsg(self):
if self.send_UID:
@@ -299,20 +304,23 @@ if __name__ == '__main__':
export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
-✨ 推荐cron:01 8 * * *
+✨ 推荐cron:0 6 * * *
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.08'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
diff --git a/JTSD.py b/JTSD.py
index c8623af..39c03d3 100755
--- a/JTSD.py
+++ b/JTSD.py
@@ -1,9 +1,8 @@
# !/usr/bin/python3
# -- coding: utf-8 --
# -------------------------------
-# ✨✨✨ @Author CHERWIN✨✨✨
# -------------------------------
-# cron "0 6 * * *" script-path=xxx.py,tag=匹配cron用
+# cron "0 5 * * *" script-path=xxx.py,tag=匹配cron用
# const $ = new Env('极兔速递小程序签到')
import json
import os
@@ -17,8 +16,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
+
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -133,6 +135,7 @@ class RUN:
self.sign()
self.sendMsg()
else:
+ self.sendMsg()
return False
def sendMsg(self):
@@ -200,16 +203,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.18'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
@@ -224,4 +230,4 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
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 + TIPS_HTML)
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
\ No newline at end of file
diff --git a/KFHS.py b/KFHS.py
index fba5883..492358e 100755
--- a/KFHS.py
+++ b/KFHS.py
@@ -1,21 +1,23 @@
# !/usr/bin/python3
# -- coding: utf-8 --
# -------------------------------
-# cron "30 1 * * *" script-path=xxx.py,tag=匹配cron用
+# cron "0 0,8 * * " script-path=xxx.py,tag=匹配cron用
# const $ = new Env('微信公众号:卡夫亨氏新厨艺')
import os
import random
import time
-from datetime import date, datetime
+from datetime import date, datetime,time as times
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
-# import CHERWIN_TOOLS
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
+
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -75,7 +77,7 @@ class RUN:
openId = data.get('openId','')
signTimes = data.get('signTimes',0)
memberInfo = data.get('memberInfo', {})
- phone = memberInfo.get('phone', '')
+ self.phone = memberInfo.get('phone', '')
score = memberInfo.get('score', '')
if End :
Log(f'执行后积分:【{score}】')
@@ -84,22 +86,23 @@ class RUN:
# add = {"nickname":nickname,"member_id":member_id}
userid_list.append(self.member_id)
username_list.append(nickname)
- Log(f'>>>当前用户:【{nickname}】\nID:【{self.member_id}】 \nOpenID:【{openId}】 \n已连续签到【{signTimes}】天')
serialSign = data.get('serialSign', [{}])
+ signTimes = data.get('signTimes', 0)
+ Log(f'>>>当前用户:【{nickname}】\nID:【{self.member_id}】 \nOpenID:【{openId}】 \n已连续签到【{signTimes}】天')
- if serialSign :
+ if serialSign:
current_date = date.today()
date_string = serialSign[0].get('createdAt',current_date)
memberBalance = serialSign[0].get('memberBalance', 0)
parsed_date = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S').date()
if parsed_date == current_date:
print(f"今日已签到,当前积分:【{memberBalance}】")
- else:
- print("今日未签到")
- wait_time = random.randint(1000, 10000) / 1000.0 # 转换为秒
- time.sleep(wait_time)
- print('随机延时1-10秒执行签到')
- self.dailySign()
+ else:
+ print("今日未签到")
+ wait_time = random.randint(1000, 10000) / 1000.0 # 转换为秒
+ time.sleep(wait_time)
+ print('随机延时1-10秒执行签到')
+ self.dailySign()
return True
except:
print(response.text)
@@ -141,12 +144,33 @@ class RUN:
id_list = resp['data']['chineseCookbook']['data']
for i in id_list:
Cookid_list.append(i['id'])
+ # self.creatCookbookCode(i['id'])
print(f'>获取到菜谱ID:【{Cookid_list}】')
except:
print(response.text)
else:
print("API访问失败!")
+ def creatCookbookCode(self,cookbook_id):
+
+ data = {
+ 'cookbook_id':cookbook_id
+ }
+ response = self.s.post(
+ f'{self.baseUrl}createCookbookCode',
+ headers=self.headers, data=data
+ )
+ if response.status_code == 200:
+ try:
+ resp = response.json()
+ data = resp.get('data',{})
+ code_url = data.get('code_url','')
+ print(f'创建分享链接成功:[{code_url}]')
+ except:
+ print(response.text)
+ else:
+ print("API访问失败!")
+
def recordScoreShare(self, cookbook_id, now_id):
# print('')
# self.getUserInfo()
@@ -195,19 +219,31 @@ class RUN:
else:
Log('助力对象为自身,跳过')
- # 预留兑换函数
- def exchangeIntegralNew(self):
+ def exchange(self):
data = {
- 'value': '爱奇艺月卡',
- 'phone': '',
- 'type': '视频卡'
+ 'phone': self.phone
}
- # data = {
- # 'value': '全网10元话费',
- # 'phone': '',
- # 'type': '话费',
- # 'memberId': '',
- # }
+ huafei_li = ['全网10元话费', '全网20元话费']
+ videoCard_li = ['爱奇艺', '腾讯', '优酷']
+ cardType = ['年卡', '季卡', '月卡', '周卡']
+ for card in huafei_li:
+ data['value'] = card
+ data['type'] = '话费'
+ data['memberId'] = self.member_id
+ self.exchangeIntegralNew(data)
+
+ for card in cardType:
+ for video in videoCard_li:
+ cardname = video + card
+ data['value'] = cardname
+ data['type'] = '视频卡'
+ self.exchangeIntegralNew(data)
+ print(cardname)
+
+
+ # 预留兑换函数
+ def exchangeIntegralNew(self,data):
+ print(f'正在尝试兑换【{data["value"]}】')
response = self.s.post(
f'{self.baseUrl}exchangeIntegralNew',
headers=self.headers,
@@ -224,15 +260,18 @@ class RUN:
print("API访问失败!")
def main(self):
- # self.getUserInfo()
- # self.getCookbookIndex()
if self.getUserInfo():
- if self.index == 1:
- self.getCookbookIndex()
+ now = datetime.now().time()
+ start_time = times(23, 59, 59)
+ end_time = times(0, 5)
+ if start_time <= now <= end_time:
+ self.exchange()
+ self.getCookbookIndex()
self.getUserInfo(True)
self.sendMsg()
return True
else:
+ self.sendMsg()
return False
def help(self):
@@ -245,6 +284,7 @@ class RUN:
now_id = userid_list[self.index-1]
Log(f'\n当前用于助力用户:【{username}】 ID:【{now_id}】')
self.helpAuthor(662056, cookbook_id, now_id)
+ self.helpAuthor(662086, cookbook_id, now_id)
self.recordScoreShare(cookbook_id, now_id)
self.sendMsg(True)
return True
@@ -316,29 +356,32 @@ if __name__ == '__main__':
export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨ ✨ 注意:token有效期7天,7天后重新抓
-✨ 推荐cron:5 8 * * *
+✨ 推荐cron:0 0,8 * *
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
- print(token)
+ # print(token)
if not token:
print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
exit()
tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- print(tokens)
+ # print(tokens)
Cookid_list = []
userid_list = []
username_list = []
diff --git a/KGZJ.py b/KGZJ.py
new file mode 100755
index 0000000..1772f63
--- /dev/null
+++ b/KGZJ.py
@@ -0,0 +1,372 @@
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# cron "30 9 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('宽哥之家小程序')
+
+import os
+import random
+import time
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+# import CHERWIN_TOOLS
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+
+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'
+
+class RUN:
+ def __init__(self,info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ self.token = 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
+ Log(f"\n---------开始执行第{self.index}个账号>>>>>")
+ self.s = requests.session()
+ self.s.verify = False
+
+ self.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) XWEB/9129',
+ 'Host': 'shop.sctobacco.com',
+ 'Connection': 'keep-alive',
+ 'xweb_xhr': '1',
+ 'gray': '0',
+ 'token': self.token,
+ 'Accept': '*/*',
+ 'Sec-Fetch-Site': 'cross-site',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Referer': 'https://servicewechat.com/wxb6bc0796e0f0db00/224/page-frame.html',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Accept-Language': 'zh-CN,zh;q=0.9'
+ }
+ self.s.headers.update(self.headers)
+
+
+ def do_request(self, url, method='POST',params=None, data=None, headers=None):
+
+ try:
+ response = self.s.request(method, url, params=params, json=data, headers=headers)
+ response.raise_for_status()
+ return response.json()
+ except Exception as e:
+ print(f"请求错误: {e}")
+ return None
+
+ def personal_info(self):
+ Log(f'======= 查询用户信息 =======')
+ personal_info_valid = False
+ try:
+ # 发送GET请求
+ response = self.do_request('https://shop.sctobacco.com/api/mc-server/mypage/simpleInfo',method='GET')
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ personal_info_valid = True
+ data = response.get('data', {})
+ mobile_phone = data.get('phone','')
+ self.name = data.get('nickname','')
+ unionId = data.get('unionId','')
+ self.mobile_phone = mobile_phone[:3] + "*" * 4 + mobile_phone[7:]
+ # 提取个人信息
+ Log(f">>账号[{self.index}]登陆成功!✅\n用户名:【{self.name}】 \n手机号:【{self.mobile_phone}】")
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'>>登录失败❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ finally:
+ # 最终返回请求是否成功的标志
+ return personal_info_valid
+
+ def myTask(self):
+ print(f'======= 查询任务列表 =======')
+ try:
+
+ # 发送GET请求
+ response = self.do_request('https://shop.sctobacco.com/api/mc-server/mcTask/myTask',method='GET')
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ data = response.get('data', {})
+ taskList = data.get('taskList',[{}])
+ skip_task =[50001,50002,30002]
+ for task in taskList:
+ taskName = task.get('taskName', '')
+ taskId = task.get('taskId', '')
+ isCompleted = task.get('isCompleted', '0')
+ print(f'>>当前任务:【{taskName}】')
+ if taskId in skip_task:
+ print('>暂不支持,跳过❌')
+ continue
+ if isCompleted != '0' :
+ print('>已完成,跳过✅')
+ continue
+ if taskId == 30016:
+ self.SignSubmit()
+ elif taskId == 30004:
+ self.listForMobile()
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'查询任务列表失败❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ def get_score(self):
+ Log(f'======= 获取积分信息 =======')
+ try:
+ timestamp = int(time.time() * 1000)
+ # 发送GET请求
+ response = self.do_request(f'https://shop.sctobacco.com/api/sc-server/log/detail?scoreTypeId=jifen001',method='GET')
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ data = response.get('data', {})
+ if data:
+ scoreTypeName = data.get('scoreTypeName', '')
+ totalScore = data.get('totalScore', '')
+ Log(f'>当前{scoreTypeName}:【{totalScore}】✅')
+ else:
+ Log('>获取积分信息失败❌')
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'获取积分信息失败❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ def SignSubmit(self):
+ Log(f'======= 签到 =======')
+ try:
+ timestamp = int(time.time() * 1000)
+ # 发送GET请求
+ response = self.do_request(f'https://shop.sctobacco.com/api/ac-server/manage/acSignMemberLog/SignSubmit?t={timestamp}',method='GET')
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ data = response.get('data', '')
+ if data:
+ Log(f'>签到成功✅,获得{data}积分')
+ else:
+ Log('>签到失败❌')
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'签到失败❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+
+ def listForMobile(self):
+ Log(f'======= 获取文章列表 =======')
+ try:
+ timestamp = int(time.time() * 1000)
+ # 发送GET请求
+ response = self.do_request(f'https://shop.sctobacco.com/api/mc-server/mcMedia/listForMobile?t={timestamp}&offset=0&limit=10&isShow=1',method='GET')
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ data = response.get('data', {})
+ rows = response.get('rows', [{}])
+ random_element = random.choice(rows)
+ if random_element:
+ Log(f'>>>获取文章列表成功✅')
+ appid = random_element['appid']
+ title = random_element['title']
+ mediaId = random_element['mediaId']
+ Log(f'>>前选择文章:【{title}】 appid:{appid} mediaId:{mediaId}')
+ self.clickMedia(mediaId,appid)
+ else:
+ Log('>>获取文章列表失败❌')
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'获取文章列表失败❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ def clickMedia(self,mediaId,appid):
+ Log(f'======= 阅读文章 =======')
+ try:
+ parmas={
+ 'mpMediaId':mediaId,
+ 'mediaId':mediaId,
+ 'appid' :appid
+ }
+ # 发送GET请求
+ response = self.do_request(f'https://shop.sctobacco.com/api/mc-server/mcMedia/clickMedia',method='GET',params=parmas)
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ message = response.get('message', {})
+ if message == "success":
+ Log(f'>阅读文章成功✅')
+ else:
+ Log('>阅读文章失败❌')
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'阅读文章❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+ def clickMedia(self,mediaId,appid):
+ Log(f'======= 阅读文章 =======')
+ try:
+ parmas={
+ 'mpMediaId':mediaId,
+ 'mediaId':mediaId,
+ 'appid' :appid
+ }
+ # 发送GET请求
+ response = self.do_request(f'https://shop.sctobacco.com/api/mc-server/mcMedia/clickMedia',method='GET',params=parmas)
+ # 检查请求是否成功
+ if response.get('code','-1'):
+ message = response.get('message', {})
+ if message == "success":
+ Log(f'>阅读文章成功✅')
+ else:
+ Log('>阅读文章失败❌')
+ else:
+ # 如果请求不成功,则打印错误信息
+ message = response.get('msg', '')
+ Log(f'阅读文章❌: {message}')
+
+ except Exception as e:
+ # 捕获任何异常并打印
+ print(e)
+
+
+ def main(self):
+ if not self.personal_info() :
+ Log("用户信息无效,请更新CK")
+ self.sendMsg()
+ return False
+ self.myTask()
+ self.get_score()
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+
+if __name__ == '__main__':
+ APP_NAME = '宽哥之家小程序'
+ ENV_NAME = 'KGZJ'
+ CK_NAME = 'token'
+ print(f'''
+✨✨✨ {APP_NAME}签到✨✨✨
+✨ 功能:
+ 积分签到
+✨ 抓包步骤:
+ 打开{APP_NAME}
+ 授权登陆
+ 打开抓包工具
+ 找请求头带{CK_NAME}的URl
+ 复制里面的{CK_NAME}参数值
+✨ ✨✨wxpusher一对一推送功能,
+ ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
+ ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
+参数示例:1790314xxxxxx@UID_xxxxx
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
+✨ 推荐cron:5 8 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{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}挂机通知', f'{send_msg}\n{TIPS_HTML}')
\ No newline at end of file
diff --git a/KKYP.py b/KKYP.py
old mode 100644
new mode 100755
index dbc6314..adae710
--- a/KKYP.py
+++ b/KKYP.py
@@ -10,8 +10,11 @@ import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -159,16 +162,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.05.04'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
diff --git a/LSXDS.py b/LSXDS.py
old mode 100644
new mode 100755
index 206fc65..af81474
--- a/LSXDS.py
+++ b/LSXDS.py
@@ -14,9 +14,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# import CHERWIN_TOOLS
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-#
+
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -368,16 +370,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.05.08'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
@@ -394,4 +399,4 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
s.verify = False
run_result = RUN(infos, index).main()
if not run_result: continue
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
\ No newline at end of file
diff --git a/MXBC.py b/MXBC.py
old mode 100644
new mode 100755
index fa8d2a7..76b8e65
--- a/MXBC.py
+++ b/MXBC.py
@@ -20,8 +20,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -300,16 +303,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.15'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
diff --git a/NXDD.py b/NXDD.py
index 1adef50..76832ed 100755
--- a/NXDD.py
+++ b/NXDD.py
@@ -1,335 +1,341 @@
-# !/usr/bin/python3
-# -- coding: utf-8 --
-# -------------------------------
-# @Author CHERWIN✨✨✨
-# -------------------------------
-# cron "30 1 * * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('奈雪小程序签到')
-import datetime
-import json
-import os
-import random
-import requests
-import hashlib
-import hmac
-import base64
-import time
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-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'
-
-class RUN:
- def __init__(self,info,index):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- token = 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:
- print('检测到设置了UID')
- print(last_info)
- self.send_UID = last_info
- self.index = index + 1
- self.s = requests.session()
- self.s.verify = False
-
- self.token = f'Bearer {token}'
- self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/6945'
- self.openId = 'QL6ZOftGzbziPlZwfiXM'
-
- def random_string(self,length=6, chars='123456789'):
- return ''.join(random.choice(chars) for _ in range(length))
-
- def get_body(self):
- nonce = int(self.random_string())
- timestamp = int(time.time())
- url_path = f'nonce={nonce}&openId={self.openId}×tamp={timestamp}'
- signature = base64.b64encode(
- hmac.new('sArMTldQ9tqU19XIRDMWz7BO5WaeBnrezA'.encode(), url_path.encode(), hashlib.sha1).digest()).decode()
- common = {
- 'platform': 'wxapp',
- 'version': '5.1.8',
- 'imei': '',
- 'osn': 'microsoft',
- 'sv': 'Windows 10 x64',
- 'lang': 'zh_CN',
- 'currency': 'CNY',
- 'timeZone': '',
- 'nonce': nonce,
- 'openId': self.openId,
- 'timestamp': timestamp,
- 'signature': signature
- }
- params = {
- 'businessType': 1,
- 'brand': 26000252,
- 'tenantId': 1,
- 'channel': 2,
- 'stallType': None,
- 'storeId': None
- }
-
- requestData = {
- 'common': common,
- 'params': params
- }
- return requestData
-
- def task_api(self,api_options=None):
- if api_options is None:
- api_options = {}
- try:
- # 首先解析URL,获得主机名
- host_name = api_options['url'].replace('//', '/').split('/')[1]
- full_url = api_options['url']
- if 'queryParam' in api_options:
- # 如果存在查询参数,将其附加到URL
- query_str = "&".join(f"{k}={v}" for k, v in api_options['queryParam'].items())
- full_url += '?' + query_str
- # 定义请求头
- headers = {
- 'Host': host_name,
- 'Connection': 'keep-alive',
- 'User-Agent': self.UA,
- 'Authorization': self.token,
- 'Referer': 'https://tm-web.pin-dao.cn/',
- 'Origin': 'https://tm-web.pin-dao.cn'
- }
- # 准备请求体
- data = None
- if 'body' in api_options:
- body = self.get_body()
- body['params'].update(api_options['body'])
- content_type = api_options.get('Content-Type', 'application/json')
- headers['Content-Type'] = content_type
- if 'json' in content_type:
- data = json.dumps(body)
- else:
- data = "&".join(f"{k}={json.dumps(v) if isinstance(v, dict) else v}" for k, v in body.items())
- headers['Content-Length'] = str(len(data))
- # 如果有额外的URL参数或头部参数,合并到请求中
- if 'urlObjectParam' in api_options:
- # 这里根据需要处理urlObjectParam
- pass
- if 'headerParam' in api_options:
- headers.update(api_options['headerParam'])
- # 发出请求
- response = requests.request(method=api_options.get('method', 'GET'), url=full_url, headers=headers,
- data=data, timeout=20,verify=False)
- # 打印状态码
- if response.status_code != 200:
- print(f"[{api_options.get('fn', 'unknown function')}]返回[{response.status_code}]")
-
- # 解析结果
- try:
- result = response.json()
- except ValueError:
- result = response.text
- return result
-
- except Exception as e:
- print(str(e))
- return {}
-
- def base_userinfo(self):
- try:
- api_options = {
- 'fn': 'baseUserinfo',
- 'method': 'post',
- 'url': 'https://tm-web.pin-dao.cn/user/base-userinfo',
- 'body': {}
- }
- response = self.task_api(api_options)
- if response['code'] == 0:
- # 登录成功的逻辑处理
- phone = response['data']['phone']
- self.phone = phone[:3] + "*" * 4 + phone[7:]
- self.userId = response['data']['userId']
- self.nickName = response['data']['nickName']
- Log(f'账号[{self.index}]登录成功!\n手机号:[{self.phone}] ID[{self.userId}]')
- # print(one_msg)
- return True
- else:
- # 登录失败的逻辑处理
- Log(f"账号登录失败: {response['message']}")
- except Exception as e:
- print(e)
-
- def user_account(self):
- try:
- api_options = {
- 'fn': 'userAccount',
- 'method': 'post',
- 'url': 'https://tm-web.pin-dao.cn/user/account/user-account',
- 'body': {}
- }
- response = self.task_api(api_options)
- if response['code'] == 0:
- # 查询成功的逻辑处理
- coin = response['data']['coin']
- Log(f'账号[{self.index}]当前奈雪币: {coin}')
- else:
- # 查询失败的逻辑处理
- Log(f'账号[{self.index}]查询失败')
- except Exception as e:
- print(e)
-
- def sign_record(self):
- try:
- sign_date = datetime.datetime.now().replace(day=1).strftime('%Y-%m-%d')
- today_date = datetime.datetime.now().strftime('%Y-%m-%d')
- api_options = {
- 'fn': 'signRecord',
- 'method': 'post',
- 'url': 'https://tm-web.pin-dao.cn/user/sign/records',
- 'body': {
- 'signDate': sign_date,
- 'startDate': today_date
- }
- }
- response = self.task_api(api_options)
- if response['code'] == 0:
- Log(f"今天{'已' if response['data']['status'] else '未'}签到,已签到{response['data']['signCount']}天")
- if not response['data']['status']:
- self.sign_save()
- else:
- Log(f"查询签到失败: {response['message']}")
- except Exception as e:
- print(e)
-
- def sign_save(self):
- try:
- sign_date = datetime.datetime.now().strftime('%Y-%m-%d')
- api_options = {
- 'fn': 'signSave',
- 'method': 'post',
- 'url': 'https://tm-web.pin-dao.cn/user/sign/save',
- 'body': {
- 'signDate': sign_date
- }
- }
- response = self.task_api(api_options)
- if response['code'] == 0:
- if response['data']['flag']:
- Log('签到成功')
- else:
- Log('今天已经签到过了')
- else:
- print(f"签到失败: {response['message']}")
- except Exception as e:
- print(e)
-
- def main(self):
- Log(f"\n开始执行第{self.index}个账号--------------->>>>>")
- base_userinfo_result = self.base_userinfo()
- if not base_userinfo_result:
- Log("用户信息无效,请更新CK")
- return False
- self.sign_record()
- self.user_account()
- 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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-
-if __name__ == '__main__':
- APP_NAME = '奈雪点单小程序'
- ENV_NAME = 'NXDD'
- CK_NAME = 'Authorization'
- print(f'''
-✨✨✨ {APP_NAME}签到✨✨✨
-✨ 功能:
- 积分签到
-✨ 抓包步骤:
- 打开{APP_NAME}
- 授权登陆
- 打开抓包工具
- 找请求头带{CK_NAME}的URl
- 复制里面的{CK_NAME}参数值【不要】前面的Bearer 【不要】前面的Bearer 【不要】前面的Bearer
-参数示例:eyJhbGciOiJxxxxxxxxxxxx
-✨ 设置青龙变量:
-export {ENV_NAME}='{CK_NAME}参数值【不要】前面的Bearer'多账号#或&分割
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
-✨ 推荐cron:30 1 * * *
-✨✨✨ @Author CHERWIN✨✨✨
-''')
- local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- token = ENV if ENV else token
- if not token:
- print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
- exit()
- tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
- access_token = []
- 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 + TIPS_HTML)
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# @Author CHERWIN✨✨✨
+# -------------------------------
+# cron "30 1 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('奈雪小程序签到')
+import datetime
+import json
+import os
+import random
+import requests
+import hashlib
+import hmac
+import base64
+import time
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+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'
+
+class RUN:
+ def __init__(self,info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ token = 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:
+ print('检测到设置了UID')
+ print(last_info)
+ self.send_UID = last_info
+ self.index = index + 1
+ self.s = requests.session()
+ self.s.verify = False
+
+ self.token = f'Bearer {token}'
+ self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/6945'
+ self.openId = 'QL6ZOftGzbziPlZwfiXM'
+
+ def random_string(self,length=6, chars='123456789'):
+ return ''.join(random.choice(chars) for _ in range(length))
+
+ def get_body(self):
+ nonce = int(self.random_string())
+ timestamp = int(time.time())
+ url_path = f'nonce={nonce}&openId={self.openId}×tamp={timestamp}'
+ signature = base64.b64encode(
+ hmac.new('sArMTldQ9tqU19XIRDMWz7BO5WaeBnrezA'.encode(), url_path.encode(), hashlib.sha1).digest()).decode()
+ common = {
+ 'platform': 'wxapp',
+ 'version': '5.1.8',
+ 'imei': '',
+ 'osn': 'microsoft',
+ 'sv': 'Windows 10 x64',
+ 'lang': 'zh_CN',
+ 'currency': 'CNY',
+ 'timeZone': '',
+ 'nonce': nonce,
+ 'openId': self.openId,
+ 'timestamp': timestamp,
+ 'signature': signature
+ }
+ params = {
+ 'businessType': 1,
+ 'brand': 26000252,
+ 'tenantId': 1,
+ 'channel': 2,
+ 'stallType': None,
+ 'storeId': None
+ }
+
+ requestData = {
+ 'common': common,
+ 'params': params
+ }
+ return requestData
+
+ def task_api(self,api_options=None):
+ if api_options is None:
+ api_options = {}
+ try:
+ # 首先解析URL,获得主机名
+ host_name = api_options['url'].replace('//', '/').split('/')[1]
+ full_url = api_options['url']
+ if 'queryParam' in api_options:
+ # 如果存在查询参数,将其附加到URL
+ query_str = "&".join(f"{k}={v}" for k, v in api_options['queryParam'].items())
+ full_url += '?' + query_str
+ # 定义请求头
+ headers = {
+ 'Host': host_name,
+ 'Connection': 'keep-alive',
+ 'User-Agent': self.UA,
+ 'Authorization': self.token,
+ 'Referer': 'https://tm-web.pin-dao.cn/',
+ 'Origin': 'https://tm-web.pin-dao.cn'
+ }
+ # 准备请求体
+ data = None
+ if 'body' in api_options:
+ body = self.get_body()
+ body['params'].update(api_options['body'])
+ content_type = api_options.get('Content-Type', 'application/json')
+ headers['Content-Type'] = content_type
+ if 'json' in content_type:
+ data = json.dumps(body)
+ else:
+ data = "&".join(f"{k}={json.dumps(v) if isinstance(v, dict) else v}" for k, v in body.items())
+ headers['Content-Length'] = str(len(data))
+ # 如果有额外的URL参数或头部参数,合并到请求中
+ if 'urlObjectParam' in api_options:
+ # 这里根据需要处理urlObjectParam
+ pass
+ if 'headerParam' in api_options:
+ headers.update(api_options['headerParam'])
+ # 发出请求
+ response = requests.request(method=api_options.get('method', 'GET'), url=full_url, headers=headers,
+ data=data, timeout=20,verify=False)
+ # 打印状态码
+ if response.status_code != 200:
+ print(f"[{api_options.get('fn', 'unknown function')}]返回[{response.status_code}]")
+
+ # 解析结果
+ try:
+ result = response.json()
+ except ValueError:
+ result = response.text
+ return result
+
+ except Exception as e:
+ print(str(e))
+ return {}
+
+ def base_userinfo(self):
+ try:
+ api_options = {
+ 'fn': 'baseUserinfo',
+ 'method': 'post',
+ 'url': 'https://tm-web.pin-dao.cn/user/base-userinfo',
+ 'body': {}
+ }
+ response = self.task_api(api_options)
+ if response['code'] == 0:
+ # 登录成功的逻辑处理
+ phone = response['data']['phone']
+ self.phone = phone[:3] + "*" * 4 + phone[7:]
+ self.userId = response['data']['userId']
+ self.nickName = response['data']['nickName']
+ Log(f'账号[{self.index}]登录成功!\n手机号:[{self.phone}] ID[{self.userId}]')
+ # print(one_msg)
+ return True
+ else:
+ # 登录失败的逻辑处理
+ Log(f"账号登录失败: {response['message']}")
+ except Exception as e:
+ print(e)
+
+ def user_account(self):
+ try:
+ api_options = {
+ 'fn': 'userAccount',
+ 'method': 'post',
+ 'url': 'https://tm-web.pin-dao.cn/user/account/user-account',
+ 'body': {}
+ }
+ response = self.task_api(api_options)
+ if response['code'] == 0:
+ # 查询成功的逻辑处理
+ coin = response['data']['coin']
+ Log(f'账号[{self.index}]当前奈雪币: {coin}')
+ else:
+ # 查询失败的逻辑处理
+ Log(f'账号[{self.index}]查询失败')
+ except Exception as e:
+ print(e)
+
+ def sign_record(self):
+ try:
+ sign_date = datetime.datetime.now().replace(day=1).strftime('%Y-%m-%d')
+ today_date = datetime.datetime.now().strftime('%Y-%m-%d')
+ api_options = {
+ 'fn': 'signRecord',
+ 'method': 'post',
+ 'url': 'https://tm-web.pin-dao.cn/user/sign/records',
+ 'body': {
+ 'signDate': sign_date,
+ 'startDate': today_date
+ }
+ }
+ response = self.task_api(api_options)
+ if response['code'] == 0:
+ Log(f"今天{'已' if response['data']['status'] else '未'}签到,已签到{response['data']['signCount']}天")
+ if not response['data']['status']:
+ self.sign_save()
+ else:
+ Log(f"查询签到失败: {response['message']}")
+ except Exception as e:
+ print(e)
+
+ def sign_save(self):
+ try:
+ sign_date = datetime.datetime.now().strftime('%Y-%m-%d')
+ api_options = {
+ 'fn': 'signSave',
+ 'method': 'post',
+ 'url': 'https://tm-web.pin-dao.cn/user/sign/save',
+ 'body': {
+ 'signDate': sign_date
+ }
+ }
+ response = self.task_api(api_options)
+ if response['code'] == 0:
+ if response['data']['flag']:
+ Log('签到成功')
+ else:
+ Log('今天已经签到过了')
+ else:
+ print(f"签到失败: {response['message']}")
+ except Exception as e:
+ print(e)
+
+ def main(self):
+ Log(f"\n开始执行第{self.index}个账号--------------->>>>>")
+ base_userinfo_result = self.base_userinfo()
+ if not base_userinfo_result:
+ Log("用户信息无效,请更新CK")
+ return False
+ self.sign_record()
+ self.user_account()
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+if __name__ == '__main__':
+ APP_NAME = '奈雪点单小程序'
+ ENV_NAME = 'NXDD'
+ CK_NAME = 'Authorization'
+ print(f'''
+✨✨✨ {APP_NAME}签到✨✨✨
+✨ 功能:
+ 积分签到
+✨ 抓包步骤:
+ 打开{APP_NAME}
+ 授权登陆
+ 打开抓包工具
+ 找请求头带{CK_NAME}的URl
+ 复制里面的{CK_NAME}参数值【不要】前面的Bearer 【不要】前面的Bearer 【不要】前面的Bearer
+参数示例:eyJhbGciOiJxxxxxxxxxxxx
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}参数值【不要】前面的Bearer'多账号#或&分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
+✨ 推荐cron:30 1 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ access_token = []
+ 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 + TIPS_HTML)
diff --git a/PPCS.py b/PPCS.py
index 80632f9..f084da8 100755
--- a/PPCS.py
+++ b/PPCS.py
@@ -1,554 +1,680 @@
-'''
-!/usr/bin/python3
--- coding: utf-8 --
--------------------------------
-✨✨✨ @Author CHERWIN✨✨✨
-cron "0 9 * * *" script-path=xxx.py,tag=匹配cron用
-const $ = new Env('朴朴超市APP')
-'''
-
-import json
-import os
-import random
-import time
-from sys import exit
-from datetime import datetime, timedelta
-from urllib.parse import urlparse
-
-import requests
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-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'
-
-inviteCode = {}
-
-class RUN:
- def __init__(self, info,index,access_token=None,user_id=None):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- self.refresh_token = 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
-
- Log(f"\n---------开始执行第{self.index}个账号>>>>>")
- self.s = requests.session()
- self.s.verify = False
- self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
- self.headers = {
- 'Authorization': '',
- 'Accept': 'application/json, text/plain, */*',
- 'User-Agent': self.UA,
- 'Origin': 'https://ma.pupumall.com',
- 'Sec-Fetch-Site': 'cross-site',
- 'Sec-Fetch-Mode': 'cors',
- 'Sec-Fetch-Dest': 'empty',
- 'Referer': 'https://ma.pupumall.com/',
- 'Accept-Language': 'zh-CN,zh;q=0.9',
- 'pp-os': '0'
- }
- # print(self.refresh_token)
- self.team_need_help = False
- self.teamId = ''
- self.location = {}
- self.store_id = None
- self.zip = None
- self.lng = None
- self.lat = None
- self.params = {
- 'supplement_id': '',
- 'lat_y': '',
- 'lng_x': '',
- }
- if access_token:
- self.access_token=access_token
- self.headers['Authorization'] = access_token
- self.headers['pp-userid'] = user_id
- self.near_location_by_city()
- self.wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
-
-
-
- def make_request(self, url, method='post',headers={},params='',data={}):
- parsed_url = urlparse(url)
- host = parsed_url.netloc
- self.headers['Host'] = host
- if headers == {}:
- headers = self.headers
- if data =={}:
- data = self.params
- try:
- if method.lower() == 'get':
- response = self.s.get(url, headers=headers, verify=False,params=params)
- elif method.lower() == 'post':
- response = self.s.post(url, headers=headers, json=data, verify=False)
- else:
- raise ValueError("不支持的请求方法: " + method)
-
- return response.json()
- except requests.exceptions.RequestException as e:
- print("请求异常:", e)
- except ValueError as e:
- print("值错误或不支持的请求方法:", e)
- except Exception as e:
- print("发生了未知错误:", e)
-
- def near_location_by_city(self):
- print('>>>>>>开始随机选择位置')
- url = 'https://j1.pupuapi.com/client/store/place/near_location_by_city/v2'
- # 生成随机的四位数
- random_digits = ''.join(random.choices('0123456789', k=4))
- # 准备查询参数
- search_params = {
- 'lng': '119.31' + random_digits,
- 'lat': '26.06' + random_digits
- }
- try:
- result =self.make_request(url,method='get',params=search_params)
- errcode = result.get('errcode', -1)
- if errcode == 0:
- data = result.get('data')
- # 假设randomList是一个选择列表中随机元素的方法
- self.location = self.randomList(data)
- self.store_id = self.location['service_store_id']
- self.zip = self.location['city_zip']
- self.lng = str(self.location['lng_x'])
- self.lat = str(self.location['lat_y'])
- self.params['lat_y'] = self.lat
- self.params['lat_x'] = self.lng
- # 更新请求头部
- self.headers['pp_storeid'] = self.store_id
- self.headers['pp-cityzip'] = str(self.zip)
- print('>选取随机地点成功')
- else:
- errmsg = result.get('errmsg', '')
- print(f'>选取随机地点失败[{errcode}]: {errmsg}')
- except Exception as e:
- print(e)
-
- def randomList(self, lst):
- # 返回列表中的随机项
- return random.choice(lst)
-
- def get_AccessToken(self):
- # Log('获取access_token')
- url = "https://cauth.pupuapi.com/clientauth/user/refresh_token"
- data = {
- "refresh_token": self.refresh_token
- }
- headers = {
- "User-Agent": "Pupumall/4.7.3;Android/11;dda37894d1b4c3ed09b6272c55b37cf2",
- "Content-Type": "application/json; charset=UTF-8",
- "Host": "cauth.pupuapi.com",
- "Connection": "Keep-Alive",
- "Accept-Encoding": "gzip"
- }
-
- try:
- response = requests.put(url, headers=headers, data=json.dumps(data), verify=False)
- response.raise_for_status()
-
- json_response = response.json()
- print(json_response)
- data = json_response.get('data', {})
- access_token = data.get('access_token', '')
- if access_token:
- self.access_token = f'Bearer '+access_token
- self.user_id = data.get('user_id')
- self.name = data.get('nick_name', '')
- self.headers['Authorization'] = self.access_token
- self.headers['pp-userid'] = self.user_id
- append_data = {
- 'access_token':self.access_token,
- 'user_id':self.user_id
- }
- access_token_li.append(append_data)
- # print(f'账号【{self.index}】access_token:{self.access_token}')
- return True
- else:
- return False
- except requests.exceptions.HTTPError as http_err:
- Log(f"HTTP请求出错: {http_err}")
- except requests.exceptions.ConnectionError as conn_err:
- Log(f"网络连接出错: {conn_err}")
- except requests.exceptions.Timeout as timeout_err:
- Log(f"请求超时: {timeout_err}")
- except requests.exceptions.RequestException as req_err:
- Log(f"出现了一个意外的请求错误: {req_err}")
- except json.JSONDecodeError as json_err:
- Log(f"JSON解码错误: {json_err}")
- return False
-
-
- def getUserInfo(self):
- global inviteCode
- Log(f'>>>>>>获取用户信息')
- url = "https://cauth.pupuapi.com/clientauth/user/info"
-
- # response = self.do_request(url, headers=headers,req_type='get')
- response = self.make_request(url,method='get')
- # print(response)
- if 'errcode' in response and response.get('errcode', '') == 0:
- data = response.get('data')
- self.user_id = data.get('user_id')
- phone_number = data['phone']
- self.phone = phone_number[:3] + '****' + phone_number[7:]
- self.invite_code = data['invite_code']
- Log(f'手机号:【{self.phone}】')
- print(f'用户ID:【{self.user_id}】\n邀请码:【{self.invite_code}】')
- # new_data = {
- # self.user_id:
- # {
- # 'phone': self.phone,
- # 'invite_code': self.invite_code
- # }
- # }
- # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/PPCS_INVITE_CODE.json", new_data)
- return True
- else:
- Log(f'>获取用户信息失败')
- print(response)
- return False
-
- def signStu(self):
- Log(f'>>>>>>获取签到状态')
- url = 'https://j1.pupuapi.com/client/game/sign/v2/index'
- try:
- result = self.make_request(url, 'get')
- errcode = result.get('errcode', 1)
- if errcode == 0:
- data = result.get('data', {})
- is_signed = data.get('is_signed', 0)
- if is_signed:
- Log('今天已签到')
- else:
- self.sign()
- else:
- errmsg = result.get('errmsg', '')
- print('查询签到信息失败[{}]: {}'.format(errcode, errmsg))
- except Exception as e:
- print('签到索引过程中发生错误: {}'.format(e))
-
- def getCoinInfo(self):
- url = "https://j1.pupuapi.com/client/coin"
- # response = self.do_request(url, req_type='get')
- response = self.make_request(url,method='get')
- # print(response)
- if 'errcode' in response and response.get('errcode', '') == 0:
- data = response.get('data')
- # 当前朴分
- coin = data['balance']
- Log(f'当前朴分:【{coin}】')
- else:
- Log(f'>获取当前朴分失败')
- print(response)
-
-
-
- def sign(self):
- Log(f'>>>>>>开始签到')
- url = "https://j1.pupuapi.com/client/game/sign/v2?supplement_id="
- # 签到
- data = {'supplement_id': ''}
- try:
- result = self.make_request(url, 'post', data=data)
- errcode = result.get('errcode', 1)
- if errcode == 0:
- data = result.get('data', {})
- daily_sign_coin = data.get('daily_sign_coin', 0)
- coupon_list = data.get('coupon_list', [])
-
- rewards = [str(daily_sign_coin) + '积分']
- for coupon in coupon_list:
- condition_amount = '{:.2f}'.format(coupon['condition_amount'] / 100)
- discount_amount = '{:.2f}'.format(coupon['discount_amount'] / 100)
- rewards.append('满{}减{}券'.format(condition_amount, discount_amount))
- Log('签到成功: ' + ', '.join(rewards))
- else:
- errmsg = result.get('errmsg', '')
- Log('签到失败[{}]: {}'.format(errcode, errmsg))
- except Exception as e:
- Log('签到过程中发生错误: {}'.format(e))
-
- # 发起组队
- def creatTeam(self):
- global inviteCode
- Log(f'>>>>>>开始发起组队')
- url = "https://j1.pupuapi.com/client/game/coin_share/team"
- response = self.make_request(url)
- # print(response)
- if 'errcode' in response and response.get('errcode', '') == 0:
- data = response.get('data')
- self.teamId = data
- Log(f'>发起组队成功,ID:【{data}】')
- return True
- elif 'errcode' in response and response.get('errcode', '') != 0:
- Log(f'>发起组队失败:【{response.get("errmsg", "")}】')
- else:
- Log(f'>发起组队失败')
- print(response)
- return False
-
- def get_myTeam(self):
- Log(f'>>>>>>开始查询历史组队')
- # 获取当前日期
- today = datetime.now().date()
- # 构建当天的23:59:59时间
- end_of_day = datetime.combine(today, datetime.max.time()) + timedelta(hours=23, minutes=59, seconds=59)
- # 将时间转换为时间戳(毫秒为单位)
- timestamp = int(end_of_day.timestamp() * 1000)
- # 将日期格式化为字符串
- formatted_date = today.strftime("%Y-%m-%d")
- # print(timestamp)
- # print(formatted_date)
- url = f'https://j1.pupuapi.com/client/game/coin_share/records?time_from=1704038400000&time_to={timestamp}&page=1&size=20'
- try:
- result = self.make_request(url,method='get')
- errcode = result.get('errcode', -1)
- isCreatTeam = False
- if errcode == 0:
- data = result.get('data',[{}])
- for team in data:
- # print(team)
- record_type = team.get('record_type','')
- time_create = team.get('time_create','')
- # 将时间戳转换为 datetime 对象
- timestamp = time_create / 1000 # 将时间戳转换为秒
- dt = datetime.fromtimestamp(timestamp)
- # 将日期格式化为字符串
- formatted_time_create = dt.strftime("%Y-%m-%d")
- team_id = team.get('team_id','')
- # print(record_type)
- # print(formatted_time_create)
- # print(team_id)
- if record_type == 0 and formatted_time_create == formatted_date:
- self.teamId = team_id
- isCreatTeam =True
- break
- if isCreatTeam:
- Log(f'今日已创建ID:【{self.teamId}】队伍')
- self.check_my_team()
- else:
- self.creatTeam()
- else:
- errmsg = result.get('errmsg', '')
- print(f'查询组队历史信息失败[{errcode}]: {errmsg}')
- except Exception as e:
- print(str(e))
-
- def check_my_team(self):
- Log(f'>>>>>>开始查询组队详情')
- url = f'https://j1.pupuapi.com/client/game/coin_share/teams/{self.teamId}'
- try:
- result = self.make_request(url,method='get')
- errcode = result.get('errcode', -1)
- if errcode == 0:
- data = result.get('data')
- status = data.get('status')
- if status == 10:
- self.team_need_help = True
- self.team_max_help = data.get('target_team_member_num')
- self.team_helped_count = data.get('current_team_member_num')
- Log(f'组队未完成: {self.team_helped_count}/{self.team_max_help}')
- elif status == 30:
- self.team_need_help = False
- coins = data.get('current_user_reward_coin')
- Log(f'已组队成功, 获得了{coins}积分')
- else:
- Log(f'组队状态[{status}]')
- print(f': {json.dumps(data)}')
- else:
- errmsg = result.get('errmsg', '')
- print(f'查询组队信息失败[{errcode}]: {errmsg}')
- except Exception as e:
- print(str(e))
- # 组队
- def joinAuthorTeam(self):
- Log(f'>>>>>>第1个账号开始助力作者')
- if len(AuthorCode) > 0:
- for code in AuthorCode:
- # print(code['teamId'])
- url = f"https://j1.pupuapi.com/client/game/coin_share/teams/{code['teamId']}/join"
- response = self.make_request(url)
- # print(response)
- if 'errcode' in response and response.get('errcode', '') == 0:
- print(f'>入队成功:【{code}】')
- break
- # elif 'errcode' in response and response.get('errcode', '') != 0:
- # print(f'>入队失败:【{response.get("errmsg", "")}】')
- # else:
- # print(f'>入队失败')
- # print(response)
-# 组队
- def joinTeam(self):
- global inviteCode
- Log(f'>>>>>>开始本地组队')
- with open('INVITE_CODE/PPCS_INVITE_CODE.json', 'r') as file:
- data = json.load(file)
- inviteCode = list(data.values())
- for code in inviteCode:
- teamId = code.get('teamId',False)
- if not teamId:continue
- url = f"https://j1.pupuapi.com/client/game/coin_share/teams/{code['teamId']}/join"
- response = self.make_request(url)
- # print(response)
- if 'errcode' in response and response.get('errcode', '') == 0:
- Log(f">入队成功:【{code['teamId']}】")
- elif 'errcode' in response and response.get('errcode', '') != 0:
- Log(f'>入队失败:【{response.get("errmsg", "")}】')
- else:
- Log(f'>入队失败')
- print(response)
-
- def main(self):
- # print(self.refresh_token)
- if self.get_AccessToken():
- print('成功获取了access token.')
- self.getUserInfo()
- self.signStu()
- self.getCoinInfo()
- self.get_myTeam()
- new_data = {
- self.user_id:
- {
- 'phone': self.phone,
- 'invite_code': self.invite_code
- }
- }
- if self.teamId:new_data[self.user_id]['teamId']=self.teamId
- CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/PPCS_INVITE_CODE.json", new_data)
- return True
- else:
- Log( f'账号[{self.index}] {CK_NAME}:\n【{self.refresh_token}】\n已失效请及时更新')
- return False
- self.sendMsg()
-
- def help(self):
- if self.get_AccessToken():
-
- if self.index == 1:
- Log('--------签到组队--------')
- self.joinAuthorTeam()
- else:
- Log('--------签到组队--------')
- self.joinTeam()
- return True
- else:
- Log(f'账号[{self.index}] {CK_NAME}:\n【{self.refresh_token}】\n已失效请及时更新')
- return False
- self.sendMsg(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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-
-if __name__ == '__main__':
- APP_NAME = '朴朴超市'
- ENV_NAME = 'PPCS'
- CK_NAME = 'refresh_token'
- print(f'''
-✨✨✨ 朴朴超市脚本✨✨✨
-✨ 功能:
- 积分签到
- 组队互助
-✨ 抓包步骤:
- 打开朴朴超市APP
- 已登录先退出
- 打开抓包
- 登陆
- 找https://cauth.pupuapi.com/clientauth/user/verify_login
- 复制返回body中的{CK_NAME}
- 多个账号可清理APP数据进行换号别点退出否则token失效
-✨ 设置青龙变量:
-export {ENV_NAME}= 'E0oXq3++6a4LG4xxxxxxxx'多账号#分割
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ 多账号默认第一个账号与作者组队,其余互助
-✨ 推荐定时:0 9 * * *
-✨✨✨ @Author CHERWIN✨✨✨
- ''')
-
- local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- token = ENV if ENV else token
- if not token:
- print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
- exit()
- tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
- access_token_li=[]
- for index, infos in enumerate(tokens):
- run_result = RUN(infos, index).main()
- if not run_result: continue
-
- for index, infos in enumerate(tokens):
- RUN(infos, index).help()
- if not run_result: continue
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
-
-
+'''
+!/usr/bin/python3
+-- coding: utf-8 --
+-------------------------------
+✨✨✨ @Author CHERWIN✨✨✨
+cron "0 9 * * *" script-path=xxx.py,tag=匹配cron用
+const $ = new Env('朴朴超市APP')
+'''
+
+import json
+import os
+import random
+import time
+from sys import exit
+from datetime import datetime, timedelta
+from urllib.parse import urlparse
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+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'
+
+inviteCode = {}
+
+class RUN:
+ def __init__(self, info,index,access_token=None,user_id=None):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ self.refresh_token = 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
+
+ Log(f"\n---------开始执行第{self.index}个账号>>>>>")
+ self.s = requests.session()
+ self.s.verify = False
+ self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
+ self.headers = {
+ 'Authorization': '',
+ 'Accept': 'application/json, text/plain, */*',
+ 'User-Agent': self.UA,
+ 'Origin': 'https://ma.pupumall.com',
+ 'Sec-Fetch-Site': 'cross-site',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Referer': 'https://ma.pupumall.com/',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'pp-os': '0'
+ }
+ # print(self.refresh_token)
+ self.team_need_help = False
+ self.teamId = ''
+ self.location = {}
+ self.store_id = None
+ self.zip = None
+ self.lng = None
+ self.lat = None
+ self.boost_id = ''
+ self.boost_id_li = []
+ self.boost_name = ''
+ self.boost_type = ''
+ self.boost_is_enabled = ''
+ self.boost_is_finished = ''
+ self.boost_entity_id = ''
+ self.need_newuser = False
+ self.status = False
+ self.params = {
+ 'supplement_id': '',
+ 'lat_y': '',
+ 'lng_x': '',
+ }
+ if access_token:
+ self.access_token=access_token
+ self.headers['Authorization'] = access_token
+ self.headers['pp-userid'] = user_id
+ self.near_location_by_city()
+ self.wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
+
+
+
+ def make_request(self, url, method='post',headers={},params='',data={}):
+ parsed_url = urlparse(url)
+ host = parsed_url.netloc
+ self.headers['Host'] = host
+ if headers == {}:
+ headers = self.headers
+ if data =={}:
+ data = self.params
+ try:
+ if method.lower() == 'get':
+ response = self.s.get(url, headers=headers, verify=False,params=params)
+ elif method.lower() == 'post':
+ response = self.s.post(url, headers=headers, json=data, verify=False)
+ else:
+ raise ValueError("不支持的请求方法: " + method)
+
+ return response.json()
+ except requests.exceptions.RequestException as e:
+ print("请求异常:", e)
+ except ValueError as e:
+ print("值错误或不支持的请求方法:", e)
+ except Exception as e:
+ print("发生了未知错误:", e)
+
+ def near_location_by_city(self):
+ print('>>>>>>开始随机选择位置')
+ url = 'https://j1.pupuapi.com/client/store/place/near_location_by_city/v2'
+ # 生成随机的四位数
+ random_digits = ''.join(random.choices('0123456789', k=13))
+ # 准备查询参数
+ search_params = {
+ 'lng': '119.30' + random_digits,
+ 'lat': '26.08' + random_digits
+ }
+ try:
+ result =self.make_request(url,method='get',params=search_params)
+ errcode = result.get('errcode', -1)
+ if errcode == 0:
+ data = result.get('data')
+ # 假设randomList是一个选择列表中随机元素的方法
+ self.location = self.randomList(data)
+ self.store_id = self.location['service_store_id']
+ self.zip = self.location['city_zip']
+ self.lng = str(self.location['lng_x'])
+ self.lat = str(self.location['lat_y'])
+ self.params['lat_y'] = self.lat
+ self.params['lat_x'] = self.lng
+ # 更新请求头部
+ self.headers['pp_storeid'] = self.store_id
+ self.headers['pp-cityzip'] = str(self.zip)
+ print('>选取随机地点成功')
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'>选取随机地点失败[{errcode}]: {errmsg}')
+ except Exception as e:
+ print(e)
+
+ def randomList(self, lst):
+ # 返回列表中的随机项
+ return random.choice(lst)
+
+ def get_AccessToken(self):
+ # Log('获取access_token')
+ url = "https://cauth.pupuapi.com/clientauth/user/refresh_token"
+ data = {
+ "refresh_token": self.refresh_token
+ }
+ headers = {
+ "User-Agent": "Pupumall/4.7.3;Android/11;dda37894d1b4c3ed09b6272c55b37cf2",
+ "Content-Type": "application/json; charset=UTF-8",
+ "Host": "cauth.pupuapi.com",
+ "Connection": "Keep-Alive",
+ "Accept-Encoding": "gzip"
+ }
+
+ try:
+ response = requests.put(url, headers=headers, data=json.dumps(data), verify=False)
+ response.raise_for_status()
+
+ json_response = response.json()
+ # print(json_response)
+ data = json_response.get('data', {})
+ access_token = data.get('access_token', '')
+ if access_token:
+ self.access_token = f'Bearer '+access_token
+ self.user_id = data.get('user_id')
+ self.name = data.get('nick_name', '')
+ self.is_new_user = data.get('is_new_user', '')
+ self.headers['Authorization'] = self.access_token
+ self.headers['pp-userid'] = self.user_id
+ append_data = {
+ 'access_token':self.access_token,
+ 'user_id':self.user_id
+ }
+ access_token_li.append(append_data)
+ self.status = True
+ # print(f'账号【{self.index}】access_token:{self.access_token}')
+ return True
+ else:
+ return False
+ except requests.exceptions.HTTPError as http_err:
+ Log(f"HTTP请求出错: {http_err}")
+ except requests.exceptions.ConnectionError as conn_err:
+ Log(f"网络连接出错: {conn_err}")
+ except requests.exceptions.Timeout as timeout_err:
+ Log(f"请求超时: {timeout_err}")
+ except requests.exceptions.RequestException as req_err:
+ Log(f"出现了一个意外的请求错误: {req_err}")
+ except json.JSONDecodeError as json_err:
+ Log(f"JSON解码错误: {json_err}")
+ return False
+
+
+ def getUserInfo(self):
+ global inviteCode
+ Log(f'>>>>>>获取用户信息')
+ url = "https://cauth.pupuapi.com/clientauth/user/info"
+
+ # response = self.do_request(url, headers=headers,req_type='get')
+ response = self.make_request(url,method='get')
+ # print(response)
+ if 'errcode' in response and response.get('errcode', '') == 0:
+ data = response.get('data')
+ self.user_id = data.get('user_id')
+ phone_number = data['phone']
+ self.phone = phone_number[:3] + '****' + phone_number[7:]
+ self.invite_code = data['invite_code']
+ Log(f'手机号:【{self.phone}】')
+ print(f'用户ID:【{self.user_id}】\n邀请码:【{self.invite_code}】')
+ # new_data = {
+ # self.user_id:
+ # {
+ # 'phone': self.phone,
+ # 'invite_code': self.invite_code
+ # }
+ # }
+ # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/PPCS_INVITE_CODE.json", new_data)
+ return True
+ else:
+ Log(f'>获取用户信息失败')
+ print(response)
+ return False
+
+ def signStu(self):
+ Log(f'>>>>>>获取签到状态')
+ url = 'https://j1.pupuapi.com/client/game/sign/v2/index'
+ try:
+ result = self.make_request(url, 'get')
+ errcode = result.get('errcode', 1)
+ if errcode == 0:
+ data = result.get('data', {})
+ is_signed = data.get('is_signed', 0)
+ if is_signed:
+ Log('今天已签到')
+ else:
+ self.sign()
+ else:
+ errmsg = result.get('errmsg', '')
+ print('查询签到信息失败[{}]: {}'.format(errcode, errmsg))
+ except Exception as e:
+ print('签到索引过程中发生错误: {}'.format(e))
+
+ def getCoinInfo(self):
+ url = "https://j1.pupuapi.com/client/coin"
+ # response = self.do_request(url, req_type='get')
+ response = self.make_request(url,method='get')
+ # print(response)
+ if 'errcode' in response and response.get('errcode', '') == 0:
+ data = response.get('data')
+ # 当前朴分
+ coin = data['balance']
+ Log(f'当前朴分:【{coin}】')
+ else:
+ Log(f'>获取当前朴分失败')
+ print(response)
+
+
+
+ def sign(self):
+ Log(f'>>>>>>开始签到')
+ url = "https://j1.pupuapi.com/client/game/sign/v2?supplement_id="
+ # 签到
+ data = {'supplement_id': ''}
+ try:
+ result = self.make_request(url, 'post', data=data)
+ errcode = result.get('errcode', 1)
+ if errcode == 0:
+ data = result.get('data', {})
+ daily_sign_coin = data.get('daily_sign_coin', 0)
+ coupon_list = data.get('coupon_list', [])
+
+ rewards = [str(daily_sign_coin) + '积分']
+ for coupon in coupon_list:
+ condition_amount = '{:.2f}'.format(coupon['condition_amount'] / 100)
+ discount_amount = '{:.2f}'.format(coupon['discount_amount'] / 100)
+ rewards.append('满{}减{}券'.format(condition_amount, discount_amount))
+ Log('签到成功: ' + ', '.join(rewards))
+ else:
+ errmsg = result.get('errmsg', '')
+ Log('签到失败[{}]: {}'.format(errcode, errmsg))
+ except Exception as e:
+ Log('签到过程中发生错误: {}'.format(e))
+
+ # 发起组队
+ def creatTeam(self):
+ global inviteCode
+ Log(f'>>>>>>开始发起组队')
+ url = "https://j1.pupuapi.com/client/game/coin_share/team"
+ response = self.make_request(url)
+ # print(response)
+ if 'errcode' in response and response.get('errcode', '') == 0:
+ data = response.get('data')
+ self.teamId = data
+ Log(f'>发起组队成功,ID:【{data}】')
+ return True
+ elif 'errcode' in response and response.get('errcode', '') != 0:
+ Log(f'>发起组队失败:【{response.get("errmsg", "")}】')
+ else:
+ Log(f'>发起组队失败')
+ print(response)
+ return False
+
+ def get_myTeam(self):
+ Log(f'>>>>>>开始查询历史组队')
+ # 获取当前日期
+ today = datetime.now().date()
+ # 构建当天的23:59:59时间
+ end_of_day = datetime.combine(today, datetime.max.time()) + timedelta(hours=23, minutes=59, seconds=59)
+ # 将时间转换为时间戳(毫秒为单位)
+ timestamp = int(end_of_day.timestamp() * 1000)
+ # 将日期格式化为字符串
+ formatted_date = today.strftime("%Y-%m-%d")
+ # print(timestamp)
+ # print(formatted_date)
+ url = f'https://j1.pupuapi.com/client/game/coin_share/records?time_from=1704038400000&time_to={timestamp}&page=1&size=20'
+ try:
+ result = self.make_request(url,method='get')
+ errcode = result.get('errcode', -1)
+ isCreatTeam = False
+ if errcode == 0:
+ data = result.get('data',[{}])
+ for team in data:
+ # print(team)
+ record_type = team.get('record_type','')
+ time_create = team.get('time_create','')
+ # 将时间戳转换为 datetime 对象
+ timestamp = time_create / 1000 # 将时间戳转换为秒
+ dt = datetime.fromtimestamp(timestamp)
+ # 将日期格式化为字符串
+ formatted_time_create = dt.strftime("%Y-%m-%d")
+ team_id = team.get('team_id','')
+ # print(record_type)
+ # print(formatted_time_create)
+ # print(team_id)
+ if record_type == 0 and formatted_time_create == formatted_date:
+ self.teamId = team_id
+ isCreatTeam =True
+ break
+ if isCreatTeam:
+ Log(f'今日已创建ID:【{self.teamId}】队伍')
+ self.check_my_team()
+ else:
+ self.creatTeam()
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'查询组队历史信息失败[{errcode}]: {errmsg}')
+ except Exception as e:
+ print(str(e))
+
+ def check_my_team(self):
+ Log(f'>>>>>>开始查询组队详情')
+ url = f'https://j1.pupuapi.com/client/game/coin_share/teams/{self.teamId}'
+ try:
+ result = self.make_request(url,method='get')
+ errcode = result.get('errcode', -1)
+ if errcode == 0:
+ data = result.get('data')
+ status = data.get('status')
+ if status == 10:
+ self.team_need_help = True
+ self.team_max_help = data.get('target_team_member_num')
+ self.team_helped_count = data.get('current_team_member_num')
+ Log(f'组队未完成: {self.team_helped_count}/{self.team_max_help}')
+ elif status == 30:
+ self.team_need_help = False
+ coins = data.get('current_user_reward_coin')
+ Log(f'已组队成功, 获得了{coins}积分')
+ else:
+ Log(f'组队状态[{status}]')
+ print(f': {json.dumps(data)}')
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'查询组队信息失败[{errcode}]: {errmsg}')
+ except Exception as e:
+ print(str(e))
+
+ # 组队
+ def joinAuthorTeam(self):
+ print(f'>>>>>>第1个账号开始助力作者')
+ if len(AuthorCode) > 0:
+ for code in AuthorCode:
+ # print(code['teamId'])
+ if code.get('status',False) and code.get('phone','') != self.phone:
+ url = f"https://j1.pupuapi.com/client/game/coin_share/teams/{code['teamId']}/join"
+ response = self.make_request(url)
+ # print(response)
+ if 'errcode' in response and response.get('errcode', '') == 0:
+ print(f'>入队成功:【{code}】')
+ break
+ # elif 'errcode' in response and response.get('errcode', '') != 0:
+ # print(f'>入队失败:【{response.get("errmsg", "")}】')
+ # else:
+ # print(f'>入队失败')
+ # print(response)
+# 组队
+ def joinTeam(self):
+ global inviteCode
+ Log(f'>>>>>>开始本地组队')
+ with open('INVITE_CODE/PPCS_INVITE_CODE.json', 'r') as file:
+ data = json.load(file)
+ inviteCode = list(data.values())
+ for code in inviteCode:
+ teamId = code.get('teamId',False)
+ if not teamId:continue
+ url = f"https://j1.pupuapi.com/client/game/coin_share/teams/{code['teamId']}/join"
+ response = self.make_request(url)
+ # print(response)
+ if 'errcode' in response and response.get('errcode', '') == 0:
+ Log(f">入队成功:【{code['teamId']}】")
+ elif 'errcode' in response and response.get('errcode', '') != 0:
+ Log(f'>入队失败:【{response.get("errmsg", "")}】')
+ else:
+ Log(f'>入队失败')
+ print(response)
+
+ def boost_recommend(self):
+ print(f'>>>>>>开始获取助力活动列表')
+ url = f'https://j1.pupuapi.com/client/boost/recommend'
+ try:
+ result = self.make_request(url,method='get')
+ errcode = result.get('errcode', -1)
+ if errcode == 0:
+ data = result.get('data',[])
+ for li in data:
+ self.boost_id = li.get('id','')
+ self.boost_name = li.get('name','')
+ self.boost_type = li.get('type','')
+ self.boost_is_enabled = li.get('is_enabled','')
+ self.boost_is_finished = li.get('is_finished','')
+ self.boost_entity_id = li.get('entity_id','')
+ self.boost_finish_condition_msg = li.get('boost_finish_condition_msg','')
+
+
+ if self.boost_entity_id:
+ print(f'当前项目:【{self.boost_name}】 已发起 ID:【{self.boost_entity_id}】 完成状态:{self.boost_is_finished} ')
+ li = {
+ 'boost_entity_id': self.boost_entity_id,
+ 'boost_type': self.boost_type,
+ 'need_newuser':self.need_newuser
+ }
+ self.boost_id_li.append(li)
+ continue
+ print(f'当前项目:【{self.boost_name}】 完成状态:{self.boost_is_finished} ')
+ if '新人' in self.boost_finish_condition_msg:
+ self.need_newuser = True
+ continue
+ if not self.boost_take_in():break
+ print(self.boost_id_li)
+
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'查询组队信息失败[{errcode}]: {errmsg}')
+ except Exception as e:
+ print(str(e))
+
+ def boost_help(self):
+ print(f'>开始助力')
+ if len(AuthorCode) > 0:
+ for code in AuthorCode:
+ # print(code['teamId'])
+ if code.get('status',False) and code.get('phone','') != self.phone and code.get('boost',False) and self.is_new_user:
+ boost_li = code.get('boost',[])
+ for boost in boost_li:
+ boost_entity_id = boost.get('boost_entity_id','')
+ boost_type = boost.get('boost_type', '')
+ url = f'https://j1.pupuapi.com/client/boost/assist/{boost_entity_id}?group_type={boost_type}'
+ # try:
+ result = self.make_request(url)
+ errcode = result.get('errcode', -1)
+ if errcode == 0:
+ print('助力成功')
+ self.is_new_user = False
+ break
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'助力失败[{errcode}]: {errmsg}')
+ break
+ else:
+ continue
+ # except Exception as e:
+ # print(str(e))
+
+ def boost_take_in(self):
+ print(f'>开始发起助力活动')
+ self.lng = str(self.location['lng_x'])
+ self.lat = str(self.location['lat_y'])
+ url = f'https://j1.pupuapi.com/client/boost/take_in/{self.boost_id}?lat_y={self.lat}&lng_x={self.lng}'
+ # try:
+ result = self.make_request(url)
+ errcode = result.get('errcode', -1)
+ if errcode == 0:
+ self.boost_entity_id = result.get('data','')
+ # print(self.boost_entity_id)
+ if self.boost_entity_id:
+ li = {
+ 'boost_entity_id':self.boost_entity_id,
+ 'boost_type':self.boost_type,
+ 'need_newuser':self.need_newuser
+ }
+ self.boost_id_li.append(li)
+ return True
+ else:
+ errmsg = result.get('errmsg', '')
+ print(f'发起组队失败[{errcode}]: {errmsg}')
+ return False
+ # except Exception as e:
+ # print(str(e))
+
+
+ def main(self):
+ # print(self.refresh_token)
+ if self.get_AccessToken():
+ print('成功获取了access token.')
+ self.getUserInfo()
+ self.signStu()
+ self.getCoinInfo()
+ self.get_myTeam()
+ self.boost_recommend()
+ if self.is_new_user:
+ self.boost_help()
+ new_data = {
+ self.user_id:
+ {
+ 'status': self.status,
+ 'phone': self.phone,
+ 'invite_code': self.invite_code,
+ 'boost':self.boost_id_li
+ }
+ }
+ if self.teamId:new_data[self.user_id]['teamId']=self.teamId
+ CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/PPCS_INVITE_CODE.json", new_data)
+ self.sendMsg()
+ return True
+ else:
+ Log( f'账号[{self.index}] {CK_NAME}:\n【{self.refresh_token}】\n已失效请及时更新')
+ self.sendMsg()
+ return False
+
+
+ def help(self):
+ if self.get_AccessToken():
+ if self.index == 1:
+ print('--------签到组队--------')
+ self.joinAuthorTeam()
+ else:
+ print('--------签到组队--------')
+ self.joinTeam()
+ return True
+ else:
+ Log(f'账号[{self.index}] {CK_NAME}:\n【{self.refresh_token}】\n已失效请及时更新')
+ self.sendMsg(True)
+ return False
+
+
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version,True)
+
+if __name__ == '__main__':
+ APP_NAME = '朴朴超市'
+ ENV_NAME = 'PPCS'
+ CK_NAME = 'refresh_token'
+ print(f'''
+✨✨✨ 朴朴超市脚本✨✨✨
+✨ 功能:
+ 积分签到
+ 组队互助
+✨ 抓包步骤:
+ 打开朴朴超市APP
+ 已登录先退出
+ 打开抓包
+ 登陆
+ 找https://cauth.pupuapi.com/clientauth/user/verify_login
+ 复制返回body中的{CK_NAME}
+ 多个账号可清理APP数据进行换号别点退出否则token失效
+✨ 设置青龙变量:
+export {ENV_NAME}= 'E0oXq3++6a4LG4xxxxxxxx'多账号#分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ 多账号默认第一个账号与作者组队,其余互助
+✨ 推荐定时:0 9 * * *
+✨✨✨ @Author CHERWIN✨✨✨
+ ''')
+
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # with open('INVITE_CODE/PPCS_INVITE_CODE.json','r') as f:
+ # content = json.loads(f.read())
+ # print(content)
+
+ # AuthorCode = list(content.values())
+ # print(AuthorCode)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ access_token_li=[]
+ for index, infos in enumerate(tokens):
+ run_result = RUN(infos, index).main()
+ if not run_result: continue
+
+ for index, infos in enumerate(tokens):
+ RUN(infos, index).help()
+ if not run_result: continue
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+
+
diff --git a/SFSY.py b/SFSY.py
index fd1ab68..e9a3988 100755
--- a/SFSY.py
+++ b/SFSY.py
@@ -13,28 +13,37 @@ from datetime import datetime, timedelta
from sys import exit
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
+
if os.path.isfile('notify.py'):
from notify import send
+
print("加载通知服务成功!")
else:
print("加载通知服务失败!")
send_msg = ''
-one_msg=''
+one_msg = ''
+
+
def Log(cont=''):
- global send_msg,one_msg
+ 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=['8C3950A023D942FD93BE9218F5BFB34B','EF94619ED9C84E968C7A88CFB5E0B5DC','9C92BD3D672D4B6EBB7F4A488D020C79','803CF9D1E0734327BDF67CDAE1442B0E','00C81F67BE374041A692FA034847F503']
+# 1905 #0945 #6332 #6615 2559
+inviteId = [
+ '8C3950A023D942FD93BE9218F5BFB34B', 'EF94619ED9C84E968C7A88CFB5E0B5DC', '9C92BD3D672D4B6EBB7F4A488D020C79','803CF9D1E0734327BDF67CDAE1442B0E', '00C81F67BE374041A692FA034847F503']
class RUN:
- def __init__(self,info,index):
+ def __init__(self, info, index):
global one_msg
one_msg = ''
split_info = info.split('@')
@@ -62,9 +71,12 @@ class RUN:
}
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 = APP_INFO.get('ANSWER',[]).get(self.today,False)
+ self.answer = APP_INFO.get('ANSWER', []).get(self.today, False)
def get_deviceId(self, characters='abcdef0123456789'):
result = ''
@@ -77,7 +89,7 @@ class RUN:
result += char
return result
- def login(self,sfurl):
+ 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_', '')
@@ -89,6 +101,7 @@ class RUN:
else:
Log(f'获取用户信息失败')
return False
+
def getSign(self):
timestamp = str(int(round(time.time() * 1000)))
token = 'wwesldfs29aniversaryvdld29'
@@ -102,7 +115,8 @@ class RUN:
}
self.headers.update(data)
return data
- def do_request(self, url, data = {}, req_type = 'post'):
+
+ def do_request(self, url, data={}, req_type='post'):
self.getSign()
try:
if req_type.lower() == 'get':
@@ -120,20 +134,19 @@ class RUN:
print('JSON decoding failed:', e)
return None
-
def sign(self):
print(f'>>>>>>开始执行签到')
- json_data = {"comeFrom":"vioin","channelFrom":"WEIXIN"}
+ 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:
- count_day = response.get('obj',{}).get('countDay',0)
+ count_day = response.get('obj', {}).get('countDay', 0)
if response.get('obj') and response['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")}')
@@ -143,7 +156,7 @@ class RUN:
'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)
+ response = self.do_request(url, data=json_data)
# print(response)
if response.get('success') == True:
gift_list = response.get('obj', {}).get('giftList', [])
@@ -157,16 +170,16 @@ class RUN:
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'>>>开始获取签到任务列表')
+ def get_SignTaskList(self, END=False):
+ if not END: print(f'>>>开始获取签到任务列表')
json_data = {
'channelType': '3',
'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)
+ 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') == True and response.get('obj') != []:
totalPoint = response["obj"]["totalPoint"]
if END:
Log(f'当前积分:【{totalPoint}】')
@@ -178,7 +191,7 @@ class RUN:
self.strategyId = task["strategyId"]
self.title = task["title"]
status = task["status"]
- skip_title = ['用行业模板寄件下单','去新增一个收件偏好','参与积分活动']
+ skip_title = ['用行业模板寄件下单', '去新增一个收件偏好', '参与积分活动']
if status == 3:
print(f'>{self.title}-已完成')
continue
@@ -198,8 +211,8 @@ class RUN:
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)
+ 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:
@@ -233,11 +246,11 @@ class RUN:
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'
+ 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'
json_data = {"taskType": self.taskType}
# print(json_data)
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~receiveHoney'
@@ -295,8 +308,8 @@ class RUN:
print('>>>开始获取采蜜换大礼任务列表')
# 任务列表
json_data = {}
- self.headers['channel']='wxwdsj'
- url ='https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeIndexService~taskDetail'
+ 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)
@@ -323,11 +336,11 @@ class RUN:
print('>>>执行大冒险任务')
# 大冒险
gameNum = 5
- for i in range(1,gameNum):
+ for i in range(1, gameNum):
json_data = {
'gatherHoney': 20,
}
- if gameNum < 0 :break
+ if gameNum < 0: break
print(f'>>开始第{i}次大冒险')
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~receiveExchangeGameService~gameReport'
response = self.do_request(url, data=json_data)
@@ -342,8 +355,8 @@ class RUN:
print(f'>大冒险失败!【{response.get("errorMessage")}】')
break
- def honey_indexData(self,END=False):
- if not END:print('\n>>>>>>>开始执行采蜜换大礼任务')
+ def honey_indexData(self, END=False):
+ if not END: print('\n>>>>>>>开始执行采蜜换大礼任务')
# 邀请
random_invite = random.choice([invite for invite in inviteId if invite != self.user_id])
self.headers['channel'] = 'wxwdsj'
@@ -357,7 +370,7 @@ class RUN:
return
Log(f'执行前丰蜜:【{usableHoney}】')
taskDetail = response.get('obj').get('taskDetail')
- activityEndTime = response.get('obj').get('activityEndTime','')
+ activityEndTime = response.get('obj').get('activityEndTime', '')
activity_end_time = datetime.strptime(activityEndTime, "%Y-%m-%d %H:%M:%S")
current_time = datetime.now()
@@ -372,8 +385,6 @@ class RUN:
self.receive_honeyTask()
time.sleep(2)
-
-
def EAR_END_2023_TaskList(self):
print('\n>>>>>>开始年终集卡任务')
# 任务列表
@@ -381,11 +392,11 @@ class RUN:
"activityCode": "YEAR_END_2023",
"channelType": "MINI_PROGRAM"
}
- self.headers['channel']='xcx23nz'
- self.headers['platform']='MINI_PROGRAM'
- self.headers['syscode']='MCS-MIMP-CORE'
+ self.headers['channel'] = 'xcx23nz'
+ 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'
+ url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~activityTaskService~taskList'
response = self.do_request(url, data=json_data)
# print(response)
@@ -476,7 +487,7 @@ class RUN:
print(f'>>>开始抽卡')
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~yearEnd2023GardenPartyService~getAward'
for l in range(10):
- for i in range(0,3):
+ for i in range(0, 3):
json_data = {
"cardType": i
}
@@ -497,7 +508,7 @@ class RUN:
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):
+ for i in range(1, 11):
json_data = {
"index": i
}
@@ -545,6 +556,7 @@ class RUN:
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'
@@ -554,7 +566,7 @@ class RUN:
print(f'每周领券: {product_names}')
else:
error_message = response.get('errorMessage') or json.dumps(response) or '无返回'
- print( f'每周领券失败: {error_message}')
+ print(f'每周领券失败: {error_message}')
if '系统繁忙' in error_message or '用户手机号校验未通过' in error_message:
self.anniversary_black = True
@@ -581,13 +593,17 @@ class RUN:
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']:
+ 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']}
@@ -597,7 +613,8 @@ class RUN:
# 完成任务后获取任务奖励的逻辑
self.anniversary2024_fetchMixTaskReward(task)
else:
- print('完成任务[%s]失败: %s' % (task['taskName'], response.get('errorMessage') or (json.dumps(response) if response 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'
@@ -885,7 +902,7 @@ class RUN:
self.cards[currency_key] = int(card.get('balance'))
card_info.append('[' + card.get('currency') + ']X' + str(card.get('balance')))
- Log(f'已收集拼图: {card_info}' )
+ Log(f'已收集拼图: {card_info}')
cards_li.sort(key=lambda x: x.get('balance'), reverse=True)
else:
@@ -896,11 +913,11 @@ class RUN:
def do_draw(self, cards):
url = 'https://mcs-mimp-web.sf-express.com/mcs-mimp/commonPost/~memberNonactivity~anniversary2024CardService~collectDrawAward'
- data = {"accountList":cards}
+ data = {"accountList": cards}
response = self.do_request(url, data)
if response and response.get('success'):
- data = response.get('obj',{})
- productName = data.get('productName','')
+ data = response.get('obj', {})
+ productName = data.get('productName', '')
Log(f'抽奖成功,获得{productName}')
return True
else:
@@ -908,7 +925,7 @@ class RUN:
print(f'抽奖失败: {error_message}')
return False
- def convert_common_card(self,cards, target_card):
+ def convert_common_card(self, cards, target_card):
# 如果共通卡(COMMON_CARD)的数量大于0,转化成目标卡
if cards['COMMON_CARD'] > 0:
cards['COMMON_CARD'] -= 1
@@ -916,13 +933,12 @@ class RUN:
return True
return False
- def can_draw(self,cards, n):
+ 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):
+ 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:
@@ -937,7 +953,7 @@ class RUN:
else:
return None
- def simulate_lottery(self,cards):
+ def simulate_lottery(self, cards):
while self.can_draw(cards, 9):
used_cards = self.draw(cards, 9)
print("进行了一次9卡抽奖,消耗卡片: ", used_cards)
@@ -973,15 +989,210 @@ class RUN:
else:
print('未到自动抽奖时间')
+ def member_day_index(self):
+ 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'):
+ Log(f'会员日领取{hour}点红包成功')
+ else:
+ error_message = response.get('errorMessage', '无返回')
+ Log(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']
+ # Rest of the logic to process packet list
+ 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:
+ 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 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
+ 执行签到任务
self.sign()
self.superWelfare_receiveRedPacket()
self.get_SignTaskList()
@@ -992,17 +1203,25 @@ class RUN:
#获取任务列表并执行任务
self.get_honeyTaskListStart()
self.honey_indexData(True)
+ #######################################
# # 获取当前季度结束日期
# activity_end_date = get_quarter_end_date()
# if is_activity_end_date(activity_end_date):
# Log("今天采蜜活动截止兑换,请及时进行兑换")
# send('顺丰速运挂机通知', "今天采蜜活动截止兑换,请及时进行兑换")
- target_time = datetime(2024, 4, 8, 19, 0)
- if datetime.now() < target_time:
- # self.EAR_END_2023_TaskList()
- self.anniversary2024_task()
+ # target_time = datetime(2024, 4, 8, 19, 0)
+ # if datetime.now() < target_time:
+ # # self.EAR_END_2023_TaskList()
+ # self.anniversary2024_task()
+ # else:
+ # print('周年庆活动已结束')
+ #######################################
+ self.member_day_index()
+ current_date = datetime.now().day
+ if 26 <= current_date <= 28:
+ self.member_day_index()
else:
- print('周年庆活动已结束')
+ print('未到指定时间不执行会员日任务')
self.sendMsg()
return True
@@ -1012,7 +1231,6 @@ class RUN:
print(push_res)
-
def get_quarter_end_date():
current_date = datetime.now()
current_month = current_date.month
@@ -1026,6 +1244,7 @@ def get_quarter_end_date():
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()
@@ -1033,7 +1252,6 @@ def is_activity_end_date(end_date):
return current_date == end_date
-
def down_file(filename, file_url):
print(f'开始下载:{filename},下载地址:{file_url}')
try:
@@ -1060,10 +1278,13 @@ def down_file(filename, file_url):
print(f'【{filename}】下载失败:{str(e)}')
return False
+
def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ global CHERWIN_TOOLS, ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,
+ local_version)
+
if __name__ == '__main__':
APP_NAME = '顺丰速运'
@@ -1094,16 +1315,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.16'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
@@ -1118,4 +1342,3 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
run_result = RUN(infos, index).main()
if not run_result: continue
if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
-
diff --git a/TBHYZX.py b/TBHYZX.py
old mode 100644
new mode 100755
index 967373f..fd4ce7b
--- a/TBHYZX.py
+++ b/TBHYZX.py
@@ -15,8 +15,10 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
#
-if os.path.isfile('/DEV_ENV.py'):
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -36,8 +38,7 @@ class RUN:
global one_msg
one_msg = ''
split_info = info.split('@')
-
- self.token = split_info[0]
+ self.token = json.loads(split_info[0])
# print(self.token)
len_split_info = len(split_info)
last_info = split_info[len_split_info - 1]
@@ -69,6 +70,8 @@ class RUN:
}
#
# print(self.headers)
+ for key, value in self.token.items():
+ self.headers[key] = value
self.baseUrl = 'https://wxa-tp.ezrpro.com/myvip/'
@@ -120,17 +123,30 @@ class RUN:
def WxAppOnLoginNew(self):
Log('>>>>>>登陆')
url = "https://wxa-tp.ezrpro.com/myvip/Base/User/WxAppOnLoginNew"
+ # data = {
+ # "code": self.token,
+ # "CommonIdType": "VipWxUnionId",
+ # "CommonId": "124948229",
+ # "ShopId": 0,
+ # "CommonIdSource": 47,
+ # "Latitude": 0,
+ # "Longitude": 0,
+ # "InviteActObj": "{\"ActId\":50726}",
+ # "PingId": "peLXqZCQAAD-C3PrZ36DkaE98NoLjuqQ",
+ # # "PingDate": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ # "PingDate": '2024-03-19 22:23:01'
+ # }
data = {
- "code": self.token,
- "CommonIdType": "VipId",
- "CommonId": "124948229",
+ "CommonIdType": "VipWxUnionId",
+ "CommonId": "",
"ShopId": 0,
- "CommonIdSource": 98,
+ "CommonIdSource": 47,
"Latitude": 0,
"Longitude": 0,
"InviteActObj": "{\"ActId\":50726}",
- "PingId": "peLXqZCQAA3W2G4d-pEZ8FRPEjxKdzoQ",
- "PingDate": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ "code": "0c1QVUFa1bogqH0W87Ga1ZHjjG3QVUFP",
+ "PingId": "peLXqZCQAAD-C3PrZ36DkaE98NoLjuqQ",
+ "PingDate": "2024-03-19 22:23:01"
}
response = s.post(url, headers=self.headers,json=data)
response = response.json()
@@ -187,8 +203,9 @@ class RUN:
def main(self):
Log(f"\n开始执行第{self.index}个账号--------------->>>>>")
- if self.WxAppOnLoginNew():
- self.GetVipCardInfoByVipId()
+ # if self.WxAppOnLoginNew():
+ if self.GetVipCardInfoByVipId():
+ # self.GetVipCardInfoByVipId()
self.GetSignInDtlInfo()
self.BonusClassify()
self.sendMsg()
@@ -261,16 +278,19 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.05.08'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print('脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
@@ -287,4 +307,4 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
s.verify = False
run_result = RUN(infos, index).main()
if not run_result: continue
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
\ No newline at end of file
diff --git a/TYQH.py b/TYQH.py
index 7399914..aba846d 100755
--- a/TYQH.py
+++ b/TYQH.py
@@ -1,1243 +1,1212 @@
-# !/usr/bin/python3
-# -- coding: utf-8 --
-# -------------------------------
-# @Author : cherwin
-# -------------------------------
-# cron "25 10-22/2 * * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('统一快乐星球小程序-茄皇的家')
-import hashlib
-import json
-import os
-import random
-import string
-import time
-from datetime import datetime
-from os import environ, path
-
-import requests
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-
-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'
-
-USER_INFO = {}
-
-class RUN:
- def __init__(self, info,index):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- self.third_id = split_info[0]
- self.wid = split_info[1]
- 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.user_index = index + 1
- print(f"\n---------开始执行第{self.user_index}个账号>>>>>")
- self.s = requests.session()
- self.s.verify = False
-
- self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
-
- self.headers = {
- 'User-Agent': self.UA,
- 'Sec-Fetch-Site': 'cross-site',
- 'Sec-Fetch-Mode': 'cors',
- 'Sec-Fetch-Dest': 'empty',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Accept-Language': 'zh-CN,zh;q=0.9',
- 'Origin': 'https://thekingoftomato.ioutu.cn',
- 'Referer': 'https://thekingoftomato.ioutu.cn/'
-
- }
- self.base_url = 'https://qiehuang-apig.xiaoyisz.com/qiehuangsecond/ga'
- self.sun = 0
- self.land = {}
- self.refresh_land_step = False
- self.need_help_unlock = True
- self.need_help_task = True
- self.need_help_risk = True
-
- self.can_go_risk = True
- self.can_add_friend = True
-
- self.can_help_task = True
- self.can_help_risk = True
- self.can_help_unlock = True
- self.role_id =''
- self.role_progress=''
- self.role_max=''
- self.all_land_unlock = True
- self.all_role_unlock = True
- self.help_task_config = {}
- self.help_role_config = {}
- self.group_step = ['发育期', '幼苗期', '开花期', '结果期', '收获期']
- self.Login_res = self.login()
-
- def load_json(self):
- try:
- with open(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", 'r', encoding='utf-8') as file:
- data = json.load(file)
- return data
- except FileNotFoundError:
- print("未找到文件,返回空字典")
- return {}
- except Exception as e:
- print(f"发生错误:{e}")
- return {}
-
- def make_request(self, url, method='post', headers={}, params={}):
- if headers == {}:
- headers = self.headers
- if params == {}:
- params = self.params
- try:
- if method.lower() == 'get':
- response = requests.get(url, headers=headers, verify=False)
-
- elif method.lower() == 'post':
- response = requests.post(url, headers=headers, json=params, verify=False)
- else:
- raise ValueError("不支持的请求方法: " + method)
- return response.json()
- except requests.exceptions.RequestException as e:
- print("请求异常:", e)
- except ValueError as e:
- print("值错误或不支持的请求方法:", e)
- except Exception as e:
- print("发生了未知错误:", e)
-
- def gen_sign(self, parameters={}, body=None):
- sorted_keys = sorted(parameters.keys())
- parameter_strings = []
- for key in sorted_keys:
- if isinstance(parameters[key], dict):
- parameter_strings.append(f"{key}={json.dumps(parameters[key])}")
- else:
- parameter_strings.append(f"{key}={parameters[key]}")
-
- current_time = int(datetime.now().timestamp() * 1000)
- secret_chars = list('BxzTx45uIGT25TTHIIBU2')
- last_three_digits = str(current_time)[-3:]
- for digit in last_three_digits:
- secret_chars.insert(int(digit), digit)
-
- secret = hashlib.md5(''.join(secret_chars).encode()).hexdigest()
- nonce_str = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
-
- sign_data = {
- 'client_id': 'game',
- 'nonstr': nonce_str,
- 'timestamp': current_time,
- 'body': json.dumps(body) if body else '',
- 'query': '&'.join(parameter_strings) if parameter_strings else '',
- 'secret': secret
- }
-
- sign_string = '|'.join([str(v) for v in sign_data.values()])
- sign = hashlib.md5(sign_string.encode()).hexdigest().upper()
- sign_header = {
- 'client_id': 'game',
- 'timestamp': str(current_time),
- 'nonstr': sign_data['nonstr'],
- 'sign': sign
- }
- self.headers.update(sign_header)
- return self.headers
-
- def login(self):
- login_successful = False
- try:
- login_params = {
- 'thirdId': self.third_id,
- 'wid': self.wid
- }
- sign_header = self.gen_sign({}, login_params)
- # print(self.headers)
- # Hypothetically speaking, this is how you might perform a POST request in Python with the requests library.
- response = self.s.post(f'{self.base_url}/public/api/login', json=login_params, headers=sign_header)
- if response.status_code == 200:
- response_data = response.json()
- if response_data.get('code', -1) == 0:
- auth = response_data['data']['token'] or ''
- if auth:
- login_successful = True
- print(f'账号【{self.user_index}】登录成功')
- Authorization = {'Authorization': auth}
- self.headers.update(Authorization)
- else:
- print(f'账号【{self.user_index}】登录获取auth失败')
- else:
- print(f"登录获取auth失败[{response_data['code']}]: {response_data['message']}")
- elif response.status_code == 403:
- print('登录失败[403]: 黑IP了, 换个IP试试吧')
- except Exception as e:
- print(e)
- finally:
- return login_successful
-
- def userInfo_get(self,END=False):
- print(f'获取用户[{self.user_index}]信息--->>>')
- try:
- sign_header = self.gen_sign()
- # print(self.headers)
- url = f'{self.base_url}/userInfo/get'
- # 发起GET请求
- response = self.s.get(url, headers=sign_header, verify=False)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data', {})
- self.userId = data['userId']
- self.gold = int(data['gold'])
- self.score = int(data['score'])
- self.sun = int(data['sun'])
- self.sunMax = int(data['sunMax'])
- self.nickName = data['nickName']
- if self.nickName == None:self.nickName = '未命名'
- new_data = {
- self.userId:
- {
- 'name': self.nickName
- }
- }
- USER_INFO.update(new_data)
- CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
- if END:
- Log(f"-----用户[{self.user_index}]信息-----\n用户Id:{self.userId}\n用户名:{self.nickName}\n调料🧂x{self.gold}\n番茄🍅x{self.score}\n阳光☀x{self.sun}\n------用户[{self.user_index}]信息END------")
- else:
- print(f"-----用户[{self.user_index}]信息-----\n用户Id:{self.userId}\n用户名:{self.nickName}\n调料🧂x{self.gold}\n番茄🍅x{self.score}\n阳光☀x{self.sun}\n------用户[{self.user_index}]信息END------")
-
- else:
- error_message = data.get('message', '')
- print(f"获取账号信息失败[{str(code)}]: {error_message}")
- except Exception as e:
- print(e)
- finally:
- return
-
- def userInfo_autoSun(self):
- print('收集阳光--->>>')
- sign_header = self.gen_sign()
- url = f'{self.base_url}/userInfo/autoSun'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- sun = data.get('data', {}).get('sun', 0)
- print(f"刷新收集到【{sun}】阳光---√")
- else:
- print(f"刷新收集阳光失败[{data['code']}]: {str(code)}")
-
- def task_get(self):
- print(f'获取任务列表--->>>')
- sign_header = self.gen_sign()
- url = f'{self.base_url}/task/get'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- tasks = data.get('data', [])
- for task in tasks:
- self.task_id = task['id']
- self.task_title = task['title']
- task_status = task['status']
- self.task_progress = task.get('currentProgress', 0)
- self.task_max_progress = task.get('progress', 1)
-
- print(f"任务:【{self.task_title}】进度:【{self.task_progress}/{self.task_max_progress}】")
- if self.task_title == '邀请好友助力':
- if self.task_progress == self.task_max_progress:
- self.need_help_task = False
- # new_data = {
- # self.userId: {
- # 'task_id': self.task_id,
- # 'task_stu': self.can_help_task,
- # 'current_progress': self.task_progress
- # }
- # }
- # USER_INFO.update(new_data)
- # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/QH_INVITE_CODE.json", new_data)
- print(f"任务 '{self.task_title}' 【跳过】---》")
- continue
- elif self.task_title == '邀请新人助力':
- print(f"任务 '{self.task_title}' 【跳过】---》")
- continue
-
- if task_status == 0 and self.task_progress < self.task_max_progress:
- # 此任务尚未完成,根据具体业务逻辑进行处理,如启动任务
- print(f"任务【{self.task_title}】【未完成】执行任务---》")
- self.task_doTask() # 取消这行注释来执行任务
-
- elif task_status == 1:
- # 任务已完成但奖励未被领取,根据业务逻辑领取奖励
- print(f"任务【{self.task_title}】【已完成】领取奖励---》")
- self.task_reward() # 取消这行注释来领取奖励
- else:
- print(f"获取任务列表失败[{data['code']}]: {str(code)}")
-
- def task_doHelpTask(self,help_data):
- # print('开始助力任务---》')
- params = {'id': help_data["task_id"]}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/task/doTask'
- response = self.s.get(url, headers=sign_header,params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"助力账号[{help_data['index']}][{help_data['name']}]成功---√")
- elif '已超出' in data.get('message', ''):
- self.can_help_task = False
- error_message = data.get('message', '')
- print(f"助力账号[{help_data['index']}][{help_data['name']}]失败[{code}]: {error_message}")
- else:
- error_message = data.get('message', '')
- print(f"助力账号[{help_data['index']}][{help_data['name']}]失败[{code}]: {error_message}")
- if '助力次数' in error_message:
- self.can_help_task = False
-
- def task_doTask(self):
- sign_header = self.gen_sign({'id': self.task_id})
- url = f'{self.base_url}/task/doTask'
- params = {'id': self.task_id}
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"完成任务[{self.task_title}]成功---√")
- else:
- print(f"完成任务[{self.task_title}]失败[{str(code)}]: {data.get('message', '')}")
-
- def task_reward(self):
- sign_header = self.gen_sign({'id': self.task_id})
- url = f'{self.base_url}/task/reward'
- params = {'id': self.task_id}
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"领取任务[{self.task_title}]奖励成功---√")
- else:
- print(f"领取任务[{self.task_title}]奖励失败[{str(code)}]: {data.get('message', '')}")
-
- def user_role_get(self):
- print('\n查询角色信息--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/user-role/get'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data')
- if data and data.get('isReward'):
- print('可领取定时奖励,开始领取---》')
- self.user_role_reward() # 此处调用 user_role_reward 函数
- for role in data.get('roleList', []):
- if role['status'] > 0:
- print(f"角色【{role['name']}】已解锁---√")
- continue
- if role['unlockType'] == 1:
- if self.gold >= role['unlockNum']:
- print(f"调料包充足,开始解锁角色【{role['name']}】---》")
- self.user_role_goldUnlock(role) # 此处调用 user_role_goldUnlock 函数
- else:
- print(f"调料包不足解锁角色【{role['name']}】---!")
- elif role['unlockType'] == 2:
- self.user_role_findFriendHelpInfo(role) # 此处调用 user_role_findFriendHelpInfo 函数
- else:
- message = data.get('message', '')
- print(f'角色信息失败【{code}】: {message}')
- except Exception as e:
- print(e)
-
- def user_role_findFriendHelpInfo(self, role):
- print(f'查询角色邀请进度--->>>')
- try:
- params = {'userRoleId': role['id']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-role/findFriendHelpInfo'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data')
- self.help_role_config = {
- 'id': role['id'],
- 'progress': len(data) if data else 0,
- 'max': role['unlockNum']
- }
- self.role_id = role['id']
- self.role_progress = len(data) if data else 0
- self.role_max = role['unlockNum']
- if role['unlockNum'] == len(data) if data else 0:
- self.need_help_unlock=False
- # new_data = {
- # self.userId:
- # {
- # 'role_id': self.role_id,
- # 'role_can_help': self.can_help_unlock,
- # 'role_progress': self.role_progress,
- # 'role_max': self.role_max
- # }
- # }
- # USER_INFO.update(new_data)
- # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/QH_INVITE_CODE.json", new_data)
- print(f'查询角色【{role["name"]}】邀请进度成功---√')
- else:
- message = data.get('message', '')
- print(f'查询角色【{role["name"]}】邀请进度失败[{code}]: {message}')
- except Exception as e:
- print(e)
-
- def user_role_friendHelpUnlock(self, help_data):
- print('开始角色解锁互助--->>>')
- # try:
- params = {'userRoleId': help_data['role_id']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-role/friendHelpUnlock'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- help_data['role_progress'] += 1
- print(f'助力账号[{help_data["index"]}][{help_data["name"]}]解锁角色成功---√')
- else:
- message = data.get('message', '')
- print(f'助力账号[{help_data["index"]}][{help_data["name"]}]解锁角色失败[{code}]: {message}')
- # except Exception as e:
- # print(e)
-
- def user_role_goldUnlock(self, role):
- print(f'解锁角色开始--->>>')
- try:
- params = {'roleId': role['roleId']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-role/goldUnlock'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.gold -= role['unlockNum']
- print(f'解锁角色[{role["name"]}]成功')
- self.user_role_reward() # 此处调用 user_role_reward 函数
- else:
- message = data.get('message', '')
- print(f'解锁角色[{role["name"]}]失败[{code}]: {message}')
- except Exception as e:
- print(e)
-
- def user_role_reward(self):
- print(f'领取伴手礼--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/user-role/reward'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data')
- name = data.get('name') if data else 'unknown'
- print(f'领取伴手礼【{name}】成功')
- else:
- message = data.get('message', '')
- print(f'领取伴手礼失败[{code}]: {message}')
- except Exception as e:
- print(e)
-
- def user_land_get(self):
- print(f'\n刷新土地信息--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/user-land/get'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print('土地信息刷新成功---√')
- for land in data.get('data', {}).get('gaUserLandList', []):
- ga_user_land_list = data.get('data', {}).get('gaUserLandList', [])
- for land_info in ga_user_land_list:
- land_id = land_info['id']
- land_no = land_info['no']
- status = land_info['status']
- step = land_info['step']
- left_sun_count = land_info['leftSunCount']
- sum_sun_count = land_info['sumSunCount']
- sun_time = land_info['sunTime']
- sun_timestamp = land_info['sunTimestamp']
- need_sun = land_info['needSun']
- use_sun_count = land_info['useSunCount']
- unlock_gold = land_info['unlockGold']
-
- if not self.land.get(land_no):
- self.land[land_no] = {}
-
- self.land[land_no].update({
- 'id': land_id,
- 'no': land_no,
- 'status': status,
- 'step': step,
- 'leftSunCount': left_sun_count,
- 'sumSunCount': sum_sun_count,
- 'sunTime': sun_time,
- 'sunTimestamp': sun_timestamp,
- 'needSun': need_sun,
- 'useSunCount': use_sun_count,
- 'unlockGold': unlock_gold
- })
- if land['status'] == 0:
- # 检查是否应该解锁土地
- if self.gold >= land['unlockGold']:
- print('开始解锁新土地---》')
- self.user_land_unlock(self.land[land_no])
- else:
- # print('调料包不足以解锁新土地')
- self.all_land_unlock = False
- else:
- message = data.get('message', '')
- # 这里应该是日志记录的代码
- print('获取账号信息失败[{}]: {}'.format(str(code), message))
- except Exception as e:
- print(e)
-
- def user_land_unlock(self, land_info):
- print(f'解锁土地--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/user-land/unlock'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"[{land_info['no']}号土地]解锁成功---√")
- self.gold -= land_info['unlockGold']
- self.user_land_get()
- else:
- message = data.get('message', '')
- print(f"[{land_info['no']}号土地]解锁失败[{str(code)}]:{message}")
- except Exception as e:
- print(e)
-
- def user_land_result(self, land_info):
- print(f'收获番茄--->>>')
- try:
- params = {'no': land_info['no']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-land/result'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.refresh_land_step = True
- print(f'[{land_info["no"]}号土地]收获成功: 番茄x{data.get("data", 0)}---√')
- self.user_land_get()
- else:
- message = data.get('message', '')
- print(f"[{land_info['no']}号土地]收获失败[{str(code)}]: {message}")
- except Exception as e:
- print(e)
-
- def user_land_sow(self, land_info):
- print(f'播种--->>>')
- try:
- params = {'no': land_info['no']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-land/sow'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.refresh_land_step = True
- print(f"[{land_info['no']}号土地]种植成功---√")
- self.user_land_get()
- else:
- message = data.get('message', '')
- print(f"[{land_info['no']}号土地]种植失败[{str(code)}]: {message}")
- except Exception as e:
- print(e)
-
- def user_land_sun(self, land_info):
- print(f'撒阳光--->>>')
- try:
- params = {'no': land_info['no']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-land/sun'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"[{land_info['no']}号土地]撒阳光成功---√")
- time.sleep(1)
- self.sun -= land_info['needSun']
- self.user_land_get()
- else:
- message = data.get('message', '')
- print(f"[{land_info['no']}号土地]撒阳光失败[{str(code)}]:{message}")
- except Exception as e:
- print(e)
-
- def user_land_level(self, land_info):
- print(f'浇水升级--->>>')
- try:
- params = {'no': land_info['no']}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/user-land/level'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.refresh_land_step = True
- print(f"[{land_info['no']}号土地]浇水升级成功---√")
- self.user_land_get()
- else:
- message = data.get('message', '')
- print(f"[{land_info['no']}号土地]浇水升级失败[{str(code)}]: {message}")
- except Exception as e:
- print(e)
-
- def take_risk_online(self):
- print(f'进入冒险页--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/take-risk/online'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code != 0:
- message = data.get('message', '')
- print(f'进入冒险页失败{str(code)}: {message}')
- else:
- print(f'进入冒险页成功---√')
- end = data.get('data', {}).get('end', True)
- if end == True:
- self.need_help_risk = False
- except Exception as e:
- print(e)
-
- def take_risk_get(self):
- print(f'查询冒险次数--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/common/take-risk/get'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.risk_num = data.get('data', {}).get('num', 0)
- if data.get('data', {}).get('complete', False) == False:
- self.take_risk_up(data.get('data', {}).get('gameMapEvent'))
- print(f"剩余冒险【{self.risk_num}】次")
- else:
- message = data.get('message', '')
- print(f'查询冒险次数失败: {message}' )
- except Exception as e:
- print(e)
-
- def take_risk_go(self):
- print(f'开始冒险--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/common/take-risk/go'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- # print(data)
- code = data.get('code', -1)
- if code == 0:
- self.risk_num = data.get('data', {}).get('num', 0)
- if data.get('data', {}).get('complete'):
- game_map_event_answer_list = data.get('data', {}).get('gameMapEvent', {}).get(
- 'gameMapEventAnswerList', [])
- filtered_list = filter(lambda x: x.get('dropReward', {}).get('finalNum'),game_map_event_answer_list)
- rewards = []
- for item in filtered_list:
- reward_name = item['dropReward']['name']
- final_num = item['dropReward']['finalNum']
- rewards.append(f'{reward_name}x{final_num}')
- if rewards:
- print(f'冒险奖励: {rewards}---√')
- else:
- print('触发冒险事件没有获取奖励')
- else:
- # print(data.get('data', {}).get('gameMapEvent'))
- self.take_risk_up(data.get('data', {}).get('gameMapEvent'))
- elif code == 4000:
- slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
- validateCount = data.get('data', {}).get('validateCount', None)
- if slideImgInfo and validateCount:
- print('本次冒险需要验证码')
- self.can_go_risk = False
- if self.get_CapCode(slideImgInfo):
- if self.checkUserCapCode():
- self.take_risk_go()
- else:
- print(f"验证次数上限")
- self.can_go_risk = False
- else:
- message = data.get('message', '')
- print(f'冒险失败{code}]: {message}')
- if message and '冒险暂停中' in message or code == 4000:
- self.can_go_risk = False
-
- except Exception as e:
- print(e)
-
- def take_risk_up(self, game_map_event):
- print(f'触发冒险事件--->>>')
- # try:
- gameMapEventAnswerList = game_map_event.get('gameMapEventAnswerList', [])
- index = random.randint(0, len(gameMapEventAnswerList) - 1)
- gameMapEventAnswer = gameMapEventAnswerList[index]
- json_id = gameMapEventAnswer['jsonId']
- # print(json_id)
- params = {'jsonId': json_id}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/common/take-risk/up'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- self.risk_num = data.get('data', {}).get('num', 0)
- print(f'剩余次数:【{self.risk_num}】')
-
- game_map_event_list = data.get('data', {}).get('gameMapEvent', {}).get('gameMapEventAnswerList', [])
-
- reward_list = [event['dropReward']['name'] + 'x' + str(event['dropReward']['finalNum']) for event in
- game_map_event_list if event.get('dropReward', {}).get('finalNum')]
- if reward_list:
- print(f'冒险奖励: {reward_list}---√')
- else:
- print('触发冒险事件没有获取奖励')
- else:
- message = data.get('message', '')
- print(f'触发冒险事件[ {json_id} ]失败{code}]: {message}')
- # except Exception as e:
- # print(e)
-
- def take_risk_reward(self):
- print(f'领取冒险定时奖励--->>>')
- try:
- url = f'{self.base_url}/take-risk/reward'
- sign_header = self.gen_sign()
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print('领取冒险定时奖励成功---√')
- else:
- message = data.get('message', '').replace('\r', '').split('\n')
- message = ','.join(filter(lambda x: x, message))
- print(f'领取冒险定时奖励失败{code}]: {message}')
- except Exception as e:
- print(e)
-
- def randomString(self,length, chars='abcdef0123456789'):
- return ''.join(random.choice(chars) for _ in range(length))
-
- def friend_help_task_risk(self, friend_info):
- print('开始冒险互助--->>>')
- # try:
- params = {
- 'userId': friend_info['userId'],
- 'type': 0x1,
- 'randomId': self.randomString(32, '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM')
- }
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/friend-help/help'
- response = self.s.get(url, headers=sign_header,params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- if data.get('data'):
- self.can_help_risk = False
- print(f"冒险助力账号[{friend_info['index']}][{friend_info['name']}]成功---√")
- else:
- message = data.get('message', '').replace('\r', '').split('\n')
- message = ','.join(filter(lambda x: x, message))
- print(f"冒险助力账号[{friend_info['index']}][{friend_info['name']}]失败{message}")
- if '助力次数' in message:
- self.can_help_risk = False
- elif '挂机时间已完成' in message:
- friend_info['need_help_risk'] = False
- # except Exception as e:
- # print(e)
-
- def friend_help(self, friend_info):
- print(f'开始阳光互助--->>>')
- # try:
- params = {
- 'userId': friend_info['userId'],
- 'type': 0x0,
- 'randomId': self.randomString(32, '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM')
- }
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/friend-help/help'
- response = self.s.get(url, headers=sign_header,params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- if data.get('data'):
- # print(f"请求助力账号[{friend_info['index']}][{friend_info['name']}] 成功---√")
- self.task_doHelpTask(friend_info)
- else:
- message = data.get('message', '').replace('\r', '').split('\n')
- message = ','.join(filter(lambda x: x, message))
- print(f"请求助力账号[{friend_info['index']}][{friend_info['name']}] 失败: {message}")
- if '助力次数' in message:
- self.can_help_task = False
- # except Exception as e:
- # print(e)
-
- def friend_findRecommend(self):
- print(f'查询添加好友列表--->>>')
- try:
- url = f'{self.base_url}/friend/findRecommend'
- sign_header = self.gen_sign()
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f'查询添加好友列表成功---√')
- for user_info in data.get('data', []):
- if not self.can_add_friend:
- print('好友已满')
- break
- # if len(list(filter(lambda user: user['userId'] == user_info['userId'], self.user_list))) > 0:
- # continue
- self.friend_addFriend(user_info)
- # self.friend_deleteFriend(user_info)
- else:
- message = data.get('message', '')
- print(f'查询添加好友列表失败{code}]: {message}')
- except Exception as e:
- print(e)
-
- def friend_addFriend(self, user_data):
- print(f'添加好友--->>>')
- try:
- friend_user_id = user_data['userId']
- params = {'friendUserId': friend_user_id}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/friend/addFriend'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"添加好友[{user_data['nickName']}]成功---√")
- else:
- message = data.get('message', '')
- print(f'添加好友{user_data["nickName"]}失败{code}]: {message}')
- if message and '达到好友上限' in message:
- self.can_add_friend = False
- except Exception as e:
- print(e)
-
- def friend_deleteFriend(self, user_data):
- print(f'删除好友--->>>')
- try:
- friend_user_id = user_data['userId']
- params = {'friendUserId': friend_user_id}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/friend/delFriend'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"删除好友[{user_data['nickName']}]成功---√")
- else:
- message = data.get('message', '')
- print(f'删除好友{user_data["nickName"]}失败{code}]: {message}')
- except Exception as e:
- print(e)
-
- def friend_findFriend(self):
- print(f'\n查询好友列表--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/friend/findFriend'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f'查询好友列表成功---√')
- friend_list = data.get('data', {}).get('friendList', [])
- friend_list.sort(key=lambda x: x['gold'], reverse=True)
- for friend in friend_list:
- if friend.get('stealFlag', False):
- if not self.friend_stealGold(friend):
- break
-
- else:
- message = data.get('message', '')
- print(f'查询好友列表失败[{str(code)}]:{message}')
- except Exception as e:
- print(e)
-
- def get_CapCode(self, slideImgInfo):
- slidingImage = slideImgInfo.get('slidingImage', None)
- backImage = slideImgInfo.get('backImage', None)
- dddddocr_api = os.environ.get('OCR_API',False)
- if not dddddocr_api:
- print('未定义变量【OCR_API】\n取消验证码识别\n搭建方式:https://github.com/CHERWING/CHERWIN_OCR')
- return False
- if slidingImage and backImage:
- data = {
- "slidingImage": slidingImage,
- "backImage": backImage
- }
- response = requests.post(f"{dddddocr_api}/capcode", data=json.dumps(data),headers={'Content-Type': 'application/json'})
- print(response.json())
- self.capcode = response.json().get('result','')
- if self.capcode:
- return True
- else:
- return False
-
- def get_CapCode_local(self, slideImgInfo):
- slidingImage = slideImgInfo.get('slidingImage', None)
- backImage = slideImgInfo.get('backImage', None)
- if slidingImage and backImage:
- self.capcode =CHERWIN_TOOLS.CAPCODE(slidingImage,backImage)
- if self.capcode:
- return True
- else:
- return False
-
- def friend_stealGold(self, user_data):
- print(f'偷取好友--->>>')
- # try:
- friend_user_id = user_data['userId']
- params = {'friendUserId': friend_user_id}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/friend/stealGold'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- print(f"偷取好友[{user_data['nickName']}]: 阳光x{data.get('data', 0)}")
- return True
- elif code == 4000:
-
- slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
- validateCount = data.get('data', {}).get('validateCount', None)
- if slideImgInfo and validateCount:
- print(f"偷取好友[{user_data['nickName']}],需要滑块验证")
- self.can_stealGold = False
- if self.get_CapCode(slideImgInfo):
- if self.checkUserCapCode():
- self.friend_stealGold(user_data)
- else:
- print(f"偷取好友[{user_data['nickName']}]验证码上限")
- self.can_stealGold = False
- else:
- message = data.get('message', '')
- print(f"偷取好友[{user_data['nickName']}]阳光失败[{str(code)}]: {message}")
-
- return False
- # except Exception as e:
- # print(e)
-
- def checkUserCapCode(self):
- print(f'提交验证码--->>>')
- # try:
- print(f'验证码:{self.capcode}')
- params = {'xpos':self.capcode}
- print(params)
- sign_header = self.gen_sign(body=params)
- url = f'{self.base_url}/checkUserCapCode'
- response = self.s.post(url, headers=sign_header, json=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data', 0)
- print(f"验证码正确,获取到[{data}]")
- return True
- else:
- message = data.get('message', '')
- print(f"验证码错误[{message}]")
- return False
- # except Exception as e:
- # print(e)
-
- def risk_task(self):
- self.take_risk_get()
- self.take_risk_online()
- self.take_risk_reward()
- print(f'可以冒险【{self.risk_num}】次')
- while self.risk_num > 0 and self.can_go_risk == True:
- self.take_risk_go()
- time.sleep(2)
-
- def land_task(self):
- self.user_land_get()
- if self.all_land_unlock and self.all_role_unlock:
- pass
- for land_number, land_info in self.land.items():
- # print(land_number)
- # print(land_info)
- if land_info['status'] == 0:
- continue
- step, use_sun_count, left_sun_count = land_info['step'], land_info['useSunCount'], land_info['leftSunCount']
-
- total_sun_count = (use_sun_count if use_sun_count else 0) + (left_sun_count if left_sun_count else 0)
-
- print(f"\n---[{land_info['no']}号土地]---\n{self.group_step[step-1]},阶段{step}, 进度{use_sun_count}/{total_sun_count}")
-
- self.refresh_land_step = True
- while self.refresh_land_step:
- self.refresh_land_step = False
- if land_info['status'] == 0:
- break
- if step == 0:
- self.user_land_sow(land_info)
- else:
- if left_sun_count == 0:
- if step == 5:
- self.user_land_result(land_info)
- else:
- current_time = int(time.time() * 1000)
- if current_time >= (land_info['sunTime'] + land_info['sunTimestamp']) * 1000:
- self.user_land_level(land_info)
- else:
- if self.sun >= land_info['needSun']:
- current_time = int(time.time() * 1000)
- if current_time >= (land_info['sunTime'] + land_info['sunTimestamp']) * 1000:
- self.user_land_sun(land_info)
- # time.sleep(2)
-
- def userTask(self):
- print('\n--------------- 开始日常任务 ---------------')
- wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
- if not self.Login_res:
- return False
- self.userInfo_autoSun()
-
- self.userInfo_get()
-
- self.task_get()
-
- self.user_role_get()
-
- self.risk_task()
-
- self.land_task()
-
- self.steal_task()
-
- self.userInfo_get(END=True)
- new_data = {
- self.userId: {
- 'userId': self.userId,
- 'task_id': self.task_id,
- 'task_can_help': self.can_help_task,
- 'task_need_help': self.need_help_task,
- 'task_progress': self.task_progress,
- 'task_max_progress': self.task_max_progress,
- 'role_id': self.role_id,
- 'role_can_help': self.can_help_unlock,
- 'role_need_help': self.need_help_unlock,
- 'role_progress': self.role_progress,
- 'role_max': self.role_max,
- 'risk_can_help': self.can_help_risk,
- 'risk_need_help': self.need_help_task,
- 'can_go_risk': self.can_go_risk,
- 'can_add_friend': self.can_add_friend
-
- }
- }
- # print(new_data)
- USER_INFO.update(new_data)
- CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
- self.steal_task()
- self.sendMsg()
- return True
-
- def helpEachOther(self):
- print('--------------- 开始互助 ---------------')
-
- if not self.Login_res:
- return False
-
- self.userInfo_get()
-
- if self.user_index == 1:
- print('第一个账号助力作者--->>>')
- data_li = AuthorCode
- help_type = '作者'
- else:
- print('其余账号互助--->>>')
- json_data = self.load_json()
- data_li = list(json_data.values())
- help_type = '本地'
-
-
- # print(data_li)
- for index, code_li in enumerate(data_li):
- # print(f"Index: {index}")
- # print(f"Data: {code_li}")
- if code_li.get('userId','') == self.userId:
- continue
- task_need_help = code_li.get("task_need_help", '')
- role_need_help = code_li.get("role_need_help", '')
- risk_need_help = code_li.get("task_can_help", '')
- code_li["index"] = index+1
- print(f'\n------助力{help_type}账号【{index+1}】开始------')
- # print(code_li)
- # 冒险助力
- if self.can_help_risk and risk_need_help:
- self.friend_help_task_risk(code_li)
- else:
- print(f'好友冒险助力已完成或冒险助力次数已耗尽')
-
- # 解锁角色助力
- if self.can_help_unlock and role_need_help:
- self.user_role_friendHelpUnlock(code_li)
- else:
- print(f'好友解锁角色助力已完成或解锁角色助力次数已耗尽')
-
- # 阳光助力
- if self.can_help_task and task_need_help:
- self.friend_help(code_li)
- else:
- print(f'阳光助力次数已耗尽')
-
- print(f'------助力{help_type}账号【{index+1}】结束------')
- time.sleep(1)
-
-
- new_data = {
- self.userId: {
- 'task_can_help': self.can_help_task,
- 'role_can_help': self.can_help_unlock,
- 'risk_can_help': self.can_help_risk
- }
- }
- CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
- self.sendMsg(True)
- return True
-
- def steal_task(self, count=5):
- if not self.Login_res:
- return False
- json_data = self.load_json()
- self.can_add_friend = json_data.get(self.userId, {}).get('can_add_friend', '')
- for i in range(count):
- if self.can_add_friend:
- self.friend_findRecommend()
- time.sleep(2)
- self.friend_findFriend()
- 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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-
-
-if __name__ == '__main__':
- APP_NAME = '统一茄皇'
- ENV_NAME = 'TYQH'
- CK_NAME = 'thirdId@wid'
- CK_URL = '.../public/api/login'
- print(f'''
-✨✨✨ {APP_NAME}脚本 ✨✨✨
-✨ 功能:
- 日常任务
- 互助任务
-✨ 抓包步骤:
- 统一快乐星球小程序-活动
- 开始抓包-茄皇的家第三期
- 抓{CK_URL}取{CK_NAME}
-✨ 设置青龙变量:
-export {ENV_NAME}= '{CK_NAME}'多账号#分割或&
-export OCR_API= 'http://localhost:3721'
-✨ 由于青龙python版本问题无法直接使用dddocr需要自行搭建API,搭建方式:https://github.com/CHERWING/CHERWIN_OCR
-✨ 如果你的环境可以安装dddocr库则可以替换代码内的【self.get_CapCode】为【self.get_CapCode_local】
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ 推荐定时:25 10-22/2 * * *
-✨ 第一个账号助力作者,其余互助
-✨✨✨ @Author CHERWIN✨✨✨
- ''')
-
- local_script_name = os.path.basename(__file__)
- local_version = '2024.05.04'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- token = ENV if ENV else token
- if not token:
- print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
- exit()
- tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
- access_token = []
- for index, infos in enumerate(tokens):
- run_result = RUN(infos, index).userTask()
- if not run_result: continue
-
- for index, infos in enumerate(tokens):
- run_result =RUN(infos, index).helpEachOther()
- if not run_result: continue
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# @Author : cherwin
+# -------------------------------
+# cron "25 10-22/2 * * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('统一快乐星球小程序-茄皇的家')
+
+import json
+import os
+import random
+import time
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+
+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'
+
+USER_INFO = {}
+
+class RUN:
+ def __init__(self, info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ self.third_id = split_info[0]
+ self.wid = split_info[1]
+ 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.user_index = index + 1
+ print(f"\n---------开始执行第{self.user_index}个账号>>>>>")
+ self.s = requests.session()
+ self.s.verify = False
+
+ self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
+
+ self.headers = {
+ 'User-Agent': self.UA,
+ 'Sec-Fetch-Site': 'cross-site',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Origin': 'https://thekingoftomato.ioutu.cn',
+ 'Referer': 'https://thekingoftomato.ioutu.cn/'
+
+ }
+ self.base_url = 'https://qiehuang-apig.xiaoyisz.com/qiehuangsecond/ga'
+ self.sun = 0
+ self.land = {}
+ self.refresh_land_step = False
+ self.need_help_unlock = True
+ self.need_help_task = True
+ self.need_help_risk = True
+
+ self.can_go_risk = True
+ self.can_add_friend = True
+
+ self.can_help_task = True
+ self.can_help_risk = True
+ self.can_help_unlock = True
+ self.role_id =''
+ self.role_progress=''
+ self.role_max=''
+ self.all_land_unlock = True
+ self.all_role_unlock = True
+ self.help_task_config = {}
+ self.help_role_config = {}
+ self.group_step = ['发育期', '幼苗期', '开花期', '结果期', '收获期']
+ self.Login_res = self.login()
+
+ def load_json(self):
+ try:
+ with open(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", 'r', encoding='utf-8') as file:
+ data = json.load(file)
+ return data
+ except FileNotFoundError:
+ print("未找到文件,返回空字典")
+ return {}
+ except Exception as e:
+ print(f"发生错误:{e}")
+ return {}
+
+ def make_request(self, url, method='post', headers={}, params={}):
+ if headers == {}:
+ headers = self.headers
+ if params == {}:
+ params = self.params
+ try:
+ if method.lower() == 'get':
+ response = requests.get(url, headers=headers, verify=False)
+
+ elif method.lower() == 'post':
+ response = requests.post(url, headers=headers, json=params, verify=False)
+ else:
+ raise ValueError("不支持的请求方法: " + method)
+ return response.json()
+ except requests.exceptions.RequestException as e:
+ print("请求异常:", e)
+ except ValueError as e:
+ print("值错误或不支持的请求方法:", e)
+ except Exception as e:
+ print("发生了未知错误:", e)
+
+ def gen_sign(self, parameters={}, body=None):
+ sign_header = CHERWIN_TOOLS.TYQH_SIGN(parameters, body)
+ self.headers.update(sign_header)
+ return self.headers
+
+ def login(self):
+ login_successful = False
+ try:
+ login_params = {
+ 'thirdId': self.third_id,
+ 'wid': self.wid
+ }
+ sign_header = self.gen_sign({}, login_params)
+ # print(self.headers)
+ # Hypothetically speaking, this is how you might perform a POST request in Python with the requests library.
+ response = self.s.post(f'{self.base_url}/public/api/login', json=login_params, headers=sign_header)
+ if response.status_code == 200:
+ response_data = response.json()
+ if response_data.get('code', -1) == 0:
+ auth = response_data['data']['token'] or ''
+ if auth:
+ login_successful = True
+ print(f'账号【{self.user_index}】登录成功')
+ Authorization = {'Authorization': auth}
+ self.headers.update(Authorization)
+ else:
+ print(f'账号【{self.user_index}】登录获取auth失败')
+ else:
+ print(f"登录获取auth失败[{response_data['code']}]: {response_data['message']}")
+ elif response.status_code == 403:
+ print('登录失败[403]: 黑IP了, 换个IP试试吧')
+ except Exception as e:
+ print(e)
+ finally:
+ return login_successful
+
+ def userInfo_get(self,END=False):
+ print(f'获取用户[{self.user_index}]信息--->>>')
+ try:
+ sign_header = self.gen_sign()
+ # print(self.headers)
+ url = f'{self.base_url}/userInfo/get'
+ # 发起GET请求
+ response = self.s.get(url, headers=sign_header, verify=False)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data', {})
+ self.userId = data['userId']
+ self.gold = int(data['gold'])
+ self.score = int(data['score'])
+ self.sun = int(data['sun'])
+ self.sunMax = int(data['sunMax'])
+ self.nickName = data['nickName']
+ if self.nickName == None:self.nickName = '未命名'
+ new_data = {
+ self.userId:
+ {
+ 'name': self.nickName
+ }
+ }
+ USER_INFO.update(new_data)
+ CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
+ if END:
+ Log(f"-----用户[{self.user_index}]信息-----\n用户Id:{self.userId}\n用户名:{self.nickName}\n调料🧂x{self.gold}\n番茄🍅x{self.score}\n阳光☀x{self.sun}\n------用户[{self.user_index}]信息END------")
+ else:
+ print(f"-----用户[{self.user_index}]信息-----\n用户Id:{self.userId}\n用户名:{self.nickName}\n调料🧂x{self.gold}\n番茄🍅x{self.score}\n阳光☀x{self.sun}\n------用户[{self.user_index}]信息END------")
+
+ else:
+ error_message = data.get('message', '')
+ print(f"获取账号信息失败[{str(code)}]: {error_message}")
+ except Exception as e:
+ print(e)
+ finally:
+ return
+
+ def userInfo_autoSun(self):
+ print('收集阳光--->>>')
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/userInfo/autoSun'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ sun = data.get('data', {}).get('sun', 0)
+ print(f"刷新收集到【{sun}】阳光---√")
+ else:
+ print(f"刷新收集阳光失败[{data['code']}]: {str(code)}")
+
+ def task_get(self):
+ print(f'获取任务列表--->>>')
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/task/get'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ tasks = data.get('data', [])
+ for task in tasks:
+ self.task_id = task['id']
+ self.task_title = task['title']
+ task_status = task['status']
+ self.task_progress = task.get('currentProgress', 0)
+ self.task_max_progress = task.get('progress', 1)
+
+ print(f"任务:【{self.task_title}】进度:【{self.task_progress}/{self.task_max_progress}】")
+ if self.task_title == '邀请好友助力':
+ if self.task_progress == self.task_max_progress:
+ self.need_help_task = False
+ # new_data = {
+ # self.userId: {
+ # 'task_id': self.task_id,
+ # 'task_stu': self.can_help_task,
+ # 'current_progress': self.task_progress
+ # }
+ # }
+ # USER_INFO.update(new_data)
+ # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/QH_INVITE_CODE.json", new_data)
+ print(f"任务 '{self.task_title}' 【跳过】---》")
+ continue
+ elif self.task_title == '邀请新人助力':
+ print(f"任务 '{self.task_title}' 【跳过】---》")
+ continue
+
+ if task_status == 0 and self.task_progress < self.task_max_progress:
+ # 此任务尚未完成,根据具体业务逻辑进行处理,如启动任务
+ print(f"任务【{self.task_title}】【未完成】执行任务---》")
+ self.task_doTask() # 取消这行注释来执行任务
+
+ elif task_status == 1:
+ # 任务已完成但奖励未被领取,根据业务逻辑领取奖励
+ print(f"任务【{self.task_title}】【已完成】领取奖励---》")
+ self.task_reward() # 取消这行注释来领取奖励
+ else:
+ print(f"获取任务列表失败[{data['code']}]: {str(code)}")
+
+ def task_doHelpTask(self,help_data):
+ # print('开始助力任务---》')
+ params = {'id': help_data["task_id"]}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/task/doTask'
+ response = self.s.get(url, headers=sign_header,params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"助力账号[{help_data['index']}][{help_data['name']}]成功---√")
+ elif '已超出' in data.get('message', ''):
+ self.can_help_task = False
+ error_message = data.get('message', '')
+ print(f"助力账号[{help_data['index']}][{help_data['name']}]失败[{code}]: {error_message}")
+ else:
+ error_message = data.get('message', '')
+ print(f"助力账号[{help_data['index']}][{help_data['name']}]失败[{code}]: {error_message}")
+ if '助力次数' in error_message:
+ self.can_help_task = False
+
+ def task_doTask(self):
+ sign_header = self.gen_sign({'id': self.task_id})
+ url = f'{self.base_url}/task/doTask'
+ params = {'id': self.task_id}
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"完成任务[{self.task_title}]成功---√")
+ else:
+ print(f"完成任务[{self.task_title}]失败[{str(code)}]: {data.get('message', '')}")
+
+ def task_reward(self):
+ sign_header = self.gen_sign({'id': self.task_id})
+ url = f'{self.base_url}/task/reward'
+ params = {'id': self.task_id}
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"领取任务[{self.task_title}]奖励成功---√")
+ else:
+ print(f"领取任务[{self.task_title}]奖励失败[{str(code)}]: {data.get('message', '')}")
+
+ def user_role_get(self):
+ print('\n查询角色信息--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/user-role/get'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data')
+ if data and data.get('isReward'):
+ print('可领取定时奖励,开始领取---》')
+ self.user_role_reward() # 此处调用 user_role_reward 函数
+ for role in data.get('roleList', []):
+ if role['status'] > 0:
+ print(f"角色【{role['name']}】已解锁---√")
+ continue
+ if role['unlockType'] == 1:
+ if self.gold >= role['unlockNum']:
+ print(f"调料包充足,开始解锁角色【{role['name']}】---》")
+ self.user_role_goldUnlock(role) # 此处调用 user_role_goldUnlock 函数
+ else:
+ print(f"调料包不足解锁角色【{role['name']}】---!")
+ elif role['unlockType'] == 2:
+ self.user_role_findFriendHelpInfo(role) # 此处调用 user_role_findFriendHelpInfo 函数
+ else:
+ message = data.get('message', '')
+ print(f'角色信息失败【{code}】: {message}')
+ except Exception as e:
+ print(e)
+
+ def user_role_findFriendHelpInfo(self, role):
+ print(f'查询角色邀请进度--->>>')
+ try:
+ params = {'userRoleId': role['id']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-role/findFriendHelpInfo'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data')
+ self.help_role_config = {
+ 'id': role['id'],
+ 'progress': len(data) if data else 0,
+ 'max': role['unlockNum']
+ }
+ self.role_id = role['id']
+ self.role_progress = len(data) if data else 0
+ self.role_max = role['unlockNum']
+ if role['unlockNum'] == len(data) if data else 0:
+ self.need_help_unlock=False
+ # new_data = {
+ # self.userId:
+ # {
+ # 'role_id': self.role_id,
+ # 'role_can_help': self.can_help_unlock,
+ # 'role_progress': self.role_progress,
+ # 'role_max': self.role_max
+ # }
+ # }
+ # USER_INFO.update(new_data)
+ # CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/QH_INVITE_CODE.json", new_data)
+ print(f'查询角色【{role["name"]}】邀请进度成功---√')
+ else:
+ message = data.get('message', '')
+ print(f'查询角色【{role["name"]}】邀请进度失败[{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def user_role_friendHelpUnlock(self, help_data):
+ print('开始角色解锁互助--->>>')
+ # try:
+ params = {'userRoleId': help_data['role_id']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-role/friendHelpUnlock'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ help_data['role_progress'] += 1
+ print(f'助力账号[{help_data["index"]}][{help_data["name"]}]解锁角色成功---√')
+ else:
+ message = data.get('message', '')
+ print(f'助力账号[{help_data["index"]}][{help_data["name"]}]解锁角色失败[{code}]: {message}')
+ # except Exception as e:
+ # print(e)
+
+ def user_role_goldUnlock(self, role):
+ print(f'解锁角色开始--->>>')
+ try:
+ params = {'roleId': role['roleId']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-role/goldUnlock'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.gold -= role['unlockNum']
+ print(f'解锁角色[{role["name"]}]成功')
+ self.user_role_reward() # 此处调用 user_role_reward 函数
+ else:
+ message = data.get('message', '')
+ print(f'解锁角色[{role["name"]}]失败[{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def user_role_reward(self):
+ print(f'领取伴手礼--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/user-role/reward'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data')
+ name = data.get('name') if data else 'unknown'
+ print(f'领取伴手礼【{name}】成功')
+ else:
+ message = data.get('message', '')
+ print(f'领取伴手礼失败[{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def user_land_get(self):
+ print(f'\n刷新土地信息--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/user-land/get'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print('土地信息刷新成功---√')
+ for land in data.get('data', {}).get('gaUserLandList', []):
+ ga_user_land_list = data.get('data', {}).get('gaUserLandList', [])
+ for land_info in ga_user_land_list:
+ land_id = land_info['id']
+ land_no = land_info['no']
+ status = land_info['status']
+ step = land_info['step']
+ left_sun_count = land_info['leftSunCount']
+ sum_sun_count = land_info['sumSunCount']
+ sun_time = land_info['sunTime']
+ sun_timestamp = land_info['sunTimestamp']
+ need_sun = land_info['needSun']
+ use_sun_count = land_info['useSunCount']
+ unlock_gold = land_info['unlockGold']
+
+ if not self.land.get(land_no):
+ self.land[land_no] = {}
+
+ self.land[land_no].update({
+ 'id': land_id,
+ 'no': land_no,
+ 'status': status,
+ 'step': step,
+ 'leftSunCount': left_sun_count,
+ 'sumSunCount': sum_sun_count,
+ 'sunTime': sun_time,
+ 'sunTimestamp': sun_timestamp,
+ 'needSun': need_sun,
+ 'useSunCount': use_sun_count,
+ 'unlockGold': unlock_gold
+ })
+ if land['status'] == 0:
+ # 检查是否应该解锁土地
+ if self.gold >= land['unlockGold']:
+ print('开始解锁新土地---》')
+ self.user_land_unlock(self.land[land_no])
+ else:
+ # print('调料包不足以解锁新土地')
+ self.all_land_unlock = False
+ else:
+ message = data.get('message', '')
+ # 这里应该是日志记录的代码
+ print('获取账号信息失败[{}]: {}'.format(str(code), message))
+ except Exception as e:
+ print(e)
+
+ def user_land_unlock(self, land_info):
+ print(f'解锁土地--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/user-land/unlock'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"[{land_info['no']}号土地]解锁成功---√")
+ self.gold -= land_info['unlockGold']
+ self.user_land_get()
+ else:
+ message = data.get('message', '')
+ print(f"[{land_info['no']}号土地]解锁失败[{str(code)}]:{message}")
+ except Exception as e:
+ print(e)
+
+ def user_land_result(self, land_info):
+ print(f'收获番茄--->>>')
+ try:
+ params = {'no': land_info['no']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-land/result'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.refresh_land_step = True
+ print(f'[{land_info["no"]}号土地]收获成功: 番茄x{data.get("data", 0)}---√')
+ self.user_land_get()
+ else:
+ message = data.get('message', '')
+ print(f"[{land_info['no']}号土地]收获失败[{str(code)}]: {message}")
+ except Exception as e:
+ print(e)
+
+ def user_land_sow(self, land_info):
+ print(f'播种--->>>')
+ try:
+ params = {'no': land_info['no']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-land/sow'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.refresh_land_step = True
+ print(f"[{land_info['no']}号土地]种植成功---√")
+ self.user_land_get()
+ else:
+ message = data.get('message', '')
+ print(f"[{land_info['no']}号土地]种植失败[{str(code)}]: {message}")
+ except Exception as e:
+ print(e)
+
+ def user_land_sun(self, land_info):
+ print(f'撒阳光--->>>')
+ try:
+ params = {'no': land_info['no']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-land/sun'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"[{land_info['no']}号土地]撒阳光成功---√")
+ time.sleep(1)
+ self.sun -= land_info['needSun']
+ self.user_land_get()
+ else:
+ message = data.get('message', '')
+ print(f"[{land_info['no']}号土地]撒阳光失败[{str(code)}]:{message}")
+ except Exception as e:
+ print(e)
+
+ def user_land_level(self, land_info):
+ print(f'浇水升级--->>>')
+ try:
+ params = {'no': land_info['no']}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/user-land/level'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.refresh_land_step = True
+ print(f"[{land_info['no']}号土地]浇水升级成功---√")
+ self.user_land_get()
+ else:
+ message = data.get('message', '')
+ print(f"[{land_info['no']}号土地]浇水升级失败[{str(code)}]: {message}")
+ except Exception as e:
+ print(e)
+
+ def take_risk_online(self):
+ print(f'进入冒险页--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/take-risk/online'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code != 0:
+ message = data.get('message', '')
+ print(f'进入冒险页失败{str(code)}: {message}')
+ else:
+ print(f'进入冒险页成功---√')
+ end = data.get('data', {}).get('end', True)
+ if end == True:
+ self.need_help_risk = False
+ except Exception as e:
+ print(e)
+
+ def take_risk_get(self):
+ print(f'查询冒险次数--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/common/take-risk/get'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.risk_num = data.get('data', {}).get('num', 0)
+ if data.get('data', {}).get('complete', False) == False:
+ self.take_risk_up(data.get('data', {}).get('gameMapEvent'))
+ print(f"剩余冒险【{self.risk_num}】次")
+ else:
+ message = data.get('message', '')
+ print(f'查询冒险次数失败: {message}' )
+ except Exception as e:
+ print(e)
+
+ def take_risk_go(self):
+ print(f'开始冒险--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/common/take-risk/go'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ # print(data)
+ code = data.get('code', -1)
+ if code == 0:
+ self.risk_num = data.get('data', {}).get('num', 0)
+ if data.get('data', {}).get('complete'):
+ game_map_event_answer_list = data.get('data', {}).get('gameMapEvent', {}).get(
+ 'gameMapEventAnswerList', [])
+ filtered_list = filter(lambda x: x.get('dropReward', {}).get('finalNum'),game_map_event_answer_list)
+ rewards = []
+ for item in filtered_list:
+ reward_name = item['dropReward']['name']
+ final_num = item['dropReward']['finalNum']
+ rewards.append(f'{reward_name}x{final_num}')
+ if rewards:
+ print(f'冒险奖励: {rewards}---√')
+ else:
+ print('触发冒险事件没有获取奖励')
+ else:
+ # print(data.get('data', {}).get('gameMapEvent'))
+ self.take_risk_up(data.get('data', {}).get('gameMapEvent'))
+ elif code == 4000:
+ slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
+ validateCount = data.get('data', {}).get('validateCount', None)
+ if slideImgInfo and validateCount:
+ print('本次冒险需要验证码')
+ self.can_go_risk = False
+ if self.get_CapCode(slideImgInfo):
+ if self.checkUserCapCode():
+ self.take_risk_go()
+ else:
+ print(f"验证次数上限")
+ self.can_go_risk = False
+ else:
+ message = data.get('message', '')
+ print(f'冒险失败{code}]: {message}')
+ if message and '冒险暂停中' in message or code == 4000:
+ self.can_go_risk = False
+
+ except Exception as e:
+ print(e)
+
+ def take_risk_up(self, game_map_event):
+ print(f'触发冒险事件--->>>')
+ # try:
+ gameMapEventAnswerList = game_map_event.get('gameMapEventAnswerList', [])
+ index = random.randint(0, len(gameMapEventAnswerList) - 1)
+ gameMapEventAnswer = gameMapEventAnswerList[index]
+ json_id = gameMapEventAnswer['jsonId']
+ # print(json_id)
+ params = {'jsonId': json_id}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/common/take-risk/up'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ self.risk_num = data.get('data', {}).get('num', 0)
+ print(f'剩余次数:【{self.risk_num}】')
+
+ game_map_event_list = data.get('data', {}).get('gameMapEvent', {}).get('gameMapEventAnswerList', [])
+
+ reward_list = [event['dropReward']['name'] + 'x' + str(event['dropReward']['finalNum']) for event in
+ game_map_event_list if event.get('dropReward', {}).get('finalNum')]
+ if reward_list:
+ print(f'冒险奖励: {reward_list}---√')
+ else:
+ print('触发冒险事件没有获取奖励')
+ else:
+ message = data.get('message', '')
+ print(f'触发冒险事件[ {json_id} ]失败{code}]: {message}')
+ # except Exception as e:
+ # print(e)
+
+ def take_risk_reward(self):
+ print(f'领取冒险定时奖励--->>>')
+ try:
+ url = f'{self.base_url}/take-risk/reward'
+ sign_header = self.gen_sign()
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print('领取冒险定时奖励成功---√')
+ else:
+ message = data.get('message', '').replace('\r', '').split('\n')
+ message = ','.join(filter(lambda x: x, message))
+ print(f'领取冒险定时奖励失败{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def randomString(self,length, chars='abcdef0123456789'):
+ return ''.join(random.choice(chars) for _ in range(length))
+
+ def friend_help_task_risk(self, friend_info):
+ print('开始冒险互助--->>>')
+ # try:
+ params = {
+ 'userId': friend_info['userId'],
+ 'type': 0x1,
+ 'randomId': self.randomString(32, '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM')
+ }
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/friend-help/help'
+ response = self.s.get(url, headers=sign_header,params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ if data.get('data'):
+ self.can_help_risk = False
+ print(f"冒险助力账号[{friend_info['index']}][{friend_info['name']}]成功---√")
+ else:
+ message = data.get('message', '').replace('\r', '').split('\n')
+ message = ','.join(filter(lambda x: x, message))
+ print(f"冒险助力账号[{friend_info['index']}][{friend_info['name']}]失败{message}")
+ if '助力次数' in message:
+ self.can_help_risk = False
+ elif '挂机时间已完成' in message:
+ friend_info['need_help_risk'] = False
+ # except Exception as e:
+ # print(e)
+
+ def friend_help(self, friend_info):
+ print(f'开始阳光互助--->>>')
+ # try:
+ params = {
+ 'userId': friend_info['userId'],
+ 'type': 0x0,
+ 'randomId': self.randomString(32, '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM')
+ }
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/friend-help/help'
+ response = self.s.get(url, headers=sign_header,params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ if data.get('data'):
+ # print(f"请求助力账号[{friend_info['index']}][{friend_info['name']}] 成功---√")
+ self.task_doHelpTask(friend_info)
+ else:
+ message = data.get('message', '').replace('\r', '').split('\n')
+ message = ','.join(filter(lambda x: x, message))
+ print(f"请求助力账号[{friend_info['index']}][{friend_info['name']}] 失败: {message}")
+ if '助力次数' in message:
+ self.can_help_task = False
+ # except Exception as e:
+ # print(e)
+
+ def friend_findRecommend(self):
+ print(f'查询添加好友列表--->>>')
+ try:
+ url = f'{self.base_url}/friend/findRecommend'
+ sign_header = self.gen_sign()
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f'查询添加好友列表成功---√')
+ for user_info in data.get('data', []):
+ if not self.can_add_friend:
+ print('好友已满')
+ break
+ # if len(list(filter(lambda user: user['userId'] == user_info['userId'], self.user_list))) > 0:
+ # continue
+ self.friend_addFriend(user_info)
+ # self.friend_deleteFriend(user_info)
+ else:
+ message = data.get('message', '')
+ print(f'查询添加好友列表失败{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def friend_addFriend(self, user_data):
+ print(f'添加好友--->>>')
+ try:
+ friend_user_id = user_data['userId']
+ params = {'friendUserId': friend_user_id}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/friend/addFriend'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"添加好友[{user_data['nickName']}]成功---√")
+ else:
+ message = data.get('message', '')
+ print(f'添加好友{user_data["nickName"]}失败{code}]: {message}')
+ if message and '达到好友上限' in message:
+ self.can_add_friend = False
+ except Exception as e:
+ print(e)
+
+ def friend_deleteFriend(self, user_data):
+ print(f'删除好友--->>>')
+ try:
+ friend_user_id = user_data['userId']
+ params = {'friendUserId': friend_user_id}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/friend/delFriend'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"删除好友[{user_data['nickName']}]成功---√")
+ else:
+ message = data.get('message', '')
+ print(f'删除好友{user_data["nickName"]}失败{code}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def friend_findFriend(self):
+ print(f'\n查询好友列表--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/friend/findFriend'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f'查询好友列表成功---√')
+ friend_list = data.get('data', {}).get('friendList', [])
+ friend_list.sort(key=lambda x: x['gold'], reverse=True)
+ for friend in friend_list:
+ if friend.get('stealFlag', False):
+ if not self.friend_stealGold(friend):
+ break
+
+ else:
+ message = data.get('message', '')
+ print(f'查询好友列表失败[{str(code)}]:{message}')
+ except Exception as e:
+ print(e)
+
+ def get_CapCode(self, slideImgInfo):
+ slidingImage = slideImgInfo.get('slidingImage', None)
+ backImage = slideImgInfo.get('backImage', None)
+ dddddocr_api = os.environ.get('OCR_API',False)
+ if not dddddocr_api:
+ print('未定义变量【OCR_API】\n取消验证码识别\n搭建方式:https://github.com/CHERWING/CHERWIN_OCR')
+ return False
+ if slidingImage and backImage:
+ data = {
+ "slidingImage": slidingImage,
+ "backImage": backImage
+ }
+ response = requests.post(f"{dddddocr_api}/capcode", data=json.dumps(data),headers={'Content-Type': 'application/json'})
+ print(response.json())
+ self.capcode = response.json().get('result','')
+ if self.capcode:
+ return True
+ else:
+ return False
+
+ def get_CapCode_local(self, slideImgInfo):
+ slidingImage = slideImgInfo.get('slidingImage', None)
+ backImage = slideImgInfo.get('backImage', None)
+ if slidingImage and backImage:
+ self.capcode =CHERWIN_TOOLS.CAPCODE(slidingImage,backImage)
+ if self.capcode:
+ return True
+ else:
+ return False
+
+ def friend_stealGold(self, user_data):
+ print(f'偷取好友--->>>')
+ # try:
+ friend_user_id = user_data['userId']
+ params = {'friendUserId': friend_user_id}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/friend/stealGold'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ print(f"偷取好友[{user_data['nickName']}]: 阳光x{data.get('data', 0)}")
+ return True
+ elif code == 4000:
+
+ slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
+ validateCount = data.get('data', {}).get('validateCount', None)
+ if slideImgInfo and validateCount:
+ print(f"偷取好友[{user_data['nickName']}],需要滑块验证")
+ self.can_stealGold = False
+ if self.get_CapCode(slideImgInfo):
+ if self.checkUserCapCode():
+ self.friend_stealGold(user_data)
+ else:
+ print(f"偷取好友[{user_data['nickName']}]验证码上限")
+ self.can_stealGold = False
+ else:
+ message = data.get('message', '')
+ print(f"偷取好友[{user_data['nickName']}]阳光失败[{str(code)}]: {message}")
+
+ return False
+ # except Exception as e:
+ # print(e)
+
+ def checkUserCapCode(self):
+ print(f'提交验证码--->>>')
+ # try:
+ print(f'验证码:{self.capcode}')
+ params = {'xpos':self.capcode}
+ print(params)
+ sign_header = self.gen_sign(body=params)
+ url = f'{self.base_url}/checkUserCapCode'
+ response = self.s.post(url, headers=sign_header, json=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data', 0)
+ print(f"验证码正确,获取到[{data}]")
+ return True
+ else:
+ message = data.get('message', '')
+ print(f"验证码错误[{message}]")
+ return False
+ # except Exception as e:
+ # print(e)
+
+ def risk_task(self):
+ self.take_risk_get()
+ self.take_risk_online()
+ self.take_risk_reward()
+ print(f'可以冒险【{self.risk_num}】次')
+ while self.risk_num > 0 and self.can_go_risk == True:
+ self.take_risk_go()
+ time.sleep(2)
+
+ def land_task(self):
+ self.user_land_get()
+ if self.all_land_unlock and self.all_role_unlock:
+ pass
+ for land_number, land_info in self.land.items():
+ # print(land_number)
+ # print(land_info)
+ if land_info['status'] == 0:
+ continue
+ step, use_sun_count, left_sun_count = land_info['step'], land_info['useSunCount'], land_info['leftSunCount']
+
+ total_sun_count = (use_sun_count if use_sun_count else 0) + (left_sun_count if left_sun_count else 0)
+
+ print(f"\n---[{land_info['no']}号土地]---\n{self.group_step[step-1]},阶段{step}, 进度{use_sun_count}/{total_sun_count}")
+
+ self.refresh_land_step = True
+ while self.refresh_land_step:
+ self.refresh_land_step = False
+ if land_info['status'] == 0:
+ break
+ if step == 0:
+ self.user_land_sow(land_info)
+ else:
+ if left_sun_count == 0:
+ if step == 5:
+ self.user_land_result(land_info)
+ else:
+ current_time = int(time.time() * 1000)
+ if current_time >= (land_info['sunTime'] + land_info['sunTimestamp']) * 1000:
+ self.user_land_level(land_info)
+ else:
+ if self.sun >= land_info['needSun']:
+ current_time = int(time.time() * 1000)
+ if current_time >= (land_info['sunTime'] + land_info['sunTimestamp']) * 1000:
+ self.user_land_sun(land_info)
+ # time.sleep(2)
+
+ def userTask(self):
+ print('\n--------------- 开始日常任务 ---------------')
+ wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
+ if not self.Login_res:
+ return False
+ self.userInfo_autoSun()
+
+ self.userInfo_get()
+
+ self.task_get()
+
+ self.user_role_get()
+
+ self.risk_task()
+
+ self.land_task()
+
+ self.steal_task()
+
+ self.userInfo_get(END=True)
+ new_data = {
+ self.userId: {
+ 'userId': self.userId,
+ 'task_id': self.task_id,
+ 'task_can_help': self.can_help_task,
+ 'task_need_help': self.need_help_task,
+ 'task_progress': self.task_progress,
+ 'task_max_progress': self.task_max_progress,
+ 'role_id': self.role_id,
+ 'role_can_help': self.can_help_unlock,
+ 'role_need_help': self.need_help_unlock,
+ 'role_progress': self.role_progress,
+ 'role_max': self.role_max,
+ 'risk_can_help': self.can_help_risk,
+ 'risk_need_help': self.need_help_task,
+ 'can_go_risk': self.can_go_risk,
+ 'can_add_friend': self.can_add_friend
+
+ }
+ }
+ # print(new_data)
+ USER_INFO.update(new_data)
+ CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
+ self.steal_task()
+ self.sendMsg()
+ return True
+
+ def helpEachOther(self):
+ print('--------------- 开始互助 ---------------')
+
+ if not self.Login_res:
+ return False
+
+ self.userInfo_get()
+
+ if self.user_index == 1:
+ print('第一个账号助力作者--->>>')
+ data_li = AuthorCode
+ help_type = '作者'
+ else:
+ print('其余账号互助--->>>')
+ json_data = self.load_json()
+ data_li = list(json_data.values())
+ help_type = '本地'
+
+
+ # print(data_li)
+ for index, code_li in enumerate(data_li):
+ # print(f"Index: {index}")
+ # print(f"Data: {code_li}")
+ if code_li.get('userId','') == self.userId:
+ continue
+ task_need_help = code_li.get("task_need_help", '')
+ role_need_help = code_li.get("role_need_help", '')
+ risk_need_help = code_li.get("task_can_help", '')
+ code_li["index"] = index+1
+ print(f'\n------助力{help_type}账号【{index+1}】开始------')
+ # print(code_li)
+ # 冒险助力
+ if self.can_help_risk and risk_need_help:
+ self.friend_help_task_risk(code_li)
+ else:
+ print(f'好友冒险助力已完成或冒险助力次数已耗尽')
+
+ # 解锁角色助力
+ if self.can_help_unlock and role_need_help:
+ self.user_role_friendHelpUnlock(code_li)
+ else:
+ print(f'好友解锁角色助力已完成或解锁角色助力次数已耗尽')
+
+ # 阳光助力
+ if self.can_help_task and task_need_help:
+ self.friend_help(code_li)
+ else:
+ print(f'阳光助力次数已耗尽')
+
+ print(f'------助力{help_type}账号【{index+1}】结束------')
+ time.sleep(1)
+
+
+ new_data = {
+ self.userId: {
+ 'task_can_help': self.can_help_task,
+ 'role_can_help': self.can_help_unlock,
+ 'risk_can_help': self.can_help_risk
+ }
+ }
+ CHERWIN_TOOLS.SAVE_INVITE_CODE(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", new_data)
+ self.sendMsg(True)
+ return True
+
+ def steal_task(self, count=5):
+ if not self.Login_res:
+ return False
+ json_data = self.load_json()
+ self.can_add_friend = json_data.get(self.userId, {}).get('can_add_friend', '')
+ for i in range(count):
+ if self.can_add_friend:
+ self.friend_findRecommend()
+ time.sleep(2)
+ self.friend_findFriend()
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+
+if __name__ == '__main__':
+ APP_NAME = '统一茄皇'
+ ENV_NAME = 'TYQH'
+ CK_NAME = 'thirdId@wid'
+ CK_URL = '.../public/api/login'
+ print(f'''
+✨✨✨ {APP_NAME}脚本 ✨✨✨
+✨ 功能:
+ 日常任务
+ 互助任务
+✨ 抓包步骤:
+ 统一快乐星球小程序-活动
+ 开始抓包-茄皇的家第三期
+ 抓{CK_URL}取{CK_NAME}
+✨ 设置青龙变量:
+export {ENV_NAME}= '{CK_NAME}'多账号#分割或&
+export OCR_API= 'http://localhost:3721'
+✨ 由于青龙python版本问题无法直接使用dddocr需要自行搭建API,搭建方式:https://github.com/CHERWING/CHERWIN_OCR
+✨ 如果你的环境可以安装dddocr库则可以替换代码内的【self.get_CapCode】为【self.get_CapCode_local】
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ 推荐定时:25 10-22/2 * * *
+✨ 第一个账号助力作者,其余互助
+✨✨✨ @Author CHERWIN✨✨✨
+ ''')
+
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ access_token = []
+ for index, infos in enumerate(tokens):
+ run_result = RUN(infos, index).userTask()
+ if not run_result: continue
+
+ for index, infos in enumerate(tokens):
+ run_result =RUN(infos, index).helpEachOther()
+ if not run_result: continue
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
diff --git a/TYQH_JK.py b/TYQH_JK.py
old mode 100644
new mode 100755
index f8cf5ce..a4765f6
--- a/TYQH_JK.py
+++ b/TYQH_JK.py
@@ -1,426 +1,399 @@
-# !/usr/bin/python3
-# -- coding: utf-8 --
-# -------------------------------
-# @Author : cherwin
-# -------------------------------
-# cron "59 9 * 2-6 * *" script-path=xxx.py,tag=匹配cron用
-# const $ = new Env('统一茄皇监控')
-import hashlib
-import json
-import os
-import random
-import string
-import time
-from datetime import datetime
-from os import environ, path
-
-import requests
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-
-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'
-
-USER_INFO = {}
-
-class RUN:
- def __init__(self, info,index):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- self.third_id = split_info[0]
- self.wid = split_info[1]
- 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.user_index = index + 1
- print(f"\n---------开始执行第{self.user_index}个账号>>>>>")
- self.s = requests.session()
- self.s.verify = False
-
- self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
-
- self.headers = {
- 'User-Agent': self.UA,
- 'Sec-Fetch-Site': 'cross-site',
- 'Sec-Fetch-Mode': 'cors',
- 'Sec-Fetch-Dest': 'empty',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Accept-Language': 'zh-CN,zh;q=0.9',
- 'Origin': 'https://thekingoftomato.ioutu.cn',
- 'Referer': 'https://thekingoftomato.ioutu.cn/'
-
- }
- self.base_url = 'https://qiehuang-apig.xiaoyisz.com/qiehuangsecond/ga'
- self.goodsid = None
- self.Login_res = self.login()
-
- def load_json(self):
- try:
- with open(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", 'r', encoding='utf-8') as file:
- data = json.load(file)
- return data
- except FileNotFoundError:
- print("未找到文件,返回空字典")
- return {}
- except Exception as e:
- print(f"发生错误:{e}")
- return {}
-
- def make_request(self, url, method='post', headers={}, params={}):
- if headers == {}:
- headers = self.headers
- if params == {}:
- params = self.params
- try:
- if method.lower() == 'get':
- response = requests.get(url, headers=headers, verify=False)
-
- elif method.lower() == 'post':
- response = requests.post(url, headers=headers, json=params, verify=False)
- else:
- raise ValueError("不支持的请求方法: " + method)
- return response.json()
- except requests.exceptions.RequestException as e:
- print("请求异常:", e)
- except ValueError as e:
- print("值错误或不支持的请求方法:", e)
- except Exception as e:
- print("发生了未知错误:", e)
-
- def gen_sign(self, parameters={}, body=None):
- sorted_keys = sorted(parameters.keys())
- parameter_strings = []
- for key in sorted_keys:
- if isinstance(parameters[key], dict):
- parameter_strings.append(f"{key}={json.dumps(parameters[key])}")
- else:
- parameter_strings.append(f"{key}={parameters[key]}")
-
- current_time = int(datetime.now().timestamp() * 1000)
- secret_chars = list('BxzTx45uIGT25TTHIIBU2')
- last_three_digits = str(current_time)[-3:]
- for digit in last_three_digits:
- secret_chars.insert(int(digit), digit)
-
- secret = hashlib.md5(''.join(secret_chars).encode()).hexdigest()
- nonce_str = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
-
- sign_data = {
- 'client_id': 'game',
- 'nonstr': nonce_str,
- 'timestamp': current_time,
- 'body': json.dumps(body) if body else '',
- 'query': '&'.join(parameter_strings) if parameter_strings else '',
- 'secret': secret
- }
-
- sign_string = '|'.join([str(v) for v in sign_data.values()])
- sign = hashlib.md5(sign_string.encode()).hexdigest().upper()
- sign_header = {
- 'client_id': 'game',
- 'timestamp': str(current_time),
- 'nonstr': sign_data['nonstr'],
- 'sign': sign
- }
- self.headers.update(sign_header)
- return self.headers
-
- def login(self):
- login_successful = False
- try:
- login_params = {
- 'thirdId': self.third_id,
- 'wid': self.wid
- }
- sign_header = self.gen_sign({}, login_params)
- # print(self.headers)
- # Hypothetically speaking, this is how you might perform a POST request in Python with the requests library.
- response = self.s.post(f'{self.base_url}/public/api/login', json=login_params, headers=sign_header)
- if response.status_code == 200:
- response_data = response.json()
- if response_data.get('code', -1) == 0:
- auth = response_data['data']['token'] or ''
- if auth:
- login_successful = True
- print(f'账号【{self.user_index}】登录成功')
- Authorization = {'Authorization': auth}
- self.headers.update(Authorization)
- else:
- print(f'账号【{self.user_index}】登录获取auth失败')
- else:
- print(f"登录获取auth失败[{response_data['code']}]: {response_data['message']}")
- elif response.status_code == 403:
- print('登录失败[403]: 黑IP了, 换个IP试试吧')
- except Exception as e:
- print(e)
- finally:
- return login_successful
-
- def get_CapCode(self, slideImgInfo):
- slidingImage = slideImgInfo.get('slidingImage', None)
- backImage = slideImgInfo.get('backImage', None)
- dddddocr_api = os.environ.get('OCR_API',False)
- if not dddddocr_api:
- print('未定义变量【OCR_API】\n取消验证码识别\n搭建方式:https://github.com/CHERWING/CHERWIN_SCRIPTS')
- return False
- if slidingImage and backImage:
- data = {
- "slidingImage": slidingImage,
- "backImage": backImage
- }
- response = requests.post(f"{dddddocr_api}/capcode", data=json.dumps(data),headers={'Content-Type': 'application/json'})
- print(response.json())
- self.capcode = response.json().get('result','')
- if self.capcode:
- return True
- else:
- return False
-
- def get_CapCode_local(self, slideImgInfo):
- slidingImage = slideImgInfo.get('slidingImage', None)
- backImage = slideImgInfo.get('backImage', None)
- if slidingImage and backImage:
- self.capcode =CHERWIN_TOOLS.CAPCODE(slidingImage,backImage)
- if self.capcode:
- return True
- else:
- return False
-
- def checkUserCapCode(self):
- print(f'提交验证码--->>>')
- # try:
- print(f'验证码:{self.capcode}')
- params = {'xpos':self.capcode}
- print(params)
- sign_header = self.gen_sign(body=params)
- url = f'{self.base_url}/checkUserCapCode'
- response = self.s.post(url, headers=sign_header, json=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data', 0)
- print(f"验证码正确,获取到[{data}]")
- return True
- else:
- message = data.get('message', '')
- print(f"验证码错误[{message}]")
- return False
- # except Exception as e:
- # print(e)
-
- def exchange_find(self):
- print(f'获取兑换列表--->>>')
- try:
- sign_header = self.gen_sign()
- url = f'{self.base_url}/exchange/find'
- response = self.s.get(url, headers=sign_header)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data', {})[1]
- num = data.get('num',0)
- if num < 0 :
- Log('兑换上限,跳过')
- return False
- # print(f"兑换列表:{data}")
- exchangePrizeVoList = data.get('exchangePrizeVoList',None)
- if exchangePrizeVoList:
- for goods in exchangePrizeVoList:
- name = goods.get('name','')
- self.goodsid = goods.get('id','')
- usableStock = goods.get('usableStock','')
- if usableStock >0:
- Log(f'ID:【{self.goodsid}】 【{name}】 当前剩余:{usableStock}【可兑换】')
- self.sendMsg()
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
- if TYQH_DHID and TYQH_DHID == self.goodsid:
- self.exchange_reward(TYQH_DHID)
- elif TYQH_DHID == '0':
- self.exchange_reward(self.goodsid)
- else:
- continue
- else:
- print(f'ID:【{self.goodsid}】【{name}】 当前剩余:{usableStock}【不可兑换】')
- else:
- message = data.get('message', '')
- print(f'{message}')
- except Exception as e:
- print(e)
-
- def exchange_reward(self, reward_id):
- print(f'尝试兑换--->>>')
- try:
- params = {'id': reward_id}
- sign_header = self.gen_sign(params)
- url = f'{self.base_url}/exchange/reward'
- response = self.s.get(url, headers=sign_header, params=params)
- data = response.json()
- code = data.get('code', -1)
- if code == 0:
- data = data.get('data', {}).get('name') or ''
- Log(f"兑换[{data}]成功")
- elif code == 4000:
- slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
- validateCount = data.get('data', {}).get('validateCount', None)
- if slideImgInfo and validateCount:
- print(f"兑换需要滑块验证")
- if self.get_CapCode(slideImgInfo):
- if self.checkUserCapCode():
- self.exchange_reward(reward_id)
- else:
- print(f"兑换验证码上限")
- else:
- message = data.get('message', '')
- print(f'兑换[id={reward_id}]: {message}')
- except Exception as e:
- print(e)
-
- def userTask(self):
- print('\n--------------- 开始日常任务 ---------------')
- wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
- if not self.Login_res:
- return False
- self.exchange_find()
-
- 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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-import threading
-
-def execute_task(infos, index):
- run_result = RUN(infos, index).userTask()
- if not run_result:
- return
-
-if __name__ == '__main__':
- APP_NAME = '统一茄皇监控'
- ENV_NAME = 'TYQH_JK'
- print(f'''
-✨✨✨ {APP_NAME}脚本 ✨✨✨
-✨ 功能:
- 奖品监控
-✨ 设置青龙变量:
-export TYQH= '' 使用相同TYQH变量
-export TYQH_DHID= '112' 设置兑换ID则开启自动兑换,设置为0遍历兑换全部可兑换商品
-export OCR_API= 'http://localhost:3721'
-✨ 由于青龙python版本问题无法直接使用dddocr需要自行搭建API,搭建方式:https://github.com/CHERWING/CHERWIN_OCR
-✨ 如果你的环境可以安装dddocr库则可以替换代码内的【self.get_CapCode】为【self.get_CapCode_local】
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ 推荐定时:*/10 9:59 1-31 2-6 * * 2-6月每月1日9点55到10点1分,每10秒执行一次
-✨ 第一个账号助力作者,其余互助
-✨✨✨ @Author CHERWIN✨✨✨
- ''')
- local_script_name = os.path.basename(__file__)
- local_version = '2024.05.04'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- ENV = os.environ.get('TYQH','')
- TYQH_DHID = os.environ.get('TYQH_DHID',None)
- if TYQH_DHID == '0':
- Log(f'\n当前已设置TYQH_DHID变量,将自动遍历兑换商品')
- elif TYQH_DHID:
- Log(f'\n当前已设置TYQH_DHID变量,将自动兑换id【{TYQH_DHID}】商品')
- else:
- Log('\n未定义TYQH_DHID变量,取消自动兑换')
- token = ENV if ENV else token
- if not token:
- print(f"未填写TYQH变量\n青龙可在环境变量设置TYQH 或者在本脚本文件上方将ck填入token =''")
- exit()
- tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>> 共获取到{len(tokens)} 个账号 <<<<<<<<<<")
- # access_token = []
- # threads = []
- # for index, infos in enumerate(tokens):
- # thread = threading.Thread(target=execute_task, args=(infos, index))
- # threads.append(thread)
- # thread.start()
- #
- # for thread in threads:
- # thread.join()
- while True:
- current_time = time.localtime()
- if (current_time.tm_hour == 9 and current_time.tm_min == 59 and current_time.tm_sec >= 59) or \
- (current_time.tm_hour == 10 and current_time.tm_min == 1 and current_time.tm_sec <= 59):
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>> 共获取到{len(tokens)} 个账号 <<<<<<<<<<")
- access_token = []
- threads = []
- for index, infos in enumerate(tokens):
- thread = threading.Thread(target=execute_task, args=(infos, index))
- threads.append(thread)
- thread.start()
-
- for thread in threads:
- thread.join()
- elif current_time.tm_hour == 10 and current_time.tm_min > 5:
- break
- else:
- time.sleep(1)
-
+# !/usr/bin/python3
+# -- coding: utf-8 --
+# -------------------------------
+# @Author : cherwin
+# -------------------------------
+# cron "59 9 * 2-6 * *" script-path=xxx.py,tag=匹配cron用
+# const $ = new Env('统一茄皇监控')
+import hashlib
+import json
+import os
+import random
+import string
+import time
+from datetime import datetime
+from os import environ, path
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+
+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'
+
+USER_INFO = {}
+
+class RUN:
+ def __init__(self, info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ self.third_id = split_info[0]
+ self.wid = split_info[1]
+ 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.user_index = index + 1
+ print(f"\n---------开始执行第{self.user_index}个账号>>>>>")
+ self.s = requests.session()
+ self.s.verify = False
+
+ self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f) XWEB/8555'
+
+ self.headers = {
+ 'User-Agent': self.UA,
+ 'Sec-Fetch-Site': 'cross-site',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Origin': 'https://thekingoftomato.ioutu.cn',
+ 'Referer': 'https://thekingoftomato.ioutu.cn/'
+
+ }
+ self.base_url = 'https://qiehuang-apig.xiaoyisz.com/qiehuangsecond/ga'
+ self.goodsid = None
+ self.Login_res = self.login()
+
+ def load_json(self):
+ try:
+ with open(f"INVITE_CODE/{ENV_NAME}_INVITE_CODE.json", 'r', encoding='utf-8') as file:
+ data = json.load(file)
+ return data
+ except FileNotFoundError:
+ print("未找到文件,返回空字典")
+ return {}
+ except Exception as e:
+ print(f"发生错误:{e}")
+ return {}
+
+ def make_request(self, url, method='post', headers={}, params={}):
+ if headers == {}:
+ headers = self.headers
+ if params == {}:
+ params = self.params
+ try:
+ if method.lower() == 'get':
+ response = requests.get(url, headers=headers, verify=False)
+
+ elif method.lower() == 'post':
+ response = requests.post(url, headers=headers, json=params, verify=False)
+ else:
+ raise ValueError("不支持的请求方法: " + method)
+ return response.json()
+ except requests.exceptions.RequestException as e:
+ print("请求异常:", e)
+ except ValueError as e:
+ print("值错误或不支持的请求方法:", e)
+ except Exception as e:
+ print("发生了未知错误:", e)
+
+ def gen_sign(self, parameters={}, body=None):
+ sign_header=CHERWIN_TOOLS.TYQH_SIGN(parameters,body)
+ self.headers.update(sign_header)
+ return self.headers
+
+ def login(self):
+ login_successful = False
+ try:
+ login_params = {
+ 'thirdId': self.third_id,
+ 'wid': self.wid
+ }
+ sign_header = self.gen_sign({}, login_params)
+ # print(self.headers)
+ # Hypothetically speaking, this is how you might perform a POST request in Python with the requests library.
+ response = self.s.post(f'{self.base_url}/public/api/login', json=login_params, headers=sign_header)
+ if response.status_code == 200:
+ response_data = response.json()
+ if response_data.get('code', -1) == 0:
+ auth = response_data['data']['token'] or ''
+ if auth:
+ login_successful = True
+ print(f'账号【{self.user_index}】登录成功')
+ Authorization = {'Authorization': auth}
+ self.headers.update(Authorization)
+ else:
+ print(f'账号【{self.user_index}】登录获取auth失败')
+ else:
+ print(f"登录获取auth失败[{response_data['code']}]: {response_data['message']}")
+ elif response.status_code == 403:
+ print('登录失败[403]: 黑IP了, 换个IP试试吧')
+ except Exception as e:
+ print(e)
+ finally:
+ return login_successful
+
+ def get_CapCode(self, slideImgInfo):
+ slidingImage = slideImgInfo.get('slidingImage', None)
+ backImage = slideImgInfo.get('backImage', None)
+ dddddocr_api = os.environ.get('OCR_API',False)
+ if not dddddocr_api:
+ print('未定义变量【OCR_API】\n取消验证码识别\n搭建方式:https://github.com/CHERWING/CHERWIN_SCRIPTS')
+ return False
+ if slidingImage and backImage:
+ data = {
+ "slidingImage": slidingImage,
+ "backImage": backImage
+ }
+ response = requests.post(f"{dddddocr_api}/capcode", data=json.dumps(data),headers={'Content-Type': 'application/json'})
+ print(response.json())
+ self.capcode = response.json().get('result','')
+ if self.capcode:
+ return True
+ else:
+ return False
+
+ def get_CapCode_local(self, slideImgInfo):
+ slidingImage = slideImgInfo.get('slidingImage', None)
+ backImage = slideImgInfo.get('backImage', None)
+ if slidingImage and backImage:
+ self.capcode =CHERWIN_TOOLS.CAPCODE(slidingImage,backImage)
+ if self.capcode:
+ return True
+ else:
+ return False
+
+ def checkUserCapCode(self):
+ print(f'提交验证码--->>>')
+ # try:
+ print(f'验证码:{self.capcode}')
+ params = {'xpos':self.capcode}
+ print(params)
+ sign_header = self.gen_sign(body=params)
+ url = f'{self.base_url}/checkUserCapCode'
+ response = self.s.post(url, headers=sign_header, json=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data', 0)
+ print(f"验证码正确,获取到[{data}]")
+ return True
+ else:
+ message = data.get('message', '')
+ print(f"验证码错误[{message}]")
+ return False
+ # except Exception as e:
+ # print(e)
+
+ def exchange_find(self):
+ print(f'获取兑换列表--->>>')
+ try:
+ sign_header = self.gen_sign()
+ url = f'{self.base_url}/exchange/find'
+ response = self.s.get(url, headers=sign_header)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data', {})[1]
+ num = data.get('num',0)
+ if num < 0 :
+ Log('兑换上限,跳过')
+ return False
+ # print(f"兑换列表:{data}")
+ exchangePrizeVoList = data.get('exchangePrizeVoList',None)
+ if exchangePrizeVoList:
+ for goods in exchangePrizeVoList:
+ name = goods.get('name','')
+ self.goodsid = goods.get('id','')
+ usableStock = goods.get('usableStock','')
+ if usableStock >0:
+ Log(f'ID:【{self.goodsid}】 【{name}】 当前剩余:{usableStock}【可兑换】')
+ self.sendMsg()
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+ if TYQH_DHID and TYQH_DHID == self.goodsid:
+ self.exchange_reward(TYQH_DHID)
+ elif TYQH_DHID == '0':
+ self.exchange_reward(self.goodsid)
+ else:
+ continue
+ else:
+ print(f'ID:【{self.goodsid}】【{name}】 当前剩余:{usableStock}【不可兑换】')
+ else:
+ message = data.get('message', '')
+ print(f'{message}')
+ except Exception as e:
+ print(e)
+
+ def exchange_reward(self, reward_id):
+ print(f'尝试兑换--->>>')
+ try:
+ params = {'id': reward_id}
+ sign_header = self.gen_sign(params)
+ url = f'{self.base_url}/exchange/reward'
+ response = self.s.get(url, headers=sign_header, params=params)
+ data = response.json()
+ code = data.get('code', -1)
+ if code == 0:
+ data = data.get('data', {}).get('name') or ''
+ Log(f"兑换[{data}]成功")
+ elif code == 4000:
+ slideImgInfo = data.get('data', {}).get('slideImgInfo', None)
+ validateCount = data.get('data', {}).get('validateCount', None)
+ if slideImgInfo and validateCount:
+ print(f"兑换需要滑块验证")
+ if self.get_CapCode(slideImgInfo):
+ if self.checkUserCapCode():
+ self.exchange_reward(reward_id)
+ else:
+ print(f"兑换验证码上限")
+ else:
+ message = data.get('message', '')
+ print(f'兑换[id={reward_id}]: {message}')
+ except Exception as e:
+ print(e)
+
+ def userTask(self):
+ print('\n--------------- 开始日常任务 ---------------')
+ wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
+ if not self.Login_res:
+ return False
+ self.exchange_find()
+
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+import threading
+
+def execute_task(infos, index):
+ run_result = RUN(infos, index).userTask()
+ if not run_result:
+ return
+
+if __name__ == '__main__':
+ APP_NAME = '统一茄皇监控'
+ ENV_NAME = 'TYQH_JK'
+ print(f'''
+✨✨✨ {APP_NAME}脚本 ✨✨✨
+✨ 功能:
+ 奖品监控
+✨ 设置青龙变量:
+export TYQH= '' 使用相同TYQH变量
+export TYQH_DHID= '112' 设置兑换ID则开启自动兑换,设置为0遍历兑换全部可兑换商品
+export OCR_API= 'http://localhost:3721'
+✨ 由于青龙python版本问题无法直接使用dddocr需要自行搭建API,搭建方式:https://github.com/CHERWING/CHERWIN_OCR
+✨ 如果你的环境可以安装dddocr库则可以替换代码内的【self.get_CapCode】为【self.get_CapCode_local】
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ 推荐定时:*/10 9:59 1-31 2-6 * * 2-6月每月1日9点55到10点1分,每10秒执行一次
+✨ 第一个账号助力作者,其余互助
+✨✨✨ @Author CHERWIN✨✨✨
+ ''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ ENV = os.environ.get('TYQH','')
+ TYQH_DHID = os.environ.get('TYQH_DHID',None)
+ if TYQH_DHID == '0':
+ Log(f'\n当前已设置TYQH_DHID变量,将自动遍历兑换商品')
+ elif TYQH_DHID:
+ Log(f'\n当前已设置TYQH_DHID变量,将自动兑换id【{TYQH_DHID}】商品')
+ else:
+ Log('\n未定义TYQH_DHID变量,取消自动兑换')
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写TYQH变量\n青龙可在环境变量设置TYQH 或者在本脚本文件上方将ck填入token =''")
+ exit()
+ tokens = CHERWIN_TOOLS.ENV_SPLIT(token)
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>> 共获取到{len(tokens)} 个账号 <<<<<<<<<<")
+ # access_token = []
+ # threads = []
+ # for index, infos in enumerate(tokens):
+ # thread = threading.Thread(target=execute_task, args=(infos, index))
+ # threads.append(thread)
+ # thread.start()
+ #
+ # for thread in threads:
+ # thread.join()
+ while True:
+ current_time = time.localtime()
+ if (current_time.tm_hour == 9 and current_time.tm_min == 59 and current_time.tm_sec >= 59) or \
+ (current_time.tm_hour == 10 and current_time.tm_min == 1 and current_time.tm_sec <= 59):
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>> 共获取到{len(tokens)} 个账号 <<<<<<<<<<")
+ access_token = []
+ threads = []
+ for index, infos in enumerate(tokens):
+ thread = threading.Thread(target=execute_task, args=(infos, index))
+ threads.append(thread)
+ thread.start()
+
+ for thread in threads:
+ thread.join()
+ elif current_time.tm_hour == 10 and current_time.tm_min > 5:
+ break
+ else:
+ time.sleep(1)
+
diff --git a/TYYP.py b/TYYP.py
index 99ffa42..404c8dd 100755
--- a/TYYP.py
+++ b/TYYP.py
@@ -16,8 +16,10 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# import CHERWIN_TOOLS
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -251,16 +253,20 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
diff --git a/YDKD.py b/YDKD.py
index 8982b2c..2f338d0 100755
--- a/YDKD.py
+++ b/YDKD.py
@@ -32,8 +32,10 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning
# import CHERWIN_TOOLS
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
+ IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
print("加载通知服务成功!")
@@ -339,16 +341,20 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.04.06'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token
diff --git a/YHSH.py b/YHSH.py
index 1fd6aad..0fad45f 100755
--- a/YHSH.py
+++ b/YHSH.py
@@ -1,1104 +1,1163 @@
-'''
-!/usr/bin/python3
--- coding: utf-8 --
--------------------------------
-✨✨✨ @Author CHERWIN✨✨✨
-cron "51 8,21 * * *" script-path=xxx.py,tag=匹配cron用
-const $ = new Env('永辉生活')
-'''
-import hashlib
-import json
-import os
-import random
-import time
-import urllib
-from os import environ, path
-from sys import exit
-from urllib.parse import quote, urlparse, parse_qs
-
-import requests
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
-
-# 禁用安全请求警告
-requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
-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'
-
-inviteCode = {}
-GameCode=[]
-PRIZEID = ''
-
-
-class RUN:
- def __init__(self, info,index):
- global one_msg
- one_msg = ''
- split_info = info.split('@')
- token = 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.s = requests.session()
- self.s.verify = False
- self.UA = 'Mozilla/5.0 (Linux; Android 11; Mi9 Pro 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36YhStore/9.6.0.14 cn.yonghui.hyd/2022946000 (client/phone; Android 30; Xiaomi/Mi9 Pro 5G)'
- self.headers = {
- 'Host': 'api.yonghuivip.com',
- 'Connection': 'keep-alive',
- 'User-Agent': self.UA,
- 'X-YH-Context': 'origin=h5&morse=1',
- 'Accept': '*/*',
- 'Origin': 'https://m.yonghuivip.com',
- 'X-Requested-With': 'cn.yonghui.hyd',
- 'Sec-Fetch-Site': 'same-site',
- 'Sec-Fetch-Mode': 'cors',
- 'Sec-Fetch-Dest': 'empty',
- 'Referer': 'https://m.yonghuivip.com/',
- # 'Accept-Encoding': 'gzip, deflate, br',
- 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
- }
- # 创建一个字典来存储参数
- data = {}
- # 解析第一个URL并提取参数
- parsed_url1 = urlparse(token)
- # print(parsed_url1)
- self.data_dict = parse_qs(parsed_url1.query)
- # print(self.data_dict)
- self.url_add = token.split('?')[1]
- # print(self.data_dict)
- self.fruit_is_ripe = False
- self.gameCode =''
- if self.data_dict.get('memberid') :
- self.memberId = self.data_dict.get('memberid',[])[0]
- else:
- self.memberId = self.data_dict.get('memberId', [])[0]
- if self.data_dict.get('shopid') :
- self.shopid = self.data_dict.get('shopid',[])[0]
- else:
- self.shopid = '9M7M'
- self.url_add =f'{self.url_add}&shopid={self.shopid}'
- print(self.shopid)
- self.gamecode_li = []
- self.canJoinTeam = True
- self.canhelp_coup = True
- self.teamCode = ''
-
-
- # 将参数转换为字典
- def create_dict_from_string(self, data_string):
- params = {}
- key_value_pairs = data_string.split(',')
- for pair in key_value_pairs:
- key, value = pair.split('=')
- params[key] = value
- return params
-
- # 发送请求函数
- def do_request(self, url, data={}, req_type='post', headers={}):
- if headers == {}:
- headers = self.headers
- try:
- if req_type.lower() == 'get':
- response = self.s.get(url, headers=headers)
- elif req_type.lower() == 'post':
- response = self.s.post(url, headers=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
-
- def getCredit(self):
- Log(f'\n>>>>>>获取积分信息')
- headers = {
- 'Accept': '*/*'
- }
- url = f'https://api.yonghuivip.com/web/coupon/credit/details/?page=0&{self.url_add}'
- response = self.do_request(url, req_type='get', headers=headers)
- # print(response)
-
- if 'code' in response and response.get('code','') == 0:
- credit = response.get('data')['credit']
- self.sign_count = response.get('data')['count']
-
- Log(f'>当前用户:{self.memberId}\n>当前积分:{credit}')
- # Log(f'>>>累计签到:{self.sign_count}天')
- return True
- elif response.get("message", "") == '登录状态已失效,请重新登录':
- if send:send('永辉生活账号失效通知', f'账号:{self.index} ID:{self.memberId}已失效,请重新抓包')
- else:
- Log(f'>获取积分信息失败')
- # print(response)
- return False
-
- def sign(self):
- Log(f'\n>>>>>>开始执行签到')
- headers = {
- 'Accept': 'application/json'
- }
-
- data = {
- "memberId": self.memberId,
- "shopid": self.shopid,
- "missionid": "39"
- }
- url = f'https://api.yonghuivip.com/web/coupon/signreward/sign?{self.url_add}'
- response = self.do_request(url, headers=headers,data=data)
- # print(response)
-
- if 'code' in response and response.get('code') == 0:
- Log(f'>签到成功')
- Log(f'>累计签到:{int(self.sign_count) + 1}天')
- self.getCredit()
- return True
- elif '任务已完成,请勿重复点击' in response:
- Log(f'>今日已签到')
- else:
- Log(f'>签到失败,{response.get("message")}')
- return False
-
- def teamDetail(self):
- Log(f'\n>>>>>>开始获取组队详情')
- headers = {
- 'Accept': 'application/json'
- }
- data = {
- "createTeamFlag": True,
- "shopId": self.shopid,
- }
-
- url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/teamDetail?{self.url_add}'
- response = self.do_request(url, headers=headers,data=data)
- # print(response)
- if 'code' in response and response.get('code') == 0:
- data = response.get('data',{})
- if data != {}:
- self.teamCode = data.get('teamCode','')
- subTitle = data.get('subTitle','')
- print(f'战队ID:【{self.teamCode}】 状态:【{subTitle}】')
- new_data={
- self.memberId:{
- 'teamCode':self.teamCode
- }
- }
- inviteCode.update(new_data)
- print(inviteCode)
- else:
- print('未查询到战队,开始创建')
- self.creatTeam()
- else:
- print(f'>创建战队失败,{response.get("message")}')
-
- def creatTeam(self):
- Log(f'\n>>>>>>开始组队任务')
- headers = {
- 'Accept': 'application/json'
- }
- data = {
- "shopId": self.shopid,
- }
-
- url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/createTeam?{self.url_add}'
- response = self.do_request(url, headers=headers,data=data)
- # print(response)
- if 'code' in response and response.get('code') == 0:
- data = response.get('data',{})
- self.teamCode = data.get('teamCode', '')
- subTitle = data.get('subTitle', '')
- Log(f'创建战队成功,ID:【{self.teamCode}】 状态:【{subTitle}】')
- new_data = {
- self.memberId: {
- 'teamCode': self.teamCode
- }
- }
- inviteCode.update(new_data)
- else:
- print(f'>创建战队失败,{response.get("message")}')
-
- def joinAuthorTeam(self):
- print(f'>>>开始加入作者队伍')
- headers = {
- 'Accept': 'application/json'
- }
- if len(AuthorCode) >0 :
- for code in AuthorCode:
- if not self.canJoinTeam:break
- data = {
- "teamCode": code.get('teamCode'),
- "shopId": self.shopid
- }
- url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/joinTheParty?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
- if 'code' in response and response.get('code') == 0:
- print(f'加入战队成功')
- break
- elif response.get('message') == '达到1天内组队上限':
- self.canJoinTeam = False
-
- def joinTeam(self):
- Log(f'>>>开始本地账号组队')
- headers = {
- 'Accept': 'application/json'
- }
- inviteCode_li = list(inviteCode.values())
- # print(inviteCode_li)
- for code in inviteCode_li:
- if not self.canJoinTeam:
- print('达到1天内组队上限')
- break
- data = {
- "teamCode": code.get('teamCode'),
- "shopId": self.shopid
- }
- url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/joinTheParty?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- Log(f'组队成功')
- break
- elif response.get("message","") == '会员专享功能,请先登录':
- break
- elif response.get('message') == '达到1天内组队上限':
- self.canJoinTeam = False
- else:
- Log(f'>组队失败,{response.get("message")}')
-
- def farmInfo(self):
- headers = {
- 'Accept': '*/*'
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/info?{self.url_add}'
- response = self.do_request(url, headers=headers, req_type='get')
- # print(response)
-
- if 'code' in response and response.get('code') == 0:
- self.parentId = response.get('data',[])['parentId']
- self.memberAmount = response.get('data',[])['memberAmount']
- self.ladderText = response.get('data',[]).get('ladderText','')
- Log(f'>>>当前水滴:{self.memberAmount}')
- Log(f'>>>当前水果进度:{self.ladderText}')
- if self.ladderText == '再浇水0%,果树就要成熟了':
- self.fruit_is_ripe = True
- inviteCode[self.memberId]['fruit_is_ripe'] = self.fruit_is_ripe
-
- return True
- else:
- Log(f'>>>获取果园信息失败\n{response}')
- return False
-
- def plantFruit_sign(self):
- Log(f'>>>开始果园签到')
- headers = {
- 'Accept': 'application/json'
- }
- data = {
- "taskType": "sign",
- "activityCode": "HXNC-QG",
- "shopId": "",
- "channel": ""
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/doTask?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
- # print(response)
-
- if 'code' in response and response.get('code') == 0:
- signText = response.get('data')['signText']
- Log(f'>>>{signText}')
- return True
- else:
- Log(f'>>>果园签到失败\n{response}')
- return False
-
- def plantFruit_getTaskList(self):
- print(f'>>>获取任务列表')
- headers = {
- 'Accept': '*/*'
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/task/list?activityCode=HXNC-QG&&parentId={self.parentId}&{self.url_add}'
- response = self.do_request(url, headers=headers, req_type='get')
- # print(response)
-
- if 'code' in response and response.get('code') == 0:
- data = response.get('data')
- for i in data:
- subType = i['subType']
- title = i['title']
- finished = i['finished']
- self.taskId = i['taskId']
- self.rewardid = i.get('rewardId', '')
- # print(self.rewardid)
- if subType == 'activityPage' and finished != 1:
- actionUrl = i['actionUrl']
- # 解码URL
- decoded_url = urllib.parse.unquote(actionUrl)
- decoded_url = decoded_url.replace('pid=null', f'pid={self.parentId}')
- # print(decoded_url)
- parsed_url = urllib.parse.urlparse(decoded_url)
- query_params = urllib.parse.parse_qs(parsed_url.query)
- self.aid = query_params.get("aid", [None])[0]
- self.taskid = query_params.get("taskid", [None])[0]
- # print(self.aid)
- # 提取aid后面的字符串
- index = decoded_url.find("&aid=")
- if index != -1:
- toUrl = f'?aid={decoded_url[index + 5:]}'
- else:
- toUrl = ""
- self.doFruitTask(title, toUrl)
- if self.rewardid != '':
- print('检测到有可收取任务')
- self.receive_water()
- return True
- else:
- print(response)
- return False
-
- def doFruitTask(self, title, toUrl):
- print(f'>>>开始做任务{title}')
- params = {"platform": "android",
- "v": "9.6.0.14",
- "channel": "2",
- "distinctId": "",
- "proportion": 2.75,
- "screen": "1080.75*2340.25",
- "pagesize": 6,
- "networkType": "wifi",
- "aid": self.aid,
- "versionpro": "2",
- "appType": "h5",
- "model": "Mi9 Pro 5G",
- "os": "android",
- "osVersion": "android30",
- "channelSub": "",
- "brand": "Xiaomi",
- "productLine": "YhStore",
- "salesChannel": "",
- "deviceid": "",
- "sellerid": "7",
- "shopid": "90B3",
- "uid": "",
- "access_token": "",
- "showmultiseller": "",
- "shopName": "",
- "isOldEdition": False,
- "userid": "",
- "pageid": self.aid,
- "pid": self.parentId,
- "taskid": self.taskid,
- "sceneValue": "4",
- "memberId": ""
- }
-
- headers = {
- 'Accept': 'application/json, text/plain, */*',
- "Content-Type": "application/json;charset=UTF-8",
- "Connection": "keep-alive",
- "Connection": "keep-alive"
- }
- url = f'https://api.yonghuivip.com/web/coupon/dailyreward/browse{toUrl}&{self.url_add}'
- response = self.do_request(url, headers=headers, data=params)
- # print(response)
-
- if 'code' in response and response.get('code') == 0:
- data = response.get('data')['title']
- Log(f'>{data}')
- return True
- else:
- return False
-
- def receive_inviteWater(self):
- headers = {
- 'Accept': '*/*'
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/invitation/bubble?activityCode=HXNC-QG&{self.url_add}'
- # print(url)
- response =self.do_request(url, headers=headers,req_type='get')
- # print(response)
- if 'code' in response and response.get('code') == 0:
- data = response['data']['inviteWaterBubble']
- if data != []:
- Log(f'>>>开始领取邀请奖励')
- for task in data:
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/receiveWater?{self.url_add}'
- headers = {
- "Content-Type": "application/json",
- "Accept": "application/json"
- }
- data = {"taskId": task['taskId'], "id": task['rewardId'], "activityCode": "HXNC-QG"}
- response = requests.post(url, headers=headers, json=data,verify=False).json()
- if 'code' in response and response.get('code') == 0:
- receiveAmount = response['data']['receiveAmount']
- print(f'>成功收取【{receiveAmount}】水滴')
- else:
- print(f'>收取失败,{response}')
- else:
- print('>没有可领取的邀请奖励')
- else:
- print(f'>领取邀请奖励失败,{response}')
-
- def receive_water(self,taskType=None):
- print(f'>>>开始领取奖励')
- headers = {
- "Content-Type": "application/json",
- "Accept": "application/json"
- }
- data = {
- "taskId": self.taskId,
- "id": self.rewardid,
- "activityCode": "HXNC-QG"}
- if taskType != None:
- data['taskType'] = "activityPage"
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/receiveWater?{self.url_add}'
- # print(url)
-
- response =self.do_request(url, headers=headers, data=data)
- # response =requests.post(url, headers=headers, json=data)
- # if response:
- # response = response.json()
- if 'code' in response and response.get('code') == 0:
- receiveAmount = response['data']['receiveAmount']
- print(f'>成功收取【{receiveAmount}】水滴')
- else:
- print(f'>收取失败,{response}')
-
- def watering(self):
- self.farmInfo()
- if int(self.memberAmount / 10) > 1 :
- print(f'>>>开始浇水')
- headers = {
- 'Accept': 'application/json'
- }
- data = {"activityCode": "HXNC-QG", "shopId": "", "channel": "", "inviteTicket": "", "inviteShopId": ""}
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?{self.url_add}'
- for i in range(int(self.memberAmount / 10)):
-
- response = self.do_request(url, headers=headers, data=data)
- # print(response.text)
- if 'code' in response and response.get('code') == 0:
- print(f'>第{i + 1}次浇水成功')
- elif response.get('message') == '果树已经成熟啦,快去领取奖励吧':
- print(f'>果树已经成熟啦')
- self.fruit_is_ripe = True
-
- inviteCode[self.memberId]['fruit_is_ripe'] = self.fruit_is_ripe
-
- break
- else:
- print(f'>浇水失败,{response}')
- else:
- print('>水滴不足,停止浇水')
-
- def get_inviteTicket(self):
- print(f'>>>开始获取果园邀请码')
- headers = {
- 'Accept': 'application/json'
- }
- data = {"inviteAction": "802"}
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/invite/ticket?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
- # print(response)
- if 'code' in response and response.get('code','') == 0:
- self.inviteTicket = response.get('data')
- print(f'果园邀请码:{self.inviteTicket}')
- inviteCode[self.memberId]['inviteCode']=self.inviteTicket
- inviteCode[self.memberId]['shopId']=self.shopid
-
- else:
- print(f'>获取果园邀请码失败,{response}')
-
- def helpAuthor(self):
- print(f'>>>开始助力作者')
- headers = {
- 'Accept': 'application/json'
- }
- for code in AuthorCode:
- if code.get('memberId', '') == self.memberId: continue
- if code.get('fruit_is_ripe',False):break
- data={
- "activityCode":"HXNC-QG",
- "shopId":self.shopid,
- "channel":"512",
- "inviteTicket":code.get('inviteCode',''),"inviteAction":"watering","inviteShopId":code.get('shopId','')
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?inviteTicket={code}&{self.url_add}'
- response = self.do_request(url, headers=headers,data=data)
- # print(response)
- if 'code' in response and response.get('code') == 0:
- Log(f'>助力作者成功')
- break
- elif response.get("message","") == '会员专享功能,请先登录':
- break
- else:
- pass
- # Log(f'>助力作者失败,{response.get("message","")}')
-
- def helpOther(self):
- Log(f'>>>开始本地账号互助')
- headers = {
- 'Accept': 'application/json'
- }
- inviteCode_li = list(inviteCode.values())
- # print(inviteCode_li)
- for code in inviteCode_li:
- if code.get('memberId', '') == self.memberId:continue
- if code.get('fruit_is_ripe', False): break
- data = {"activityCode": "HXNC-QG",
- "shopId": self.shopid,
- "channel": "512",
- "inviteTicket": code.get('inviteCode', ''), "inviteAction": "watering",
- "inviteShopId": code.get('shopId', '')
- }
- url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?inviteTicket={code}&{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
- # print(response.text)
- if 'code' in response and response.get('code') == 0:
- Log(f'>助力成功')
- elif response.get("message","") == '会员专享功能,请先登录':
- break
- else:
- Log(f'>助力失败,{response.get("message","")}')
-
- ######################成长值任务
- def get_GrowthValue(self):
- Log(f'\n>>>>>>开始成长任务')
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "businessCode": "membershipSystem"
- }
- url = f'https://api.yonghuivip.com/web/member/level/benefit/queryMemberGrowthValueProcess?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- # print(response['data'])
- data = response.get('data',[])
- self.levelNeedGrowthValues = data.get('levelNeedGrowthValues',[])
- if self.levelNeedGrowthValues != None:
- for li in self.levelNeedGrowthValues:
- isCurrentLevel = li.get('isCurrentLevel','')
- # print(isCurrentLevel)
- if isCurrentLevel == True:
- self.levelName = li.get('levelName', '')
- # print(self.levelName)
- currentTotalGrowthValue = li.get('currentTotalGrowthValue', '')
- nextLevelMinGrowthValue = li.get('nextLevelMinGrowthValue', '')
- count = int(nextLevelMinGrowthValue)-int(currentTotalGrowthValue)
- print(f'当前等级:【{self.levelName}】 积分:【{currentTotalGrowthValue}】 升级需要【{count}】')
- break
- else:
- print('--------------')
-
- else:
- Log(f'>获取失败,{response}')
-
- def get_GrowthtaskList(self):
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "businessCode": "membershipSystem",
- "shopId": self.shopid,
- "isOpenPublishNotice": True
- }
- url = f'https://api.yonghuivip.com/web/member/task/listTasks?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- # print(response['data'])
- data = response.get('data',[])
- self.taskCode = data.get('taskCode','')
- # Log(f'>获取到当前签到任务ID:【{self.taskID}】 编码:【{self.taskCode}】')
- if data.get("subTasks",[]) != None:
- for li in data.get("subTasks",[]):
- self.taskID = li.get('taskId','')
- self.taskTitle = li.get('taskTitle','')
- self.doSignTask()
- else:
- print('>>未发现成长值任务')
-
- else:
- Log(f'>获取失败,{response}')
-
- ######################签到任务
- def get_taskList(self):
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "shopId": self.shopid
- }
- url = f'https://api.yonghuivip.com/web/coupon/credit/task/queryTaskInfo?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- # print(response['data'])
- data = response.get('data',[])
- if data:
- self.taskStatus = data.get('taskStatus','')
- self.taskID = data.get('taskId','')
- self.taskTitle = data.get('taskTitle','')
- if self.taskID and self.taskStatus ==0:
- self.doTask()
- else:
- print('>>未发现任务')
-
- else:
- Log(f'>获取失败,{response}')
-
- def doTask(self):
- Log(f'>>>执行{self.taskTitle}')
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "taskId": self.taskID,
- "shopId": self.shopid
- }
- url = f'https://api.yonghuivip.com/web/coupon/credit/task/completeTask?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- data = response['data']
- success = data['success']
- sendNum = data['sendNum']
- if success:
- Log(f'>获取到【{sendNum}】积分')
-
- elif response.get('message','')=='任务已完成,请勿重复点击':
- Log(f'>今日已签到')
- else:
-
- Log(f'>签到失败,{response}')
-
- def doSignTask(self):
- Log(f'>>>执行{self.taskTitle}')
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "taskId": self.taskID,
- "shopId": self.shopid,
- "taskCode": self.taskCode
- }
- url = f'https://api.yonghuivip.com/web/member/task/doTask?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- recive_data = response['data']
- Log(f'>签到成功获取到【{recive_data}】成长值')
- elif response.get('message','')=='任务已完成,请勿重复点击':
- Log(f'>今日已签到')
- else:
-
- Log(f'>签到失败,{response}')
-
- #########助力券任务
- #获取助力券列表
- def listBoostCouponByPage(self):
- global PRIZEID
- print(f'>>>>>>开始获取助力券列表>>>>>>')
- print('默认发起普通用户助力券')
- headers = {
- "Accept": "application/json",
- "Content-Type": "application/json"
- }
- data = {
- "current": 1,
- "size": 20
- }
- url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/listBoostCouponByPage?{self.url_add}'
-
- response = self.do_request(url, headers=headers, data=data)
- # print(response)
- if 'code' in response and response.get('code') == 0:
- # print(response)
-
- coupList = response.get('data')['records']
- for li in coupList:
- #助力券ID
- self.prizeId = li['prizeGameDTO']['prizeId']
- self.needBoostNum = li['prizeGameDTO']['needBoostNum']
- self.remainBoostNum = li['prizeGameDTO']['remainBoostNum']
- self.gameCode = li['prizeGameDTO']['gameCode']
-
- # boosterType 2 新人助力 1普通助力
- self.boosterType = li['prizeGameDTO']['boosterType']
- self.boosterType ="新人" if self.boosterType == 2 else "普通用户"
- self.amount = li['boostCouponVO']['amount']
- self.coupName = li['boostCouponVO']['name']
- # 剩余张数
- self.availableCount = li['boostCouponVO']['availableCount']
- # 使用限制
- self.couponDescription = li['boostCouponVO']['couponDescription']
- self.applicationScope = li['boostCouponVO']['applicationScope']
- self.canApply = li['boostCouponVO']['canApply']
- copuname = f'{self.amount}元{self.coupName}'
- # if COPU_NAME == copuname:
- # PRIZEID = self.prizeId
- self.canApply = "可发起" if self.canApply != -1 else "不可发起"
- if self.canApply != -1 and self.boosterType == '普通用户':
- self.getGameCode()
- if self.gameCode:
- gamecode_data = {
- 'name': f'{self.amount}元{self.coupName}',
- 'prizeId': self.prizeId,
- 'gameCode': self.gameCode
- }
- self.gamecode_li.append(gamecode_data)
- if self.index == 1:
- GameCode.append(gamecode_data)
- print(f'-----【{self.amount}元{self.coupName}】----')
- print(f'prizeId:【{self.prizeId}】\n需要【{self.needBoostNum}】个[{self.boosterType}]助力,仍需:【{self.remainBoostNum}】 {self.canApply}】 \n使用限制:【{self.couponDescription} {self.applicationScope}】\ngameCode:【{self.gameCode}】')
-
- # print('第一个账号gamecodeli:',GameCode)
- # print(self.gamecode_li)
- print(f'>>>>>>获取助力券列表结束>>>>>>')
-
- #根据prizeId获取gameCode
- def getGameCode(self):
- global GameCode
- # print(f'>>开始获取prizeID:【{self.prizeId}】gameCode')
- headers = {
- "Accept": "*/*"
- }
-
- url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/getGameCode?prizeId={self.prizeId}&gameCode=&{self.url_add}'
-
- response = self.do_request(url, headers=headers, req_type='get')
- # print(response)
- if 'code' in response and response.get('code') == 0:
- # print(response)
- self.gameCode = response.get('data')
- #保存到json
- if self.gameCode:
- gamecode_data ={
- 'name':f'{self.amount}元{self.coupName}',
- 'prizeId':self.prizeId,
- 'gameCode':self.gameCode
- }
- if self.index == 1:
- GameCode.append(gamecode_data)
- print(f'>>获取到gameCode:【{self.gameCode}】')
- else:
- print('>>未获取到gameCode')
- elif response.get('message','') =='您今日发起活动次数已达上限,请明日再来':
- self.canDoApply = False
- else:
- print(response.get('message'))
-
- #助力助力券
- def Boostcoupon(self,gameCodeLi=None):
- global AuthorCode
-
- print(f'>>>开始领券助力')
- # print('GameCode:',GameCode)
- # print('AuthorCode:',inviteCode)
- if gameCodeLi==None:
- print('>>第一个账号开始为作者助力')
- for codeli in AuthorCode:
- if not self.canhelp_coup:
- print(f'>>>助力次数上限')
- return
- # print(codeli)
- gameCode = codeli.get('gameCode', [{}])
- memberId = codeli.get('memberId', '')
- if memberId == self.memberId: continue
- for Codes in gameCode:
- code = Codes.get('gameCode', '')
- self.copuHelp(code)
- else:
- code_list = list(inviteCode.values())
- print('>>开始为第一个账号助力')
- if not self.canhelp_coup:
- print(f'>>>助力次数上限')
- return
- gameCode = code_list[0].get('gameCode', [{}])
- for Codes in gameCode:
- code = Codes.get('gameCode', '')
- self.copuHelp(code)
- # for codeli in GameCode:
- # if not self.canhelp_coup: return
- # print(codeli)
- # code = codeli.get('gameCode', [{}])
- # self.copuHelp(code)
-
-
- def copuHelp(self,code):
- headers = {
- "Accept": "*/*"
- }
- url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/boost?gameCode={code}&{self.url_add}'
- response = self.do_request(url, headers=headers, req_type='get')
- if 'code' in response and response.get('code') == 0:
- # print(response)
- Log(f'>{code},助力成功!')
- return True
- elif response.get('message') == '每日助力次数超过限制':
- self.canhelp_coup = False
- return False
- else:
- # print(f">{code},助力失败{response.get('message')}!")
- return False
-
-
- #########试用任务
- def tryList(self,levelName=None):
- if not levelName:
- self.levelName = '黄金'
- if self.levelName == '普通':
- Log(f'当前等级【{self.levelName}】不达标,停止试用申请')
- else:
- Log(f'>>>开始试用申请')
- headers = {
- 'Accept': '*/*'
- }
- url = f'https://api.yonghuivip.com/web/marketing/free/trial/issue/prize/landing/page?{self.url_add}'
- response = self.do_request(url, headers=headers, req_type='get')
-
- if 'code' in response and response.get('code') == 0:
- # print(response)
- if response['data']['tip'] == '本期活动报名已结束,敬请期待下期活动':
- Log('>>本期活动报名已结束,敬请期待下期活动')
- return False
- goodsList = response['data']['currTab']['landingPagePrizeVOList']
- for liId in goodsList:
- buttonStateName = liId['buttonStateName']
- self.skuTitle = liId['skuTitle']
- self.prizeId = liId['prizeId']
- if buttonStateName != '已报名':
- print(f'>>产品:【{self.skuTitle}】 ID:【{self.prizeId}】【可申请】')
- self.doTry()
- else:
- print(f'>>产品:【{self.skuTitle}】【已申请,跳过】')
-
- else:
- Log(f'>获取失败,{response}')
-
- def doTry(self):
- print(f'>>开始申请【{self.skuTitle}】')
- headers = {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- }
- data = {
- "prizeId": self.prizeId
- }
- url = f'https://api.yonghuivip.com/web/marketing/free/trial/sign/up/fire?{self.url_add}'
- response = self.do_request(url, headers=headers, data=data)
-
- if 'code' in response and response.get('code') == 0:
- # print(response)
- Log(f'>{self.skuTitle},申请成功!')
- else:
- Log(f'>{self.skuTitle},申请失败,{response}')
-
- def get_WinTryList(self):
- print(f'>>>>>>获取已中奖列表>>>>>>')
- headers = {
- 'Accept': '*/*',
- }
- url = f'https://api.yonghuivip.com/web/marketing/free/trial/issue/participated/detail?fromType=1&pageNum=1&{self.url_add}'
- response = self.do_request(url, headers=headers,req_type='get')
- if 'code' in response and response.get('code') == 0:
- data = response.get('data')
- participatedVOList = data.get('participatedVOList')
- for li in participatedVOList:
- skuTitle = li['skuTitle']
- skuPrice = li['skuPrice']
- status = li['status']
- #1已报名 2待领券 3未中奖 4待兑换
- if status == 2:
- Log(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【待领券】')
- elif status == 4:
- Log(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【待兑换】')
- elif status == 6:
- print(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【已过期】')
- elif status == 5:
- print(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【已兑换】')
- else:
- print(f'商品:【{skuTitle}】 价格:【{skuPrice}】')
- # print(response)
- else:
- print(f'>申请失败,{response}')
- def help_fun(self):
- print(f"\n>>>>>>>>>>开始互助<<<<<<<<<<")
- one_msg = ''
- if not self.getCredit():
- return False
- # # pass
- # Log(f"\n********账号【{self.index}】果园互助********")
- # self.helpAuthor()
- # self.helpOther()
- Log(f"\n********账号【{self.index}】组队互助********")
- self.joinAuthorTeam()
- self.joinTeam()
- self.sendMsg(True)
- return True
- def main(self):
- global one_msg
- wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
- one_msg = ''
- Log(f"\n---------开始执行第{self.index}个账号>>>>>")
- if not self.getCredit():
- return False
- self.sign()
- self.teamDetail()
- self.get_taskList()
- self.creatTeam()
- self.get_GrowthValue()
- self.get_GrowthtaskList()
- Log(f'\n>>>>>>开始试用任务')
- self.get_WinTryList()
- self.tryList()
- Log('\n>>>>>>开始助力券任务')
- self.listBoostCouponByPage()
- if self.index == 1:
- self.Boostcoupon()
- else:
- self.Boostcoupon(GameCode)
- new_data = {
- self.memberId:
- {
- 'memberId': self.memberId,
- 'gameCode': self.gamecode_li,
- 'fruit_is_ripe': self.fruit_is_ripe,
- # 'inviteCode': self.inviteTicket,
- 'teamCode': self.teamCode,
- 'shopId': self.shopid
- }
- }
- # print(new_data)
- inviteCode.update(new_data)
- # print(f'当前inviteCode:\n{inviteCode}')
- CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/YHSH_INVITE_CODE.json", new_data)
- 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)
-
-
-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
-
-def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
- import CHERWIN_TOOLS
- ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
-
-if __name__ == '__main__':
- APP_NAME='永辉生活'
- ENV_NAME = 'YHSH'
- CK_NAME = 'url'
- print(f'''
-✨✨✨ {APP_NAME}脚本✨✨✨
-✨ 功能:
- 积分签到
- 种树
- 种树任务
- 成长值任务
- 试用申请
- 果园互助
- 组队互助
- 助力券助力
-✨ 抓包步骤:
- 打开永辉生活APP或小程序
- 点击“我的”
- 打开抓包工具
- 点击“积分签到”,找到带以下参数的链接复制:
- -deviceid
- -jysessionid
- -shopid
- -memberid
- -access_token
- -sign
-链接示例:https://api.yonghuivip.com/web/coupon/credit/coupon/getcreditcouponpageinfo/v2?xxxxx
-✨ ✨✨wxpusher一对一推送功能,
- ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
- ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
-✨ 设置青龙变量:
-export {ENV_NAME}='{CK_NAME}'多账号#分割
-export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-✨ 默认每个账号随机助力作者一次,其余互助,后续考虑加上邀请池
-✨✨✨ @Author CHERWIN✨✨✨
- ''')
- local_script_name = os.path.basename(__file__)
- local_version = '2024.04.17'
- if os.path.isfile('CHERWIN_TOOLS.py'):
- import_Tools()
- else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
- import_Tools()
- else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
- print(TIPS)
- token = ''
- token = ENV if ENV else token
- if not token:
- print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
- exit()
- tokens = token.split('#')
- # print(tokens)
- if len(tokens) > 0:
- print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
- for index, infos in enumerate(tokens):
- run_result = RUN(infos, index).main()
- if not run_result:continue
- for index, infos in enumerate(tokens):
- RUN(infos, index).help_fun()
- if not run_result: continue
- if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
-
+'''
+!/usr/bin/python3
+-- coding: utf-8 --
+-------------------------------
+✨✨✨ @Author CHERWIN✨✨✨
+cron "51 8,21 * * *" script-path=xxx.py,tag=匹配cron用
+const $ = new Env('永辉生活')
+'''
+import hashlib
+import json
+import os
+import random
+import time
+import urllib
+from os import environ, path
+from sys import exit
+from urllib.parse import quote, urlparse, parse_qs
+
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+# 禁用安全请求警告
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+IS_DEV = False
+if os.path.isfile('DEV_ENV.py'):
+ import DEV_ENV
+ IS_DEV = True
+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'
+
+inviteCode = {}
+GameCode=[]
+PRIZEID = ''
+
+
+class RUN:
+ def __init__(self, info,index):
+ global one_msg
+ one_msg = ''
+ split_info = info.split('@')
+ token = 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.s = requests.session()
+ self.s.verify = False
+ self.UA = 'Mozilla/5.0 (Linux; Android 11; Mi9 Pro 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36YhStore/9.6.0.14 cn.yonghui.hyd/2022946000 (client/phone; Android 30; Xiaomi/Mi9 Pro 5G)'
+ self.headers = {
+ 'Host': 'api.yonghuivip.com',
+ 'Connection': 'keep-alive',
+ 'User-Agent': self.UA,
+ 'X-YH-Context': 'origin=h5&morse=1',
+ 'Accept': '*/*',
+ 'Origin': 'https://m.yonghuivip.com',
+ 'X-Requested-With': 'cn.yonghui.hyd',
+ 'Sec-Fetch-Site': 'same-site',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Referer': 'https://m.yonghuivip.com/',
+ # 'Accept-Encoding': 'gzip, deflate, br',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
+ }
+ # 创建一个字典来存储参数
+ data = {}
+ # 解析第一个URL并提取参数
+ parsed_url1 = urlparse(token)
+ # print(parsed_url1)
+ self.data_dict = parse_qs(parsed_url1.query)
+ # print(self.data_dict)
+ self.url_add = token.split('?')[1]
+ # print(self.data_dict)
+ self.fruit_is_ripe = False
+ self.gameCode =''
+ if self.data_dict.get('memberid') :
+ self.memberId = self.data_dict.get('memberid',[])[0]
+ else:
+ self.memberId = self.data_dict.get('memberId', [])[0]
+ if self.data_dict.get('shopid') :
+ self.shopid = self.data_dict.get('shopid',[])[0]
+ else:
+ self.shopid = '9M7M'
+ self.url_add =f'{self.url_add}&shopid={self.shopid}'
+ print(self.shopid)
+ self.gamecode_li = []
+ self.canJoinTeam = True
+ self.canhelp_coup = True
+ self.teamCode = ''
+
+
+ # 将参数转换为字典
+ def create_dict_from_string(self, data_string):
+ params = {}
+ key_value_pairs = data_string.split(',')
+ for pair in key_value_pairs:
+ key, value = pair.split('=')
+ params[key] = value
+ return params
+
+ # 发送请求函数
+ def do_request(self, url, data={}, req_type='post', headers={}):
+ if headers == {}:
+ headers = self.headers
+ try:
+ if req_type.lower() == 'get':
+ response = self.s.get(url, headers=headers)
+ elif req_type.lower() == 'post':
+ response = self.s.post(url, headers=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
+
+ def getCredit(self):
+ Log(f'\n>>>>>>获取积分信息')
+ headers = {
+ 'Accept': '*/*'
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/credit/details/?page=0&{self.url_add}'
+ response = self.do_request(url, req_type='get', headers=headers)
+ # print(response)
+
+ if 'code' in response and response.get('code','') == 0:
+ credit = response.get('data')['credit']
+ self.sign_count = response.get('data')['count']
+
+ Log(f'>当前用户:{self.memberId}\n>当前积分:{credit}')
+ # Log(f'>>>累计签到:{self.sign_count}天')
+ return True
+ elif response.get("message", "") == '登录状态已失效,请重新登录':
+ if send:send('永辉生活账号失效通知', f'账号:{self.index} ID:{self.memberId}已失效,请重新抓包')
+ else:
+ Log(f'>获取积分信息失败')
+ # print(response)
+ return False
+
+ def sign(self):
+ Log(f'\n>>>>>>开始执行签到')
+ headers = {
+ 'Accept': 'application/json'
+ }
+
+ data = {
+ "memberId": self.memberId,
+ "shopid": self.shopid,
+ "missionid": "39"
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/signreward/sign?{self.url_add}'
+ response = self.do_request(url, headers=headers,data=data)
+ # print(response)
+
+ if 'code' in response and response.get('code') == 0:
+ Log(f'>签到成功')
+ Log(f'>累计签到:{int(self.sign_count) + 1}天')
+ self.getCredit()
+ return True
+ elif '任务已完成,请勿重复点击' in response:
+ Log(f'>今日已签到')
+ else:
+ Log(f'>签到失败,{response.get("message")}')
+ return False
+
+ def teamDetail(self):
+ Log(f'\n>>>>>>开始获取组队详情')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ data = {
+ "createTeamFlag": True,
+ "shopId": self.shopid,
+ }
+
+ url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/teamDetail?{self.url_add}'
+ response = self.do_request(url, headers=headers,data=data)
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data',{})
+ if data != {}:
+ self.teamCode = data.get('teamCode','')
+ subTitle = data.get('subTitle','')
+ print(f'战队ID:【{self.teamCode}】 状态:【{subTitle}】')
+ new_data={
+ self.memberId:{
+ 'teamCode':self.teamCode
+ }
+ }
+ inviteCode.update(new_data)
+ print(inviteCode)
+ else:
+ print('未查询到战队,开始创建')
+ self.creatTeam()
+ else:
+ print(f'>创建战队失败,{response.get("message")}')
+
+ def creatTeam(self):
+ Log(f'\n>>>>>>开始组队任务')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ data = {
+ "shopId": self.shopid,
+ }
+
+ url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/createTeam?{self.url_add}'
+ response = self.do_request(url, headers=headers,data=data)
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data',{})
+ self.teamCode = data.get('teamCode', '')
+ subTitle = data.get('subTitle', '')
+ Log(f'创建战队成功,ID:【{self.teamCode}】 状态:【{subTitle}】')
+ new_data = {
+ self.memberId: {
+ 'teamCode': self.teamCode
+ }
+ }
+ inviteCode.update(new_data)
+ else:
+ print(f'>创建战队失败,{response.get("message")}')
+
+ def joinAuthorTeam(self):
+ print(f'>>>开始加入作者队伍')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ if len(AuthorCode) >0 :
+ for code in AuthorCode:
+ if not self.canJoinTeam:break
+ data = {
+ "teamCode": code.get('teamCode'),
+ "shopId": self.shopid
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/joinTheParty?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+ if 'code' in response and response.get('code') == 0:
+ print(f'加入战队成功')
+ break
+ elif response.get('message') == '达到1天内组队上限':
+ self.canJoinTeam = False
+
+ def joinTeam(self):
+ Log(f'>>>开始本地账号组队')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ inviteCode_li = list(inviteCode.values())
+ # print(inviteCode_li)
+ for code in inviteCode_li:
+ if not self.canJoinTeam:
+ print('达到1天内组队上限')
+ break
+ data = {
+ "teamCode": code.get('teamCode'),
+ "shopId": self.shopid
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/credit/dividePoint/joinTheParty?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ Log(f'组队成功')
+ break
+ elif response.get("message","") == '会员专享功能,请先登录':
+ break
+ elif response.get('message') == '达到1天内组队上限':
+ self.canJoinTeam = False
+ else:
+ Log(f'>组队失败,{response.get("message")}')
+
+ def farmInfo(self):
+ headers = {
+ 'Accept': '*/*'
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/info?{self.url_add}'
+ response = self.do_request(url, headers=headers, req_type='get')
+ # print(response)
+
+ if 'code' in response and response.get('code') == 0:
+ self.parentId = response.get('data',[])['parentId']
+ self.memberAmount = response.get('data',[])['memberAmount']
+ self.ladderText = response.get('data',[]).get('ladderText','')
+ Log(f'>>>当前水滴:{self.memberAmount}')
+ Log(f'>>>当前水果进度:{self.ladderText}')
+ if self.ladderText == '再浇水0%,果树就要成熟了':
+ self.fruit_is_ripe = True
+ inviteCode[self.memberId]['fruit_is_ripe'] = self.fruit_is_ripe
+
+ return True
+ else:
+ Log(f'>>>获取果园信息失败\n{response}')
+ return False
+
+ def plantFruit_sign(self):
+ Log(f'>>>开始果园签到')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ data = {
+ "taskType": "sign",
+ "activityCode": "HXNC-QG",
+ "shopId": "",
+ "channel": ""
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/doTask?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+ # print(response)
+
+ if 'code' in response and response.get('code') == 0:
+ signText = response.get('data')['signText']
+ Log(f'>>>{signText}')
+ return True
+ else:
+ Log(f'>>>果园签到失败\n{response}')
+ return False
+
+ def plantFruit_getTaskList(self):
+ print(f'>>>获取任务列表')
+ headers = {
+ 'Accept': '*/*'
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/task/list?activityCode=HXNC-QG&&parentId={self.parentId}&{self.url_add}'
+ response = self.do_request(url, headers=headers, req_type='get')
+ # print(response)
+
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data')
+ for i in data:
+ subType = i['subType']
+ title = i['title']
+ finished = i['finished']
+ self.taskId = i['taskId']
+ self.rewardid = i.get('rewardId', '')
+ # print(self.rewardid)
+ if subType == 'activityPage' and finished != 1:
+ actionUrl = i['actionUrl']
+ # 解码URL
+ decoded_url = urllib.parse.unquote(actionUrl)
+ decoded_url = decoded_url.replace('pid=null', f'pid={self.parentId}')
+ # print(decoded_url)
+ parsed_url = urllib.parse.urlparse(decoded_url)
+ query_params = urllib.parse.parse_qs(parsed_url.query)
+ self.aid = query_params.get("aid", [None])[0]
+ self.taskid = query_params.get("taskid", [None])[0]
+ # print(self.aid)
+ # 提取aid后面的字符串
+ index = decoded_url.find("&aid=")
+ if index != -1:
+ toUrl = f'?aid={decoded_url[index + 5:]}'
+ else:
+ toUrl = ""
+ self.doFruitTask(title, toUrl)
+ if self.rewardid != '':
+ print('检测到有可收取任务')
+ self.receive_water()
+ return True
+ else:
+ print(response)
+ return False
+
+ def doFruitTask(self, title, toUrl):
+ print(f'>>>开始做任务{title}')
+ params = {"platform": "android",
+ "v": "9.6.0.14",
+ "channel": "2",
+ "distinctId": "",
+ "proportion": 2.75,
+ "screen": "1080.75*2340.25",
+ "pagesize": 6,
+ "networkType": "wifi",
+ "aid": self.aid,
+ "versionpro": "2",
+ "appType": "h5",
+ "model": "Mi9 Pro 5G",
+ "os": "android",
+ "osVersion": "android30",
+ "channelSub": "",
+ "brand": "Xiaomi",
+ "productLine": "YhStore",
+ "salesChannel": "",
+ "deviceid": "",
+ "sellerid": "7",
+ "shopid": "90B3",
+ "uid": "",
+ "access_token": "",
+ "showmultiseller": "",
+ "shopName": "",
+ "isOldEdition": False,
+ "userid": "",
+ "pageid": self.aid,
+ "pid": self.parentId,
+ "taskid": self.taskid,
+ "sceneValue": "4",
+ "memberId": ""
+ }
+
+ headers = {
+ 'Accept': 'application/json, text/plain, */*',
+ "Content-Type": "application/json;charset=UTF-8",
+ "Connection": "keep-alive",
+ "Connection": "keep-alive"
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/dailyreward/browse{toUrl}&{self.url_add}'
+ response = self.do_request(url, headers=headers, data=params)
+ # print(response)
+
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data')['title']
+ Log(f'>{data}')
+ return True
+ else:
+ return False
+
+ def receive_inviteWater(self):
+ headers = {
+ 'Accept': '*/*'
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/invitation/bubble?activityCode=HXNC-QG&{self.url_add}'
+ # print(url)
+ response =self.do_request(url, headers=headers,req_type='get')
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ data = response['data']['inviteWaterBubble']
+ if data != []:
+ Log(f'>>>开始领取邀请奖励')
+ for task in data:
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/receiveWater?{self.url_add}'
+ headers = {
+ "Content-Type": "application/json",
+ "Accept": "application/json"
+ }
+ data = {"taskId": task['taskId'], "id": task['rewardId'], "activityCode": "HXNC-QG"}
+ response = requests.post(url, headers=headers, json=data,verify=False).json()
+ if 'code' in response and response.get('code') == 0:
+ receiveAmount = response['data']['receiveAmount']
+ print(f'>成功收取【{receiveAmount}】水滴')
+ else:
+ print(f'>收取失败,{response}')
+ else:
+ print('>没有可领取的邀请奖励')
+ else:
+ print(f'>领取邀请奖励失败,{response}')
+
+ def receive_water(self,taskType=None):
+ print(f'>>>开始领取奖励')
+ headers = {
+ "Content-Type": "application/json",
+ "Accept": "application/json"
+ }
+ data = {
+ "taskId": self.taskId,
+ "id": self.rewardid,
+ "activityCode": "HXNC-QG"}
+ if taskType != None:
+ data['taskType'] = "activityPage"
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/receiveWater?{self.url_add}'
+ # print(url)
+
+ response =self.do_request(url, headers=headers, data=data)
+ # response =requests.post(url, headers=headers, json=data)
+ # if response:
+ # response = response.json()
+ if 'code' in response and response.get('code') == 0:
+ receiveAmount = response['data']['receiveAmount']
+ print(f'>成功收取【{receiveAmount}】水滴')
+ else:
+ print(f'>收取失败,{response}')
+
+ def watering(self):
+ self.farmInfo()
+ if int(self.memberAmount / 10) > 1 :
+ print(f'>>>开始浇水')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ data = {"activityCode": "HXNC-QG", "shopId": "", "channel": "", "inviteTicket": "", "inviteShopId": ""}
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?{self.url_add}'
+ for i in range(int(self.memberAmount / 10)):
+
+ response = self.do_request(url, headers=headers, data=data)
+ # print(response.text)
+ if 'code' in response and response.get('code') == 0:
+ print(f'>第{i + 1}次浇水成功')
+ elif response.get('message') == '果树已经成熟啦,快去领取奖励吧':
+ print(f'>果树已经成熟啦')
+ self.fruit_is_ripe = True
+
+ inviteCode[self.memberId]['fruit_is_ripe'] = self.fruit_is_ripe
+
+ break
+ else:
+ print(f'>浇水失败,{response}')
+ else:
+ print('>水滴不足,停止浇水')
+
+ def get_inviteTicket(self):
+ print(f'>>>开始获取果园邀请码')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ data = {"inviteAction": "802"}
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/invite/ticket?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+ # print(response)
+ if 'code' in response and response.get('code','') == 0:
+ self.inviteTicket = response.get('data')
+ print(f'果园邀请码:{self.inviteTicket}')
+ inviteCode[self.memberId]['inviteCode']=self.inviteTicket
+ inviteCode[self.memberId]['shopId']=self.shopid
+
+ else:
+ print(f'>获取果园邀请码失败,{response}')
+
+ def helpAuthor(self):
+ print(f'>>>开始助力作者')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ for code in AuthorCode:
+ if code.get('memberId', '') == self.memberId: continue
+ if code.get('fruit_is_ripe',False):break
+ data={
+ "activityCode":"HXNC-QG",
+ "shopId":self.shopid,
+ "channel":"512",
+ "inviteTicket":code.get('inviteCode',''),"inviteAction":"watering","inviteShopId":code.get('shopId','')
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?inviteTicket={code}&{self.url_add}'
+ response = self.do_request(url, headers=headers,data=data)
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ Log(f'>助力作者成功')
+ break
+ elif response.get("message","") == '会员专享功能,请先登录':
+ break
+ else:
+ pass
+ # Log(f'>助力作者失败,{response.get("message","")}')
+
+ def helpOther(self):
+ Log(f'>>>开始本地账号互助')
+ headers = {
+ 'Accept': 'application/json'
+ }
+ inviteCode_li = list(inviteCode.values())
+ # print(inviteCode_li)
+ for code in inviteCode_li:
+ if code.get('memberId', '') == self.memberId:continue
+ if code.get('fruit_is_ripe', False): break
+ data = {"activityCode": "HXNC-QG",
+ "shopId": self.shopid,
+ "channel": "512",
+ "inviteTicket": code.get('inviteCode', ''), "inviteAction": "watering",
+ "inviteShopId": code.get('shopId', '')
+ }
+ url = f'https://activity.yonghuivip.com/api/web/flow/farm/watering?inviteTicket={code}&{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+ # print(response.text)
+ if 'code' in response and response.get('code') == 0:
+ Log(f'>助力成功')
+ elif response.get("message","") == '会员专享功能,请先登录':
+ break
+ else:
+ Log(f'>助力失败,{response.get("message","")}')
+
+ ######################成长值任务
+ def get_GrowthValue(self):
+ Log(f'\n>>>>>>开始成长任务')
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "businessCode": "membershipSystem"
+ }
+ url = f'https://api.yonghuivip.com/web/member/level/benefit/queryMemberGrowthValueProcess?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ # print(response['data'])
+ data = response.get('data',[])
+ self.levelNeedGrowthValues = data.get('levelNeedGrowthValues',[])
+ if self.levelNeedGrowthValues != None:
+ for li in self.levelNeedGrowthValues:
+ isCurrentLevel = li.get('isCurrentLevel','')
+ # print(isCurrentLevel)
+ if isCurrentLevel == True:
+ self.levelName = li.get('levelName', '')
+ # print(self.levelName)
+ currentTotalGrowthValue = li.get('currentTotalGrowthValue', '')
+ nextLevelMinGrowthValue = li.get('nextLevelMinGrowthValue', '')
+ count = int(nextLevelMinGrowthValue)-int(currentTotalGrowthValue)
+ print(f'当前等级:【{self.levelName}】 积分:【{currentTotalGrowthValue}】 升级需要【{count}】')
+ break
+ else:
+ print('--------------')
+
+ else:
+ Log(f'>获取失败,{response}')
+
+ def get_GrowthtaskList(self):
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "businessCode": "membershipSystem",
+ "shopId": self.shopid,
+ "isOpenPublishNotice": True
+ }
+ url = f'https://api.yonghuivip.com/web/member/task/listTasks?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ # print(response['data'])
+ data = response.get('data',[])
+ self.taskCode = data.get('taskCode','')
+ # Log(f'>获取到当前签到任务ID:【{self.taskID}】 编码:【{self.taskCode}】')
+ if data.get("subTasks",[]) != None:
+ for li in data.get("subTasks",[]):
+ self.taskID = li.get('taskId','')
+ self.taskTitle = li.get('taskTitle','')
+ self.doSignTask()
+ else:
+ print('>>未发现成长值任务')
+
+ else:
+ Log(f'>获取失败,{response}')
+
+ ######################签到任务
+ def get_taskList(self):
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "shopId": self.shopid
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/credit/task/queryTaskInfo?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ # print(response['data'])
+ data = response.get('data',[])
+ if data:
+ self.taskStatus = data.get('taskStatus','')
+ self.taskID = data.get('taskId','')
+ self.taskTitle = data.get('taskTitle','')
+ if self.taskID and self.taskStatus ==0:
+ self.doTask()
+ else:
+ print('>>未发现任务')
+
+ else:
+ Log(f'>获取失败,{response}')
+
+ def doTask(self):
+ Log(f'>>>执行{self.taskTitle}')
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "taskId": self.taskID,
+ "shopId": self.shopid
+ }
+ url = f'https://api.yonghuivip.com/web/coupon/credit/task/completeTask?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ data = response['data']
+ success = data['success']
+ sendNum = data['sendNum']
+ if success:
+ Log(f'>获取到【{sendNum}】积分')
+
+ elif response.get('message','')=='任务已完成,请勿重复点击':
+ Log(f'>今日已签到')
+ else:
+
+ Log(f'>签到失败,{response}')
+
+ def doSignTask(self):
+ Log(f'>>>执行{self.taskTitle}')
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "taskId": self.taskID,
+ "shopId": self.shopid,
+ "taskCode": self.taskCode
+ }
+ url = f'https://api.yonghuivip.com/web/member/task/doTask?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ recive_data = response['data']
+ Log(f'>签到成功获取到【{recive_data}】成长值')
+ elif response.get('message','')=='任务已完成,请勿重复点击':
+ Log(f'>今日已签到')
+ else:
+
+ Log(f'>签到失败,{response}')
+
+ #########助力券任务
+ #获取助力券列表
+ def listBoostCouponByPage(self):
+ global PRIZEID
+ print(f'>>>>>>开始获取助力券列表>>>>>>')
+ print('默认发起普通用户助力券')
+ headers = {
+ "Accept": "application/json",
+ "Content-Type": "application/json"
+ }
+ data = {
+ "current": 1,
+ "size": 20
+ }
+ url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/listBoostCouponByPage?{self.url_add}'
+
+ response = self.do_request(url, headers=headers, data=data)
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ # print(response)
+
+ coupList = response.get('data')['records']
+ for li in coupList:
+ #助力券ID
+ self.prizeId = li['prizeGameDTO']['prizeId']
+ self.needBoostNum = li['prizeGameDTO']['needBoostNum']
+ self.remainBoostNum = li['prizeGameDTO']['remainBoostNum']
+ self.gameCode = li['prizeGameDTO']['gameCode']
+
+ # boosterType 2 新人助力 1普通助力
+ self.boosterType = li['prizeGameDTO']['boosterType']
+ self.boosterType ="新人" if self.boosterType == 2 else "普通用户"
+ self.amount = li['boostCouponVO']['amount']
+ self.coupName = li['boostCouponVO']['name']
+ # 剩余张数
+ self.availableCount = li['boostCouponVO']['availableCount']
+ # 使用限制
+ self.couponDescription = li['boostCouponVO']['couponDescription']
+ self.applicationScope = li['boostCouponVO']['applicationScope']
+ self.canApply = li['boostCouponVO']['canApply']
+ copuname = f'{self.amount}元{self.coupName}'
+ # if COPU_NAME == copuname:
+ # PRIZEID = self.prizeId
+ self.canApply = "可发起" if self.canApply != -1 else "不可发起"
+ if self.canApply != -1 and self.boosterType == '普通用户':
+ self.getGameCode()
+ if self.gameCode:
+ gamecode_data = {
+ 'name': f'{self.amount}元{self.coupName}',
+ 'prizeId': self.prizeId,
+ 'gameCode': self.gameCode
+ }
+ self.gamecode_li.append(gamecode_data)
+ if self.index == 1:
+ GameCode.append(gamecode_data)
+ print(f'-----【{self.amount}元{self.coupName}】----')
+ print(f'prizeId:【{self.prizeId}】\n需要【{self.needBoostNum}】个[{self.boosterType}]助力,仍需:【{self.remainBoostNum}】 {self.canApply}】 \n使用限制:【{self.couponDescription} {self.applicationScope}】\ngameCode:【{self.gameCode}】')
+
+ # print('第一个账号gamecodeli:',GameCode)
+ # print(self.gamecode_li)
+ print(f'>>>>>>获取助力券列表结束>>>>>>')
+
+ #根据prizeId获取gameCode
+ def getGameCode(self):
+ global GameCode
+ # print(f'>>开始获取prizeID:【{self.prizeId}】gameCode')
+ headers = {
+ "Accept": "*/*"
+ }
+
+ url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/getGameCode?prizeId={self.prizeId}&gameCode=&{self.url_add}'
+
+ response = self.do_request(url, headers=headers, req_type='get')
+ # print(response)
+ if 'code' in response and response.get('code') == 0:
+ # print(response)
+ self.gameCode = response.get('data')
+ #保存到json
+ if self.gameCode:
+ gamecode_data ={
+ 'name':f'{self.amount}元{self.coupName}',
+ 'prizeId':self.prizeId,
+ 'gameCode':self.gameCode
+ }
+ if self.index == 1:
+ GameCode.append(gamecode_data)
+ print(f'>>获取到gameCode:【{self.gameCode}】')
+ else:
+ print('>>未获取到gameCode')
+ elif response.get('message','') =='您今日发起活动次数已达上限,请明日再来':
+ self.canDoApply = False
+ else:
+ print(response.get('message'))
+
+ #助力助力券
+ def Boostcoupon(self,gameCodeLi=None):
+ global AuthorCode
+
+ print(f'>>>开始领券助力')
+ # print('GameCode:',GameCode)
+ # print('AuthorCode:',inviteCode)
+ if gameCodeLi==None:
+ print('>>第一个账号开始为作者助力')
+ for codeli in AuthorCode:
+ if not self.canhelp_coup:
+ print(f'>>>助力次数上限')
+ return
+ # print(codeli)
+ gameCode = codeli.get('gameCode', [{}])
+ memberId = codeli.get('memberId', '')
+ if memberId == self.memberId: continue
+ for Codes in gameCode:
+ code = Codes.get('gameCode', '')
+ self.copuHelp(code)
+ else:
+ code_list = list(inviteCode.values())
+ print('>>开始为第一个账号助力')
+ if not self.canhelp_coup:
+ print(f'>>>助力次数上限')
+ return
+ gameCode = code_list[0].get('gameCode', [{}])
+ for Codes in gameCode:
+ code = Codes.get('gameCode', '')
+ self.copuHelp(code)
+ # for codeli in GameCode:
+ # if not self.canhelp_coup: return
+ # print(codeli)
+ # code = codeli.get('gameCode', [{}])
+ # self.copuHelp(code)
+
+
+ def copuHelp(self,code):
+ headers = {
+ "Accept": "*/*"
+ }
+ url = f'https://api.yonghuivip.com/web/marketing/boostcoupon/boost?gameCode={code}&{self.url_add}'
+ response = self.do_request(url, headers=headers, req_type='get')
+ if 'code' in response and response.get('code') == 0:
+ # print(response)
+ Log(f'>{code},助力成功!')
+ return True
+ elif response.get('message') == '每日助力次数超过限制':
+ self.canhelp_coup = False
+ return False
+ else:
+ # print(f">{code},助力失败{response.get('message')}!")
+ return False
+
+
+ #########试用任务
+ def tryList(self,levelName=None):
+ if not levelName:
+ self.levelName = '黄金'
+ if self.levelName == '普通':
+ Log(f'当前等级【{self.levelName}】不达标,停止试用申请')
+ else:
+ Log(f'>>>开始试用申请')
+ headers = {
+ 'Accept': '*/*'
+ }
+ url = f'https://api.yonghuivip.com/web/marketing/free/trial/issue/prize/landing/page?{self.url_add}'
+ response = self.do_request(url, headers=headers, req_type='get')
+
+ if 'code' in response and response.get('code') == 0:
+ # print(response)
+ if response['data']['tip'] == '本期活动报名已结束,敬请期待下期活动':
+ Log('>>本期活动报名已结束,敬请期待下期活动')
+ return False
+ goodsList = response['data']['currTab']['landingPagePrizeVOList']
+ for liId in goodsList:
+ buttonStateName = liId['buttonStateName']
+ self.skuTitle = liId['skuTitle']
+ self.prizeId = liId['prizeId']
+ if buttonStateName != '已报名':
+ print(f'>>产品:【{self.skuTitle}】 ID:【{self.prizeId}】【可申请】')
+ self.doTry()
+ else:
+ print(f'>>产品:【{self.skuTitle}】【已申请,跳过】')
+
+ else:
+ Log(f'>获取失败,{response}')
+
+ def doTry(self):
+ print(f'>>开始申请【{self.skuTitle}】')
+ headers = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ }
+ data = {
+ "prizeId": self.prizeId
+ }
+ url = f'https://api.yonghuivip.com/web/marketing/free/trial/sign/up/fire?{self.url_add}'
+ response = self.do_request(url, headers=headers, data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ # print(response)
+ Log(f'>{self.skuTitle},申请成功!')
+ else:
+ Log(f'>{self.skuTitle},申请失败,{response}')
+
+ def get_WinTryList(self):
+ print(f'>>>>>>获取已中奖列表>>>>>>')
+ headers = {
+ 'Accept': '*/*',
+ }
+ url = f'https://api.yonghuivip.com/web/marketing/free/trial/issue/participated/detail?fromType=1&pageNum=1&{self.url_add}'
+ response = self.do_request(url, headers=headers,req_type='get')
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data')
+ participatedVOList = data.get('participatedVOList')
+ for li in participatedVOList:
+ skuTitle = li['skuTitle']
+ skuPrice = li['skuPrice']
+ status = li['status']
+ #1已报名 2待领券 3未中奖 4待兑换
+ if status == 2:
+ Log(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【待领券】')
+ elif status == 4:
+ Log(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【待兑换】')
+ elif status == 6:
+ print(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【已过期】')
+ elif status == 5:
+ print(f'商品:【{skuTitle}】 价格:【{skuPrice}】 【已兑换】')
+ else:
+ print(f'商品:【{skuTitle}】 价格:【{skuPrice}】')
+ # print(response)
+ else:
+ print(f'>申请失败,{response}')
+
+
+ def sixYears_getTask(self):
+ print(f'>>开始获取6周年任务列表')
+ headers = {
+ 'Accept': '*/*'
+ }
+
+ url = f'https://api.yonghuivip.com/web/marketing/quick/task/loadTask?activityId=3572&{self.url_add}'
+ response = self.do_request(url, headers=headers, req_type='get')
+
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data',[{}])
+ for task in data:
+ taskId = task.get('taskId','')
+ taskType = task.get('taskType','')
+ taskStatus = task.get('taskStatus','')
+ taskTitle = task.get('taskTitle','')
+ if taskStatus == 0:
+ print(f'任务[{taskTitle}]已完成')
+ continue
+ self.sixYears_doTask(taskId,taskType,taskTitle)
+ else:
+ Log(f'获取6周年任务列表,{response}')
+
+ def sixYears_doTask(self,taskId,taskType,taskTitle):
+ print(f'>>开始执行{taskTitle}任务')
+ headers= self.headers.copy()
+
+ headers_new = {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ }
+ headers.update(headers_new)
+
+ data = {
+ "activityId": '3572',
+ "activityCode": "FJ-MD-05",
+ "taskId": taskId,
+ "taskType": taskType
+ }
+
+ url = f'https://api.yonghuivip.com/web/marketing/quick/task/doTask?{self.url_add}'
+ response = self.do_request(url, headers=headers,data=data)
+
+ if 'code' in response and response.get('code') == 0:
+ data = response.get('data',{})
+ count = data.get('count',0)
+ print(f'获得【{count}】次抽奖机会')
+ else:
+ Log(f'>执行{taskTitle}任务失败,{response}')
+
+ def help_fun(self):
+ print(f"\n>>>>>>>>>>开始互助<<<<<<<<<<")
+ one_msg = ''
+ if not self.getCredit():
+ return False
+ # # pass
+ # Log(f"\n********账号【{self.index}】果园互助********")
+ # self.helpAuthor()
+ # self.helpOther()
+ Log(f"\n********账号【{self.index}】组队互助********")
+ self.joinAuthorTeam()
+ self.joinTeam()
+ self.sendMsg(True)
+ return True
+ def main(self):
+ global one_msg
+ wait_time = random.randint(1000, 3000) / 1000.0 # 转换为秒
+ one_msg = ''
+ Log(f"\n---------开始执行第{self.index}个账号>>>>>")
+ if not self.getCredit():
+ return False
+ self.sign()
+ self.teamDetail()
+ self.get_taskList()
+ self.creatTeam()
+ self.get_GrowthValue()
+ self.get_GrowthtaskList()
+ Log(f'\n>>>>>>开始试用任务')
+ self.get_WinTryList()
+ self.tryList()
+ Log('\n>>>>>>开始助力券任务')
+ self.listBoostCouponByPage()
+ if self.index == 1:
+ self.Boostcoupon()
+ else:
+ self.Boostcoupon(GameCode)
+ self.sixYears_getTask()
+ new_data = {
+ self.memberId:
+ {
+ 'memberId': self.memberId,
+ 'gameCode': self.gamecode_li,
+ 'fruit_is_ripe': self.fruit_is_ripe,
+ # 'inviteCode': self.inviteTicket,
+ 'teamCode': self.teamCode,
+ 'shopId': self.shopid
+ }
+ }
+ # print(new_data)
+ inviteCode.update(new_data)
+ # print(f'当前inviteCode:\n{inviteCode}')
+ CHERWIN_TOOLS.SAVE_INVITE_CODE("INVITE_CODE/YHSH_INVITE_CODE.json", new_data)
+ 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)
+
+
+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
+
+def import_Tools():
+ global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ import CHERWIN_TOOLS
+ ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
+if __name__ == '__main__':
+ APP_NAME='永辉生活'
+ ENV_NAME = 'YHSH'
+ CK_NAME = 'url'
+ print(f'''
+✨✨✨ {APP_NAME}脚本✨✨✨
+✨ 功能:
+ 积分签到
+ 种树
+ 种树任务
+ 成长值任务
+ 试用申请
+ 果园互助
+ 组队互助
+ 助力券助力
+✨ 抓包步骤:
+ 打开永辉生活APP或小程序
+ 点击“我的”
+ 打开抓包工具
+ 点击“积分签到”,找到带以下参数的链接复制:
+ -deviceid
+ -jysessionid
+ -shopid
+ -memberid
+ -access_token
+ -sign
+链接示例:https://api.yonghuivip.com/web/coupon/credit/coupon/getcreditcouponpageinfo/v2?xxxxx
+✨ ✨✨wxpusher一对一推送功能,
+ ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送
+ ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID
+✨ 设置青龙变量:
+export {ENV_NAME}='{CK_NAME}'多账号#分割
+export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
+✨ 默认每个账号随机助力作者一次,其余互助,后续考虑加上邀请池
+✨✨✨ @Author CHERWIN✨✨✨
+ ''')
+ local_script_name = os.path.basename(__file__)
+ local_version = '2024.05.15'
+ if IS_DEV:
+ import_Tools()
+ else:
+ if os.path.isfile('CHERWIN_TOOLS.py'):
+ import_Tools()
+ else:
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
+ print(TIPS)
+ token = ''
+ token = ENV if ENV else token
+ if not token:
+ print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''")
+ exit()
+ tokens = token.split('#')
+ # print(tokens)
+ if len(tokens) > 0:
+ print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<")
+ for index, infos in enumerate(tokens):
+ run_result = RUN(infos, index).main()
+ if not run_result:continue
+ # for index, infos in enumerate(tokens):
+ # RUN(infos, index).help_fun()
+ # if not run_result: continue
+ if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML)
+
diff --git a/ZTKD.py b/ZTKD.py
index 3d074ed..e4ea905 100755
--- a/ZTKD.py
+++ b/ZTKD.py
@@ -1,56 +1,42 @@
# !/usr/bin/python3
# -- coding: utf-8 --
# -------------------------------
-# ✨✨✨ 中通快递小程序签到✨✨✨
-# ✨ 功能:
-# 积分签到
-# ✨ 抓包步骤:
-# 打开中通快递小程序
-# 授权登陆
-# 打开抓包工具
-# 找URl请求头带[x-token或者token]
-# 复制里面的[x-token或者token]参数值
-# 参数示例:eyJhbGciOiJIUzUxMiJ9.eyJnZW5lcmF0ZVRpbWUixxxxxx
-# ✨ 设置青龙变量:
-# export YDKD='x-token或者token参数值'多账号#或&分割
-# export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
-# ✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包
-# ✨ 推荐cron:0 6 * * *
# ✨✨✨ @Author CHERWIN✨✨✨
# -------------------------------
# cron "0 6 * * *" script-path=xxx.py,tag=匹配cron用
# const $ = new Env('中通快递小程序签到')
-import json
+
import os
-import random
import time
from datetime import datetime, date
-from os import path
import requests
-import hashlib
+
from requests.packages.urllib3.exceptions import InsecureRequestWarning
-# import CHERWIN_TOOLS
+
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-#
-if os.path.isfile('DEV_ENV.py'):
- import DEV_ENV
+
+IS_DEV = True
if os.path.isfile('notify.py'):
from notify import send
+
print("加载通知服务成功!")
else:
print("加载通知服务失败!")
send_msg = ''
-one_msg=''
+one_msg = ''
+
+
def Log(cont=''):
- global send_msg,one_msg
+ global send_msg, one_msg
print(cont)
if cont:
one_msg += f'{cont}\n'
send_msg += f'{cont}\n'
+
class RUN:
- def __init__(self,info,index):
+ def __init__(self, info, index):
global one_msg
one_msg = ''
split_info = info.split('@')
@@ -83,18 +69,18 @@ class RUN:
self.list_index = 0
self.isFirstTask = True
- def get_point(self,END=False):
+ def get_point(self, END=False):
Log('>>>>>>获取积分信息')
json_data = {}
- response = s.post(f'{self.baseUrl}user/point/get', headers=self.headers,json=json_data)
+ response = s.post(f'{self.baseUrl}user/point/get', headers=self.headers, json=json_data)
point_info = response.json()
# print(point_info)
- code = point_info.get('code',-1)
- if point_info.get('success',False) == True and code == 10000:
- data = point_info.get('data',[{}])
- point=data.get('point',0)
- mobile=data.get('mobile','')
- mobile=mobile[:3] + "*" * 4 + mobile[7:]
+ code = point_info.get('code', -1)
+ if point_info.get('success', False) == True and code == 10000:
+ data = point_info.get('data', [{}])
+ point = data.get('point', 0)
+ mobile = data.get('mobile', '')
+ mobile = mobile[:3] + "*" * 4 + mobile[7:]
if END:
Log(f'>>执行后积分:【{point}】')
else:
@@ -106,43 +92,42 @@ class RUN:
return False
def Check_sign(self):
- Log('>>>>>>查询签到')
- json_data = {"calendarType":0}
- response = s.post(f'{self.baseUrl}member/sign/v2/calendar', headers=self.headers,json=json_data)
- response = response.json()
- # print(point_info)
- code = response.get('code', -1)
- if response['success']== True and response['data'] != None and code == 10000:
- data=response.get('data',{})
- dayList=data.get('dayList',[{}])
- signDays=data.get('signDays',0)
- for day in dayList:
- dates = day.get('date','')
- point = day.get('point','')
- signFlag = day.get('signFlag','')
- current_date = date.today()
- parsed_date = datetime.strptime(dates, '%Y-%m-%d').date()
- if parsed_date == current_date:
- if signFlag == 1:
- Log(f'>>今日已签到,连续签到【{signDays}】天,获得【{point}】积分')
- else:
- self.sign()
- else:
- Log(f"查询签到失败,{response['msg']}")
+ Log('>>>>>>查询签到')
+ json_data = {"calendarType": 0}
+ response = s.post(f'{self.baseUrl}member/sign/v2/calendar', headers=self.headers, json=json_data)
+ response = response.json()
+ # print(point_info)
+ code = response.get('code', -1)
+ if response['success'] == True and response['data'] != None and code == 10000:
+ data = response.get('data', {})
+ dayList = data.get('dayList', [{}])
+ signDays = data.get('signDays', 0)
+ for day in dayList:
+ dates = day.get('date', '')
+ point = day.get('point', '')
+ signFlag = day.get('signFlag', '')
+ current_date = date.today()
+ parsed_date = datetime.strptime(dates, '%Y-%m-%d').date()
+ if parsed_date == current_date:
+ if signFlag == 1:
+ Log(f'>>今日已签到,连续签到【{signDays}】天,获得【{point}】积分')
+ else:
+ self.sign()
+ else:
+ Log(f"查询签到失败,{response['msg']}")
+
def sign(self):
- Log('>>>签到')
- json_data = {}
- response = s.post(f'{self.baseUrl}member/sign/v2/userSignIn', headers=self.headers,json=json_data)
- point_info = response.json()
- # print(point_info)
- code = point_info.get('code', -1)
- if point_info['success']== True and point_info['data'] != None and code == 10000:
- point=point_info['data']['point']
- Log(f'>>签到成功获得:【{point}】积分')
- else:
- Log(f">>签到失败,{point_info['msg']}")
-
-
+ Log('>>>签到')
+ json_data = {}
+ response = s.post(f'{self.baseUrl}member/sign/v2/userSignIn', headers=self.headers, json=json_data)
+ point_info = response.json()
+ # print(point_info)
+ code = point_info.get('code', -1)
+ if point_info['success'] == True and point_info['data'] != None and code == 10000:
+ point = point_info['data']['point']
+ Log(f'>>签到成功获得:【{point}】积分')
+ else:
+ Log(f">>签到失败,{point_info['msg']}")
def main(self):
print(f"\n开始执行第{self.index}个账号--------------->>>>>")
@@ -186,15 +171,17 @@ def down_file(filename, file_url):
print(f'【{filename}】下载失败:{str(e)}')
return False
+
def import_Tools():
- global CHERWIN_TOOLS,ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
+ global CHERWIN_TOOLS, ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
import CHERWIN_TOOLS
ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version)
+
if __name__ == '__main__':
APP_NAME = '中通快递小程序'
ENV_NAME = 'ZTKD'
- CK_NAME = 'x-token或者token'
+ CK_NAME = 'token'
print(f'''
✨✨✨ {APP_NAME}签到✨✨✨
✨ 功能:
@@ -203,7 +190,7 @@ if __name__ == '__main__':
打开{APP_NAME}
授权登陆
打开抓包工具
- 找URl请求头带[{CK_NAME}]
+ 找https://api.ztomember.com/api/user/point/get请求头里的[{CK_NAME}]
复制里面的[{CK_NAME}]参数值
参数示例:eyJhbGciOiJIUzUxMiJ9.eyJnZW5lcmF0ZVRpbWUixxxxxx
✨ 设置青龙变量:
@@ -214,16 +201,20 @@ export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启
✨✨✨ @Author CHERWIN✨✨✨
''')
local_script_name = os.path.basename(__file__)
- local_version = '2024.05.08'
- if os.path.isfile('CHERWIN_TOOLS.py'):
+ local_version = '2024.05.15'
+ if IS_DEV:
import_Tools()
else:
- if down_file('CHERWIN_TOOLS.py', 'https://py.cherwin.cn/CHERWIN_TOOLS.py'):
- print('脚本依赖下载完成请重新运行脚本')
+ if os.path.isfile('CHERWIN_TOOLS.py'):
import_Tools()
else:
- print('脚本依赖下载失败,请到https://py.cherwin.cn/CHERWIN_TOOLS.py下载最新版本依赖')
- exit()
+ if down_file('CHERWIN_TOOLS.py', 'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py'):
+ print('脚本依赖下载完成请重新运行脚本')
+ import_Tools()
+ else:
+ print(
+ '脚本依赖下载失败,请到https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/CHERWIN_TOOLS.py下载最新版本依赖')
+ exit()
print(TIPS)
token = ''
token = ENV if ENV else token