feat: 新增平台
This commit is contained in:
@@ -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("无法识别的视频平台")
|
||||
|
||||
Reference in New Issue
Block a user