Commit 7f322a4

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-08-26 09:08:35
chore(bridge): add `target_mid` for bridge bots
1 parent 9f060b9
src/preview/douyin.py
@@ -68,6 +68,7 @@ async def preview_douyin(
         succ, data = await parse_via_tikhub(url, platform, proxy, provider="tikhub")
     if not succ and "bridge" in douyin_provider:  # try bridge
         logger.error("❌抖音解析失败, 尝试第三方Bot...")
+        kwargs |= {"target_mid": message.id}
         await send_to_social_media_bridge(client, message, url, platform, **kwargs)
         return
     if not succ:
src/preview/instagram.py
@@ -30,7 +30,7 @@ async def preview_instagram(
     db_key: str = "",
     *,
     instagram_provider: str = PROVIDER.INSTAGRAM,
-    instagram_comments_provider: str = PROVIDER.INSTAGRAM_COMMENTS,
+    instagram_comments: bool = True,
     **kwargs,
 ):
     """Preview instagram link in the message.
@@ -41,7 +41,7 @@ async def preview_instagram(
         url (str, optional): Tnstagram link.
         db_key (str, optional): The cache key.
         instagram_provider (str, optional): The instagram extractor: tikhub, ddinstagram, bridge
-        instagram_comments_provider (str, optional): The instagram comments extractor: "tikhub" or "false".
+        instagram_comments (bool, optional): Add instagram comments. Defaults to True.
     """
     if kwargs.get("show_progress") and "progress" not in kwargs:
         res = await send2tg(client, message, texts=f"🔗正在解析Instagram链接\n{url}", **kwargs)
@@ -93,7 +93,7 @@ async def preview_instagram(
             texts += f"{description}\n"
     # parse comments
     comments: list[str] = []
-    if true(instagram_comments_provider):
+    if true(instagram_comments):
         comment_nodes = glom(data, "edge_media_to_parent_comment.edges", default=[])
         comment_nodes = sorted(comment_nodes, key=lambda x: glom(x, "node.created_at", default=0))
         comment_list = [{"author": glom(node, "node.owner.username", default="user"), "text": glom(node, "node.text", default="")} for node in comment_nodes]
@@ -121,6 +121,7 @@ async def preview_ddinstagram(client: Client, message: Message, url: str, post_t
         post_id (str): post id.
         fallback (bool, optional): Fallback to other bots. Defaults to True.
     """
+    kwargs |= {"target_mid": message.id}
     if "ddinstagram" not in instagram_provider:
         if "bridge" in instagram_provider:
             await send_to_social_media_bridge(client, message, url, **kwargs)
src/preview/twitter.py
@@ -29,9 +29,8 @@ async def preview_twitter(
     db_key: str = "",
     platform: str = "x",
     twitter_provider: str = PROVIDER.TWITTER,
-    twitter_comments_provider: str = PROVIDER.TWITTER_COMMENTS,
     *,
-    fallback: bool = True,
+    twitter_comments: bool = True,
     **kwargs,
 ):
     """Preview twitter link in the message.
@@ -43,8 +42,7 @@ async def preview_twitter(
         db_key (str, optional): The cache key.
         platform (str): The social media platform.
         twitter_provider (str): The extractor to use: fxtwitter or tikhub.
-        twitter_comments_provider (str, optional): The twitter comments extractor: "tikhub" or "false".
-        fallback (bool, optional): Fallback to other bots. Defaults to True.
+        twitter_comments (bool, optional): Add twitter comments. Defaults to True
     """
     if kwargs.get("show_progress") and "progress" not in kwargs:
         res = await send2tg(client, message, texts=f"🔗正在解析推特链接\n{url}", **kwargs)
@@ -101,10 +99,12 @@ async def preview_twitter(
             logger.warning(f"Twitter API [vxtwitter] failed: {e}")
 
     if not succ:
-        if fallback:
+        if "bridge" in twitter_provider:
             await modify_progress(text="❌推特解析失败, 尝试第三方Bot...", **kwargs)
+            kwargs |= {"target_mid": message.id}
             await send_to_social_media_bridge(client, message, url, platform, **kwargs)
         return
+
     media = []
     media_ids = set()  # deduplicate media
     master_media = []
@@ -156,7 +156,7 @@ async def preview_twitter(
             msg += f"\n🏞{part_strs['first']}属于主推"
         if texts := master_info.get("texts"):
             msg += f"\n{texts}"
-        if true(twitter_comments_provider) and (comments := master_info.get("comments")):
+        if true(twitter_comments) and (comments := master_info.get("comments")):
             msg += f"\n{BLOCKQUOTE_EXPANDABLE_DELIM}💬**点此展开评论区**:"
             for cmt in comments:
                 if str(cmt["post_id"]) == str(this_info["post_id"]):
@@ -185,7 +185,7 @@ async def preview_twitter(
     if texts := this_info.get("texts"):
         msg += f"\n{texts}"
 
-    if true(twitter_comments_provider) and (comments := this_info.get("comments")):
+    if true(twitter_comments) and (comments := this_info.get("comments")):
         msg += f"\n{BLOCKQUOTE_EXPANDABLE_DELIM}💬**点此展开评论区**:"
         for cmt in comments:
             cmt_texts = cmt["text"].strip().removeprefix(f"@{master_handle}").strip()  # 有时回推的comment前会附带被回推的handle, 这里去掉
src/preview/weibo.py
@@ -34,8 +34,8 @@ async def preview_weibo(
     db_key: str = "",
     post_id: str = "",
     *,
-    weibo_comments_provider: str = PROVIDER.WEIBO_COMMENTS,
-    fallback: bool = True,
+    weibo_provider: str = PROVIDER.WEIBO,
+    weibo_comments: bool = True,
     **kwargs,
 ):
     """Preview weibo link in the message.
@@ -46,8 +46,8 @@ async def preview_weibo(
         url (str, optional): Weibo link.
         db_key (str, optional): The cache key.
         post_id (str, optional): Weibo post ID
-        weibo_comments_provider (str, optional): The weibo comments extractor: "free" or "false".
-        fallback (bool, optional): Fallback to other bots. Defaults to True.
+        weibo_provider (str, optional): The weibo provider.
+        weibo_comments (bool, optional): Fetch weibo comments. Defaults to True.
     """
     if post_id.startswith("weibovideo"):
         post_id = await weibo_vid_to_postid(post_id)
@@ -64,8 +64,9 @@ async def preview_weibo(
         await modify_progress(text=f"❌从{DB.ENGINE}缓存中转发失败, 尝试重新解析...", **kwargs)
     this_info = await parse_weibo_info(post_id, **kwargs)
     if error_msg := this_info.get("error_msg"):
-        if this_info.get("fallback", fallback):
+        if "bridge" in weibo_provider and not this_info.get("force_stop"):
             await modify_progress(text=f"❌微博解析失败: {error_msg}\n尝试第三方Bot...", **kwargs)
+            kwargs |= {"target_mid": message.id}
             await send_to_social_media_bridge(client, message, url, **kwargs)
         else:
             await modify_progress(text=f"❌微博解析失败: {error_msg}", force_update=True, **kwargs)
@@ -122,7 +123,7 @@ async def preview_weibo(
         media.extend(quote_info["media"])
 
     comments = []
-    if true(weibo_comments_provider):
+    if true(weibo_comments):
         comments = this_info.get("comments", [])
         if not comments:
             comments = await parse_weibo_comments(post_id)
@@ -147,7 +148,7 @@ async def parse_weibo_info(post_id: str, data: dict | None = None, **kwargs) ->
                 info["error_msg"] = "Weibo API empty response"
                 if "微博不存在" in str(resp["text"]) or "暂无查看权限" in str(resp["text"]):
                     info["error_msg"] = "微博不存在或暂无查看权限!"
-                    info["fallback"] = False
+                    info["force_stop"] = True
                 logger.error(info["error_msg"])
                 return info
             json_data: dict = json.loads(matched.group(1))
src/preview/xiaohongshu.py
@@ -10,7 +10,7 @@ from pyrogram.client import Client
 from pyrogram.types import Message
 
 from bridge.social import send_to_social_media_bridge
-from config import DB, PROXY, TZ
+from config import DB, PROVIDER, PROXY, TZ
 from database.database import get_db
 from messages.database import copy_messages_from_db, save_messages
 from messages.progress import modify_progress
@@ -20,7 +20,16 @@ from networking import download_file, download_first_success_urls, download_medi
 from others.emoji import emojify
 
 
-async def preview_xhs(client: Client, message: Message, url: str = "", db_key: str = "", xsec: str = "", *, fallback: bool = True, **kwargs):
+async def preview_xhs(
+    client: Client,
+    message: Message,
+    url: str = "",
+    db_key: str = "",
+    xsec: str = "",
+    *,
+    xhs_provider: str = PROVIDER.XHS,
+    **kwargs,
+):
     """Preview xiaohongshu link in the message.
 
     Args:
@@ -29,7 +38,7 @@ async def preview_xhs(client: Client, message: Message, url: str = "", db_key: s
         url (str, optional): xiaohongshu link
         db_key (str, optional): The cache key.
         xsec (str, optional): The xsec token.
-        fallback (bool, optional): Fallback to other bots. Defaults to True.
+        xhs_provider (str, optional): The xiaohongshu provider.
     """
     if kwargs.get("show_progress") and "progress" not in kwargs:
         res = await send2tg(client, message, texts=f"🔗正在解析小红书链接\n{url}", **kwargs)
@@ -51,9 +60,10 @@ async def preview_xhs(client: Client, message: Message, url: str = "", db_key: s
     xhs_info = await get_xhs_info(url)
     note = xhs_info.get("note", {})
     if not note:
-        if fallback:
+        if "bridge" in xhs_provider:
             await modify_progress(text="❌小红书解析失败, 尝试第三方Bot...", **kwargs)
             full_url = f"https://{db_key}?xsec_token={xsec}"
+            kwargs |= {"target_mid": message.id}
             await send_to_social_media_bridge(client, message, full_url, **kwargs)
         else:
             await modify_progress(text="❌小红书解析失败, 请稍候再尝试", force_update=True, **kwargs)
src/config.py
@@ -136,13 +136,12 @@ class DANMU:
 
 
 class PROVIDER:  # default API provider
-    DOUYIN = os.getenv("DOUYIN_PROVIDER", "direct-free-tikhub-bridge").lower()  # free or tikhub
-    DOUYIN_COMMENTS = os.getenv("DOUYIN_COMMENTS_PROVIDER", "free-tikhub").lower()  # free or tikhub or a false value (0, false, none, null, etc.)
-    TWITTER = os.getenv("TWITTER_PROVIDER", "tikhub-vxtwitter-fxtwitter").lower()
-    TWITTER_COMMENTS = os.getenv("TWITTER_COMMENTS_PROVIDER", "tikhub").lower()  # tikhub or a false value (0, false, none, null, etc.)
-    INSTAGRAM = os.getenv("INSTAGRAM_PROVIDER", "tikhub-ddinstagram-bridge").lower()  # tikhub, ddinstagram, bridge
-    INSTAGRAM_COMMENTS = os.getenv("INSTAGRAM_COMMENTS_PROVIDER", "tikhub").lower()  # tikhub or a false value (0, false, none, null, etc.)
-    WEIBO_COMMENTS = os.getenv("WEIBO_COMMENTS_PROVIDER", "free").lower()  # free or a false value (0, false, none, null, etc.)
+    DOUYIN = os.getenv("DOUYIN_PROVIDER", "direct-free-tikhub-bridge").lower()
+    DOUYIN_COMMENTS = os.getenv("DOUYIN_COMMENTS_PROVIDER", "free-tikhub").lower()  # a false value (0, false, none, null) to disable it
+    TWITTER = os.getenv("TWITTER_PROVIDER", "tikhub-vxtwitter-fxtwitter-bridge").lower()
+    INSTAGRAM = os.getenv("INSTAGRAM_PROVIDER", "tikhub-ddinstagram-bridge").lower()
+    WEIBO = os.getenv("WEIBO_PROVIDER", "direct-bridge").lower()
+    XHS = os.getenv("XHS_PROVIDER", "direct-bridge").lower()
 
 
 class TOKEN: