From 5e2e03098c830491826f7194dca6ddab9f577c54 Mon Sep 17 00:00:00 2001 From: Markus Busche Date: Fri, 27 Jun 2025 11:18:35 +0200 Subject: [PATCH] Umgebaut auf REST API --- ti_status_checker.py | 34 +++++++---------- ti_status_checker_api.py | 81 ---------------------------------------- 2 files changed, 14 insertions(+), 101 deletions(-) delete mode 100644 ti_status_checker_api.py diff --git a/ti_status_checker.py b/ti_status_checker.py index 9679c6c..f0e7695 100644 --- a/ti_status_checker.py +++ b/ti_status_checker.py @@ -1,31 +1,24 @@ import requests -import time import json -from bs4 import BeautifulSoup from datetime import datetime import re -TI_STATUS_URL = "https://fachportal.gematik.de/ti-status" +TI_API_URL = "https://ti-lage.prod.ccs.gematik.solutions/lageapi/v2/tilage" WEBHOOK_URL = "https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a" STATE_FILE = "ti_status_state.json" def fetch_status_messages(): - resp = requests.get(TI_STATUS_URL) + resp = requests.get(TI_API_URL) resp.raise_for_status() - soup = BeautifulSoup(resp.text, "html.parser") - # Annahme: Meldungen stehen in bestimmten HTML-Elementen (z.B.
) - # Dies muss ggf. angepasst werden, wenn die Struktur anders ist! + data = resp.json() messages = [] - for item in soup.find_all("div", class_="c-status-list__item"): - title = item.get_text(strip=True) - if title: - messages.append(title) - # Fallback: Wenn keine spezielle Klasse, alle sichtbaren Meldungen im Hauptbereich - if not messages: - for p in soup.find_all("p"): - text = p.get_text(strip=True) - if text and len(text) > 30: - messages.append(text) + for meldung in data.get("meldungen", []): + zeit = meldung.get("zeitpunkt", "") + titel = meldung.get("titel", "") + beschreibung = meldung.get("beschreibung", "") + link = meldung.get("link", "") + msg = f"{zeit}\n- {titel}: {beschreibung}\n{link}".strip() + messages.append(msg) return messages def load_state(): @@ -40,7 +33,8 @@ def save_state(state): json.dump(state, f, ensure_ascii=False, indent=2) def markdownify_message(message): - # Datumsangaben fett hervorheben (z.B. 23.06.2025) + # Datumsangaben fett hervorheben (z.B. 2025-06-23 oder 23.06.2025) + message = re.sub(r"(\d{4}-\d{2}-\d{2})", r"**\1**", message) message = re.sub(r"(\d{2}\.\d{2}\.\d{4})", r"**\1**", message) # URLs als Links darstellen message = re.sub(r"(https?://\S+)", r"[\1](\1)", message) @@ -60,7 +54,7 @@ def markdownify_message(message): def send_to_mattermost(message): md_message = markdownify_message(message) payload = { - "text": f"#### Neue TI-Status-Meldung\n\n{md_message}\n\n[Zur Statusseite]({TI_STATUS_URL})\n_Gemeldet am {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}_" + "text": f"#### Neue TI-Status-Meldung\n\n{md_message}\n\n[Zur Statusseite](https://fachportal.gematik.de/ti-status)\n_Gemeldet am {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}_" } resp = requests.post(WEBHOOK_URL, json=payload) resp.raise_for_status() @@ -68,7 +62,7 @@ def send_to_mattermost(message): def main(): state = load_state() known_messages = set(state.get("messages", [])) - print("Prüfe TI-Status-Seite auf neue Meldungen...") + print("Prüfe TI-Status-API auf neue Meldungen...") try: messages = fetch_status_messages() new_messages = [m for m in messages if m not in known_messages] diff --git a/ti_status_checker_api.py b/ti_status_checker_api.py deleted file mode 100644 index f0e7695..0000000 --- a/ti_status_checker_api.py +++ /dev/null @@ -1,81 +0,0 @@ -import requests -import json -from datetime import datetime -import re - -TI_API_URL = "https://ti-lage.prod.ccs.gematik.solutions/lageapi/v2/tilage" -WEBHOOK_URL = "https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a" -STATE_FILE = "ti_status_state.json" - -def fetch_status_messages(): - resp = requests.get(TI_API_URL) - resp.raise_for_status() - data = resp.json() - messages = [] - for meldung in data.get("meldungen", []): - zeit = meldung.get("zeitpunkt", "") - titel = meldung.get("titel", "") - beschreibung = meldung.get("beschreibung", "") - link = meldung.get("link", "") - msg = f"{zeit}\n- {titel}: {beschreibung}\n{link}".strip() - messages.append(msg) - return messages - -def load_state(): - try: - with open(STATE_FILE, "r", encoding="utf-8") as f: - return json.load(f) - except (FileNotFoundError, json.JSONDecodeError): - return {"messages": []} - -def save_state(state): - with open(STATE_FILE, "w", encoding="utf-8") as f: - json.dump(state, f, ensure_ascii=False, indent=2) - -def markdownify_message(message): - # Datumsangaben fett hervorheben (z.B. 2025-06-23 oder 23.06.2025) - message = re.sub(r"(\d{4}-\d{2}-\d{2})", r"**\1**", message) - message = re.sub(r"(\d{2}\.\d{2}\.\d{4})", r"**\1**", message) - # URLs als Links darstellen - message = re.sub(r"(https?://\S+)", r"[\1](\1)", message) - # Listenpunkte erkennen (z.B. mit - oder *) - lines = message.splitlines() - md_lines = [] - for line in lines: - line = line.strip() - if line.startswith("-") or line.startswith("*"): - md_lines.append(f"- {line[1:].strip()}") - else: - md_lines.append(line) - # Absätze durch doppelte Zeilenumbrüche trennen - md_message = "\n\n".join([l for l in md_lines if l]) - return md_message - -def send_to_mattermost(message): - md_message = markdownify_message(message) - payload = { - "text": f"#### Neue TI-Status-Meldung\n\n{md_message}\n\n[Zur Statusseite](https://fachportal.gematik.de/ti-status)\n_Gemeldet am {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}_" - } - resp = requests.post(WEBHOOK_URL, json=payload) - resp.raise_for_status() - -def main(): - state = load_state() - known_messages = set(state.get("messages", [])) - print("Prüfe TI-Status-API auf neue Meldungen...") - try: - messages = fetch_status_messages() - new_messages = [m for m in messages if m not in known_messages] - for msg in new_messages: - print(f"Neue Meldung gefunden: {msg}") - send_to_mattermost(msg) - known_messages.add(msg) - if new_messages: - save_state({"messages": list(known_messages)}) - else: - print(f"Keine neuen Meldungen ({datetime.now().strftime('%H:%M:%S')})") - except Exception as e: - print(f"Fehler: {e}") - -if __name__ == "__main__": - main() \ No newline at end of file