From dbe3e237d535c4d51ac555b598b10451ac56ffe1 Mon Sep 17 00:00:00 2001 From: 3288588344 <127068117+3288588344@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:50:11 +0800 Subject: [PATCH] Add files via upload --- 移动云盘.py | 881 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 881 insertions(+) create mode 100644 移动云盘.py diff --git a/移动云盘.py b/移动云盘.py new file mode 100644 index 0000000..121ddb6 --- /dev/null +++ b/移动云盘.py @@ -0,0 +1,881 @@ +# 脚本名称: [中国移动云盘] +# 功能描述: [签到 基础任务 果园 云朵大作战] +# 使用说明: +# - [抓包 Cookie:任意Authorization] +# - [注意事项: 简易方法,开抓包进App,搜refresh,找到authTokenRefresh.do ,请求头中的Authorization,响应体 xxx 中xxx值(新版加密抓这个)] +# 环境变量设置: +# - 名称:[ydypCK] 格式:[Authorization值#手机号#token值] +# - 多账号处理方式:[换行或者&分割] +# 定时设置: [0 0 8,16,20 * * *] +# 更新日志: +# - [1.30]: [同一环境变量获取] +# 注: 本脚本仅用于个人学习和交流,请勿用于非法用途。作者不承担由于滥用此脚本所引起的任何责任,请在下载后24小时内删除。 +# new Env("移动云盘") +#TL库:https://github.com/3288588344/toulu.git +#tg频道:https://t.me/TLtoulu +#QQ频道:https://pd.qq.com/s/672fku8ge +#微信机器人:kckl6688 +#公众号:哆啦A梦的藏宝箱 +import os +import random +import re +import time +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 + + +# 发送通知 +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 # 导入模块的send为notify_send + print("加载通知服务成功!") + return send # 返回导入的函数 + except ImportError: + print("加载通知服务失败~") + else: + print("加载通知服务失败~") + + return False # 返回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☁️ 云朵大作战') + self.cloud_game() + print(f'\n🌳 果园任务') + 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'用户[{self.encrypt_account}]:{err_msg}\n' # 错误信息 + elif amount is not None: + user_amount += f'用户[{self.encrypt_account}]:{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}云朵') + msg = f'云朵数量:{total_amount} \n{rewards}' + 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('- 通知权限未开启') + +def get_announcement(): + """ + 获取公告信息 + """ + external_url = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt' + try: + response = requests.get(external_url) + if response.status_code == 200: + print( response.text) + print("公告获取成功,开始执行任务...") + else: + print(f"获取公告失败,状态码: {response.status_code}") + except requests.exceptions.RequestException as e: + print(f"获取公告时发生错误: {e}") + + +if __name__ == "__main__": + get_announcement() + env_name = 'ydypCK' + token = os.getenv(env_name) + if not token: + print(f'⛔️未获取到ck变量:请检查变量 {env_name} 是否填写') + exit(0) + + cookies = re.split(r'[&\n]', token) + print(f"移动硬盘共获取到{len(cookies)}个账号") + + 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有效') + if err_message != '': + print(f'-错误信息: \n{err_message}') + print(user_amount) + # 在load_send中获取导入的send函数 + send = load_send() + + # 判断send是否可用再进行调用 + if send: + msg = f"失效账号:\n{err_accounts}\n-错误信息:\n{err_message}\n-云朵数量: \n{user_amount}" + send('中国移动云盘任务信息', msg) + else: + print('通知服务不可用')