Commit 5fb2066a authored by Marco Schmiedel's avatar Marco Schmiedel

fix

parent 9f91f2a6
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 22,
"execution_count": 1,
"id": "531d8b07-8f2f-4ef6-b92a-d4bf3364e166",
"metadata": {},
"outputs": [
......
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "531d8b07-8f2f-4ef6-b92a-d4bf3364e166",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"eyJraWQiOiJpZUFmc2p0UDJLdDhVM2F2VHlGVEkiLCJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3R5cGUiOiJhcHBsaWNhdGlvbiIsIm9yZyI6Ik1EIiwiY2xpZW50X2lkIjoiOFZ5amJRWnlUVmR4MlQyVU82bUEzWlRFZWlvZEhjcC0iLCJjdXN0b21fZGF0YSI6eyJyZXNwb25zaWJsZVRlYW0iOiJCQ1MgTW9iaWxlIn0sImF6cCI6IjhWeWpiUVp5VFZkeDJUMlVPNm1BM1pURWVpb2RIY3AtIiwic2NvcGUiOiJhZ3JlZW1lbnRUZXJtU2hlZXRzOndyaXRlIG1hdWkudnZpOnJlYWQgY3VzdG9tZXJQcm9kdWN0OnJlYWQgcHJvZHVjdE9mZmVyaW5nOnJlYWQgemFwLmNvbnRyYWN0OnJlYWQgemFwLmNvbnRyYWN0OndyaXRlIHN0cyIsImlhdCI6MTc0NTk5OTY0MCwic3ViIjoiOFZ5amJRWnlUVmR4MlQyVU82bUEzWlRFZWlvZEhjcC0iLCJpc3MiOiJodHRwczovL3N0cy5tZC5kZS92MS9vaWRjLyIsImp0aSI6ImE4bnR5OGlZZEZpRDdfZzEwZnVaTCIsImV4cCI6MTc0NjA4NjA0MH0.z-LLmQHq1Pb2PNFMjLhmxMMhS9PXZoKgfBSWV-brTdIAZs4uYoUHqVTdf2UcQnFWTFuUyguoQG7r3oKANOiGQKGXiMQZrljZvi0Lb_M-ExVjtBxoVXfyea-aSl9I7qAhyq_Ir7x62RyEJzX0A47y3ZxYT8bGsLd6ApE4e1LnvF8f5QEGRNRqhHBdvlGHYAY2NbJxj2TQrzvwdPPsJONiqJWgt7Ab7OErB39qDJY91ZgQYyUQNErAEhqYlJCZu5HgC_AsX-QgH9u4FQbee6LZL-mJ_dHwWbq5c55dLET6cxxBq4h2Ha3E8fOw2tV3wInaTeHOwGmypGGVNog3el7Tgw\n",
"---\n",
"{'error': [], 'pciId': 'YLXM-34JW-L1Q4', 'pciPdf': 'https://media.mdm.freenet-group.de/downloads/vorvertragliche-dokumente/YLXM-34JW-L1Q4/095402_vertragsinformationen.pdf', 'pcsPdf': 'https://media.mdm.freenet-group.de/downloads/vorvertragliche-dokumente/YLXM-34JW-L1Q4/095402_vertragszusammenfassung.pdf'}\n",
"---\n",
"https://media.mdm.freenet-group.de/downloads/vorvertragliche-dokumente/YLXM-34JW-L1Q4/095402_vertragsinformationen.pdf\n",
"https://media.mdm.freenet-group.de/downloads/vorvertragliche-dokumente/YLXM-34JW-L1Q4/095402_vertragszusammenfassung.pdf\n"
]
}
],
"source": [
"import requests\n",
"import json\n",
"import urllib3\n",
"import os\n",
"\n",
"# Die Warnungen für unsichere HTTPS-Anfragen werden hiermit deaktiviert, um die Konsolenausgabe übersichtlich zu halten.\n",
"urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\n",
"\n",
"# Die Variable 'tokenUrl' speichert die URL, die für den Abruf des Authentifizierungstokens verwendet wird.\n",
"tokenUrl = \"https://sts.md.de/v1/oidc/token\"\n",
"\n",
"# Die Variable 'apiUrl' enthält die Ziel-URL für die API-Anfrage zur Übermittlung der Vertragsdaten.\n",
"apiUrl = \"https://partner-api.md.de/vertragserfassung/ftpOption2Pci.php\"\n",
"\n",
"# Die Variable 'clientId' beinhaltet die spezifische Client-ID, die für die OAuth2-Authentifizierung benötigt wird.\n",
"clientId = \"8VyjbQZyTVdx2T2UO6mA3ZTEeiodHcp-\"\n",
"\n",
"# Die Variable 'clientSecret' speichert das zugehörige Client-Secret für die OAuth2-Authentifizierung.\n",
"clientSecret = \"FTE3y3Hj3TXeYrR8JbbO9yRRJ5ZGmPPTHH4HpyLFd9_X6wOx\"\n",
"\n",
"# Die Variable 'cfClientId' dient zur Identifizierung gegenüber dem Cloudflare Access Schutzmechanismus.\n",
"cfClientId = \"e42d165bde7363f8478a157b57425fd5.access\"\n",
"\n",
"# Die Variable 'cfClientSecret' enthält das Secret, das für die Authentifizierung beim Cloudflare Access Schutz benötigt wird.\n",
"cfClientSecret = \"de141ba4a6fbf9c29f51ba86fce9e81d3479797ff010a7ba43cde01977eac565\"\n",
"\n",
"# Die Variable 'exampleTarifId' hält eine Beispiel-Tarif-ID bereit, die in der API-Anfrage verwendet werden kann.\n",
"exampleTarifId = \"3877325\"\n",
"\n",
"# Die Liste 'exampleServiceCodes' enthält eine Sammlung von Beispiel-Service-Codes für die API-Anfrage.\n",
"exampleServiceCodes = [\"G343\", \"O3729\", \"G4\", \"G19\", \"O1173\", \"G396\", \"O13744\", \"G179\", \"G3181655\", \"O3150921\"]\n",
"\n",
"# Die Variable 'hdlNr' speichert die Händlernummer, welche als Parameter in der API-Anfrage dient.\n",
"hdlNr = 27502648\n",
"\n",
"# Die Variable 'provHdlNr' beinhaltet die Provisions-Händlernummer, die ebenfalls Teil der API-Anfrage ist.\n",
"provHdlNr = 27502648\n",
"\n",
"# Die Variable 'produktKategorie' definiert die Kategorie des Produkts für die API-Anfrage.\n",
"produktKategorie = \"O\"\n",
"\n",
"# Das Dictionary 'tokenPayload' konfiguriert die Daten für die Anfrage des Authentifizierungstokens.\n",
"tokenPayload = {\"grant_type\": \"client_credentials\", \"client_id\": clientId, \"client_secret\": clientSecret}\n",
"\n",
"# Eine POST-Anfrage wird an die 'tokenUrl' gesendet, um ein Zugriffstoken zu erhalten; die SSL-Zertifikatsprüfung wird dabei übersprungen.\n",
"tokenResponse = requests.post(tokenUrl, data=tokenPayload, verify=False)\n",
"\n",
"# Aus der JSON-Antwort des Token-Endpunkts wird der Wert des Zugriffstokens extrahiert und in 'accessToken' gespeichert.\n",
"accessToken = tokenResponse.json().get(\"access_token\")\n",
"\n",
"# Es erfolgt eine Prüfung, ob die Variable 'accessToken' einen gültigen Wert enthält.\n",
"if accessToken:\n",
" \n",
" # Das erfolgreich abgerufene Zugriffstoken wird zur Kontrolle auf der Konsole ausgegeben.\n",
" print(accessToken)\n",
" \n",
"# Falls kein Zugriffstoken erhalten wurde, wird der alternative Zweig ausgeführt.\n",
"else:\n",
" \n",
" # Eine Hinweismeldung, dass das Token fehlt, wird auf der Konsole angezeigt.\n",
" print(\"MISSING TOKEN\")\n",
" \n",
" # Die Ausführung des Skripts wird an dieser Stelle beendet.\n",
" exit()\n",
"\n",
"# Das Dictionary 'apiHeaders' definiert die notwendigen HTTP-Header für die nachfolgende API-Anfrage, inklusive des Bearer-Tokens und der Cloudflare-Credentials.\n",
"apiHeaders = {\n",
" \"Authorization\": f\"Bearer {accessToken}\",\n",
" \"CF-Access-Client-Id\": cfClientId,\n",
" \"CF-Access-Client-Secret\": cfClientSecret,\n",
" \"Content-Type\": \"application/json\"\n",
"}\n",
"\n",
"# Das Dictionary 'apiPayload' stellt die Nutzdaten zusammen, die mittels PUT-Request an die API gesendet werden sollen.\n",
"apiPayload = {\n",
" \"hdl_nr\": hdlNr, \"prov_hdl_nr\": provHdlNr, \"tarif_id\": exampleTarifId,\n",
" \"produkt_kategorie\": produktKategorie, \"service_code\": exampleServiceCodes\n",
"}\n",
"\n",
"# Eine PUT-Anfrage mit den definierten Headern und Nutzdaten wird an die 'apiUrl' gesendet; auch hier wird die SSL-Zertifikatsprüfung ignoriert.\n",
"apiResponse = requests.put(apiUrl, headers=apiHeaders, json=apiPayload, verify=False)\n",
"\n",
"# Die von der API zurückgegebene JSON-Antwort wird verarbeitet und im Objekt 'apiData' gespeichert.\n",
"apiData = apiResponse.json()\n",
"\n",
"# Zur optischen Trennung der Ausgabe wird ein Trennstrich auf der Konsole gedruckt.\n",
"print(\"---\")\n",
"\n",
"# Der Inhalt der Variable 'apiData', welcher die gesamte API-Antwort repräsentiert, wird ausgegeben.\n",
"print(apiData)\n",
"\n",
"# Zur optischen Trennung der Ausgabe wird ein Trennstrich auf der Konsole gedruckt.\n",
"print(\"---\")\n",
"\n",
"# Aus dem 'apiData'-Objekt wird der Wert des Schlüssels 'pciPdf' extrahiert und der Variable 'pciPdf' zugewiesen.\n",
"pciPdf = apiData.get('pciPdf')\n",
"\n",
"# Analog wird der Wert des Schlüssels 'pcsPdf' aus 'apiData' extrahiert und in der Variable 'pcsPdf' gespeichert.\n",
"pcsPdf = apiData.get('pcsPdf')\n",
"\n",
"#\n",
"pcsId = apiData.get('pciId')\n",
"\n",
"# Der Wert der Variable 'pciPdf', welcher die URL zum PCI-PDF darstellt, wird auf der Konsole ausgegeben.\n",
"print(pciPdf)\n",
"\n",
"# Der Wert der Variable 'pcsPdf', der die URL zum PCS-PDF enthält, wird ebenfalls auf der Konsole ausgegeben.\n",
"print(pcsPdf)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4d796b32-df5d-4ba5-a062-4d96b12db2b3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"---\n",
"PCS PDF erfolgreich heruntergeladen und gespeichert unter: ../cache/YLXM-34JW-L1Q4_3877325_pcs.pdf\n",
"---\n"
]
}
],
"source": [
"# --- HINZUGEFÜGTER CODE BLOCK START ---\n",
"\n",
"# Zur optischen Trennung der Ausgabe wird ein Trennstrich auf der Konsole gedruckt.\n",
"print(\"---\")\n",
"\n",
"# Der Pfad zum Cache-Verzeichnis wird definiert.\n",
"cacheDir = \"../cache\"\n",
"\n",
"# Es wird geprüft, ob eine URL für das PCS-PDF vorhanden ist.\n",
"if pcsPdf:\n",
" \n",
" # Der Dateiname für die heruntergeladene PDF-Datei wird generiert, basierend auf der Beispiel-Tarif-ID.\n",
" pcsFileName = f\"{exampleTarifId}_pcs.pdf\"\n",
" \n",
" # Der vollständige Zielpfad im Cache-Verzeichnis wird erstellt.\n",
" pcsFilePath = os.path.join(cacheDir, f\"{pcsId}_{pcsFileName}\")\n",
"\n",
" # Ein try-except-Block fängt mögliche Fehler beim Download ab.\n",
" try:\n",
" # Eine GET-Anfrage wird gesendet, um die PDF-Datei herunterzuladen; SSL-Verifizierung ist deaktiviert, streaming wird genutzt.\n",
" pdfResponse = requests.get(pcsPdf, stream=True, verify=False)\n",
" \n",
" # Es wird geprüft, ob die Anfrage erfolgreich war (Status-Code 2xx).\n",
" pdfResponse.raise_for_status() # Löst eine Exception aus bei HTTP-Fehlern wie 404 oder 500.\n",
"\n",
" # Die Datei wird im Binärschreibmodus ('wb') geöffnet, um den Inhalt zu speichern.\n",
" with open(pcsFilePath, 'wb') as f:\n",
" \n",
" # Der Inhalt der Antwort wird in die Datei geschrieben.\n",
" f.write(pdfResponse.content)\n",
" \n",
" # Eine Erfolgsmeldung wird ausgegeben, die den Speicherort anzeigt.\n",
" print(f\"PCS PDF erfolgreich heruntergeladen und gespeichert unter: {pcsFilePath}\")\n",
"\n",
" # Falls ein Fehler während der HTTP-Anfrage auftritt (z.B. 404 Not Found, Timeout, Verbindungsproblem).\n",
" except requests.exceptions.RequestException as e:\n",
" \n",
" # Eine Fehlermeldung wird ausgegeben, die den Fehler beschreibt.\n",
" print(f\"FEHLER beim Herunterladen der PCS PDF von {pcsPdf}: {e}\")\n",
" \n",
" # Falls ein anderer Fehler auftritt (z.B. Probleme beim Schreiben der Datei).\n",
" except Exception as e:\n",
" # Eine allgemeine Fehlermeldung wird ausgegeben.\n",
" print(f\"Ein unerwarteter Fehler ist beim Speichern der PCS PDF aufgetreten: {e}\")\n",
" \n",
"# Falls keine URL für das PCS-PDF in der API-Antwort gefunden wurde.\n",
"else:\n",
" \n",
" # Eine entsprechende Information wird ausgegeben.\n",
" print(\"Keine PCS PDF URL in der API-Antwort gefunden, Download übersprungen.\")\n",
"\n",
"# Zur optischen Trennung der Ausgabe wird ein Trennstrich auf der Konsole gedruckt.\n",
"print(\"---\")\n",
" \n",
"# --- HINZUGEFÜGTER CODE BLOCK ENDE ---"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c99d425d-2ce5-4ca8-80f6-79f9f7d4cf13",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment