2025-04-03 22:11:20 +08:00
|
|
|
|
from typing import Annotated
|
|
|
|
|
|
|
|
|
|
|
|
from fastapi import APIRouter, Query
|
2025-04-04 17:29:50 +08:00
|
|
|
|
from loguru import logger
|
2025-04-03 22:11:20 +08:00
|
|
|
|
|
|
|
|
|
|
from app.web.request.report_request import AddUrlsRequest, CollectEvidenceRequest, ReportRequest, GetUrlListRequest
|
|
|
|
|
|
from app.web.service.domain_service import DomainService
|
|
|
|
|
|
from app.web.service.report_service import ReportURLService
|
|
|
|
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/api/urls", tags=["URL管理"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/v1/list")
|
2025-04-04 17:29:50 +08:00
|
|
|
|
def get_all_urls(request: Annotated[GetUrlListRequest, Query()]):
|
2025-04-03 22:11:20 +08:00
|
|
|
|
"""获取所有的URL,支持根据域名、状态进行过滤,不传则返回全部数据,支持分页"""
|
2025-04-04 17:29:50 +08:00
|
|
|
|
|
|
|
|
|
|
logger.debug(f"{request=}")
|
|
|
|
|
|
|
2025-04-03 22:11:20 +08:00
|
|
|
|
return ReportURLService.get_list(
|
|
|
|
|
|
request.domain,
|
|
|
|
|
|
request.surl,
|
|
|
|
|
|
request.is_report_by_one,
|
|
|
|
|
|
request.is_report_by_site,
|
|
|
|
|
|
request.is_report_by_wap,
|
|
|
|
|
|
request.has_evidence,
|
|
|
|
|
|
request.page,
|
|
|
|
|
|
request.size
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/v1/add")
|
2025-04-04 17:29:50 +08:00
|
|
|
|
def add_urls(request: AddUrlsRequest):
|
2025-04-03 22:11:20 +08:00
|
|
|
|
"""
|
|
|
|
|
|
手动添加 URL 到域名中,支持批量添加
|
|
|
|
|
|
格式 [
|
|
|
|
|
|
{"domain": "", "surl": ""}, {"domain": "", "surl": ""} ...
|
|
|
|
|
|
]
|
|
|
|
|
|
添加之前先检查 domain 有没有,没有的话就去创建一个 domain
|
|
|
|
|
|
"""
|
|
|
|
|
|
# 把所有的域名列表解出来,看看有没有不存在的,如果有就新建一个域名
|
|
|
|
|
|
# 这里还需要获取域名的 id
|
|
|
|
|
|
input_domains = [item.domain for item in request.urls]
|
|
|
|
|
|
result = DomainService.get_by_domains(input_domains)
|
|
|
|
|
|
if not result.success:
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
# 创建新域名
|
|
|
|
|
|
new_domains = [x for x in input_domains if x not in result.data]
|
|
|
|
|
|
if new_domains:
|
|
|
|
|
|
result = DomainService.add_domains(1440, True, new_domains)
|
|
|
|
|
|
if not result.success:
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
# 再获取一遍域名模型
|
|
|
|
|
|
result = DomainService.get_by_domains(input_domains)
|
|
|
|
|
|
if not result.success:
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
# 创建 URL
|
|
|
|
|
|
domain_map: dict[str, int] = {x.domain: x.id for x in result.data}
|
|
|
|
|
|
return ReportURLService.add_urls(domain_map, request.urls)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/v1/evidence")
|
2025-04-04 17:29:50 +08:00
|
|
|
|
def collect_evidence(request: CollectEvidenceRequest):
|
2025-04-03 22:11:20 +08:00
|
|
|
|
"""
|
|
|
|
|
|
强制手动触发证据收集任务,支持批量传入,已经收集过的 URL 也要强制收集
|
|
|
|
|
|
TODO:本来应该需要使用任务队列的,为了简单先把数据库的相关标记改为 0 ,也能达到一样的效果
|
|
|
|
|
|
又不是不能用 XD
|
|
|
|
|
|
"""
|
|
|
|
|
|
return ReportURLService.batch_update_evidence_flag(request.ids)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/v1/report")
|
2025-04-04 17:29:50 +08:00
|
|
|
|
def report(request: ReportRequest):
|
2025-04-03 22:11:20 +08:00
|
|
|
|
"""举报指定的URL,支持批量传入 id 批量举报
|
|
|
|
|
|
先通过改数据库,然后等引擎自己调度实现
|
|
|
|
|
|
"""
|
2025-04-04 17:29:50 +08:00
|
|
|
|
logger.debug(f"{request=}")
|
2025-04-03 22:11:20 +08:00
|
|
|
|
return ReportURLService.batch_update_report_flag(
|
|
|
|
|
|
request.ids,
|
|
|
|
|
|
request.report_by_one,
|
|
|
|
|
|
request.report_by_site,
|
|
|
|
|
|
request.report_by_wap
|
|
|
|
|
|
)
|