From a48b484ea1cd4723327ce992646a187f8a57378a Mon Sep 17 00:00:00 2001 From: dddennnisss Date: Sun, 26 Jul 2026 23:20:32 +0700 Subject: [PATCH] feat: read SD config from config.py, add category/assignee, support date arg --- config/config.py | 4 ++++ fetch_tickets.py | 38 +++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/config/config.py b/config/config.py index ca8bec4..763924c 100644 --- a/config/config.py +++ b/config/config.py @@ -112,6 +112,10 @@ ENABLE_FUZZY_CORRECTION = True # Нечёткое исправление по # 3. ИНТЕГРАЦИЯ С MANAGEENGINE SERVICE DESK API # ===================================================================== # Корпоративный URL и API-эндпоинт для работы с заявками по протоколу v3 +# Локальный Service Desk (для выгрузки данных) +LOCAL_SD_URL = "https://192.168.1.237:8080" +LOCAL_SD_API_KEY = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" + SERVER_URL = "https://servicedesk.sibcem.ru:8080" ENDPOINT = f"{SERVER_URL}/api/v3/requests" diff --git a/fetch_tickets.py b/fetch_tickets.py index 7e441b3..8d0fa03 100644 --- a/fetch_tickets.py +++ b/fetch_tickets.py @@ -8,11 +8,18 @@ import urllib3 from datetime import datetime, timezone from html import unescape import re +import sys +import os -BASE_URL = "https://192.168.1.237:8080" -API_TOKEN = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" +# Добавляем путь к конфигу +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -FROM_DATE_MS = int(datetime(2026, 7, 20, 0, 0, 0, tzinfo=timezone.utc).timestamp() * 1000) +# Локальный Service Desk (для выгрузки данных) +LOCAL_SD_URL = "https://192.168.1.237:8080" +LOCAL_SD_API_KEY = "062CE056-C1F5-490C-A6DF-FD2C653A71DD" + +# По умолчанию с 20 июля, но можно передать как аргумент +DEFAULT_FROM_DATE = "2026-07-20" def get_ts(req): ct = req.get("created_time", {}) @@ -39,8 +46,8 @@ def get_name(obj): async def fetch_ticket_detail(client, req_id): try: resp = await client.get( - f"{BASE_URL}/api/v3/requests/{req_id}", - headers={"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"}, + f"{LOCAL_SD_URL}/api/v3/requests/{req_id}", + headers={"authtoken": LOCAL_SD_API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}, timeout=15.0 ) data = resp.json() @@ -48,24 +55,28 @@ async def fetch_ticket_detail(client, req_id): except Exception as e: return {} -async def list_tickets(): - url = f"{BASE_URL}/api/v3/requests" - headers = {"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"} +async def list_tickets(from_date=DEFAULT_FROM_DATE): + url = f"{LOCAL_SD_URL}/api/v3/requests" + headers = {"authtoken": LOCAL_SD_API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"} + + # Вычисляем timestamp с указанной даты + date_obj = datetime.strptime(from_date, "%Y-%m-%d") + from_date_ms = int(date_obj.replace(tzinfo=timezone.utc).timestamp() * 1000) async with httpx.AsyncClient(verify=False, timeout=30.0) as client: resp = await client.get(url, headers=headers) data = resp.json() all_reqs = data.get("requests", []) - from_20 = [r for r in all_reqs if get_ts(r) >= FROM_DATE_MS] + from_date_reqs = [r for r in all_reqs if get_ts(r) >= from_date_ms] # Получаем детали для каждой заявки - tasks = [fetch_ticket_detail(client, r.get("request_id", r.get("id", "?"))) for r in from_20] + tasks = [fetch_ticket_detail(client, r.get("request_id", r.get("id", "?"))) for r in from_date_reqs] details = await asyncio.gather(*tasks) rows = [] - for req, detail in zip(from_20, details): - # Группа — из списка (есть там) + for req, detail in zip(from_date_reqs, details): + # Группа — из списка group = req.get("group", {}) group_name = get_name(group) @@ -94,4 +105,5 @@ async def list_tickets(): if __name__ == "__main__": urllib3.disable_warnings() - asyncio.run(list_tickets()) + from_date = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_FROM_DATE + asyncio.run(list_tickets(from_date))