Fritz!Box API für PHP (inkl. Login-Sessions)

Ich habe mal schnell geguckt: Bei einem Klick auf den "Computer starten" Button werden folgende Parameter per POST an das Script /net/edit_device.lua geschickt:

plc_desc: Beschreibung des Computers
dev_name: Name des Computers
btn_wake: Senden
back_to_page: /net/network_user_devices.lua
dev: landevice1448

Das ließe sich einfach mit der API umsetzen. Wenn jemand Lust hat, bitte, ich habe gerade keinen Kopf dafür: Einloggen und ein Request mit den obigen Parametern absetzen ist nicht viel Zauberei, wenn man die Beispielscripte modifiziert. Die Frage ist, ob die ID im Feld dev immer gleich bleibt oder sich gelegentlich auch mal ändert. Falls die gleich bleibt, ist die Sache wirklich kein Ding. Ansonsten muss man erst anhand des Namens diese ID herausfinden. Das wäre dann ein Request mehr.
 
Erstmal Danke an Gregor fürs Schreiben der Klasse. Ich lese aktuell ziemlich umständlich den AB aus, indem ich den Inhalt von /Mass-StorageDevice-01/FRITZ/voicebox/meta0 auslese und pharse. Da ich es nicht schaffe, daraus die Zeit des Anrufs zu extrahieren, lese ich diese per ftp_mdtm aus. Nicht schön...

Habe gerade mal die Klasse und das Script get_foncalls_list ausprobiert. Leider erhalte ich einen Fehler "Login failed with an unknown response". Nutze die Laborversion 5.29-24099 auf einer 7270, woran es vermutlich liegt. Auf meiner 3270 klappt der Login, aber da ist kein AB Telefonteil drin.

Gibt es schon ein Update der Klasse?

Ich habe im Flur ein iPad als Infopanel zu hängen, mit dem ich diverse Sachen anzeige.
 
Hmm, würde mich wundern, wenn AVM den komischen Login-Mechanismus einfach so ändert, aber wer weiß.

Ich habe leider keine 7270 mit Labor-Firmware zur Hand, deswegen kann ich das nicht selber testen, aber Du kannst mal etwas ausprobieren: Die Fehlermeldung ist eine Exception, die in Zeile 255 der fritzbox_api.class.php geworfen wird. Das passiert, wenn die Antwort der Box nach dem Login keine mit folgendem regulären Ausdruck verwertbare SID zurückgibt:
Code:
@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i
Du kannst mal testweise statt des Fehlertextes den Inhalt der Variablen $output auswerfen und Dir anschauen, ob die SID da anderswo ausgegeben wird bzw. was da generell von der Box zurückkommt. Das kannst Du auch gerne hier als Anhang posten, dann kann ich da mal reinschauen.

Liebe Grüße,
Gregor
 
Hi Gregor,

es kommt folgender Redirect zurück:

<META HTTP-EQUIV=Refresh CONTENT="0; URL=/login.lua?requestedpage=../html/de/menus/menu2.html">

Also nix mit SID :-|
 
Der User Pikachu hat das Problem freundlicherweise bereits gelöst und mir eine angepasste SID-Extrahierungs-Methode zur Verfügung gestellt. Ich werde die in den nächsten Tagen in die API integrieren, so dass man auswählen kann, ob man eine Box mit der alten oder der neuen Liginmethode hat. AVM hat tatsächlich den Login auf ein lua-Script umgestellt, was an sich eine gute Nachricht ist.
 
Klingt gut! Dann warte ich mal auf's Update. Denke, dann kann ich einige Funktionen mehr in meine Übersicht einbauen.
 
Hallo,

Meinst du das hier: fritzbox_api.class.php
sollte da ein Fehler drin sein dann Editiere ihn Bitte auf github

Gruß Erwin ;)
 
Oh, ein Fork auf Github. Gute Idee an sich.

Ich habe unabhängig davon mal eine neue Version gebaut und bei der Gelegenheit den Code an einigen Stellen mächtig umgebaut. Nachteil: Die Scripte müssen leicht angepasst werden. Vorteil: Die mitgelieferten Scripte habe ich schon angepasst und jetzt ist die Konfiguration deutlich sauberer gelöst.

Hauptneuerung ist aber, dass der neue .lua-Login funktioniert. Ich habe das etwas anders gelöst, als Pikachu, so dass man das bei mir über die Eigenschaft use_lua_login_method konfigurieren muss. Vorteil ist, dass nicht bei jedem Aufruf erst mal die alte Methode ausprobiert und im Fehlerfall die neue nachgeschoben wird. Das kommt mir langfristig eher unsinnig vor.

