Files
F6--/张阳脚本/简道云/main.py
T
2026-01-30 11:28:35 +08:00

172 lines
5.1 KiB
Python

from flask import Flask, request, jsonify
from module import module, F6_Plugin_module
from urllib.parse import unquote
from config import Config
import queue
import threading
import logging
import os
from logging.handlers import RotatingFileHandler
from apscheduler.schedulers.background import BackgroundScheduler
import requests
import atexit
app = Flask(__name__)
app.config.from_object(Config)
f6_module = module.F6Module()
f6_plugin_module = F6_Plugin_module.F6PluginModule()
# 定义一个映射表,将操作与处理函数关联起来
action_map = {
'login_in': f6_module.accept_login_message,
'get_company_information': f6_module.get_company_information,
'get_store_information': f6_module.get_store_information,
"keep_alive": f6_module.get_keep_heart,
'check_file': f6_plugin_module.check_file,
'create_brand': f6_plugin_module.create_brand,
'delete_history': f6_plugin_module.delete_history,
# 'delete_customer': f6_plugin_module.delete_customer,
# 'delete_cars': f6_plugin_module.delete_cars,
}
# 创建一个消息队列
task_queue = queue.Queue()
# 创建一个线程来处理队列中的任务
def process_tasks():
while True:
task = task_queue.get()
if task is None:
logger.error("任务处理线程已终止")
break # 停止处理任务
try:
result = task['handler'](task['data'])
task['response'].put(result)
except Exception as e:
logger.error(f"任务执行失败: {str(e)}")
task['response'].put({'msg': f'任务执行失败: {str(e)}'})
finally:
task_queue.task_done()
logger.info("任务处理完成")
# 启动任务处理线程
task_thread = threading.Thread(target=process_tasks, daemon=True)
task_thread.start()
# 配置日志记录器
log_dir = './日志' # 日志文件夹路径
if not os.path.exists(log_dir):
os.makedirs(log_dir) # 如果日志文件夹不存在,则创建它
log_file = os.path.join(log_dir, '简道云日志.log')
# 设置日志格式和级别
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# 创建RotatingFileHandler,支持日志文件滚动
file_handler = RotatingFileHandler(log_file, maxBytes=1024 * 1024 * 5, backupCount=5)
file_handler.setLevel(logging.INFO)
# 定义日志格式
formatter = logging.Formatter('%(asctime)s %(levelname)s:%(name)s:%(message)s')
file_handler.setFormatter(formatter)
# 将处理器添加到记录器
logger.addHandler(file_handler)
# 将Flask的默认日志记录器也配置为使用相同的处理器
app.logger.addHandler(file_handler)
# 创建一个后台调度器
scheduler = BackgroundScheduler()
# 定义一个定时任务,定期发送心跳请求以保持服务活跃
def keep_alive():
try:
data = {
'Action': 'keep_alive'
}
header = {
'Action': 'keep_alive'
}
# 发送一个GET请求到自己的API端点,模拟活动
response = requests.post(url='http://192.168.10.86:5000/webhook', data=data, headers=header, timeout=5)
if response.status_code == 200:
logger.info("Heartbeat sent successfully")
else:
logger.warning(f"Heartbeat failed with status code: {response.status_code}")
except requests.RequestException as e:
logger.error(f"Failed to send heartbeat: {e}")
# 添加定时任务,每隔1分钟执行一次
scheduler.add_job(keep_alive, 'interval', minutes=1)
# 启动调度器
scheduler.start()
# 确保在应用退出时关闭调度器
atexit.register(lambda: scheduler.shutdown())
@app.route('/webhook', methods=['POST'])
def webhook():
logging.info('Received POST request to /webhook')
"""
接受前端请求后将任务放入消息队列
Returns:
any: 返回任务处理的结果
"""
# 获取请求体中的 JSON 数据
data = request.json
header = request.headers
header = decode_headers(header)
action = header.get('Action')
if action == 'F6_Plugin':
check = header.get('Check')
if check == '':
handler = f6_plugin_module.check_file
elif check == '':
sub_action = data.get('Action')
handler = action_map.get(sub_action, lambda x: {'msg': '未执行'})
else:
return jsonify({'msg': '未知的操作'})
else:
handler = action_map.get(action, lambda x: {'msg': '未知的操作'})
# 创建一个队列用于存储任务处理结果
response_queue = queue.Queue()
# 将任务放入消息队列
task_queue.put({
'handler': handler,
'data': data,
'response': response_queue
})
# 等待任务处理结果
result = response_queue.get()
return jsonify(result)
def decode_headers(headers):
"""
解码包含中文字符的 HTTP 请求头。
:param headers: 包含编码后头部字段的字典
:return: 解码后的头部字段字典
"""
return {key: unquote(value, encoding='utf-8') for key, value in headers.items()}
if __name__ == '__main__':
# from waitress import serve
# serve(app, host='192.168.10.86', port=5000)
app.run(debug=True, port=5000)