FritzBox DECT-Monitor in Webgadget

Anfängerfragen zum Programmieren mit PureBasic.
gnaps
Beiträge: 151
Registriert: 02.09.2008 13:02

FritzBox DECT-Monitor in Webgadget

Beitrag von gnaps »

Hallo Forum,

ich würde gerne die Ansicht "DECT-Monitor" von der FritzBox in einem Webgadget anzeigen lassen.
Meine FritzBox-7270 ist mit einem Kennwort geschützt.

Wie geh ich da vor?
Hat das schon jemand umgesetzt?

Hintergedanke:
Ich möchte einen Statusmonitor haben, der mir die Verbindungen der DECT-Telefone anzeigt
und diese alle x-Sekunden aktuallisiert.

Gruß
gnaps
PureBasic Vollversion V 5.71 für Windows - Windows 10 (64)
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Falko »

Das ist ab den neueren Fritzboxversionen um einiges komplizierter.
Ich selbst habe das noch nicht probiert, wobei damals mit dem Speedport,
konnte man mit curl was machen. Hier mal eine Beschreibung von AVM
zum Interface mit der neuen Technologie, wo SessionIDs benutzt werden,
die man nun braucht.

http://www.avm.de/de/Extern/files/sessi ... ion_ID.pdf

Vielleicht hilft Dir das einen kleinen Schritt weiter.

Dazu noch ein Link: http://www.purebasic.fr/german/viewtopi ... TPFile.pbi
Das man dazu bräuchte. Ist aber OOP und dazu können hier bestimmt einige ein passendes Beispiel daraus stricken.
Ich kanns leider nicht.


Gruß,
Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Bender »

Das mit der SID hat mich auch ein paar graue Haare gekostet, ich hab es dann so gemacht, mit Zwischenspeicherung der Seite auf der Platte ging es für mich einfacher als diese in den Speicher zu laden. Es geht zweifellos sicher eleganter, aber es funktioniert auch so bestens.
FBIP ist die Box-IP
uiPass ist das Box-PW
  • SeiteLaden() liest die angeforderte Seite über den Umweg der Festplatte in die Variable gSeite
  • FindeDaten() sucht einen String in gSeite
  • fbSID() gibt unter Zuhilfenahme der anderen Proceduren die SID zurück.
Anzumerken ist, daß das mit dem "Unicode Codepoint > 255" NICHT berücksichtigt ist!

Code: Alles auswählen

Global FBIP.s, uiPass.s, gSeite.s, SessionID.s
Global Zeilenumbuch.s = Chr(13)+Chr(10)

Procedure SeiteLaden(Seite.s)
  gSeite = ""
  If ReceiveHTTPFile("http://" + FBIP + Seite,"td.fritz")
    If ReadFile(0, "td.fritz")
      While Eof(0) = 0
        gSeite = gSeite + ReadString(0)
      Wend
      CloseFile(0)
    Else
      MessageRequester("Fehler", "Fehler beim Lesen der Daten!")
    EndIf
  Else
    MessageRequester("Fehler", "Fehler beim Laden der Seite" + Zeilenumbuch + Seite)
  EndIf
EndProcedure

Procedure.s FindeDaten(Suche.s, Stelle = 1, eSuche.s = "")
  aSuche.s = "<" + Suche + ">"
  If eSuche = "" : eSuche.s = "</" + Suche + ">" : EndIf
  PzWertA.s = StringField(gSeite, Stelle + 1, aSuche)
  ProcedureReturn StringField(PzWertA, 1, eSuche)
EndProcedure

Procedure.s fbSID()
  SeiteLaden("/login_sid.lua")
  *Buffer = AllocateMemory(200)
  PzWertC.s = FindeDaten("Challenge")
  PzWertA.s = PzWertC + "-" + uiPass
  For a = 1 To Len(PzWertA)
    PokeC(*Buffer + a + a - 2, Asc(Mid(PzWertA,a,1)))
    PokeC(*Buffer + a + a - 1, 0)
  Next
  PzWertB.s = MD5Fingerprint(*Buffer, Len(PzWertA) + Len(PzWertA))
  FreeMemory(*Buffer)
  SeiteLaden("/login_sid.lua?response=" + PzWertC + "-" + PzWertB)
  ProcedureReturn FindeDaten("SID")