Die neue Konfiguration liegt jetzt in der Datei fritzbox_user.conf.php, so dass Eure alten Konfigurationen nicht überschrieben werden (aber freilich ignoriert). Es gibt auch eine Standardkonfiguration (fritz.box ohne Passwort, console-Logging), so dass man die fritzbox_user.conf.php auch leer lassen oder löschen könnte, wenn man wollte.

Wer Lust hat, kann ja mal testen. Ich habe jetzt auf meiner Box die neue Labor-Firmware, damit funktioniert der Login. Der alte Login hat vor dem Update auch noch funktioniert, den kann ich jetzt aber nicht mehr so einfach testen.

Also wie gehabt: Aktuelle Version immer im ersten Post und hier: 0.5.0b2, alles beta, bitte erst mal testen.
 

Anhänge

  • fritzbox_api_php_v0.5.0b2.zip
    13.8 KB · Aufrufe: 99
Zuletzt bearbeitet:
Habe gerade die 0.5.0b2 heruntergeladen und der Login scheint korrekt zu funktionieren.
Leider speichert er mir nur eine leere xml Datei ab, wenn ich die foncallslist aufrufe :-(
Da ein/ausschalten des Gäste WLANs funktioniert, scheint es eher am Auslesescript zu liegen.

Ach ja: Eigentlich will ich auch die Anrufbeantworterliste auslesen. Die Seite wäre dann /fon_devices/tam_list.lua und die kann ich auch auslesen. Gibt's davon auch eine XML Version?
 
Zuletzt bearbeitet:
Ja, das ist offenbar neu geregelt, muss ich mir die Tage mal anschauen und das Script anpassen.
 
So, hatte doch jetzt schon kurz Zeit: In der Tat hat sich das Format grundlegend geändert, eine XML-Datei scheint die Box nicht mehr auszuspucken, stattdessen kommt eine .csv-Datei. Habe das Script entsprechend angepasst und für ältere Firmwares das alte Script umbenannt in fritzbox_get_foncallslist_xml.php. Unter http://<FritzBoxIP>/fon_num/foncalls_list.lua?sid=<SIDID>&xml= kommt übrigens der HTML-Code des Webinterfaces, das ist also keine Option. Version 0.5.0.b3 anbei.
 

Anhänge

  • fritzbox_api_php_v0.5.0b3.zip
    14.9 KB · Aufrufe: 59
Mangels XML Datei hatte ich halt den HTML Code geparsed. Geht auch. Mit der 0.5.0b3 stelle ich dann wohl auf CSV um. Ist sicherlich zukunftssicherer.

Lokal funktioniert nun alles. Wenn ich es aber per remote_config versuche, erhalte ich einen 'ERROR: Remote config mode enabled, but no username or no password provided'. Beide sind aber in meiner fritzbox_api.class definiert?! Die Box ist für den Fernzugriff geöffnet und auf dyndns.org angemeldet.

Ansonsten mal ein Screenshot, wie das bei mir aussieht, damit Du mal weißt, wofür die api eingesetzt wird.

screen.jpg
 
Kleiner Tippfehler, Zeile 80 in der fritzbox_api.class.php, statt

if ( !$this->config->getItem('remote_config_user') || $this->config->getItem('remote_config_password') )

sollte es

if ( !$this->config->getItem('remote_config_user') || !$this->config->getItem('remote_config_password') )

heißen. Danke fürs Testen. Habe eine gefixte 0.5.0b4 hochgeladen.

Hat jemand schon mal mit dem neuen Fritz!OS rumprobiert. WÜrde mich wundern, wenn die von der Labor-Firmware abweichen würde, aber wer weiß. Eine flexible Anrufbeantworter-Schalterei ist ja nun endlich ins Fritz!OS eingebaut worden, das war der ursprüngliche Auslöser für meine diese API.
 

Anhänge

  • fritzbox_api_php_v0.5.0b4.zip
    15 KB · Aufrufe: 29
Danke. Jetzt bekomme ich diesen Fehler nicht mehr, aber einen

Notice: Trying to get property of non-object in fritzbox_api.class.php on line 208
Notice: Trying to get property of non-object in fritzbox_api.class.php on line 210
 
Posting 1:
Wie unerfreulich: Auch der Login für die Fernwartung ist komplett anders, also wirklich komplett anders, da muss ich einiges umbauen. Das ganze basiert jetzt ja auf der Benutzerverwaltung der Box und auch mit einem .lua Login Script. Das Problem wird sein, dass nicht alle eine neue Firmware haben und ich die ein oder andere Abfrage in die API einbauen muss, dass beides geht. Ich werde mich die Tage darum kümmern.
Posting 2:
So, war gar nicht so schlimm, AVM hat das immens vereinfacht. Ich hoffe aber, die alte Variante geht jetzt noch. Anbei Version 0.5.0b5 mit funktionierendem Remotezugriff. Ach ja, nicht vergessen, in der Box einen User mit entsprechenden Rechten zu erstellen.

Ach ja, danke fürs Testen an die Betatester. :)
Posting 3:
Sind jetzt doch nur wenige Zeilen Unterschied geworden, die neue Methode funktioniert exakt wie der interne Login, so muss ich nur ein paar Extrazeilen für den alten Fernwartungsmodus drin behalten.
 

