From fef30da69d5579dce9c25d75e2dd2a918069c5d6 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Sun, 29 May 2022 00:49:11 +0800 Subject: [PATCH] catch json decode error --- .../nonebot_bison/platform/platform.py | 135 ++++++++---------- src/plugins/nonebot_bison/scheduler.py | 2 +- 2 files changed, 62 insertions(+), 75 deletions(-) diff --git a/src/plugins/nonebot_bison/platform/platform.py b/src/plugins/nonebot_bison/platform/platform.py index b5de376..22c1200 100644 --- a/src/plugins/nonebot_bison/platform/platform.py +++ b/src/plugins/nonebot_bison/platform/platform.py @@ -1,3 +1,4 @@ +import json import ssl import time from abc import ABC, abstractmethod @@ -60,6 +61,25 @@ class Platform(metaclass=RegistryABCMeta, base=True): ) -> list[tuple[User, list[Post]]]: ... + async def do_fetch_new_post( + self, target: Target, users: list[UserSubInfo] + ) -> list[tuple[User, list[Post]]]: + try: + return await self.fetch_new_post(target, users) + except httpx.RequestError as err: + logger.warning( + "network connection error: {}, url: {}".format( + type(err), err.request.url + ) + ) + return [] + except ssl.SSLError as err: + logger.warning(f"ssl error: {err}") + return [] + except json.JSONDecodeError as err: + logger.warning(f"json error, parsing: {err.doc}") + return [] + @abstractmethod async def parse(self, raw_post: RawPost) -> Post: ... @@ -227,33 +247,22 @@ class NewMessage(MessageProcess, abstract=True): async def fetch_new_post( self, target: Target, users: list[UserSubInfo] ) -> list[tuple[User, list[Post]]]: - try: - post_list = await self.get_sub_list(target) - new_posts = await self.filter_common_with_diff(target, post_list) - if not new_posts: - return [] - else: - for post in new_posts: - logger.info( - "fetch new post from {} {}: {}".format( - self.platform_name, - target if self.has_target else "-", - self.get_id(post), - ) + post_list = await self.get_sub_list(target) + new_posts = await self.filter_common_with_diff(target, post_list) + if not new_posts: + return [] + else: + for post in new_posts: + logger.info( + "fetch new post from {} {}: {}".format( + self.platform_name, + target if self.has_target else "-", + self.get_id(post), ) - res = await self.dispatch_user_post(target, new_posts, users) - self.parse_cache = {} - return res - except httpx.RequestError as err: - logger.warning( - "network connection error: {}, url: {}".format( - type(err), err.request.url ) - ) - return [] - except ssl.SSLError as err: - logger.warning(f"ssl error: {err}") - return [] + res = await self.dispatch_user_post(target, new_posts, users) + self.parse_cache = {} + return res class StatusChange(Platform, abstract=True): @@ -274,33 +283,22 @@ class StatusChange(Platform, abstract=True): async def fetch_new_post( self, target: Target, users: list[UserSubInfo] ) -> list[tuple[User, list[Post]]]: - try: - new_status = await self.get_status(target) - res = [] - if old_status := self.get_stored_data(target): - diff = self.compare_status(target, old_status, new_status) - if diff: - logger.info( - "status changes {} {}: {} -> {}".format( - self.platform_name, - target if self.has_target else "-", - old_status, - new_status, - ) + new_status = await self.get_status(target) + res = [] + if old_status := self.get_stored_data(target): + diff = self.compare_status(target, old_status, new_status) + if diff: + logger.info( + "status changes {} {}: {} -> {}".format( + self.platform_name, + target if self.has_target else "-", + old_status, + new_status, ) - res = await self.dispatch_user_post(target, diff, users) - self.set_stored_data(target, new_status) - return res - except httpx.RequestError as err: - logger.warning( - "network connection error: {}, url: {}".format( - type(err), err.request.url ) - ) - return [] - except ssl.SSLError as err: - logger.warning(f"ssl error: {err}") - return [] + res = await self.dispatch_user_post(target, diff, users) + self.set_stored_data(target, new_status) + return res class SimplePost(MessageProcess, abstract=True): @@ -309,32 +307,21 @@ class SimplePost(MessageProcess, abstract=True): async def fetch_new_post( self, target: Target, users: list[UserSubInfo] ) -> list[tuple[User, list[Post]]]: - try: - new_posts = await self.get_sub_list(target) - if not new_posts: - return [] - else: - for post in new_posts: - logger.info( - "fetch new post from {} {}: {}".format( - self.platform_name, - target if self.has_target else "-", - self.get_id(post), - ) + new_posts = await self.get_sub_list(target) + if not new_posts: + return [] + else: + for post in new_posts: + logger.info( + "fetch new post from {} {}: {}".format( + self.platform_name, + target if self.has_target else "-", + self.get_id(post), ) - res = await self.dispatch_user_post(target, new_posts, users) - self.parse_cache = {} - return res - except httpx.RequestError as err: - logger.warning( - "network connection error: {}, url: {}".format( - type(err), err.request.url ) - ) - return [] - except ssl.SSLError as err: - logger.warning(f"ssl error: {err}") - return [] + res = await self.dispatch_user_post(target, new_posts, users) + self.parse_cache = {} + return res class NoTargetGroup(Platform, abstract=True): diff --git a/src/plugins/nonebot_bison/scheduler.py b/src/plugins/nonebot_bison/scheduler.py index 307c0b5..cf976c8 100644 --- a/src/plugins/nonebot_bison/scheduler.py +++ b/src/plugins/nonebot_bison/scheduler.py @@ -59,7 +59,7 @@ async def fetch_and_send(target_type: str): send_user_list, ) ) - to_send = await platform_manager[target_type].fetch_new_post( + to_send = await platform_manager[target_type].do_fetch_new_post( target, send_userinfo_list ) if not to_send: