from flask import Flask, render_template_string, request, jsonify,redirect, url_for,abort
import os
from auto_media_publisher.scheduler.task_scheduler_thread import auto_media_publisherTaskSchedulerThread
from pathlib import Path
import json
from auto_media_publisher.config.conf_base import TASK_CONFIG_DIR
try:
globle_schduler = auto_media_publisherTaskSchedulerThread()
globle_schduler.daemon = True
globle_schduler.start()
except Exception as e:
print("[ERROR] 启动调度器失败:", e)
app = Flask(__name__)
@app.route("/")
def home():
return redirect("/tasks")
@app.route("/tasks")
def tasks():
infos = globle_schduler.get_task_info()
return render_template_string("""
任务状态
{% for tid, info in infos.items() %}
- {{ tid }} | 上次运行:{{ info.last_run }}
{{ info.last_log }}
{% endfor %}
""", infos=infos)
@app.route("/users")
def list_users():
users = [p.name for p in Path(TASK_CONFIG_DIR).rglob("*.json")]
return render_template_string("""
用户列表
{% for u in users %}
- {{ u }}
{% endfor %}
""", users=users)
@app.route("/user/", methods=["GET", "POST"])
def edit_user(uid):
path = Path(TASK_CONFIG_DIR) / uid
if not path.exists():
abort(404)
if request.method == "POST":
raw_text = request.form["content"]
cleaned_lines = [line.rstrip() for line in raw_text.splitlines() if line.strip()]
cleaned_text = "\n".join(cleaned_lines) + "\n"
path.write_text(cleaned_text, encoding="utf-8")
return redirect(url_for("list_users"))
else:
content = ""
if path.exists():
content = path.read_text(encoding="utf-8")
return render_template_string("""
编辑用户配置:{{ uid }}
""", uid=uid, content=content)
@app.route('/upload_auth', methods=['POST'])
def upload_cookie():
username = request.form.get('username')
if not username:
return jsonify({'success': False, 'error': 'Missing username'})
file = request.files.get('file')
if file.filename == '':
return jsonify({'success': False, 'error': 'No selected file'})
if file and file.filename.endswith('.json'):
try:
save_path = os.path.join('./data/cookies', username,file.filename)
os.makedirs(os.path.dirname(save_path), exist_ok=True)
file.save(save_path)
print(f"✅ 保存成功: {save_path}")
return jsonify({'success': True})
except Exception as e:
print(f"❌ 保存失败: {e}")
return jsonify({'success': False, 'error': str(e)})
return jsonify({'success': False, 'error': 'Invalid file type'})
@app.route("/user/new", methods=["POST"])
def new_user():
user_id = request.form.get("user_id", "").strip()
username = request.form.get("username", "").strip()
if not user_id or not username:
return "用户ID 和 用户名 都不能为空", 400
json_path = Path(TASK_CONFIG_DIR) / f"{user_id}.json"
if json_path.exists():
return f"配置文件 {user_id}.json 已存在", 400
default_config = {
"id": 1,
"user": "13381602515",
"username": "施教练",
"city": "上海",
"proxy": "http://127.0.0.1:8080",
"enabled": 1,
"tags": [
"太极鸟",
"机构用户"
],
"datetime_created": "2025-07-14T09:00:00",
"datetime_update": "2025-07-14T09:00:00",
"platforms": [
{
"name": "douyin",
"enabled": True,
"task_type": "video_upload",
"upload_times": [
"08:00",
"16:00"
]
},
{
"name": "xiaohongshu",
"enabled": False,
"task_type": "video_upload",
"upload_times": []
}
]
}
json_path.write_text(json.dumps(default_config, indent=2, ensure_ascii=False), encoding="utf-8")
return redirect(url_for("edit_user", uid=f"{user_id}.json"))
# 注册退出处理
#import atexit
#atexit.register(lambda: globle_schduler.shutdown(wait=False))
if __name__ == "__main__":
app.run(port=5000, debug=True) # 本地访问
#app.run(host='0.0.0.0', port=5000,debug=True) # 允许外网访问