Eigentlich wollte ich auf die Fritz!Box mittels upnp zugreifen, wie es in einigen Beiträgen in diesem und anderen Foren beschreiben ist. Leider haben aber alle Versuche mit unterschiedlichen Scripts und Parametern keinen Erfolgt gebracht. Es scheint so, als ob die KDG-gebrandtete Box derartige Zugriffe nicht zulässt. Ich glaube, die Parameter
box:settings/upnp/activated: 1
box:settings/upnp/control_activated: 0
sagen alles. Eine Einstellmöglichkeit auf der Web-Oberfläche besteht KDG (jetzt: Vodafone) sei Dank nicht.
Man kann zwar die xml-Dokumente
tr64desc.xml
igdconnSCPD.xml
igddesc.xml
igddslSCPD.xml
igdicfgSCPD.xml
laden, aber mehr geht nicht.
Ich habe daher als "Plan B" den Zugriff über die Web-Oberfläche genutzt.
Fazit: wacklig - aber es geht.
Folgende Python-Skripte funktionieren (zumindest zur Zeit !?):
import sys
import requests
import xml.etree.ElementTree as ET
import json
import hashlib
# ------------------------------------------------------------
def GetSessionID(User, Pass):
"Autorisierung aller weiteren Zugriffe"
SID = ""
URL = "http://fritz.box/login_sid.lua"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
elif x.tag == "Challenge": Challenge = x.text
if SID == "0000000000000000":
URL = "http://fritz.box/login_sid.lua?username="
URL += User + "&response=" + GetResponse(Challenge, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
return(SID)
# ------------------------------------------------------------
def GetResponse(Challenge, Pass):
"Umrechnung Passwort in Reponse"
return(Challenge + "-" + GetMD5Hash(Challenge + "-" + Pass))
# ------------------------------------------------------------
def GetMD5Hash(Input):
m = hashlib.md5()
m.update(Input.encode('UTF-16LE'))
return(m.hexdigest())
# ------------------------------------------------------------
def KeyInQuotes(Text):
"Ersetzt Integer-Keys durch Strings durch Einfügen von Anführungszeichen"
OUT = ""
T = Text.split("\n")
for z in T:
i1 = z.find("[")
i2 = z.find("]")
if i1 >= 0 and i2 > 0:
Key = z[i1+1:i2]
if not '"' in Key:
OUT += z[0:i1] + '["' + Key + '"]' + z[i2+1:]
else:
OUT += z + "\n"
else:
OUT += z + "\n"
return(OUT)
# ------------------------------------------------------------
def GetTR064xml(File, SID):
"xml Konfigurationsdateien laden"
URL = "http://fritz.box:49000/" + File
URL += "?sid=" + SID
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
return(r.text)
# ------------------------------------------------------------
def FBreconnect(User, Pass):
"Erzeugt eine Neuverbindung der FritzBox"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
URL += "&useajax=1&action=disconnect&xhr=1"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
if r.text == "done:0":
return(0)
else:
return(r.text)
# ------------------------------------------------------------
def FBstatus(User, Pass):
"Bereitstellung der Statusinformation als Dictionary"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Holen der Statusinformation"))
return("")
Raw = r.text[r.text.find("<pre>")+5:r.text.find("</pre>")].strip()
while Raw.find("\n ") > 0:
Raw = Raw.replace("\n ", "\n")
i1 = Raw.find("\nQUERIES = ")
i2 = Raw.find("\nMQUERIES = ")
i3 = Raw.find("\nCONFIG = ")
Queries = json.loads(Raw[i1+11:i2].replace("] = ", " : ").replace("\n[", "\n"))
MQueries = json.loads(KeyInQuotes(Raw[i2+12:i3]).replace("] = ", " : ").replace("\n[", "\n").replace("{[", "{"))
Config = json.loads(Raw[i3+10:].replace("] = ", " : ").replace("\n[", "\n"))
return({"Queries" : Queries, "MQueries" : MQueries, "Config" : Config})
Falls jemand noch (erfolgreiche) Erfahrungen mit dem upnp-Zugriff auf eine KDG-Fritz!Box hat, würde es mich freuen, davon zu hören.
box:settings/upnp/activated: 1
box:settings/upnp/control_activated: 0
sagen alles. Eine Einstellmöglichkeit auf der Web-Oberfläche besteht KDG (jetzt: Vodafone) sei Dank nicht.
Man kann zwar die xml-Dokumente
tr64desc.xml
igdconnSCPD.xml
igddesc.xml
igddslSCPD.xml
igdicfgSCPD.xml
laden, aber mehr geht nicht.
Ich habe daher als "Plan B" den Zugriff über die Web-Oberfläche genutzt.
Fazit: wacklig - aber es geht.
Folgende Python-Skripte funktionieren (zumindest zur Zeit !?):
import sys
import requests
import xml.etree.ElementTree as ET
import json
import hashlib
# ------------------------------------------------------------
def GetSessionID(User, Pass):
"Autorisierung aller weiteren Zugriffe"
SID = ""
URL = "http://fritz.box/login_sid.lua"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
elif x.tag == "Challenge": Challenge = x.text
if SID == "0000000000000000":
URL = "http://fritz.box/login_sid.lua?username="
URL += User + "&response=" + GetResponse(Challenge, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
return(SID)
# ------------------------------------------------------------
def GetResponse(Challenge, Pass):
"Umrechnung Passwort in Reponse"
return(Challenge + "-" + GetMD5Hash(Challenge + "-" + Pass))
# ------------------------------------------------------------
def GetMD5Hash(Input):
m = hashlib.md5()
m.update(Input.encode('UTF-16LE'))
return(m.hexdigest())
# ------------------------------------------------------------
def KeyInQuotes(Text):
"Ersetzt Integer-Keys durch Strings durch Einfügen von Anführungszeichen"
OUT = ""
T = Text.split("\n")
for z in T:
i1 = z.find("[")
i2 = z.find("]")
if i1 >= 0 and i2 > 0:
Key = z[i1+1:i2]
if not '"' in Key:
OUT += z[0:i1] + '["' + Key + '"]' + z[i2+1:]
else:
OUT += z + "\n"
else:
OUT += z + "\n"
return(OUT)
# ------------------------------------------------------------
def GetTR064xml(File, SID):
"xml Konfigurationsdateien laden"
URL = "http://fritz.box:49000/" + File
URL += "?sid=" + SID
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
return(r.text)
# ------------------------------------------------------------
def FBreconnect(User, Pass):
"Erzeugt eine Neuverbindung der FritzBox"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
URL += "&useajax=1&action=disconnect&xhr=1"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
if r.text == "done:0":
return(0)
else:
return(r.text)
# ------------------------------------------------------------
def FBstatus(User, Pass):
"Bereitstellung der Statusinformation als Dictionary"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Holen der Statusinformation"))
return("")
Raw = r.text[r.text.find("<pre>")+5:r.text.find("</pre>")].strip()
while Raw.find("\n ") > 0:
Raw = Raw.replace("\n ", "\n")
i1 = Raw.find("\nQUERIES = ")
i2 = Raw.find("\nMQUERIES = ")
i3 = Raw.find("\nCONFIG = ")
Queries = json.loads(Raw[i1+11:i2].replace("] = ", " : ").replace("\n[", "\n"))
MQueries = json.loads(KeyInQuotes(Raw[i2+12:i3]).replace("] = ", " : ").replace("\n[", "\n").replace("{[", "{"))
Config = json.loads(Raw[i3+10:].replace("] = ", " : ").replace("\n[", "\n"))
return({"Queries" : Queries, "MQueries" : MQueries, "Config" : Config})
Falls jemand noch (erfolgreiche) Erfahrungen mit dem upnp-Zugriff auf eine KDG-Fritz!Box hat, würde es mich freuen, davon zu hören.