diff --git a/app/modules/qqbot/api.py b/app/modules/qqbot/api.py index 143de77d..2c7f8f0b 100644 --- a/app/modules/qqbot/api.py +++ b/app/modules/qqbot/api.py @@ -104,6 +104,9 @@ def send_proactive_c2c_message( """ 主动发送 C2C 单聊消息(不需要 msg_id) 注意:每月限 4 条/用户,且用户必须曾与机器人交互过 + :param access_token: 访问令牌 + :param openid: 用户 openid + :param content: 消息内容 :param use_markdown: 是否使用 Markdown 格式(需机器人开通 Markdown 能力) """ if not content or not content.strip(): @@ -124,6 +127,9 @@ def send_proactive_group_message( """ 主动发送群聊消息(不需要 msg_id) 注意:每月限 4 条/群,且群必须曾与机器人交互过 + :param access_token: 访问令牌 + :param group_openid: 群聊 openid + :param content: 消息内容 :param use_markdown: 是否使用 Markdown 格式(需机器人开通 Markdown 能力) """ if not content or not content.strip(): @@ -185,6 +191,7 @@ def send_message( ) -> dict: """ 统一发送接口 + :param access_token: 访问令牌 :param target: openid(c2c)或 group_openid(group) :param content: 消息内容 :param msg_type: c2c 单聊 / group 群聊 diff --git a/app/modules/qqbot/gateway.py b/app/modules/qqbot/gateway.py index ba43f797..432455cf 100644 --- a/app/modules/qqbot/gateway.py +++ b/app/modules/qqbot/gateway.py @@ -49,8 +49,8 @@ def run_gateway( payload = {"op": 1, "d": last_seq} ws_ref[0].send(json.dumps(payload)) logger.debug(f"[QQ Gateway:{config_name}] Heartbeat sent, seq={last_seq}") - except Exception as e: - logger.debug(f"[QQ Gateway:{config_name}] Heartbeat error: {e}") + except Exception as err: + logger.debug(f"[QQ Gateway:{config_name}] Heartbeat error: {err}") if heartbeat_interval_ms and not stop_event.is_set(): heartbeat_timer = threading.Timer(heartbeat_interval_ms / 1000.0, send_heartbeat) heartbeat_timer.daemon = True @@ -60,8 +60,8 @@ def run_gateway( nonlocal last_seq, heartbeat_interval_ms, heartbeat_timer try: payload = json.loads(message) - except json.JSONDecodeError as e: - logger.error(f"[QQ Gateway:{config_name}] Invalid JSON: {e}") + except json.JSONDecodeError as err: + logger.error(f"[QQ Gateway:{config_name}] Invalid JSON: {err}") return op = payload.get("op") @@ -78,9 +78,6 @@ def run_gateway( heartbeat_interval_ms = d.get("heartbeat_interval", 30000) logger.info(f"[QQ Gateway:{config_name}] Hello received, heartbeat_interval={heartbeat_interval_ms}") - token = get_token_fn(app_id, app_secret) - gateway_url = get_gateway_url_fn(token) - # Identify identify = { "op": 2, diff --git a/app/modules/qqbot/qqbot.py b/app/modules/qqbot/qqbot.py index c69aa162..0e2c838c 100644 --- a/app/modules/qqbot/qqbot.py +++ b/app/modules/qqbot/qqbot.py @@ -217,7 +217,7 @@ class QQBot: return None data = resp.content[:65536] if len(resp.content) > 65536 else resp.content with Image.open(io.BytesIO(data)) as img: - return (img.width, img.height) + return img.width, img.height except Exception as e: logger.debug(f"QQ Bot 获取图片尺寸失败 ({url[:60]}...): {e}") return None @@ -318,8 +318,8 @@ class QQBot: try: token = get_access_token(self._app_id, self._app_secret) for tgt, tgt_is_group in targets_to_send: + send_fn = send_proactive_group_message if tgt_is_group else send_proactive_c2c_message try: - send_fn = send_proactive_group_message if tgt_is_group else send_proactive_c2c_message send_fn(token, tgt, content, use_markdown=use_markdown) success_count += 1 logger.debug(f"QQ Bot: 消息已发送到 {'群' if tgt_is_group else '用户'} {tgt}") diff --git a/app/modules/rtorrent/rtorrent.py b/app/modules/rtorrent/rtorrent.py index 6166c484..672c4525 100644 --- a/app/modules/rtorrent/rtorrent.py +++ b/app/modules/rtorrent/rtorrent.py @@ -102,7 +102,6 @@ class Rtorrent: url = self._host if url.startswith("scgi://"): # SCGI直连模式 - parsed = urlparse(url) logger.info(f"正在通过SCGI连接 rTorrent:{url}") proxy = xmlrpc.client.ServerProxy(url, transport=SCGITransport()) else: diff --git a/app/modules/ugreen/ugreen.py b/app/modules/ugreen/ugreen.py index 27166c0e..1eb8c0ce 100644 --- a/app/modules/ugreen/ugreen.py +++ b/app/modules/ugreen/ugreen.py @@ -395,7 +395,8 @@ class Ugreen: use_cookies=False, ) - def __infer_library_type(self, name: str, path: Optional[str]) -> str: + @staticmethod + def __infer_library_type(name: str, path: Optional[str]) -> str: name = name or "" path = path or "" if "电视剧" in path or any(key in name for key in ["剧", "综艺", "动漫", "纪录片"]): @@ -497,7 +498,7 @@ class Ugreen: if lib_id is not None and lib_path: paths[str(lib_id)] = str(lib_path) - if data.get("is_last_page") is True: + if data.get("is_last_page"): break page += 1 @@ -585,7 +586,8 @@ class Ugreen: api.logout() api.close() - def __extract_video_info_list(self, bucket: Any) -> list[dict]: + @staticmethod + def __extract_video_info_list(bucket: Any) -> list[dict]: if not isinstance(bucket, Mapping): return [] video_arr = bucket.get("video_arr") @@ -764,7 +766,8 @@ class Ugreen: return True - def get_webhook_message(self, body: Any) -> Optional[schemas.WebhookEventInfo]: + @staticmethod + def get_webhook_message(body: Any) -> Optional[schemas.WebhookEventInfo]: return None def get_iteminfo(self, itemid: str) -> Optional[schemas.MediaServerItem]: @@ -818,7 +821,7 @@ class Ugreen: if sub_path and sub_path not in visited: queue.append(str(sub_path)) - if data.get("is_last_page") is True: + if data.get("is_last_page"): break page += 1 @@ -957,6 +960,7 @@ class Ugreen: return images - def get_image_cookies(self, image_url: str): + @staticmethod + def get_image_cookies(image_url: str): # 绿联图片流接口依赖加密鉴权头,当前图片代理仅支持Cookie注入。 return None