EndProcedure

SessionID = fbSID()
O_o
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Falko »

Ist dieser Source komplett lauffähig, oder fehlt da noch was mit Network...?
Habe nur mal kurz getestet und kann mir nicht vorstellen ohne Benutzer und Passwort,
wie man die Fritzbox einstellen kann, das es so funktioniert.

Gruß,
Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Rebon »

Falko hat geschrieben:Ist dieser Source komplett lauffähig, oder fehlt da noch was mit Network...?
Habe nur mal kurz getestet und kann mir nicht vorstellen ohne Benutzer und Passwort,
wie man die Fritzbox einstellen kann, das es so funktioniert.
Wenn ich den Code richtig verstanden habe, nutzt er für den Login direkt in der "Adresszeile" ein Script per PHP/Lua.
PB 4.00 | Windows XP Home SP3
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Bender »

Mit den 3 Zeilen zusätzlich läuft der Code:

Code: Alles auswählen

FBIP = "fritz.box"
uiPass = "Passwort"
InitNetwork()
FBIP kann natürlich auch als IP eingegeben weden, falls man mehrere Fritten im Netzwerk hat.

Der Code macht genau das, was in dem AVM-PDF steht. Er holt sich vom Script "login_sid.lua" der Fritzbox die Challenge und erzeugt aus dem Frittenpasswort "uiPass" und der Challenge den Response, sendet den erneut zur Box und bekommt die SID, mit der kann man dann jede Seite der Box direkt per Link aufrufen, z.B.

Code: Alles auswählen

"/fon_num/rul_edit.lua?sid=" + SessionID
Für die Rufumleitungen oder

Code: Alles auswählen

"/dect/dect_moni.lua?sid=" + SessionID
Für den DECT-Monitor.
O_o
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Falko »

Für eine normale Anmeldung bei der Fritzbox reicht ja das Passwort alleine.
Aber wie muss man das nun mit dem Benutzernamen machen, wenn man diesen in
der Fritzbox aktiviert hat?
AVM hat geschrieben:Ermittlung des Response-Wertes
Beim neuen Login-Verfahren wird also das Klartextpasswort
login:command/password=<klartextpassword>
ersetzt durch
login:command/response=<response>
Der Response-Wert wird wie folgt gebildet:
<response> = <challenge>-<md5>
Der Wert <challenge> kann aus der Datei login_sid.xml bzw. login_sid.lua ausgelesen werden
und <md5> ist der MD5 (32 Hexzeichen mit Kleinbuchstaben) von
<challenge>-<klartextpassword>
.© AVM GmbH • 17.12.2012 • Seite 3 von 6
avm.de
Der MD5-Hash wird über die Bytefolge der UTF-16LE-Codierung dieses
Strings gebildet (ohne BOM und ohne abschließende 0-Bytes).
Aus Kompatibilitätsgründen muss für jedes Zeichen, dessen Unicode Codepoint > 255 ist, die
Codierung des "."-Zeichens benutzt werden (0x2e 0x00 in UTF-16LE). Dies betrifft also alle
Zeichen, die nicht in ISO-8859-1 dargestelltwerden können, z. B. das Euro-Zeichen.
Abschließend ein Beispiel mit deutschem Umlaut:
Die Challenge
<challenge> = "1234567z"
kombiniert mit dem Kennwort
<klartextpassword> = "äbc"
ergibt den Wert
<response> = "1234567z-9e224a41eeefa284df7bb0f26c2913e2"
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Bender »

Gute Frage, nächste Frage.
Also wenn ich extern auf die Box zugreife, hab ich ja auch Benutzer und PW einzugeben, komme dann aber auch auf die Seite wo ich nochmal das Frittenpasswort eingeben muß.

