def _show_task(self, pid, task, follow=False): TaskManager.running = True # 相当于每次执行 jobs -f 都初始化 # TOTAL_TASKS 用于标记还没完成的任务数量 global OUTPUT_LIST, TOTAL_TASKS def stop_show_task(): """停止显示任务状态""" stop_signal = None while TaskManager.running or TOTAL_TASKS > 0: try: stop_signal = input_with_timeout(2) except (TimeoutExpired, OSError): sleep(0.5) else: if stop_signal: TaskManager.running = False logger.debug( f"Stop_show_task break by User! {stop_signal=}, {TOTAL_TASKS=}" ) break logger.debug( f"Stop_show_task Exit! {TaskManager.running=}, {TOTAL_TASKS=}") if follow: Thread(target=stop_show_task).start() now_size, total_size, msg = task.get_process() done_files, total_files = task.get_count() while total_size == -1 or now_size < total_size or done_files <= total_files: if not TaskManager.running: break # 用户中断 if follow: now_size, total_size, msg = task.get_process() done_files, total_files = task.get_count() OUTPUT_LIST[pid] = self._size_to_msg(now_size, total_size, msg, pid, task) # 文件秒传、出错 没有大小,需要跳过秒传检查 msg if ((msg and msg != 'check') or now_size >= total_size) and done_files >= total_files: TOTAL_TASKS -= 1 logger.debug( f"{pid=} While Loop Break! {msg=}, {TOTAL_TASKS=}, {done_files=}, {total_files=}" ) while True: if not task.is_alive(): OUTPUT_LIST.append(f"[{pid}] finished") for err_msg in task.get_err_msg(): OUTPUT_LIST.append( f"[{pid}] Error Messages: {err_msg}") break sleep(1) # 只有还有一个没有完成, 就不能改 TaskManager.running if TaskManager.running and TOTAL_TASKS < 1: TaskManager.running = False # 辅助控制 stop_show_task 线程的结束 🤣 logger.debug( f"{pid=} TaskManager changed running value to False" ) break sleep(1) else: print(self._size_to_msg(now_size, total_size, msg, pid, task)) break # 非实时显示模式,直接结束
def append(self, item, repeat=True): """在末尾插入元素""" if (not repeat) and self.find_by_id(item.id): logger.debug(f"List: 不插入元素 {item.name}") return self._items.append(item) logger.debug(f"List: 插入元素 {item.name}")
def rename(self, args): """重命名文件(夹)""" name = args[0].strip(' ') if not name: info('参数:原文件名 [新文件名]') elif file := self._file_list.find_by_name(name): new = args[1].strip(' ') if len(args) == 2 else input("请输入新文件名:") logger.debug(f"{new=}, {args=}") code = self._disk.rename(file.id, new) if code == Cloud189.SUCCESS: self.refresh() elif code == Cloud189.NETWORK_ERROR: error('网络错误,请重试!') else: error('失败,未知错误!')
def _show_task_bar(self, pid=None, follow=False): """多行更新状态栏""" global OUTPUT_LIST, TOTAL_TASKS with output(output_type="list", initial_len=len(self._tasks), interval=0) as OUTPUT_LIST: pool = [] TOTAL_TASKS = len(self._tasks) logger.debug(f"TaskManager: {TOTAL_TASKS=}") for _pid, task in enumerate(self._tasks): if pid is not None and _pid != pid: # 如果指定了 pid 就只更新 pid 这个 task continue t = Thread(target=self._show_task, args=(_pid, task, follow)) t.start() pool.append(t) [t.join() for t in pool]
def stop_show_task(): """停止显示任务状态""" stop_signal = None while TaskManager.running or TOTAL_TASKS > 0: try: stop_signal = input_with_timeout(2) except (TimeoutExpired, OSError): sleep(0.5) else: if stop_signal: TaskManager.running = False logger.debug( f"Stop_show_task break by User! {stop_signal=}, {TOTAL_TASKS=}" ) break logger.debug( f"Stop_show_task Exit! {TaskManager.running=}, {TOTAL_TASKS=}")
def get_token(username, password): """获取token""" code, result = get_token_pre_params() if code != Cloud189.SUCCESS: return code, None param_id, req_id, return_url, captcha_token, j_rsakey, lt = result username = rsa_encode(j_rsakey, username) password = rsa_encode(j_rsakey, password) url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do" headers = { "User-Agent": UA, "Referer": "https://open.e.189.cn/api/logbox/oauth2/unifyAccountLogin.do", "Cookie": f"LT={lt}", "X-Requested-With": "XMLHttpRequest", "REQID": req_id, "lt": lt } data = { "appKey": "8025431004", "accountType": "02", "userName": f"{{RSA}}{username}", "password": f"{{RSA}}{password}", "validateCode": "", "captchaToken": captcha_token, "returnUrl": return_url, "mailSuffix": "@189.cn", "dynamicCheck": "FALSE", "clientType": 10020, "cb_SaveName": 1, "isOauth2": 'false', "state": "", "paramId": param_id } resp = requests.post(url, data=data, headers=headers, timeout=10) if not resp: return Cloud189.NETWORK_ERROR, None resp = resp.json() if 'toUrl' in resp: redirect_url = resp['toUrl'] else: redirect_url = '' logger.debug(f"Token: {resp['msg']=}") url = API + '/getSessionForPC.action' headers = {"User-Agent": UA, "Accept": "application/json;charset=UTF-8"} params = { 'clientType': 'TELEMAC', 'version': '1.0.0', 'channelId': 'web_cloud.189.cn', 'redirectURL': redirect_url } resp = requests.get(url, params=params, headers=headers, timeout=10) if not resp: return Cloud189.NETWORK_ERROR, None sessionKey = resp.json()['sessionKey'] sessionSecret = resp.json()['sessionSecret'] accessToken = resp.json()['accessToken'] # 需要再验证一次? url = API + '/open/oauth2/getAccessTokenBySsKey.action' timestamp = get_time(stamp=True) params = f'AppKey=601102120&Timestamp={timestamp}&sessionKey={sessionKey}' headers = { "AppKey": '601102120', 'Signature': calculate_md5_sign(params), "Sign-Type": "1", "Accept": "application/json", 'Timestamp': timestamp, } resp = requests.get(url, params={'sessionKey': sessionKey}, headers=headers, timeout=10) if not resp: return Cloud189.NETWORK_ERROR accessToken = resp.json()['accessToken'] return Cloud189.SUCCESS, (sessionKey, sessionSecret, accessToken)