""" 网站管理路由 """ 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/', 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('/', methods=['GET']) def get_website(website_id): """获取单个网站""" website = Website.query.get_or_404(website_id) return jsonify(website.to_dict()) @website_bp.route('/', 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('/', 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