Initial commit: TI-Status2Mattermost Skript und Doku
This commit is contained in:
38
README.md
Normal file
38
README.md
Normal file
@ -0,0 +1,38 @@
|
||||
# TI-Status2Mattermost
|
||||
|
||||
Dieses Python-Skript überwacht die Webseite [https://fachportal.gematik.de/ti-status](https://fachportal.gematik.de/ti-status) auf neue Störungsmeldungen und sendet diese automatisch an einen Mattermost-Webhook.
|
||||
|
||||
## Funktionsweise
|
||||
- Die Seite wird regelmäßig (alle 5 Minuten) auf neue Meldungen geprüft.
|
||||
- Neue Meldungen werden erkannt und als formatierte Nachricht an Mattermost gesendet.
|
||||
- Bereits gesendete Meldungen werden gespeichert, sodass sie nach einem Neustart nicht erneut verschickt werden.
|
||||
|
||||
## Voraussetzungen
|
||||
- Python 3.8 oder neuer
|
||||
- Zugriff auf die Mattermost-Webhook-URL
|
||||
|
||||
## Installation
|
||||
1. Repository klonen oder Dateien herunterladen.
|
||||
2. Abhängigkeiten installieren:
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## Nutzung
|
||||
Das Skript kann direkt gestartet werden:
|
||||
```bash
|
||||
python ti_status_checker.py
|
||||
```
|
||||
|
||||
Das Skript läuft in einer Endlosschleife und prüft alle 5 Minuten auf neue Meldungen.
|
||||
|
||||
## Konfiguration
|
||||
- Die Mattermost-Webhook-URL und die Status-URL sind im Skript als Konstanten hinterlegt.
|
||||
- Das Intervall kann über die Variable `CHECK_INTERVAL` (in Sekunden) angepasst werden.
|
||||
|
||||
## Hinweise
|
||||
- Bereits gesendete Meldungen werden in der Datei `ti_status_state.json` gespeichert.
|
||||
- Die Markdown-Formatierung der Nachrichten sorgt für eine übersichtliche Darstellung in Mattermost.
|
||||
|
||||
## Lizenz
|
||||
MIT
|
4
idea.txt
Normal file
4
idea.txt
Normal file
@ -0,0 +1,4 @@
|
||||
- untersuche die webseite https://fachportal.gematik.de/ti-status bezüglich einer api zum abfragen der störungsmeldungen
|
||||
- erstelle ein python script, das
|
||||
- die webseite https://fachportal.gematik.de/ti-status auf neue Meldungen überprüft
|
||||
- neue meldungen an den mattermost webhook https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a sendet
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
requests
|
||||
beautifulsoup4
|
90
ti_status_checker.py
Normal file
90
ti_status_checker.py
Normal file
@ -0,0 +1,90 @@
|
||||
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"
|
||||
WEBHOOK_URL = "https://mattermost.medisoftware.org/hooks/i67zgcgajifxxxtfwjxcxace7a"
|
||||
STATE_FILE = "ti_status_state.json"
|
||||
CHECK_INTERVAL = 300 # 5 Minuten
|
||||
|
||||
def fetch_status_messages():
|
||||
resp = requests.get(TI_STATUS_URL)
|
||||
resp.raise_for_status()
|
||||
soup = BeautifulSoup(resp.text, "html.parser")
|
||||
# Annahme: Meldungen stehen in bestimmten HTML-Elementen (z.B. <div class="c-status-list__item">)
|
||||
# Dies muss ggf. angepasst werden, wenn die Struktur anders ist!
|
||||
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)
|
||||
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. 23.06.2025)
|
||||
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]({TI_STATUS_URL})\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("Starte Überwachung der TI-Status-Seite...")
|
||||
while True:
|
||||
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}")
|
||||
time.sleep(CHECK_INTERVAL)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
15
ti_status_state.json
Normal file
15
ti_status_state.json
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"messages": [
|
||||
"23.06.2025\n - Wartungsarbeiten DEMIS:Mehr erfahren",
|
||||
"Die gematik informiert Sie auf den Status-Seiten über aktuelle betriebliche Ereignisse. Dazu gehören Störungen in der Telematikinfrastruktur, temporäre Downtimes sowie geplante Wartungsvorhaben, Releases und Updates.Bei einer außerplanmäßigen Unterbrechung im Betrieb berichtet die gematik über Fortschritte in Ursachenanalyse und Behebung.",
|
||||
"27.05.2025\n - Hinweis: Keine E-Mail-Benachrichtigungen bei TI-Status-Änderungen :Mehr erfahren",
|
||||
"06.06.2025\n - Konnektoren und Kartenterminals mit veralteter oder nicht mehr zugelassener Software im Einsatz:Mehr erfahren",
|
||||
"Bereitstellung von allgemeinen Informationen zu den verschiedenen Diensten der Telematikinfrastruktur",
|
||||
"gematik GmbHFriedrichstr. 13610117 Berlin",
|
||||
"06.05.2025\n - Am 12.05.2025 beginnen die RSA2ECC Testwochen!:\n Ein besonderer Schwerpunkt liegt diesmal auf der Prüfung von QES-Signaturen (Qualified Electronic Signatures) sowie ihrer Evaluierung und Optimierung.Mehr erfahren",
|
||||
"24.04.2025\n - Einstellung des Vertriebs und des technischen Supports für den Konnektorsimulator für Primärsysteme (KoPS):Mehr erfahren",
|
||||
"Planungshilfe für die kollisionsfreie Terminierung von Deployment-Changes für TI-Komponenten",
|
||||
"16.05.2025\n - Neue Firmware-Versionen für Konnektoren: Vorbereitung auf aktualisierte Vertrauensliste der BNetzA:Mehr erfahren",
|
||||
"23.06.2025\n - Wartungsarbeiten Versicherten Stammdaten Management (VSDM) des Betreibers BITMARCK Technik GmbH:Mehr erfahren"
|
||||
]
|
||||
}
|
Reference in New Issue
Block a user