Anhänge

  • fritzbox_api_php_v0.5.0b5.zip
    15.5 KB · Aufrufe: 44
Zuletzt bearbeitet von einem Moderator:
Mit diesem Script kann ich die Anruferliste der Fritzbox (7320) auslesen ohne diese zu Manipulieren und muß dazu nur die Nutzerdaten im Script editieren, Sorry für diese Anfängerfrage, aber hab schon die ganze Zeit gesucht und nur Callmonitor über Freetz gefunden!
 
Im Grunde ja. Wie das geht, steht auch in der mitgelieferten README. Wichtig ist, dass Du das richtige Script nimmst: Für ältere Firmwares die XML-Variante und für neuere (Fritz!OS 5.50) die normale Variante, wo eine CSV-Datei herausfällt. Die Einstellungen editierst Du in der Konfigurationsdatei fritzbox_user.conf.php.
 
Habe die Fritz!Box 7320 mit Fritz!OS 5.50 von 1&1 und die PHP Dateien liegen auf einem Webserver in einem Verzeichnis.
Nun habe ich die fritzbox_user.conf wie folgt angepasst:


<?php
if ( !isset($this->config) )
{
die(__FILE__ . ' must not be called directly');
}
####################### central API config ########################
# notice: you only have to set values differing from the defaults #
###################################################################
# use the new .lua login method in current (end 2012) labor and newer firmwares
$this->config->setItem('use_lua_login_method', true);
# set to your Fritz!Box IP address or DNS name (defaults to fritz.box), for remote config mode, use the dyndns-name like example.dyndns.org
$this->config->setItem('192.168. 178.1', 'fritz.box');
# if needed, enable remote config here
#$this->config->setItem('enable_remote_config', true);
#$this->config->setItem('remote_config_user', 'test');
#$this->config->setItem('remote_config_password', 'test123molbl31');
# set to your Fritz!Box password (defaults to no password, will be ignored, when remote config is enabled)
$this->config->setItem('*****', false);
# set the logging mechanism (defaults to console logging)
$this->config->setItem('logging', 'console'); // output to the console
#$this->setItem('logging', 'silent'); // do not output anything, be careful with this logging mode
#$this->setItem('logging', 'tam.log'); // the path to a writeable logfile
# the newline character for the logfile (does not need to be changed in most cases)
$this->config->setItem('newline', (PHP_OS == 'WINNT') ? "\r\n" : "\n");

############## module specific config ###############
# set the path for the call list for the foncalls module
$this->config->setItem('/html/de/home/foncallsdaten.csv');

Hier muß ich doch bestimmt noch etwas aufüllen, bzw stimmt der Pfad (wenn nicht, wie bekomme ich den raus) und die IP (wenn nicht, ebenfalls: Wie bekomme ich die raus?)!?!

Nun rufe ich einfach die "fritzbox_get_foncallslist_xml.php" auf und bekomme dann folgende Meldung:

Response of initialization call /login_sid.lua in initSID was not xml-formatted.

Wäre Euch dankbar für hilfe auch wenn´s für Euch sicher Lächerlich ist!
 
Praktischerweise hast Du Deine Fehler bereits farblich markiert:

statt
$this->config->setItem('192.168. 178.1', 'fritz.box');
und
$this->config->setItem('*****', false);
und
$this->config->setItem('/html/de/home/foncallsdaten.csv');

Muss es so lauten:

$this->config->setItem('fritzbox_ip', '192.168. 178.1');
und
$this->config->setItem('password', '*****');
und
$this->config->setItem('foncallslist_path', '/html/de/home/foncallsdaten.csv');

Die Methode setItem() des Config-Objekts erwartet zwei Parameter: Erst die zu setzende Eigenschaft und dann den zu setzenden Wert.

Liebe Grüße,
Gregor
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.