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: