feat: 新增平台

This commit is contained in:
2025-11-30 19:49:25 +08:00
parent c3e56a954d
commit fbd2c491b2
41 changed files with 4293 additions and 76 deletions

View File

@@ -1,12 +1,48 @@
from parsers.douyin import DouyinParser
from parsers.tiktok import TikTokParser
from parsers.bilibili import BilibiliMirParser, BilibiliBugPKParser, BilibiliYaohuParser
from parsers.kuaishou import KuaishouBugPKParser, KuaishouUctbParser
from parsers.pipixia import PipixiaBugPKParser, PipixiaUctbParser
from parsers.weibo import WeiboUctbParser, WeiboYaohuParser
from models import ParserAPI
import random
import requests
class ParserFactory:
"""解析器工厂类"""
@staticmethod
def expand_short_url(url: str) -> str:
"""展开短链接获取真实URL"""
short_domains = ['b23.tv', 'v.douyin.com', 't.cn']
# 检查是否是短链接
is_short = any(domain in url.lower() for domain in short_domains)
if not is_short:
return url
try:
# 发送请求,不跟随重定向,获取 Location 头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.head(url, headers=headers, allow_redirects=False, timeout=10)
if response.status_code in [301, 302, 303, 307, 308]:
location = response.headers.get('Location', '')
if location:
# 如果还是短链接,继续展开
if any(domain in location.lower() for domain in short_domains):
return ParserFactory.expand_short_url(location)
return location
# 如果 HEAD 请求不行,尝试 GET 请求跟随重定向
response = requests.get(url, headers=headers, allow_redirects=True, timeout=10)
return response.url
except Exception:
# 展开失败返回原URL
return url
@staticmethod
def create_parser(api_config: ParserAPI):
"""根据API配置创建解析器实例"""
@@ -28,6 +64,30 @@ class ParserFactory:
return BilibiliYaohuParser(api_url, api_key)
else:
return BilibiliMirParser(api_url, api_key)
elif platform == 'kuaishou':
# 快手解析器
if 'bugpk' in api_url:
return KuaishouBugPKParser(api_url, api_key)
elif 'uctb' in api_url:
return KuaishouUctbParser(api_url, api_key)
else:
return KuaishouBugPKParser(api_url, api_key)
elif platform == 'pipixia':
# 皮皮虾解析器
if 'bugpk' in api_url:
return PipixiaBugPKParser(api_url, api_key)
elif 'uctb' in api_url:
return PipixiaUctbParser(api_url, api_key)
else:
return PipixiaBugPKParser(api_url, api_key)
elif platform == 'weibo':
# 微博解析器
if 'uctb' in api_url:
return WeiboUctbParser(api_url, api_key)
elif 'yaohud' in api_url:
return WeiboYaohuParser(api_url, api_key)
else:
return WeiboUctbParser(api_url, api_key)
else:
raise ValueError(f"不支持的平台: {platform}")
@@ -83,5 +143,11 @@ class ParserFactory:
return 'tiktok'
elif 'bilibili.com' in url_lower or 'b23.tv' in url_lower:
return 'bilibili'
elif 'kuaishou.com' in url_lower or 'gifshow.com' in url_lower:
return 'kuaishou'
elif 'pipix.com' in url_lower or 'pipixia.com' in url_lower or 'h5.pipix.com' in url_lower:
return 'pipixia'
elif 'weibo.com' in url_lower or 'weibo.cn' in url_lower:
return 'weibo'
else:
raise ValueError("无法识别的视频平台")