From fc39ef5c83e79a5fbe816866f48ca9e4db898a24 Mon Sep 17 00:00:00 2001 From: CHERWIN Date: Wed, 15 May 2024 06:21:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BWCJ.py | 577 +++++------ CHERWIN_TOOLS.py | 957 +++++++++--------- DBKD.py | 89 +- EMS.py | 274 ++++++ GJJJ.py | 493 ++++++++++ HDL.py | 26 +- JTSD.py | 24 +- KFHS.py | 115 ++- KGZJ.py | 372 +++++++ KKYP.py | 18 +- LSXDS.py | 21 +- MXBC.py | 18 +- NXDD.py | 676 ++++++------- PPCS.py | 1234 ++++++++++++----------- SFSY.py | 367 +++++-- TBHYZX.py | 56 +- TYQH.py | 2455 +++++++++++++++++++++++----------------------- TYQH_JK.py | 825 ++++++++-------- TYYP.py | 18 +- YDKD.py | 18 +- YHSH.py | 2267 +++++++++++++++++++++--------------------- ZTKD.py | 149 ++- 22 files changed, 6311 insertions(+), 4738 deletions(-) create mode 100755 EMS.py create mode 100755 GJJJ.py create mode 100755 KGZJ.py mode change 100644 => 100755 KKYP.py mode change 100644 => 100755 LSXDS.py mode change 100644 => 100755 MXBC.py mode change 100644 => 100755 TBHYZX.py mode change 100644 => 100755 TYQH_JK.py 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