remove selenium

This commit is contained in:
jxxghp
2023-06-09 20:19:23 +08:00
parent bef1b6918a
commit 1558613772
4 changed files with 162 additions and 97 deletions

44
app/helper/cloudflare.py Normal file
View File

@ -0,0 +1,44 @@
import os
from pyquery import PyQuery
from app.log import logger
CHALLENGE_TITLES = [
# Cloudflare
'Just a moment...',
'请稍候…',
# DDoS-GUARD
'DDOS-GUARD',
]
CHALLENGE_SELECTORS = [
# Cloudflare
'#cf-challenge-running', '.ray_id', '.attack-box', '#cf-please-wait', '#challenge-spinner', '#trk_jschal_js',
# Custom CloudFlare for EbookParadijs, Film-Paleis, MuziekFabriek and Puur-Hollands
'td.info #js_info',
# Fairlane / pararius.com
'div.vc div.text-box h2'
]
SHORT_TIMEOUT = 6
CF_TIMEOUT = int(os.getenv("NASTOOL_CF_TIMEOUT", "60"))
def under_challenge(html_text: str):
"""
Check if the page is under challenge
:param html_text:
:return:
"""
# get the page title
if not html_text:
return False
page_title = PyQuery(html_text)('title').text()
logger.debug("under_challenge page_title=" + page_title)
for title in CHALLENGE_TITLES:
if page_title.lower() == title.lower():
return True
for selector in CHALLENGE_SELECTORS:
html_doc = PyQuery(html_text)
if html_doc(selector):
return True
return False

View File

@ -9,8 +9,9 @@ from ruamel.yaml import CommentedMap
from app.core.event_manager import EventManager, eventmanager
from app.core.config import settings
from app.helper.module import ModuleHelper
from app.helper.browser import PlaywrightHelper
from app.helper.cloudflare import under_challenge
from app.helper.module import ModuleHelper
from app.helper.sites import SitesHelper
from app.log import logger
from app.plugins import _PluginBase
@ -136,6 +137,8 @@ class AutoSignIn(_PluginBase):
site_url = site_info.get("url")
site_cookie = site_info.get("cookie")
ua = site_info.get("ua")
render = site_info.get("render")
proxy = settings.PROXY if site_info.get("proxy") else None
if not site_url or not site_cookie:
logger.warn(f"未配置 {site} 的站点地址或Cookie无法签到")
return ""
@ -147,9 +150,19 @@ class AutoSignIn(_PluginBase):
# 拼登签到地址
checkin_url = urljoin(site_url, "attendance.php")
logger.info(f"开始站点签到:{site},地址:{checkin_url}...")
if render:
page_source = PlaywrightHelper().get_page_source(url=checkin_url,
cookies=site_cookie,
ua=ua,
proxy=proxy)
if not SiteUtils.is_logged_in(page_source):
if under_challenge(page_source):
return f"{site}】无法通过Cloudflare"
return f"{site}】仿真登录失败Cookie已失效"
else:
res = RequestUtils(cookies=site_cookie,
headers=ua,
proxies=settings.PROXY if site_info.get("proxy") else None
proxies=proxy
).get_res(url=checkin_url)
if not res and site_url != checkin_url:
logger.info(f"开始站点模拟登录:{site},地址:{site_url}...")
@ -161,9 +174,9 @@ class AutoSignIn(_PluginBase):
if res and res.status_code in [200, 500, 403]:
if not SiteUtils.is_logged_in(res.text):
if under_challenge(res.text):
msg = "站点被Cloudflare防护更换Cookie和UA"
msg = "站点被Cloudflare防护打开站点浏览器仿真"
elif res.status_code == 200:
msg = "Cookie已失效"
msg = "Cookie已失效"
else:
msg = f"状态码:{res.status_code}"
logger.warn(f"{site} 签到失败,{msg}")

View File

@ -10,6 +10,7 @@ from ruamel.yaml import CommentedMap
from app.core.config import settings
from app.core.event_manager import eventmanager
from app.core.event_manager import Event
from app.helper.browser import PlaywrightHelper
from app.helper.module import ModuleHelper
from app.helper.sites import SitesHelper
from app.log import logger
@ -87,18 +88,30 @@ class SiteStatistic(_PluginBase):
logger.error(f"站点匹配失败 {e}")
return None
def build(self, url: str, site_name: str,
site_cookie: str = None,
ua: str = None,
proxy: bool = False) -> Optional[ISiteUserInfo]:
def build(self, site_info: CommentedMap) -> Optional[ISiteUserInfo]:
"""
构建站点信息
"""
site_cookie = site_info.get("cookie")
if not site_cookie:
return None
site_name = site_info.get("name")
url = site_info.get("url")
proxy = site_info.get("proxy")
ua = site_info.get("ua")
session = requests.Session()
logger.debug(f"站点 {site_name} url={url} site_cookie={site_cookie} ua={ua}")
proxies = settings.PROXY if proxy else None
render = site_info.get("render")
logger.debug(f"站点 {site_name} url={url} site_cookie={site_cookie} ua={ua}")
if render:
# 演染模式
html_text = PlaywrightHelper().get_page_source(url=url,
cookies=site_cookie,
ua=ua,
proxy=proxies)
else:
# 普通模式
res = RequestUtils(cookies=site_cookie,
session=session,
headers=ua,
@ -116,7 +129,10 @@ class SiteStatistic(_PluginBase):
if i == -1:
return None
tmp_url = url + html_text[i:html_text.find(";")]\
.replace("\"", "").replace("+", "").replace(" ", "").replace("window.location=", "")
.replace("\"", "")\
.replace("+", "")\
.replace(" ", "")\
.replace("window.location=", "")
res = RequestUtils(cookies=site_cookie,
session=session,
headers=ua,
@ -168,20 +184,13 @@ class SiteStatistic(_PluginBase):
:param site_info:
:return:
"""
site_name = site_info.get("name")
site_url = site_info.get("url")
site_name = site_info.get('name')
site_url = site_info.get('url')
if not site_url:
return None
site_cookie = site_info.get("cookie")
ua = site_info.get("ua")
unread_msg_notify = True
proxy = site_info.get("proxy")
try:
site_user_info: ISiteUserInfo = self.build(url=site_url,
site_name=site_name,
site_cookie=site_cookie,
ua=ua,
proxy=proxy)
site_user_info: ISiteUserInfo = self.build(site_info=site_info)
if site_user_info:
logger.debug(f"站点 {site_name} 开始以 {site_user_info.site_schema()} 模型解析")
# 开始解析

View File

@ -31,7 +31,6 @@ transmission-rpc~=4.3.0
Jinja2~=3.1.2
pyparsing~=3.0.9
func_timeout==4.3.5
selenium~=4.9.1
bs4~=0.0.1
beautifulsoup4~=4.12.2
pillow~=9.5.0