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('通知服务不可用')