2026-02-12 16:27:43 +08:00
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
2026-02-12 18:22:02 +08:00
|
|
|
|
Worker 查询 API(需要登录)。
|
2026-02-12 16:27:43 +08:00
|
|
|
|
"""
|
2026-02-14 16:49:44 +08:00
|
|
|
|
from rest_framework import status
|
|
|
|
|
|
from rest_framework.decorators import api_view, permission_classes
|
|
|
|
|
|
from rest_framework.permissions import AllowAny
|
2026-02-12 16:27:43 +08:00
|
|
|
|
|
2026-02-26 01:27:35 +08:00
|
|
|
|
from server.core.response import api_success, api_error
|
2026-02-12 16:27:43 +08:00
|
|
|
|
from server.core.worker_manager import worker_manager
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-14 16:49:44 +08:00
|
|
|
|
@api_view(["GET"])
|
|
|
|
|
|
@permission_classes([AllowAny])
|
|
|
|
|
|
def health_check(request):
|
|
|
|
|
|
"""健康检查。"""
|
|
|
|
|
|
online = len([w for w in worker_manager.get_all_workers() if w.online])
|
2026-02-26 01:27:35 +08:00
|
|
|
|
return api_success({"status": "ok", "workers_online": online})
|
2026-02-14 16:49:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _worker_to_dict(w) -> dict:
|
|
|
|
|
|
return {
|
|
|
|
|
|
"worker_id": w.worker_id,
|
|
|
|
|
|
"worker_name": w.worker_name,
|
|
|
|
|
|
"browsers": [b.model_dump() for b in w.browsers],
|
|
|
|
|
|
"online": w.online,
|
|
|
|
|
|
"current_task_id": w.current_task_id,
|
|
|
|
|
|
}
|
2026-02-12 16:27:43 +08:00
|
|
|
|
|
2026-02-14 16:49:44 +08:00
|
|
|
|
|
|
|
|
|
|
@api_view(["GET"])
|
|
|
|
|
|
def worker_list(request):
|
2026-02-12 16:27:43 +08:00
|
|
|
|
"""获取所有已注册的 Worker(含在线状态与浏览器列表)。"""
|
|
|
|
|
|
workers = worker_manager.get_all_workers()
|
2026-02-26 01:27:35 +08:00
|
|
|
|
return api_success([_worker_to_dict(w) for w in workers])
|
2026-02-14 16:49:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@api_view(["GET"])
|
|
|
|
|
|
def worker_detail(request, worker_id):
|
2026-02-12 16:27:43 +08:00
|
|
|
|
"""获取指定 Worker 的详情。"""
|
|
|
|
|
|
w = worker_manager.get_worker(worker_id)
|
|
|
|
|
|
if not w:
|
2026-02-26 01:27:35 +08:00
|
|
|
|
return api_error(status.HTTP_404_NOT_FOUND, f"Worker {worker_id} 不存在")
|
|
|
|
|
|
return api_success(_worker_to_dict(w))
|
2026-02-26 21:14:15 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-02-26 21:19:19 +08:00
|
|
|
|
def _worker_browsers_response(worker_id: str):
|
|
|
|
|
|
"""根据 worker_id 返回比特浏览器环境列表。"""
|
2026-02-26 21:14:15 +08:00
|
|
|
|
w = worker_manager.get_worker(worker_id)
|
|
|
|
|
|
if not w:
|
|
|
|
|
|
return api_error(status.HTTP_404_NOT_FOUND, f"Worker {worker_id} 不存在", data=None)
|
|
|
|
|
|
browsers = [
|
|
|
|
|
|
{"id": b.id, "name": b.name or "", "remark": b.remark or ""}
|
|
|
|
|
|
for b in w.browsers
|
|
|
|
|
|
]
|
|
|
|
|
|
return api_success(data=browsers, msg="获取成功")
|
2026-02-26 21:19:19 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@api_view(["POST"])
|
|
|
|
|
|
def worker_browsers(request):
|
2026-02-26 21:21:47 +08:00
|
|
|
|
"""获取指定电脑(Worker)中比特浏览器的环境名称列表。worker_id 可从 form-data 或 query 传入。"""
|
|
|
|
|
|
worker_id = (
|
|
|
|
|
|
request.query_params.get("worker_id")
|
|
|
|
|
|
or request.data.get("worker_id")
|
|
|
|
|
|
or request.POST.get("worker_id")
|
|
|
|
|
|
)
|
2026-02-26 21:19:19 +08:00
|
|
|
|
if not worker_id:
|
|
|
|
|
|
return api_error(status.HTTP_400_BAD_REQUEST, "请提供 worker_id 参数", data=None)
|
|
|
|
|
|
return _worker_browsers_response(str(worker_id))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@api_view(["GET"])
|
|
|
|
|
|
def worker_browsers_by_path(request, worker_id):
|
|
|
|
|
|
"""获取指定电脑(Worker)中比特浏览器的环境名称列表。worker_id 在路径中。"""
|
|
|
|
|
|
return _worker_browsers_response(worker_id)
|