mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-30 20:54:32 +08:00
111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
from lxml import etree
|
|
|
|
from app.foundation.dom import DomUtils
|
|
from app.foundation.url import split_netloc
|
|
|
|
|
|
_SPECIAL_SITE_DOMAINS = (
|
|
"u2.dmhy.org",
|
|
"pt.ecust.pp.ua",
|
|
"pt.gtkpw.xyz",
|
|
"pt.gtk.pw",
|
|
)
|
|
|
|
|
|
def urls_match(first: str, second: str) -> bool:
|
|
"""判断两个地址是否指向忽略 www 前缀后的同一站点。"""
|
|
if not first or not second:
|
|
return False
|
|
if first.startswith("http"):
|
|
_scheme, first = split_netloc(first)
|
|
if second.startswith("http"):
|
|
_scheme, second = split_netloc(second)
|
|
return first.replace("www.", "") == second.replace("www.", "")
|
|
|
|
|
|
def extract_domain(url: str) -> str:
|
|
"""按 MoviePilot 站点规则提取用于匹配的注册域名。"""
|
|
if not url:
|
|
return ""
|
|
for domain in _SPECIAL_SITE_DOMAINS:
|
|
if domain in url:
|
|
return domain
|
|
_scheme, netloc = split_netloc(url)
|
|
if not netloc:
|
|
return ""
|
|
labels = netloc.split(".")
|
|
if len(labels) > 3:
|
|
return netloc
|
|
return ".".join(labels[-2:])
|
|
|
|
|
|
class SiteUtils:
|
|
"""提供站点域名、Cookie 和访问参数处理能力。"""
|
|
|
|
|
|
@classmethod
|
|
def is_logged_in(cls, html_text: str) -> bool:
|
|
"""
|
|
判断站点是否已经登陆
|
|
:param html_text:
|
|
:return:
|
|
"""
|
|
html = etree.HTML(html_text)
|
|
try:
|
|
if not DomUtils.has_child_elements(html):
|
|
return False
|
|
# 存在明显的密码输入框,说明未登录
|
|
if html.xpath("//input[@type='password']"):
|
|
return False
|
|
# 是否存在登出和用户面板等链接
|
|
xpaths = [
|
|
'//a[contains(@href, "logout")'
|
|
' or contains(@data-url, "logout")'
|
|
' or contains(@href, "mybonus") '
|
|
' or contains(@onclick, "logout")'
|
|
' or contains(@href, "usercp")'
|
|
' or contains(@lay-on, "logout")]',
|
|
'//form[contains(@action, "logout")]',
|
|
'//div[@class="user-info-side"]',
|
|
'//a[@id="myitem"]'
|
|
]
|
|
for xpath in xpaths:
|
|
if html.xpath(xpath):
|
|
return True
|
|
return False
|
|
finally:
|
|
if html is not None:
|
|
del html
|
|
|
|
@classmethod
|
|
def is_checkin(cls, html_text: str) -> bool:
|
|
"""
|
|
判断站点是否已经签到
|
|
:return True已签到 False未签到
|
|
"""
|
|
html = etree.HTML(html_text)
|
|
try:
|
|
if not DomUtils.has_child_elements(html):
|
|
return False
|
|
# 站点签到支持的识别XPATH
|
|
xpaths = [
|
|
'//a[@id="signed"]',
|
|
'//a[contains(@href, "attendance")]',
|
|
'//a[contains(text(), "签到")]',
|
|
'//a/b[contains(text(), "签 到")]',
|
|
'//span[@id="sign_in"]/a',
|
|
'//a[contains(@href, "addbonus")]',
|
|
'//input[@class="dt_button"][contains(@value, "打卡")]',
|
|
'//a[contains(@href, "sign_in")]',
|
|
'//a[contains(@onclick, "do_signin")]',
|
|
'//a[@id="do-attendance"]',
|
|
'//shark-icon-button[@href="attendance.php"]'
|
|
]
|
|
for xpath in xpaths:
|
|
if html.xpath(xpath):
|
|
return False
|
|
return True
|
|
finally:
|
|
if html is not None:
|
|
del html
|