Commit 0572e32
Changed files (4)
src
src/preview/douyin.py
@@ -30,8 +30,6 @@ async def preview_douyin(
platform: str = "douyin",
douyin_provider: str = PROVIDER.DOUYIN,
douyin_comments_provider: str = PROVIDER.DOUYIN_COMMENTS,
- *,
- fallback: bool = True,
**kwargs,
):
"""Preview douyin or tiktok link in the message.
@@ -42,9 +40,8 @@ async def preview_douyin(
url (str, optional): The douyin or tiktok link.
db_key (str, optional): The cache key.
platform(str, optional): The platform name. Defaults to "douyin".
- douyin_provider (str, optional): The douyin extractor: "free", "tikhub" or "free-tikhub".
+ douyin_provider (str, optional): The douyin extractor: "free", "tikhub", "bridge", or combined strings.
douyin_comments_provider (str, optional): The douyin comments extractor: "free", "tikhub" or "free-tikhub".
- fallback (bool, optional): Fallback to other bots. Defaults to True.
"""
if kwargs.get("show_progress") and "progress" not in kwargs:
res = await send2tg(client, message, texts=f"🔗正在解析抖音链接\n{url}", **kwargs)
@@ -74,13 +71,13 @@ async def preview_douyin(
try:
resp = await hx_req(api_url, headers=headers, check_keys=["data"], check_kv={"code": 200})
data = resp["data"]
+ succ = True
except Exception:
logger.warning(f"{platform} API [tikhub] failed")
- if fallback:
- await modify_progress(text="❌抖音解析失败, 尝试第三方Bot...", **kwargs)
- await send_to_social_media_bridge(client, message, url, platform, **kwargs)
- return
-
+ if not succ and "bridge" in douyin_provider: # try bridge
+ logger.error("❌抖音解析失败, 尝试第三方Bot...")
+ await send_to_social_media_bridge(client, message, url, platform, **kwargs)
+ return
aweme_id = glom(data, "aweme_id", default=Path(url).stem)
if int(glom(data, "media_type", default=4)) == 2: # image post
media = [{"photo": download_first_success_urls(glom(x, "url_list", default=[]), proxy=proxy, **kwargs)} for x in glom(data, "images", default=[])]
src/preview/instagram.py
@@ -29,8 +29,8 @@ async def preview_instagram(
url: str = "",
db_key: str = "",
*,
+ instagram_provider: str = PROVIDER.INSTAGRAM,
instagram_comments_provider: str = PROVIDER.INSTAGRAM_COMMENTS,
- fallback: bool = True,
**kwargs,
):
"""Preview instagram link in the message.
@@ -40,8 +40,8 @@ async def preview_instagram(
message (Message): The trigger message object.
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".
- fallback (bool, optional): Fallback to other bots. Defaults to True.
"""
if kwargs.get("show_progress") and "progress" not in kwargs:
res = await send2tg(client, message, texts=f"🔗正在解析Instagram链接\n{url}", **kwargs)
@@ -52,14 +52,17 @@ async def preview_instagram(
if await copy_messages_from_db(client, message, key=db_key, kv=kv, **kwargs):
return
await modify_progress(text=f"❌从{DB.ENGINE}缓存中转发失败, 尝试重新解析...", **kwargs)
-
- api_url = API.TIKHUB_INSTAGRAM + url
- logger.info(f"Preview Instagram TikHub for {api_url}")
- headers = {"authorization": f"Bearer {TOKEN.TIKHUB}", "accept": "application/json"}
- resp = await hx_req(api_url, headers=headers, check_keys=["data"], check_kv={"code": 200})
- if resp.get("hx_error"):
- await modify_progress(text=f"❌Instagram解析失败, 使用DDInstagram预览\n{resp['hx_error']}", **kwargs)
- await preview_ddinstagram(client, message, url=url, fallback=fallback, **kwargs)
+ succ = False
+ if "tikhub" in instagram_provider: # try tikhub
+ api_url = API.TIKHUB_INSTAGRAM + url
+ logger.info(f"Preview Instagram TikHub for {api_url}")
+ headers = {"authorization": f"Bearer {TOKEN.TIKHUB}", "accept": "application/json"}
+ resp = await hx_req(api_url, headers=headers, check_keys=["data"], check_kv={"code": 200})
+ if not resp.get("hx_error"):
+ succ = True
+ if not succ:
+ logger.error("❌Instagram解析失败, 使用DDInstagram预览")
+ await preview_ddinstagram(client, message, url=url, instagram_provider=instagram_provider, **kwargs)
return
data = resp["data"]
@@ -104,7 +107,7 @@ async def preview_instagram(
await save_messages(messages=sent_messages, key=db_key)
-async def preview_ddinstagram(client: Client, message: Message, url: str, post_type: str, post_id: str, *, fallback: bool = True, **kwargs):
+async def preview_ddinstagram(client: Client, message: Message, url: str, post_type: str, post_id: str, *, instagram_provider: str, **kwargs):
"""Preview instagram link in the message via DDInstagram.
https://ddinstagram.com/
@@ -117,33 +120,34 @@ 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.
"""
+ if "ddinstagram" not in instagram_provider:
+ if "bridge" in instagram_provider:
+ await send_to_social_media_bridge(client, message, url, **kwargs)
+ return
api_url = f"{API.DDINSTAGRAM}/{post_type}/{post_id}"
logger.info(f"Instagram link preview for {api_url}")
headers = {"user-agent": TELEGRAM_UA}
resp = await hx_req(api_url, headers=headers, rformat="text")
if not resp.get("text"):
- if fallback:
+ if "bridge" in instagram_provider:
await send_to_social_media_bridge(client, message, url, **kwargs)
return
-
soup = BeautifulSoup(resp["text"], "html.parser")
logger.trace(soup.prettify())
texts = ""
media = {}
- if tag := soup.find("meta", attrs={"name": "twitter:title"}):
+ if tag := soup.find("meta", attrs={"property": "twitter:title"}):
author = tag.get("content", "Unknown") # type: ignore
texts += f"🏞**[{author}]({url})\n"
if tag := soup.find("meta", attrs={"property": "og:description"}):
- texts: str = tag.get("content", "") # type: ignore
- if tag := soup.find("meta", attrs={"name": "twitter:image"}):
- img_url = tag.get("content", "") # type: ignore
- if img_url:
- raw_url = f"{API.DDINSTAGRAM}{img_url}"
- media["photo"] = await download_file(raw_url, path=f"{DOWNLOAD_DIR}/{post_id}.jpg", proxy=PROXY.INSTAGRAM, **kwargs)
- if not bool(await validate_img(media["photo"])):
- await send_to_social_media_bridge(client, message, text=url, **kwargs)
- return
+ texts += tag.get("content", "") # type: ignore
+ if (tag := soup.find("meta", attrs={"property": "twitter:image"})) and (img_url := tag.get("content")): # type: ignore
+ raw_url = f"{API.DDINSTAGRAM}{img_url}"
+ media["photo"] = await download_file(raw_url, path=f"{DOWNLOAD_DIR}/{post_id}.jpg", proxy=PROXY.INSTAGRAM, **kwargs)
+ if not bool(await validate_img(media["photo"])):
+ await send_to_social_media_bridge(client, message, text=url, **kwargs)
+ return
if tag := soup.find("meta", attrs={"property": "og:video"}):
video_url = tag.get("content", "") # type: ignore
@@ -155,3 +159,4 @@ async def preview_ddinstagram(client: Client, message: Message, url: str, post_t
return
await send2tg(client, message, texts=texts, media=[media], **kwargs)
+ await modify_progress(del_status=True, **kwargs)
src/config.py
@@ -120,10 +120,11 @@ class DANMU:
class PROVIDER: # default API provider
- DOUYIN = os.getenv("DOUYIN_PROVIDER", "free-tikhub").lower() # free or tikhub
+ DOUYIN = os.getenv("DOUYIN_PROVIDER", "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-fxtwitter").lower() # tikhub or fxtwitter
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.)
YOUTUBE_COMMENTS = os.getenv("YOUTUBE_COMMENTS_PROVIDER", "free").lower() # free or a false value (0, false, none, null, etc.)