Files
sd_dispatcher/fetch_tickets.py
T

108 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""Получение списка заявок из ServiceDesk Plus. Экспорт: Группа, Описание, Назначено, Категория в JSONL."""
import requests
import json
import urllib3
from datetime import datetime
from html import unescape
import re
import sys
import os
# Отключаем ворнинги для чистой работы консоли
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# --- ИМПОРТ КОНФИГУРАЦИИ (ВСЕ ПЕРЕМЕННЫЕ ИДУТ ОТСЮДА) ---
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config'))
from config import *
def get_ts(req):
ct = req.get("created_time", {})
if isinstance(ct, dict):
v = ct.get("value", "0")
return int(v) if v else 0
return 0
def clean_html(text):
if not text:
return ""
text = re.sub(r'<[^>]+>', '', text)
text = unescape(text)
return text.strip()
def get_name(obj):
"""Извлечь имя из объекта группы/техника/категории."""
if not obj:
return ""
if isinstance(obj, dict):
return obj.get("name", "") or obj.get("display_value", "")
return str(obj)
def get_ticket_detail(ticket_id):
"""Получить детальную информацию по заявке."""
try:
url = f"{LOCAL_SD_URL}/api/v3/requests/{ticket_id}"
headers = {"authtoken": LOCAL_SD_API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
resp = requests.get(url, headers=headers, verify=False, timeout=15.0)
resp.raise_for_status()
data = resp.json()
return data.get("request", data)
except Exception as e:
return {}
def list_tickets(from_date="2026-07-20"):
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=__import__('datetime').timezone.utc).timestamp() * 1000)
resp = requests.get(url, headers=headers, verify=False, timeout=30.0)
resp.raise_for_status()
data = resp.json()
all_reqs = data.get("requests", [])
from_date_reqs = [r for r in all_reqs if get_ts(r) >= from_date_ms]
# Получаем детали для каждой заявки
rows = []
for req in from_date_reqs:
req_id = req.get("request_id", req.get("id", "?"))
detail = get_ticket_detail(req_id)
# Группа — из списка
group = req.get("group", {})
group_name = get_name(group)
# Описание — из детального запроса
desc = detail.get("description", "")
desc_clean = clean_html(desc)
# Назначено (специалист) — из детального запроса
tech = detail.get("technician", {})
assignee = get_name(tech)
# Категория — из детального запроса
cat = detail.get("category", {})
category = get_name(cat)
rows.append({
"group": group_name,
"description": desc_clean,
"assignee": assignee,
"category": category
})
# Выводим JSONL
for row in rows:
print(json.dumps(row, ensure_ascii=False))
if __name__ == "__main__":
from_date = sys.argv[1] if len(sys.argv) > 1 else "2026-07-20"
list_tickets(from_date)