diff --git a/flask-dev-api/app.py b/flask-dev-api/app.py index d54103e..e2e9f6b 100644 --- a/flask-dev-api/app.py +++ b/flask-dev-api/app.py @@ -7,9 +7,9 @@ import sys import os import time from datetime import datetime -from flask import Flask, render_template, jsonify, g, request +from flask import Flask, render_template, jsonify, g, request, session, redirect -from config import PORT +from config import PORT, LOGIN_ENABLED, LOGIN_USERNAME, LOGIN_PASSWORD, SECRET_KEY from blueprints import pin_tu_bp, base64_bp, down_video_bp, fen_ci_bp, content_tag_bp, chmod_calc_bp, json_format_bp, qr_code_bp, http_status_bp, url_parser_bp, token_gen_bp, sovits_tts_bp, stt_bp, ai_dubbing_bp, rvc_bp from utils.stats_db import init_db, record_call, get_total_count, get_avg_duration, get_daily_counts, get_monthly_counts, get_available_years, get_available_months, get_daily_counts_by_month, get_hourly_counts, get_endpoint_stats, get_today_count, get_yesterday_count, get_month_count, get_success_rate, get_duration_distribution, get_slowest_endpoints, get_week_compare, get_recent_calls, get_active_days from utils.stats_db import ALLOWED_TABLES, get_table_info, get_table_rows, get_table_count, insert_row, update_row, delete_rows, clear_table @@ -28,6 +28,24 @@ def create_app(): app = Flask(__name__) init_db() + app.secret_key = SECRET_KEY + + # 登录/登出 + @app.route('/login', methods=['GET', 'POST']) + def login(): + if not LOGIN_ENABLED: + return redirect('/') + if request.method == 'POST': + if request.form.get('username') == LOGIN_USERNAME and request.form.get('password') == LOGIN_PASSWORD: + session['logged_in'] = True + return redirect('/') + return render_template('login.html', error='用户名或密码错误') + return render_template('login.html') + + @app.route('/logout') + def logout(): + session.pop('logged_in', None) + return redirect('/login') # 主页 @app.route('/') @@ -162,6 +180,19 @@ def create_app(): deleted = clear_table(table) return jsonify({'success': True, 'deleted': deleted}) + # 登录验证 + @app.before_request + def _check_auth(): + if not LOGIN_ENABLED: + return + path = request.path + if path == '/login' or path.startswith('/static/'): + return + if not session.get('logged_in'): + if path.startswith('/api/'): + return jsonify({'error': '未登录'}), 401 + return redirect('/login') + # 请求计时 @app.before_request def _start_timer(): @@ -203,12 +234,19 @@ app = create_app() def start_flask(): """供桌面启动器调用,以非调试模式运行 Flask""" + from config import AUTO_OPEN_BROWSER + if AUTO_OPEN_BROWSER: + import webbrowser + import threading as _t + _t.Timer(1, webbrowser.open, args=[f'http://127.0.0.1:{PORT}']).start() a = create_app() a.run(host='127.0.0.1', port=PORT, use_reloader=False, threaded=True) if __name__ == '__main__': - # import webbrowser - # import threading as _t - # _t.Timer(1, webbrowser.open, args=[f'http://127.0.0.1:{PORT}']).start() + from config import AUTO_OPEN_BROWSER + if AUTO_OPEN_BROWSER: + import webbrowser + import threading as _t + _t.Timer(1, webbrowser.open, args=[f'http://127.0.0.1:{PORT}']).start() app.run(debug=True, host='0.0.0.0', port=PORT, threaded=True) diff --git a/flask-dev-api/config.py b/flask-dev-api/config.py index 2d3e6ba..79d2149 100644 --- a/flask-dev-api/config.py +++ b/flask-dev-api/config.py @@ -3,10 +3,17 @@ 全局配置集中管理 """ import os - # 基础目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) - +# ==================== 是否自动打开浏览器 ==================== +AUTO_OPEN_BROWSER = False +# AUTO_OPEN_BROWSER = True +# ==================== 登录设置 ==================== +LOGIN_ENABLED = False +# LOGIN_ENABLED = True +LOGIN_USERNAME = 'admin' +LOGIN_PASSWORD = '123456' +SECRET_KEY = 'LQkCU9XfKjxOSfIFZP7kDhwS57o2bvI4qVwZWMet4l8X3RNKnl12bgxvAy1BaByV' # ==================== down-video 视频下载 ==================== TWITTER_COOKIE = os.path.join(BASE_DIR, "config", "dv_cookies", "x.com_cookies.txt") BILIBILI_COOKIE = os.path.join(BASE_DIR, "config", "dv_cookies", "bilibili.com_cookies.txt") @@ -21,3 +28,4 @@ JIEBA_DICT_FILE = os.path.join(BASE_DIR, 'config', 'fen_ci', 'jieba.txt') TOKEN_FILE_PATH = os.path.join(BASE_DIR, 'config', 'fen_ci', 'usertoken.json') # ==================== 服务端口 ==================== PORT = 5000 + diff --git a/flask-dev-api/config/dv_cookies/bilibili.com_cookies.txt b/flask-dev-api/config/dv_cookies/bilibili.com_cookies.txt index fc7c300..168cff7 100644 --- a/flask-dev-api/config/dv_cookies/bilibili.com_cookies.txt +++ b/flask-dev-api/config/dv_cookies/bilibili.com_cookies.txt @@ -29,8 +29,6 @@ live.bilibili.com FALSE / FALSE 1782229863 GIFT_BLOCK_COOKIE GIFT_BLOCK_COOKIE .bilibili.com TRUE / FALSE 1816004451 buvid4 D3170BA8-2910-9D9B-A608-52B60F1437AB62978-025051010-2j8K1NCxW9nraGJ2vOJv2vg3LhbmydYJolrkxpng+JQJZmNXaAoya/H8tItJHUfy .bilibili.com TRUE / FALSE 1812974025 home_feed_column 5 .bilibili.com TRUE / FALSE 1812018942 CURRENT_QUALITY 64 -.bilibili.com TRUE / FALSE 1781516479 bili_ticket eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3ODE1MTY0ODIsImlhdCI6MTc4MTI1NzIyMiwicGx0IjotMX0.eEl-svs_DNL9hArempTC7OjEOmwU5zkzh4z5lvc2JGU -.bilibili.com TRUE / FALSE 1781516479 bili_ticket_expires 1781516422 .bilibili.com TRUE / TRUE 1796809280 SESSDATA e981c0f8%2C1796809283%2C53cbf%2A61CjDSekND1lFe5TiJgnRjBVV1dsBTaBY0JP5uDZhtM2bI4WZ9FnbNW1xAQXYO7eBAH7cSVk1jUG0zLU1SWUprSFZxb0VZNl9HM05WckVCZHpYRTVqM3dFUkMwbEVjai1DWF9MbERjUDZVVExzZ2JLMjBnbFhfSjA0MUZWTThBb2tRaDZDQ1d6UHpBIIEC .bilibili.com TRUE / TRUE 1796809280 bili_jct ef487b5774b781e6ab9c18d90213d327 .bilibili.com TRUE / FALSE 0 sid 8gro2gn0 diff --git a/flask-dev-api/stats.db b/flask-dev-api/stats.db index 597acfd..45acc01 100644 Binary files a/flask-dev-api/stats.db and b/flask-dev-api/stats.db differ diff --git a/flask-dev-api/templates/login.html b/flask-dev-api/templates/login.html new file mode 100644 index 0000000..e663c7c --- /dev/null +++ b/flask-dev-api/templates/login.html @@ -0,0 +1,75 @@ + + +
+ + + +请登录以继续使用
+ {% if error %} +