From 4eaade82fcbff170e3485556cc0148bc083b18aa Mon Sep 17 00:00:00 2001 From: hlt1995 <93117676+hlt1995@users.noreply.github.com> Date: Mon, 3 Nov 2025 22:13:58 +0800 Subject: [PATCH] Update and rename mcloud.py to mcloud_count.py --- 139cloud/mcloud.py | 908 --------------------------------------- 139cloud/mcloud_count.py | 359 ++++++++++++++++ 2 files changed, 359 insertions(+), 908 deletions(-) delete mode 100644 139cloud/mcloud.py create mode 100644 139cloud/mcloud_count.py diff --git a/139cloud/mcloud.py b/139cloud/mcloud.py deleted file mode 100644 index ef5d5bf..0000000 --- a/139cloud/mcloud.py +++ /dev/null @@ -1,908 +0,0 @@ -# 脚本名称: [移动云盘] -# 功能描述: [签到 基础任务 果园 云朵大作战] -# 使用说明: -# - [抓包 Cookie:任意Authorization] -# - [注意事项: Authorization复制不要带Basic] -# 环境变量设置: -# - 从asign.json中获取auth信息 - -# 注: 本脚本仅用于个人学习和交流,请勿用于非法用途。作者不承担由于滥用此脚本所引起的任何责任,请在下载后24小时内删除。 - -# cron: 5 12 * * * -# const $ = new Env('移动云盘') - -import os -import random -import re -import time -import json -from os import path - -import requests - -ua = 'Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.210 Mobile Safari/537.36 MCloudApp/10.0.1' - -err_accounts = '' # 异常账号 -err_message = '' # 错误信息 -user_amount = '' # 用户云朵·数量 -GLOBAL_DEBUG = False - -# Bark推送配置 -# ==================== Bark 推送配置 ==================== -BARK_ICON = "https://gitee.com/hlt1995/BARK_ICON/raw/main/mcloud.png" # 自定义图标 -BARK_GROUP = "移动云盘" # 自定义分组 -PUSH_SWITCH = "1" #推送开关,1开启,0关闭 -# ======================================================= - -os.environ["PUSH_SWITCH"] = PUSH_SWITCH - -def load_send(): - cur_path = path.abspath(path.dirname(__file__)) - notify_file = cur_path + "/notify.py" - - if path.exists(notify_file): - try: - from notify import send - print("加载通知服务成功!") - return send - except ImportError: - print("加载通知服务失败~") - else: - print("加载通知服务失败~") - - return False - - -class YP: - def __init__(self, cookie): - self.notebook_id = None - self.note_token = None - self.note_auth = None - self.click_num = 15 # 定义抽奖次数和摇一摇戳一戳次数 - self.draw = 1 # 抽奖次数,首次免费 - self.session = requests.Session() - - self.timestamp = str(int(round(time.time() * 1000))) - self.cookies = {'sensors_stay_time': self.timestamp} - self.Authorization = cookie.split("#")[0] - self.account = cookie.split("#")[1] - self.auth_token = cookie.split("#")[2] - self.encrypt_account = self.account[:3] + "*" * 4 + self.account[7:] - self.fruit_url = 'https://happy.mail.10086.cn/jsp/cn/garden/' - - self.jwtHeaders = { - 'User-Agent': ua, - 'Accept': '*/*', - 'Host': 'caiyun.feixin.10086.cn:7071', - } - self.treeHeaders = { - 'Host': 'happy.mail.10086.cn', - 'Accept': 'application/json, text/plain, */*', - 'User-Agent': ua, - 'Referer': 'https://happy.mail.10086.cn/jsp/cn/garden/wap/index.html?sourceid=1003', - 'Cookie': '', - } - - # 捕获异常 - - def catch_errors(func): - def wrapper(self, *args, **kwargs): - try: - return func(self, *args, **kwargs) - except Exception as e: - global err_message - print("错误:", str(e)) - err_message += f'用户[{self.encrypt_account}]:{e}\n' # 错误信息 - return None - - return wrapper - - @catch_errors - def run(self): - if self.jwt(): - self.signin_status() - self.click() - # 任务 - self.get_tasklist(url = 'sign_in_3', app_type = 'cloud_app') - print(f'\n☁️ 云朵大作战') - print(f'-已跳过:暂时无法执行,请前往APP手动完成') - #self.cloud_game() - print(f'\n🌳 果园任务') - print(f'-已结束:果园任务已结束') - #self.fruitLogin() - print(f'\n📰 公众号任务') - self.wxsign() - self.shake() - self.surplus_num() - print(f'\n🔥 热门任务') - self.backup_cloud() - self.open_send() - print(f'\n📧 139邮箱任务') - self.get_tasklist(url = 'newsign_139mail', app_type = 'email_app') - self.receive() - else: - global err_accounts - # 失效账号 - err_accounts += f'{self.encrypt_account}\n' - - @catch_errors - def send_request(self, url, headers=None, cookies=None, data=None, params=None, method='GET', debug=None, - retries=5): - - debug = debug if debug is not None else GLOBAL_DEBUG - - self.session.headers.update(headers or {}) - if cookies: - self.session.cookies.update(cookies) - request_args = {'json': data} if isinstance(data, dict) else {'data': data} - - for attempt in range(retries): - try: - response = self.session.request(method, url, params = params, **request_args) - response.raise_for_status() - if debug: - print(f'\n【{url}】响应数据:\n{response.text}') - return response - except (requests.RequestException, ConnectionError, TimeoutError) as e: - print(f"请求异常: {e}") - if attempt >= retries - 1: - print("达到最大重试次数。") - return None - time.sleep(1) - - # 随机延迟默认1-1.5s - def sleep(self, min_delay=1, max_delay=1.5): - delay = random.uniform(min_delay, max_delay) - time.sleep(delay) - - # 日志 - def log_info(self, err_msg=None, amount=None): - global err_message, user_amount - if err_msg is not None: - err_message += f'{err_msg}\n' # 错误信息 - elif amount is not None: - user_amount += f'{amount}\n' # 云朵数量 - - # 刷新令牌 - def sso(self): - sso_url = 'https://orches.yun.139.com/orchestration/auth-rebuild/token/v1.0/querySpecToken' - sso_headers = { - 'Authorization': self.Authorization, - 'User-Agent': ua, - 'Content-Type': 'application/json', - 'Accept': '*/*', - 'Host': 'orches.yun.139.com' - } - sso_payload = {"account": self.account, "toSourceId": "001005"} - sso_data = self.send_request(sso_url, headers = sso_headers, data = sso_payload, method = 'POST').json() - - if sso_data['success']: - refresh_token = sso_data['data']['token'] - return refresh_token - else: - print(sso_data['message']) - return None - - # jwt - def jwt(self): - # 获取jwttoken - token = self.sso() - if token is not None: - - jwt_url = f"https://caiyun.feixin.10086.cn:7071/portal/auth/tyrzLogin.action?ssoToken={token}" - jwt_data = self.send_request(jwt_url, headers = self.jwtHeaders, method = 'POST').json() - if jwt_data['code'] != 0: - print(jwt_data['msg']) - return False - self.jwtHeaders['jwtToken'] = jwt_data['result']['token'] - self.cookies['jwtToken'] = jwt_data['result']['token'] - return True - else: - print('-ck可能失效了') - return False - - # 签到查询 - @catch_errors - def signin_status(self): - self.sleep() - check_url = 'https://caiyun.feixin.10086.cn/market/signin/page/info?client=app' - check_data = self.send_request(check_url, headers = self.jwtHeaders, cookies = self.cookies).json() - if check_data['msg'] == 'success': - today_sign_in = check_data['result'].get('todaySignIn', False) - - if today_sign_in: - print('✅已签到') - else: - print('❌ 未签到') - signin_url = 'https://caiyun.feixin.10086.cn/market/manager/commonMarketconfig/getByMarketRuleName?marketName=sign_in_3' - signin_data = self.send_request(signin_url, headers = self.jwtHeaders, - cookies = self.cookies).json() - - if signin_data['msg'] == 'success': - print('✅签到成功') - else: - print(signin_data['msg']) - self.log_info(signin_data['msg']) - else: - print(check_data['msg']) - self.log_info(check_data['msg']) - - # 戳一下 - def click(self): - url = "https://caiyun.feixin.10086.cn/market/signin/task/click?key=task&id=319" - successful_click = 0 # 获得次数 - - try: - for _ in range(self.click_num): - return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json() - time.sleep(0.2) - - if 'result' in return_data: - print(f'✅{return_data["result"]}') - successful_click += 1 - - if successful_click == 0: - print(f'❌未获得 x {self.click_num}') - except Exception as e: - print(f'错误信息:{e}') - - # 刷新笔记token - @catch_errors - def refresh_notetoken(self): - note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/authTokenRefresh.do' - note_payload = { - "authToken": self.auth_token, - "userPhone": self.account - } - note_headers = { - 'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1122634489;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C', - 'Charset': 'UTF-8', - 'Connection': 'Keep-Alive', - 'User-Agent': 'mobile', - 'APP_CP': 'android', - 'CP_VERSION': '3.2.0', - 'x-huawei-channelsrc': '10001400', - 'Host': 'mnote.caiyun.feixin.10086.cn', - 'Content-Type': 'application/json; charset=UTF-8', - 'Accept-Encoding': 'gzip' - } - - try: - response = self.send_request(note_url, headers = note_headers, data = note_payload, method = "POST") - response.raise_for_status() - except requests.exceptions.RequestException as e: - print('出错了:', e) - return - - self.note_token = response.headers.get('NOTE_TOKEN') - self.note_auth = response.headers.get('APP_AUTH') - - # 任务列表 - def get_tasklist(self, url, app_type): - url = f'https://caiyun.feixin.10086.cn/market/signin/task/taskList?marketname={url}' - return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json() - self.sleep() - # 任务列表 - task_list = return_data.get('result', {}) - - try: - for task_type, tasks in task_list.items(): - if task_type in ["new", "hidden", "hiddenabc"]: - continue - if app_type == 'cloud_app': - if task_type == "month": - print('\n📆 云盘每月任务') - for month in tasks: - task_id = month.get('id') - if task_id in [110, 113, 417, 409]: - continue - task_name = month.get('name', '') - task_status = month.get('state', '') - - if task_status == 'FINISH': - print(f'-已完成: {task_name}') - continue - print(f'-去完成: {task_name}') - self.do_task(task_id, task_type = 'month', app_type = 'cloud_app') - time.sleep(2) - elif task_type == "day": - print('\n📆 云盘每日任务') - for day in tasks: - task_id = day.get('id') - if task_id == 404: - continue - task_name = day.get('name') - task_status = day.get('state', '') - - if task_status == 'FINISH': - print(f'-已完成: {task_name}') - continue - print(f'-去完成: {task_name}') - self.do_task(task_id, task_type = 'day', app_type = 'cloud_app') - elif app_type == 'email_app': - if task_type == "month": - print('\n📆 139邮箱每月任务') - for month in tasks: - task_id = month.get('id') - task_name = month.get('name', '') - task_status = month.get('state', '') - if task_id in [1004, 1005, 1015, 1020]: - continue - - if task_status == 'FINISH': - print(f'-已完成: {task_name}') - continue - print(f'-去完成: {task_name}') - self.do_task(task_id, task_type = 'month', app_type = 'email_app') - time.sleep(2) - except Exception as e: - print(f'错误信息:{e}') - - # 做任务 - @catch_errors - def do_task(self, task_id, task_type, app_type): - self.sleep() - task_url = f'https://caiyun.feixin.10086.cn/market/signin/task/click?key=task&id={task_id}' - self.send_request(task_url, headers = self.jwtHeaders, cookies = self.cookies) - - if app_type == 'cloud_app': - if task_type == 'day': - if task_id == 106: - print('-开始上传文件,默认0kb') - self.updata_file() - elif task_id == 107: - self.refresh_notetoken() - print('-获取默认笔记id') - note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/syncNotebookV3.do' - headers = { - 'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1122634489;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C', - 'Charset': 'UTF-8', - 'Connection': 'Keep-Alive', - 'User-Agent': 'mobile', - 'APP_CP': 'android', - 'CP_VERSION': '3.2.0', - 'x-huawei-channelsrc': '10001400', - 'APP_NUMBER': self.account, - 'APP_AUTH': self.note_auth, - 'NOTE_TOKEN': self.note_token, - 'Host': 'mnote.caiyun.feixin.10086.cn', - 'Content-Type': 'application/json; charset=UTF-8', - 'Accept': '*/*' - } - payload = { - "addNotebooks": [], - "delNotebooks": [], - "notebookRefs": [], - "updateNotebooks": [] - } - return_data = self.send_request(url = note_url, headers = headers, data = payload, - method = 'POST').json() - if return_data is None: - return print('出错了') - self.notebook_id = return_data['notebooks'][0]['notebookId'] - print('开始创建笔记') - self.create_note(headers) - elif task_type == 'month': - pass - elif app_type == 'email_app': - if task_type == 'month': - pass - - # 上传文件 - @catch_errors - def updata_file(self): - url = 'http://ose.caiyun.feixin.10086.cn/richlifeApp/devapp/IUploadAndDownload' - headers = { - 'x-huawei-uploadSrc': '1', - 'x-ClientOprType': '11', - 'Connection': 'keep-alive', - 'x-NetType': '6', - 'x-DeviceInfo': '6|127.0.0.1|1|10.0.1|Xiaomi|M2012K10C|CB63218727431865A48E691BFFDB49A1|02-00-00-00-00-00|android 11|1080X2272|zh||||032|', - 'x-huawei-channelSrc': '10000023', - 'x-MM-Source': '032', - 'x-SvcType': '1', - 'APP_NUMBER': self.account, - 'Authorization': self.Authorization, - 'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1955442920;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C', - 'Host': 'ose.caiyun.feixin.10086.cn', - 'User-Agent': 'okhttp/3.11.0', - 'Content-Type': 'application/xml; charset=UTF-8', - 'Accept': '*/*' - } - payload = ''' - - {phone} - 1 - 1 - - - 0 - - - 1 - - C4CA4238A0B923820DCC509A6F75849B - - 0 - 0 - - - - - - 0 - - 2 - - - - - '''.format(phone = self.account) - - response = requests.post(url = url, headers = headers, data = payload) - if response is None: - return - if response.status_code != 200: - return print('-上传失败') - print('-上传文件成功') - - # 创建笔记 - def create_note(self, headers): - note_id = self.get_note_id(32) # 获取随机笔记id - createtime = str(int(round(time.time() * 1000))) - time.sleep(3) - updatetime = str(int(round(time.time() * 1000))) - note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/createNote.do' - payload = { - "archived": 0, - "attachmentdir": note_id, - "attachmentdirid": "", - "attachments": [], - "audioInfo": { - "audioDuration": 0, - "audioSize": 0, - "audioStatus": 0 - }, - "contentid": "", - "contents": [{ - "contentid": 0, - "data": "000000", - "noteId": note_id, - "sortOrder": 0, - "type": "RICHTEXT" - }], - "cp": "", - "createtime": createtime, - "description": "android", - "expands": { - "noteType": 0 - }, - "latlng": "", - "location": "", - "noteid": note_id, - "notestatus": 0, - "remindtime": "", - "remindtype": 1, - "revision": "1", - "sharecount": "0", - "sharestatus": "0", - "system": "mobile", - "tags": [{ - "id": self.notebook_id, - "orderIndex": "0", - "text": "默认笔记本" - }], - "title": "00000", - "topmost": "0", - "updatetime": updatetime, - "userphone": self.account, - "version": "1.00", - "visitTime": "" - } - create_note_data = self.send_request(note_url, headers = headers, data = payload, method = "POST") - if create_note_data.status_code == 200: - print('-创建笔记成功') - else: - print('-创建失败') - - # 笔记id - def get_note_id(self, length): - characters = '19f3a063d67e4694ca63a4227ec9a94a19088404f9a28084e3e486b928039a299bf756ebc77aa4f6bfa250308ec6a8be8b63b5271a00350d136d117b8a72f39c5bd15cdfd350cba4271dc797f15412d9f269e666aea5039f5049d00739b320bb9e8585a008b52c1cbd86970cae9476446f3e41871de8d9f6112db94b05e5dc7ea0a942a9daf145ac8e487d3d5cba7cea145680efc64794d43dd15c5062b81e1cda7bf278b9bc4e1b8955846e6bc4b6a61c28f831f81b2270289e5a8a677c3141ddc9868129060c0c3b5ef507fbd46c004f6de346332ef7f05c0094215eae1217ee7c13c8dca6d174cfb49c716dd42903bb4b02d823b5f1ff93c3f88768251b56cc' - note_id = ''.join(random.choice(characters) for _ in range(length)) - return note_id - - # 公众号签到 - @catch_errors - def wxsign(self): - self.sleep() - url = 'https://caiyun.feixin.10086.cn/market/playoffic/followSignInfo?isWx=true' - return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json() - - if return_data['msg'] != 'success': - return print(return_data['msg']) - if not return_data['result'].get('todaySignIn'): - return print('❌签到失败,可能未绑定公众号') - return print('✅签到成功') - - # 摇一摇 - def shake(self): - url = "https://caiyun.feixin.10086.cn:7071/market/shake-server/shake/shakeIt?flag=1" - successful_shakes = 0 # 记录成功摇中的次数 - - try: - for _ in range(self.click_num): - return_data = self.send_request(url = url, cookies = self.cookies, headers = self.jwtHeaders, - method = 'POST').json() - time.sleep(1) - shake_prize_config = return_data["result"].get("shakePrizeconfig") - - if shake_prize_config: - print(f"🎉摇一摇获得: {shake_prize_config['name']}") - successful_shakes += 1 - except Exception as e: - print(f'错误信息: {e}') - if successful_shakes == 0: - print(f'❌未摇中 x {self.click_num}') - - # 查询剩余抽奖次数 - @catch_errors - def surplus_num(self): - self.sleep() - draw_info_url = 'https://caiyun.feixin.10086.cn/market/playoffic/drawInfo' - draw_url = "https://caiyun.feixin.10086.cn/market/playoffic/draw" - - draw_info_data = self.send_request(draw_info_url, headers = self.jwtHeaders).json() - - if draw_info_data.get('msg') == 'success': - remain_num = draw_info_data['result'].get('surplusNumber', 0) - print(f'剩余抽奖次数{remain_num}') - if remain_num > 50 - self.draw: - for _ in range(self.draw): - self.sleep() - draw_data = self.send_request(url = draw_url, headers = self.jwtHeaders).json() - - if draw_data.get("code") == 0: - prize_name = draw_data["result"].get("prizeName", "") - print("✅抽奖成功,获得:" + prize_name) - else: - print("❌抽奖失败") - else: - pass - else: - print(draw_info_data.get('msg')) - self.log_info(draw_info_data.get('msg')) - - # 果园专区 - @catch_errors - def fruitLogin(self): - token = self.sso() - if token is not None: - print("-果园专区token刷新成功") - self.sleep() - login_info_url = f'{self.fruit_url}login/caiyunsso.do?token={token}&account={self.account}&targetSourceId=001208&sourceid=1003&enableShare=1' - headers = { - 'Host': 'happy.mail.10086.cn', - 'Upgrade-Insecure-Requests': '1', - 'User-Agent': ua, - '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', - 'Referer': 'https://caiyun.feixin.10086.cn:7071/', - 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' - } - loginInfoData = requests.request("GET", login_info_url, headers = headers) - treeCookie = loginInfoData.request.headers['Cookie'] - self.treeHeaders['cookie'] = treeCookie - - do_login_url = f'{self.fruit_url}login/userinfo.do' - doLoginData = self.send_request(do_login_url, headers = self.treeHeaders).json() - if doLoginData.get('result', {}).get('islogin') != 1: - return print('❌果园登录失败') - # 去做果园任务 - self.fruitTask() - else: - print("果园专区token刷新失败") - - # 任务查询 - @catch_errors - def fruitTask(self): - # 签到任务 - check_sign_data = self.send_request(f'{self.fruit_url}task/checkinInfo.do', - headers = self.treeHeaders).json() - if check_sign_data.get('success'): - today_checkin = check_sign_data.get('result', {}).get('todayCheckin', 0) - if today_checkin == 1: - print('-果园今日已签到') - else: - checkin_data = self.send_request(f'{self.fruit_url}task/checkin.do', - headers = self.treeHeaders).json() - if checkin_data.get('result', {}).get('code', '') == 1: - print('-果园签到成功') - self.sleep() - water_data = self.send_request(f'{self.fruit_url}user/clickCartoon.do?cartoonType=widget', - headers = self.treeHeaders).json() - color_data = self.send_request(f'{self.fruit_url}user/clickCartoon.do?cartoonType=color', - headers = self.treeHeaders).json() - given_water = water_data.get('result', {}).get('given', 0) - print(f'-领取每日水滴: {given_water}') - print(f'-每日雨滴:{color_data.get("result").get("msg")}') - else: - print('-果园签到查询失败:', check_sign_data.get('msg', '')) - - # 获取任务列表 - task_list_data = self.send_request(f'{self.fruit_url}task/taskList.do?clientType=PE', - headers = self.treeHeaders).json() - task_state_data = self.send_request(f'{self.fruit_url}task/taskState.do', headers = self.treeHeaders).json() - task_state_result = task_state_data.get('result', []) - - task_list = task_list_data.get('result', []) - - for task in task_list: - task_id = task.get('taskId', '') - task_name = task.get('taskName', '') - water_num = task.get('waterNum', 0) - if task_id == 2002 or task_id == 2003: - continue - - task_state = next( - (state.get('taskState', 0) for state in task_state_result if state.get('taskId') == task_id), 0) - - if task_state == 2: - print(f'-已完成: {task_name}') - else: - self.do_fruit_task(task_name, task_id, water_num) - - # 果树信息 - self.tree_info() - - # 做任务 - @catch_errors - def do_fruit_task(self, task_name, task_id, water_num): - print(f'-去完成: {task_name}') - do_task_url = f'{self.fruit_url}task/doTask.do?taskId={task_id}' - do_task_data = self.send_request(do_task_url, headers = self.treeHeaders).json() - - if do_task_data.get('success'): - get_water_url = f'{self.fruit_url}task/givenWater.do?taskId={task_id}' - get_water_data = self.send_request(get_water_url, headers = self.treeHeaders).json() - - if get_water_data.get('success'): - print(f'-已完成任务获得水滴: {water_num}') - else: - print(f'❌领取失败: {get_water_data.get("msg", "")}') - else: - print(f'❌参与任务失败: {do_task_data.get("msg", "")}') - - # 果树信息 - @catch_errors - def tree_info(self): - treeinfo_url = f'{self.fruit_url}user/treeInfo.do' - treeinfo_data = self.send_request(treeinfo_url, headers = self.treeHeaders).json() - - if not treeinfo_data.get('success'): - error_message = treeinfo_data.get('msg', '获取果园任务列表失败') - print(error_message) - else: - collect_water = treeinfo_data.get('result', {}).get('collectWater', 0) - tree_level = treeinfo_data.get('result', {}).get('treeLevel', 0) - print(f'-当前小树等级: {tree_level} 剩余水滴: {collect_water}') - if tree_level in (2, 4, 6, 8): - # 开宝箱 - openbox_url = f'{self.fruit_url}prize/openBox.do' - openbox_data = self.send_request(openbox_url, headers = self.treeHeaders).json() - print(f'- {openbox_data.get("result").get("msg")}') - - watering_amount = collect_water // 20 # 计算需要浇水的次数 - watering_url = f'{self.fruit_url}user/watering.do?isFast=0' - if watering_amount > 0: - for _ in range(watering_amount): - watering_data = self.send_request(watering_url, headers = self.treeHeaders).json() - if watering_data.get('success'): - print('✔️ 浇水成功') - time.sleep(3) - else: - print('-水滴不足!') - - # 云朵大作战 - @catch_errors - def cloud_game(self): - game_info_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/info?op=info' - bigin_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/beinvite' - end_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/finish?flag=true' - - game_info_data = self.send_request(game_info_url, headers = self.jwtHeaders, cookies = self.cookies).json() - if game_info_data and game_info_data.get('code', -1) == 0: - currnum = game_info_data.get('result', {}).get('info', {}).get('curr', 0) - count = game_info_data.get('result', {}).get('history', {}).get('0', {}).get('count', '') - rank = game_info_data.get('result', {}).get('history', {}).get('0', {}).get('rank', '') - - print(f'今日剩余游戏次数: {currnum}\n本月排名: {rank} 合成次数: {count}') - - for _ in range(currnum): - self.send_request(bigin_url, headers = self.jwtHeaders, cookies = self.cookies).json() - print('-开始游戏,等待10-15秒完成游戏') - time.sleep(random.randint(10, 15)) - end_data = self.send_request(end_url, headers = self.jwtHeaders, cookies = self.cookies).json() - if end_data and end_data.get('code', -1) == 0: - print('游戏成功') - else: - print("-获取游戏信息失败") - - # 领取云朵 - @catch_errors - def receive(self): - receive_url = "https://caiyun.feixin.10086.cn/market/signin/page/receive" - prize_url = f"https://caiyun.feixin.10086.cn/market/prizeApi/checkPrize/getUserPrizeLogPage?currPage=1&pageSize=15&_={self.timestamp}" - receive_data = self.send_request(receive_url, headers = self.jwtHeaders, cookies = self.cookies).json() - self.sleep() - prize_data = self.send_request(prize_url, headers = self.jwtHeaders, cookies = self.cookies).json() - result = prize_data.get('result').get('result') - rewards = '' - for value in result: - prizeName = value.get('prizeName') - flag = value.get('flag') - if flag == 1: - rewards += f' • {prizeName}\n' - - receive_amount = receive_data["result"].get("receive", "") - total_amount = receive_data["result"].get("total", "") - print(f'\n-当前待领取:{receive_amount}云朵') - print(f'-当前云朵数量:{total_amount}云朵') - - if rewards: - msg = f"📱 用户:【{self.encrypt_account}】\n☁️ 云朵数量:【{total_amount}】\n🎁 待领取奖品:\n{rewards}\n" - else: - msg = f"📱 用户:【{self.encrypt_account}】\n☁️ 云朵数量:【{total_amount}】\n" - self.log_info(amount = msg) - - # 备份云朵 - @catch_errors - def backup_cloud(self): - backup_url = 'https://caiyun.feixin.10086.cn/market/backupgift/info' - backup_data = self.send_request(backup_url, headers = self.jwtHeaders).json() - state = backup_data.get('result', {}).get('state', '') - if state == -1: - print('本月未备份,暂无连续备份奖励') - - elif state == 0: - print('-领取本月连续备份奖励') - cur_url = 'https://caiyun.feixin.10086.cn/market/backupgift/receive' - cur_data = self.send_request(cur_url, headers = self.jwtHeaders).json() - print(f'-获得云朵数量:{cur_data.get("result").get("result")}') - - elif state == 1: - print('-已领取本月连续备份奖励') - self.sleep() - expend_url = 'https://caiyun.feixin.10086.cn/market/signin/page/taskExpansion' # 每月膨胀云朵 - expend_data = self.send_request(expend_url, headers = self.jwtHeaders, cookies = self.cookies).json() - - curMonthBackup = expend_data.get('result', {}).get('curMonthBackup', '') # 本月备份 - preMonthBackup = expend_data.get('result', {}).get('preMonthBackup', '') # 上月备份 - curMonthBackupTaskAccept = expend_data.get('result', {}).get('curMonthBackupTaskAccept', '') # 本月是否领取 - nextMonthTaskRecordCount = expend_data.get('result', {}).get('nextMonthTaskRecordCount', '') # 下月备份云朵 - acceptDate = expend_data.get('result', {}).get('acceptDate', '') # 月份 - - if curMonthBackup: - print(f'- 本月已备份,下月可领取膨胀云朵: {nextMonthTaskRecordCount}') - else: - print('- 本月还未备份,下月暂无膨胀云朵') - - if preMonthBackup: - if curMonthBackupTaskAccept: - print('- 上月已备份,膨胀云朵已领取') - else: - # 领取 - receive_url = f'https://caiyun.feixin.10086.cn/market/signin/page/receiveTaskExpansion?acceptDate={acceptDate}' - receive_data = self.send_request(receive_url, headers = self.jwtHeaders, - cookies = self.cookies).json() - if receive_data.get("code") != 0: - print(f'-领取失败:{receive_data.get("msg")}') - else: - cloudCount = receive_data.get('result', {}).get('cloudCount', '') - print(f'- 膨胀云朵领取成功: {cloudCount}朵') - else: - print('-上月未备份,本月无膨胀云朵领取') - - # # 开启备份 - # def open_backup(self): - - # 通知云朵 - @catch_errors - def open_send(self): - send_url = 'https://caiyun.feixin.10086.cn/market/msgPushOn/task/status' - send_data = self.send_request(send_url, headers = self.jwtHeaders).json() - - pushOn = send_data.get('result', {}).get('pushOn', '') # 0未开启,1开启,2未领取,3已领取 - firstTaskStatus = send_data.get('result', {}).get('firstTaskStatus', '') - secondTaskStatus = send_data.get('result', {}).get('secondTaskStatus', '') - onDuaration = send_data.get('result', {}).get('onDuaration', '') # 开启时间 - - if pushOn == 1: - reward_url = 'https://caiyun.feixin.10086.cn/market/msgPushOn/task/obtain' - - if firstTaskStatus == 3: - print('- 任务1奖励已领取') - else: - # 领取任务1 - print('- 领取任务1奖励') - reward1_data = self.send_request(reward_url, headers = self.jwtHeaders, data = {"type": 1}, - method = "POST").json() - print(reward1_data.get('result', {}).get('description', '')) - - if secondTaskStatus == 2: - # 领取任务2 - print('- 领取任务2奖励') - reward2_data = self.send_request(reward_url, headers = self.jwtHeaders, data = {"type": 2}, - method = "POST").json() - print(reward2_data.get('result', {}).get('description', '')) - - print(f'- 通知已开启天数: {onDuaration}, 满31天可领取奖励') - else: - print('- 通知权限未开启') - - -if __name__ == "__main__": - script_dir = path.dirname(path.abspath(__file__)) - asign_file = path.join(script_dir, 'asign.json') - - try: - with open(asign_file, 'r', encoding='utf-8') as f: - asign_data = json.load(f) - - auth_list = [item['auth'] for item in asign_data.get('caiyun', [])] - - bark_key = asign_data.get('message', {}).get('bark', {}).get('key', '') - - if bark_key: - os.environ['BARK_KEY'] = bark_key - os.environ['BARK_ICON'] = BARK_ICON - os.environ['BARK_GROUP'] = BARK_GROUP - - # 构建cookie列表 (格式: auth#手机号#00) - cookies = [] - for auth in auth_list: - try: - import base64 - decoded = base64.b64decode(auth).decode('utf-8') - parts = decoded.split(':') - if len(parts) >= 2: - phone = parts[1] # 获取手机号 - cookies.append(f"Basic {auth}#{phone}#00") - else: - print(f"无法从auth中提取手机号: {auth}") - except Exception as e: - print(f"解析auth失败: {e}") - # 如果无法解析,使用默认手机号 - cookies.append(f"Basic {auth}#13800138000#00") - - print(f"移动云盘共获取到{len(cookies)}个账号") - - except Exception as e: - print(f"读取asign.json失败: {e}") - exit(0) - - for i, account_info in enumerate(cookies, start = 1): - print(f"\n======== ▷ 第 {i} 个账号 ◁ ========") - YP(account_info).run() - print("\n随机等待5-10s进行下一个账号") - time.sleep(random.randint(5, 10)) - - if err_accounts != '': - print(f"\n失效账号:\n{err_accounts}") - else: - print('当前所有账号ck有效') - - print(user_amount) - - send = load_send() - - # 判断是否推送 - if PUSH_SWITCH == '1': - if send: - if err_accounts: - msg = f"⚠️ 失效账号:\n{err_accounts}\n" + user_amount - else: - msg = user_amount - send('☁️ 云朵资产统计', msg) - else: - print('通知服务不可用') - else: - print("推送开关已关闭,不发送推送通知") diff --git a/139cloud/mcloud_count.py b/139cloud/mcloud_count.py new file mode 100644 index 0000000..e557c0c --- /dev/null +++ b/139cloud/mcloud_count.py @@ -0,0 +1,359 @@ +# 脚本名称: [云朵资产统计] +# 功能描述: [签到 抽抽乐 云朵统计] +# 注: 本脚本仅用于个人学习和交流,请勿用于非法用途。作者不承担由于滥用此脚本所引起的任何责任,请在下载后24小时内删除。 + +# cron: 5 12 * * * +# const $ = new Env('云朵资产统计') + +import os +import random +import re +import time +import json +from os import path + +import requests + +ua = 'Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.210 Mobile Safari/537.36 MCloudApp/10.0.1' + +err_accounts = '' # 异常账号 +err_message = '' # 错误信息 +user_amount = '' # 用户云朵·数量 +GLOBAL_DEBUG = False + +# Bark推送配置 +# ==================== Bark 推送配置 ==================== +BARK_ICON = "https://gitee.com/hlt1995/BARK_ICON/raw/main/mcloud.png" # 自定义图标 +BARK_GROUP = "移动云盘" # 自定义分组 +PUSH_SWITCH = "1" #推送开关,1开启,0关闭 +# ======================================================= + +os.environ["PUSH_SWITCH"] = PUSH_SWITCH + +def load_send(): + cur_path = path.abspath(path.dirname(__file__)) + notify_file = cur_path + "/notify.py" + + if path.exists(notify_file): + try: + from notify import send + print("加载通知服务成功!") + return send + except ImportError: + print("加载通知服务失败~") + else: + print("加载通知服务失败~") + + return False + + +class YP: + def __init__(self, cookie): + self.notebook_id = None + self.note_token = None + self.note_auth = None + self.click_num = 15 # 定义抽奖次数和摇一摇戳一戳次数 + self.draw = 1 # 抽奖次数,首次免费 + self.session = requests.Session() + + self.timestamp = str(int(round(time.time() * 1000))) + self.cookies = {'sensors_stay_time': self.timestamp} + self.Authorization = cookie.split("#")[0] + self.account = cookie.split("#")[1] + self.auth_token = cookie.split("#")[2] + self.encrypt_account = self.account[:3] + "*" * 4 + self.account[7:] + self.fruit_url = 'https://happy.mail.10086.cn/jsp/cn/garden/' + + self.jwtHeaders = { + 'User-Agent': ua, + 'Accept': '*/*', + 'Host': 'caiyun.feixin.10086.cn:7071', + } + self.treeHeaders = { + 'Host': 'happy.mail.10086.cn', + 'Accept': 'application/json, text/plain, */*', + 'User-Agent': ua, + 'Referer': 'https://happy.mail.10086.cn/jsp/cn/garden/wap/index.html?sourceid=1003', + 'Cookie': '', + } + + # 捕获异常 + + def catch_errors(func): + def wrapper(self, *args, **kwargs): + try: + return func(self, *args, **kwargs) + except Exception as e: + global err_message + print("错误:", str(e)) + err_message += f'用户[{self.encrypt_account}]:{e}\n' # 错误信息 + return None + + return wrapper + + @catch_errors + def run(self): + if self.jwt(): + print(f'📅 签到查询') + self.signin_status() + self.wxsign() + self.click() + print(f'\n🎰 抽抽乐') + self.shake() + print(f'\n☁️ 云朵统计') + self.receive() + else: + global err_accounts + # 失效账号 + err_accounts += f'{self.encrypt_account}\n' + + @catch_errors + def send_request(self, url, headers=None, cookies=None, data=None, params=None, method='GET', debug=None, + retries=5): + + debug = debug if debug is not None else GLOBAL_DEBUG + + self.session.headers.update(headers or {}) + if cookies: + self.session.cookies.update(cookies) + request_args = {'json': data} if isinstance(data, dict) else {'data': data} + + for attempt in range(retries): + try: + response = self.session.request(method, url, params = params, **request_args) + response.raise_for_status() + if debug: + print(f'\n【{url}】响应数据:\n{response.text}') + return response + except (requests.RequestException, ConnectionError, TimeoutError) as e: + print(f"请求异常: {e}") + if attempt >= retries - 1: + print("达到最大重试次数。") + return None + time.sleep(1) + + # 随机延迟默认1-1.5s + def sleep(self, min_delay=1, max_delay=1.5): + delay = random.uniform(min_delay, max_delay) + time.sleep(delay) + + # 日志 + def log_info(self, err_msg=None, amount=None): + global err_message, user_amount + if err_msg is not None: + err_message += f'{err_msg}\n' # 错误信息 + elif amount is not None: + user_amount += f'{amount}\n' # 云朵数量 + + # 刷新令牌 + def sso(self): + sso_url = 'https://orches.yun.139.com/orchestration/auth-rebuild/token/v1.0/querySpecToken' + sso_headers = { + 'Authorization': self.Authorization, + 'User-Agent': ua, + 'Content-Type': 'application/json', + 'Accept': '*/*', + 'Host': 'orches.yun.139.com' + } + sso_payload = {"account": self.account, "toSourceId": "001005"} + sso_data = self.send_request(sso_url, headers = sso_headers, data = sso_payload, method = 'POST').json() + + if sso_data['success']: + refresh_token = sso_data['data']['token'] + return refresh_token + else: + print(sso_data['message']) + return None + + # jwt + def jwt(self): + # 获取jwttoken + token = self.sso() + if token is not None: + + jwt_url = f"https://caiyun.feixin.10086.cn:7071/portal/auth/tyrzLogin.action?ssoToken={token}" + jwt_data = self.send_request(jwt_url, headers = self.jwtHeaders, method = 'POST').json() + if jwt_data['code'] != 0: + print(jwt_data['msg']) + return False + self.jwtHeaders['jwtToken'] = jwt_data['result']['token'] + self.cookies['jwtToken'] = jwt_data['result']['token'] + return True + else: + print('-ck可能失效了') + return False + + # 签到查询 + @catch_errors + def signin_status(self): + self.sleep() + check_url = 'https://caiyun.feixin.10086.cn/market/signin/page/info?client=app' + check_data = self.send_request(check_url, headers = self.jwtHeaders, cookies = self.cookies).json() + if check_data['msg'] == 'success': + today_sign_in = check_data['result'].get('todaySignIn', False) + + if today_sign_in: + print('- ✅APP已签到') + else: + print('- ❌APP未签到') + signin_url = 'https://caiyun.feixin.10086.cn/market/manager/commonMarketconfig/getByMarketRuleName?marketName=sign_in_3' + signin_data = self.send_request(signin_url, headers = self.jwtHeaders, + cookies = self.cookies).json() + + if signin_data['msg'] == 'success': + print('- ✅APP签到成功') + else: + print(signin_data['msg']) + self.log_info(signin_data['msg']) + else: + print(check_data['msg']) + self.log_info(check_data['msg']) + + # 戳一下 + def click(self): + url = "https://caiyun.feixin.10086.cn/market/signin/task/click?key=task&id=319" + successful_click = 0 # 获得次数 + + try: + for _ in range(self.click_num): + return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json() + time.sleep(0.2) + + if 'result' in return_data: + print(f'- ✅{return_data["result"]}') + successful_click += 1 + + except Exception as e: + print(f'错误信息:{e}') + + + # 公众号签到 + @catch_errors + def wxsign(self): + self.sleep() + url = 'https://caiyun.feixin.10086.cn/market/playoffic/followSignInfo?isWx=true' + return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json() + + if return_data['msg'] != 'success': + return print(return_data['msg']) + if not return_data['result'].get('todaySignIn'): + return print('- ❌签到失败,可能未绑定公众号') + return print('- ✅公众号已签到') + + # 抽抽乐 + def shake(self): + url = "https://caiyun.feixin.10086.cn:7071/market/shake-server/shake/shakeIt?flag=1" + successful_shakes = 0 # 记录成功摇中的次数 + print(f'执行 {self.click_num} 次,正在抽取...') + + try: + for _ in range(self.click_num): + return_data = self.send_request(url = url, cookies = self.cookies, headers = self.jwtHeaders, + method = 'POST').json() + time.sleep(1) + shake_prize_config = return_data["result"].get("shakePrizeconfig") + + if shake_prize_config: + print(f"- 🎉抽抽乐获得: {shake_prize_config['name']}") + successful_shakes += 1 + except Exception as e: + print(f'- 错误信息: {e}') + if successful_shakes == 0: + print(f'- ❌未抽中奖品') + + + # 领取云朵 + @catch_errors + def receive(self): + receive_url = "https://caiyun.feixin.10086.cn/market/signin/page/receive" + prize_url = f"https://caiyun.feixin.10086.cn/market/prizeApi/checkPrize/getUserPrizeLogPage?currPage=1&pageSize=15&_={self.timestamp}" + receive_data = self.send_request(receive_url, headers = self.jwtHeaders, cookies = self.cookies).json() + self.sleep() + prize_data = self.send_request(prize_url, headers = self.jwtHeaders, cookies = self.cookies).json() + result = prize_data.get('result').get('result') + rewards = '' + for value in result: + prizeName = value.get('prizeName') + flag = value.get('flag') + if flag == 1: + rewards += f' • {prizeName}\n' + + receive_amount = receive_data["result"].get("receive", "") + total_amount = receive_data["result"].get("total", "") + print(f'-当前待领取:{receive_amount}云朵') + print(f'-当前云朵数量:{total_amount}云朵') + + if rewards: + msg = f"📱 用户:【{self.encrypt_account}】\n☁️ 云朵数量:【{total_amount}】\n🎁 待领取奖品:\n{rewards}" + else: + msg = f"📱 用户:【{self.encrypt_account}】\n☁️ 云朵数量:【{total_amount}】\n" + self.log_info(amount = msg) + + +if __name__ == "__main__": + script_dir = path.dirname(path.abspath(__file__)) + asign_file = path.join(script_dir, 'asign.json') + + try: + with open(asign_file, 'r', encoding='utf-8') as f: + asign_data = json.load(f) + + auth_list = [item['auth'] for item in asign_data.get('caiyun', [])] + + bark_key = asign_data.get('message', {}).get('bark', {}).get('key', '') + + if bark_key: + os.environ['BARK_KEY'] = bark_key + os.environ['BARK_ICON'] = BARK_ICON + os.environ['BARK_GROUP'] = BARK_GROUP + + # 构建cookie列表 (格式: auth#手机号#00) + cookies = [] + for auth in auth_list: + try: + import base64 + decoded = base64.b64decode(auth).decode('utf-8') + parts = decoded.split(':') + if len(parts) >= 2: + phone = parts[1] # 获取手机号 + cookies.append(f"Basic {auth}#{phone}#00") + else: + print(f"无法从auth中提取手机号: {auth}") + except Exception as e: + print(f"解析auth失败: {e}") + # 如果无法解析,使用默认手机号 + cookies.append(f"Basic {auth}#13800138000#00") + + print(f"移动云盘共获取到{len(cookies)}个账号") + + except Exception as e: + print(f"读取asign.json失败: {e}") + exit(0) + + for i, account_info in enumerate(cookies, start = 1): + print(f"\n======== ▷ 第 {i} 个账号 ◁ ========") + YP(account_info).run() + print("\n随机等待5-10s进行下一个账号") + time.sleep(random.randint(5, 10)) + + if err_accounts != '': + print(f"\n失效账号:\n{err_accounts}") + else: + print('当前所有账号ck有效') + + print(user_amount) + + send = load_send() + + # 判断是否推送 + if PUSH_SWITCH == '1': + if send: + if err_accounts: + msg = f"⚠️ 失效账号:\n{err_accounts}\n" + user_amount + else: + msg = user_amount + send('☁️ 云朵资产统计', msg) + else: + print('通知服务不可用') + else: + print("推送开关已关闭,不发送推送通知")