Vielleicht geht das nur mit dem "Standart"-User, oder man hängt noch ein username=wasauchimmer mit in den Request.
O_o
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Falko »

Irgendwo ein Passwort vor dem "-" einfügen in UTF16 sowie auch MD5 zu verschlüsseln um
damit die richtige SSID herauszubekommen ist mir leider noch nicht gelungen. Wegen dem Verständnis wir
es wohl bei mir etwas länger dauern :).

Bei der Firmwareversion 6.03 sollte auch von ausserhalb ein Zugriff nur über Benutzer und Passwort möglich sein,
soweit man die Rechte für diesen Benutzer vorgegeben hat. Eigentlich dürfte dann kein Fritzpasswort extra abgefragt
werden, wie es in den älteren Firmwareversionen war. Aber vielleicht ist das auch ganz was anderes als
der Zugriff im Heimnetz um nur die Telefonlisten aufzulisten, wie es ein Programm JAnrufmonitor schon macht.

Ich habe schon einige Versuche gemacht in deinem Code das Passwort an geeignete Stelle einzusetzen, bin aber
aus Verständinsgründen nicht sehr weit gekommen.

Zwar konnte ich mit Debug die xml-Ausgabe anzeigen lassen, nur nützt mir das leider sehr wenig :cry:

MfG,
Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Bender
Beiträge: 9
Registriert: 29.03.2013 12:39
Wohnort: HEF

Re: FritzBox DECT-Monitor in Webgadget

Beitrag von Bender »

Falko hat geschrieben: Ich habe schon einige Versuche gemacht in deinem Code das Passwort an geeignete Stelle einzusetzen, bin aber
aus Verständinsgründen nicht sehr weit gekommen.
Verstehe ich zwar nicht ganz, aber um hier den Code nicht so zu zerstückeln, nochmal zusammen mit User:

Code: Alles auswählen

InitNetwork()
Global FBIP.s, uiPass.s, gSeite.s, SessionID.s
Global Zeilenumbuch.s = Chr(13)+Chr(10)

;die 3Zeilen entsprechend anpassen
FBIP = "fritz.box"
uiPass = "Passwort"
user = "Benutzer"

Procedure SeiteLaden(Seite.s)
  gSeite = ""
  If ReceiveHTTPFile("http://" + FBIP + Seite,"td.fritz")
    If ReadFile(0, "td.fritz")
      While Eof(0) = 0
        gSeite = gSeite + ReadString(0)
      Wend
      CloseFile(0)
    Else
      MessageRequester("Fehler", "Fehler beim Lesen der Daten!")
    EndIf
  Else
    MessageRequester("Fehler", "Fehler beim Laden der Seite" + Zeilenumbuch + Seite)
  EndIf
EndProcedure

Procedure.s FindeDaten(Suche.s, Stelle = 1, eSuche.s = "")
  aSuche.s = "<" + Suche + ">"
  If eSuche = "" : eSuche.s = "</" + Suche + ">" : EndIf
  PzWertA.s = StringField(gSeite, Stelle + 1, aSuche)
  ProcedureReturn StringField(PzWertA, 1, eSuche)
EndProcedure

Procedure.s fbSID()
  SeiteLaden("/login_sid.lua")
  *Buffer = AllocateMemory(200)
  PzWertC.s = FindeDaten("Challenge")
  PzWertA.s = PzWertC + "-" + uiPass
  For a = 1 To Len(PzWertA)
    PokeC(*Buffer + a + a - 2, Asc(Mid(PzWertA,a,1)))
    PokeC(*Buffer + a + a - 1, 0)
  Next
  PzWertB.s = MD5Fingerprint(*Buffer, Len(PzWertA) + Len(PzWertA))
  FreeMemory(*Buffer)
  SeiteLaden("/login_sid.lua?response=" + PzWertC + "-" + PzWertB + "&username=" + user)
  ProcedureReturn FindeDaten("SID")
EndProcedure

SessionID = fbSID
Das mit dem UTF16 kann man vernachlässigen, solange man nicht mit Sonderzeichen rumwuselt.
O_o
Antworten