238 lines
7.3 KiB
Python
238 lines
7.3 KiB
Python
"""
|
|
网站管理路由
|
|
"""
|
|
from flask import Blueprint, request, jsonify
|
|
from models.database import db, Website
|
|
from models.database import Cookie as CookieModel
|
|
import requests as http_requests
|
|
from datetime import datetime
|
|
|
|
website_bp = Blueprint('websites', __name__)
|
|
|
|
|
|
@website_bp.route('/check-network', methods=['GET'])
|
|
def check_all_network():
|
|
"""检测所有网站的网络可达性"""
|
|
websites = Website.query.all()
|
|
result = {}
|
|
|
|
for website in websites:
|
|
try:
|
|
resp = http_requests.get(website.url, timeout=5, allow_redirects=True)
|
|
result[website.id] = {
|
|
'status': resp.status_code,
|
|
'reachable': resp.status_code < 400,
|
|
'response_time': resp.elapsed.total_seconds() * 1000
|
|
}
|
|
except Exception:
|
|
result[website.id] = {
|
|
'status': 0,
|
|
'reachable': False,
|
|
'response_time': 0
|
|
}
|
|
|
|
return jsonify(result)
|
|
|
|
|
|
@website_bp.route('/check-login/<int:website_id>', methods=['POST'])
|
|
def check_website_login(website_id):
|
|
"""检查网站登录状态"""
|
|
from DrissionPage import ChromiumPage, ChromiumOptions
|
|
|
|
website = Website.query.get_or_404(website_id)
|
|
|
|
try:
|
|
# 获取网站的cookie
|
|
cookies = CookieModel.query.filter_by(website_id=website_id).all()
|
|
if not cookies:
|
|
return jsonify({'success': False, 'message': '没有可用的cookie'})
|
|
|
|
# 初始化浏览器
|
|
co = ChromiumOptions()
|
|
co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")
|
|
co.set_argument('--no-sandbox')
|
|
co.set_argument('--disable-dev-shm-usage')
|
|
browser = ChromiumPage(addr_or_opts=co)
|
|
|
|
# 导入cookie
|
|
for cookie in cookies:
|
|
cookie_dict = {
|
|
'name': cookie.name,
|
|
'value': cookie.value,
|
|
'domain': cookie.domain,
|
|
'path': cookie.path
|
|
}
|
|
browser.set.cookies(cookie_dict)
|
|
|
|
# 访问网站
|
|
browser.get(website.url)
|
|
browser.wait.doc_loaded(timeout=30)
|
|
|
|
import time
|
|
time.sleep(2)
|
|
browser.refresh()
|
|
browser.wait.doc_loaded(timeout=30)
|
|
time.sleep(2)
|
|
|
|
# 检查登录状态
|
|
login_success = False
|
|
check_selector = website.login_check_selector
|
|
success_text = website.success_text
|
|
|
|
if check_selector:
|
|
try:
|
|
element = browser.ele(check_selector, timeout=10)
|
|
if element:
|
|
element_text = element.text or ""
|
|
if not success_text:
|
|
login_success = True
|
|
elif success_text in element_text:
|
|
login_success = True
|
|
except:
|
|
pass
|
|
|
|
if not login_success and success_text:
|
|
try:
|
|
page_text = browser.html or ""
|
|
if success_text in page_text:
|
|
login_success = True
|
|
except:
|
|
pass
|
|
|
|
# 如果登录成功,获取最新cookie
|
|
if login_success:
|
|
new_cookies = browser.cookies()
|
|
# 更新cookie
|
|
CookieModel.query.filter_by(website_id=website_id).delete()
|
|
for c in new_cookies:
|
|
new_cookie = CookieModel(
|
|
website_id=website_id,
|
|
name=c.get('name', ''),
|
|
value=c.get('value', ''),
|
|
domain=c.get('domain', ''),
|
|
path=c.get('path', '/')
|
|
)
|
|
db.session.add(new_cookie)
|
|
|
|
# 保存检测结果
|
|
from models.database import Detection
|
|
detection = Detection(
|
|
website_id=website_id,
|
|
status=1,
|
|
response_time=0,
|
|
http_status=200,
|
|
message='登录验证成功'
|
|
)
|
|
db.session.add(detection)
|
|
db.session.commit()
|
|
|
|
result = {'success': True, 'message': '登录成功'}
|
|
else:
|
|
# 保存检测结果
|
|
from models.database import Detection
|
|
detection = Detection(
|
|
website_id=website_id,
|
|
status=0,
|
|
response_time=0,
|
|
http_status=200,
|
|
message='登录验证失败'
|
|
)
|
|
db.session.add(detection)
|
|
db.session.commit()
|
|
|
|
result = {'success': False, 'message': '登录失败'}
|
|
|
|
browser.quit()
|
|
return jsonify(result)
|
|
|
|
except Exception as e:
|
|
return jsonify({'success': False, 'message': f'检测异常: {str(e)}'})
|
|
|
|
|
|
@website_bp.route('/', methods=['GET'])
|
|
def get_websites():
|
|
"""获取所有网站"""
|
|
user_id = request.args.get('user_id')
|
|
|
|
if user_id:
|
|
websites = Website.query.filter_by(user_id=user_id).all()
|
|
else:
|
|
websites = Website.query.all()
|
|
|
|
return jsonify([website.to_dict() for website in websites])
|
|
|
|
|
|
@website_bp.route('/', methods=['POST'])
|
|
def create_website():
|
|
"""创建网站"""
|
|
data = request.json
|
|
|
|
website = Website(
|
|
user_id=data.get('user_id'),
|
|
name=data.get('name'),
|
|
url=data.get('url'),
|
|
login_check_selector=data.get('login_check_selector'),
|
|
success_text=data.get('success_text'),
|
|
interval_minutes=data.get('interval_minutes', 30),
|
|
status=data.get('status', 1)
|
|
)
|
|
|
|
db.session.add(website)
|
|
db.session.commit()
|
|
|
|
return jsonify(website.to_dict()), 201
|
|
|
|
|
|
@website_bp.route('/<int:website_id>', methods=['GET'])
|
|
def get_website(website_id):
|
|
"""获取单个网站"""
|
|
website = Website.query.get_or_404(website_id)
|
|
return jsonify(website.to_dict())
|
|
|
|
|
|
@website_bp.route('/<int:website_id>', methods=['PUT'])
|
|
def update_website(website_id):
|
|
"""更新网站"""
|
|
website = Website.query.get_or_404(website_id)
|
|
data = request.json
|
|
|
|
website.name = data.get('name', website.name)
|
|
website.url = data.get('url', website.url)
|
|
website.login_check_selector = data.get('login_check_selector', website.login_check_selector)
|
|
website.success_text = data.get('success_text', website.success_text)
|
|
website.interval_minutes = data.get('interval_minutes', website.interval_minutes)
|
|
website.status = data.get('status', website.status)
|
|
|
|
db.session.commit()
|
|
|
|
return jsonify(website.to_dict())
|
|
|
|
|
|
@website_bp.route('/<int:website_id>', methods=['DELETE'])
|
|
def delete_website(website_id):
|
|
"""删除网站"""
|
|
website = Website.query.get_or_404(website_id)
|
|
|
|
db.session.delete(website)
|
|
db.session.commit()
|
|
|
|
return jsonify({'message': '网站已删除'})
|
|
|
|
|
|
# 为Website模型添加to_dict方法
|
|
def website_to_dict(self):
|
|
return {
|
|
'id': self.id,
|
|
'user_id': self.user_id,
|
|
'name': self.name,
|
|
'url': self.url,
|
|
'login_check_selector': self.login_check_selector,
|
|
'success_text': self.success_text,
|
|
'interval_minutes': self.interval_minutes,
|
|
'status': self.status,
|
|
'created_at': self.created_at.isoformat() if self.created_at else None,
|
|
'updated_at': self.updated_at.isoformat() if self.updated_at else None
|
|
}
|
|
|
|
Website.to_dict = website_to_dict
|