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

Hallo fidodido,

was mir als erstes aufgefallen ist: Du solltest die Übergabeparameter nicht so beschränken. Das zweite DECT-Telefon ist zum Beispiel die 61, das würde bei Dir nicht angenommen werden.

Die RegEx für das Auslesen des aktuell eingestellten Ports lautet
Code:
option\s+selected\s+value="(\d+)"
, die für den Haken
Code:
option\s+selected\s+value="(\d+)"
. Insgesamt lautet der Code fürs Auslesen der Felder also:

Code:
// read clicktodial setting (checkbox; value: "on" or "")
preg_match('@input\s+(checked)?.*?name="clicktodial"@s', $output, $matches);
$formfields['clicktodial'] = isset($matches[1]) ? 'on' : '';

// read port setting (selectbox)
preg_match('@option\s+selected\s+value="(\d+)"@s', $output, $matches); // simple regex, assuming that no other selectbox is on the page
$formfields['port'] = isset($matches[1]) ? $matches[1] : '';

Wenn man Schwierigkeiten mit den Regulären Ausdrücken hat: Quelltext kopieren (Vorsicht, nicht aus den Entwicklertools, sondern über Quelltext anzeigen, sonst bekommt man vom Browser reparierten Quelltext zu sehen) und z.B. in http://gskinner.com/RegExr/ einkopieren. Da kann man dann so lange rumspielen, bis es passt. Die Sache mit \s+ statt einem Leerzeichen sieht man zum Beispel nur, wenn man den richtigen Quelltext nimmt (AVM hat da gerne mal zwei Leerzeichen statt einem zwischen den HTML-Attributen). Chrome zum Beispiel bügeld das raus, wenn man den Code aus dem Webinspector kopiert. Der macht auch zum Beispiel aus checked ein checked="". Das war aber nicht Dein Problem, Du hattest in erster Linie die Attribute in der falschen Reihenfolge erwartet.

Ich denke, das bringt Dich weiter.
 
Hey, vielen Dank spackmat!

Also doch das regex - Zeugs! ;o) Hatte schon mit "RegexCoach" getüftelt, aber natürlich erst wenig verstanden. Deine Tipps bringen mich definitiv weiter.
Das mit der Einschränkung werde ich ändern. Das war mal ein Versuch, ob das so geht... ;o)

Also nochmals vielen Dank und viele Grüße!

Frank
 
Hallo Leute,
erst einmal ein dickes Lob & Danke an alle, die an der Entwicklung der API beteiligt waren!

Ich habe die 6360 mit der FW 5.28.
Habe ich das richtig verstanden, das die 'fritzbox_get_foncallslist_xml' nicht mehr (bei den 'neueren' FWs) unterstützt wird?
Bekomme es mit meiner FB nicht mehr hin...


MFG, Christof
 
Schau am besten mal, in welchem Format die Anrufliste aus der Weboberfläche kommt. Ist es eine XML-Datei, benutze die fritzbox_get_foncallslist_xml.php, ist es eine CSV-Datei (neuere Firmwares), benutze die fritzbox_get_foncallslist.php. Beide laden die Liste aus dem Webinterface im jeweils abgegebenen Format herunter, eine Konvertierung findet nicht statt, deswegen muss das Script zur Firmware passen.

Liebe Grüße,
spackmat
 
Hi spackmat,

erstmal "Danke" für die Bereitstellung deiner API.
Hab mir ein kleines Skript gemacht, sodass ich auch bei der neuen Firmware eine XML-Anrufliste herausbekomme. Finde ich persönlich schöner, da auch gleich der Pfad zur AB-Nachricht bzw. zum Fax mit angegeben ist.
AB-Nachrichten kann ich löschen, jedoch hapert es am Löschen von Faxen, da diese nicht im WI gelöscht werden können, sondern man die Fax-PDF löschen muss.
Ich wollte dies über die Fritz!NAS Oberfläche machen, habe auch analysiert, was die Oberfläche per POST beim Löschen weitergibt und es mittels deiner API genauso implementiert. Dies klappt jedoch nicht. Hast du vielleicht eine Idee, wie ich die Fax-File am einfachsten löschen kann bzw. was ich falsche mache? Muss man vielleicht Fritz!NAS zunächst aufrufen, zwecks Indexierung, bevor man eine Datei löschen will?!

Danke und Grüße
 
Hallo nfinity,

ich bin gerade sehr eingespannt und danach im Urlaub. Vielleicht hat ja jemand anderes eine Idee? Ich vermute mal auf die Schnelle, ohne das jetzt gesehen zu haben, dass man erst die Seite laden muss, um eine ID oder einen Dateinamen für das zu löschende Fax in die Finger zu bekommen. Ob man dazu Fritz!NAS aufrufen muss? Glaube ich eher nicht. Habe aber auch die Faxfunktion noch nie benutzt, faxen hat bei mir leider nie funktioniert.
 
Hallo
Ich habe die Fritzbox 7270 mit FRITZ!OS 05.50. , und die fritzbox_api_php_v0.5.0b7
In der fritzbox_user.conf.php habe ich unter
$this->config->setItem('fritzbox_ip', '192.168.2.1');
$this->config->setItem('username', 'Fritz');
$this->config->setItem('password', 'xxxxxxx');
eingetragen.
Rufe ich nun fritzbox_ring_phone.php auf, dann bekomme ich als Antwort:
2013-04-23 18:11 ERROR: Login failed with an unknown response.
Rufe ich fritzbox_get_foncallslist.php auf bekomme ich auch
ERROR: Login failed with an unknown response.
Mit dem angegebenen usernamen undpassword kann ich mich auf der FB anmelden.

Was habe ich vergessen oder läuft hier schief.
Gruß NetFritz
 
Moin,

hast Du $this->config->setItem('use_lua_login_method', true); gesetzt? Falls ja und es trotzdem nicht geht und die Zugangsdaten auf jeden Fall stimmen, solltest Du Dir mal den Inhalt von $session_status_simplexml mit var_dump($session_status_simplexml); ausgeben lassen, in der fritzbox_api.class.php in Zeile 287 (also statt des Aufrufs vor $this->error.

Viel Erfolg.
 
Hallo
Bekomme als Ausgabe
object(SimpleXMLElement)#6 (4) { ["SID"]=> string(16) "0000000000000000" ["Challenge"]=> string(8) "359859e7" ["BlockTime"]=> string(3) "108" ["Rights"]=> object(SimpleXMLElement)#3 (0) { } } 2013-04-23 21:12 Mandatory config Item foncallslist_path not set.
Gruß NetFritz
 
Hallo
Was wird denn hier bei einem Linux Debian eingetragen ?
$this->config->setItem('newline', (PHP_OS == 'WINNT') ? "\r\n" : "\n");

Gruß NetFritz
 
["SID"]=> string(16) "0000000000000000" bedeutet, dass Du nicht eingeloggt bist, aber immerhin eine gültige XML-Datei zurückgekommen ist (die Fritz!Box antwortet also immerhin).

["BlockTime"]=> string(3) "108" ist interessant. Kann es sein, dass die Box noch 108 Sekunden wegen zu vieler Fehlversuche blockt oder so? Habe die noch nie gesehen. Das würde auf falsche Benutzerdaten hindeuten.

"Mandatory config Item foncallslist_path not set." bekommt man weg, wenn man das Config-Item setzt. Ich vermute eher nicht, dass das das Problem ist, aber wer weiß.

Newline muss man normalerweise nicht selber setzen. Für Debian ist \n richtig, aber das macht die Zeile schon von alleine. Die gibt es nur, wenn man da abweichendes braucht (für die Logdatei). Manchmal möchte man Unix-Style Logdateien haben, auch wenn man das Script unter Windows laufen lässt.
 
Hallo
Hier mal die Ausgabe von fritzbox_ring_phone.php

object(SimpleXMLElement)#6 (4) { ["SID"]=> string(16) "0000000000000000" ["Challenge"]=> string(8) "173de76f" ["BlockTime"]=> string(2) "10" ["Rights"]=> object(SimpleXMLElement)#3 (0) { } } 2013-04-24 17:25 Phone **2 ringed.

In ["BlockTime"]=> string(2) "10" steht immer was drin, auch Heute Morgen nach dem aufstehen.

Habe auch schon mal mir einem neuen usernamen und password versucht kein Erfolg.

Hier nochmal die Daten der FRITZ!Box Fon WLAN 7270 v2 FRITZ!OS 05.50 Firmware-Version: 54.05.50

Kann mal jemand seine config Posten ?

Gruß NetFritz
 
Habe mal eben bei mir getestet, da steht die BlockTime auf 0.

Meine (um inaktive Einträge bereinigte) Config für eine 7390 mit Fritz!OS 5.50 und aktivierter Mehrbenutzerunterstützung:

Code:
$this->config->setItem('use_lua_login_method', true);
$this->config->setItem('fritzbox_ip', 'fritz.box');
$this->config->setItem('username', 'USERNAME');
$this->config->setItem('password', 'PASSWORT');
$this->config->setItem('logging', 'console');
$this->config->setItem('foncallslist_path', __DIR__ . '\foncallsdaten.csv');

Wenn Man beim Login nicht nach einem Benutzer gefragt wird, hat man die Mehrbenutzerunterstützung der Box nicht aktiviert, dann muss man den username auf false (ohne Anführunszeichen) setzen.
 
Hallo
Fehler gefunden.
Liegt an meiner PHP-Version 5.2.6-1+lenny16
Auf den Raspberry pi mit PHP Version 5.4.4-14 läuft es nach apt-get install php5-curl.
Gruß NetFritz

PS
Nach dem ich nochmal die aktuelle Version aus dem Anfangs-Thread installiert habe läuft es auch auf dem Rechner
mit der PHP-Version 5.2.6-1+lenny16
.
 
Zuletzt bearbeitet:
Ah, klar. Das Script braucht eigentlich mindestens PHP 5.3 und cURL, das hätte ich mal deutlicher in die README schreiben sollen.
 
reboot problem

Ich hab da ein kleines Problem:

Folgendes Script rebootet (mit aktueller API) eine 7390 mit OS 5.22 aber nicht mit OS 5.50

Ich kann trotz längeren Suchen nicht rausfinden wo es klemmt...kann mir jemand helfen?

Code:
<?php
// init the output message
$message = date('Y-m-d H:i') . ' ';
try
{ 
  // load the fritzbox_api class
  require_once(__DIR__ . '/fritzbox_api.class.php');
  $fritz = new fritzbox_api();
  
  $formfields = array(
    'getpage' => '/system/reboot.lua',
  );
  $output = $fritz->doGetRequest($formfields);
  $formfields['reboot'] = '';
  $output = $fritz->doPostForm($formfields);
  
  $message .= 'Done';
}

catch (Exception $e)
{
  $message .= $e->getMessage();
}

// log the result
if ( isset($fritz) && is_object($fritz) && get_class($fritz) == 'fritzbox_api' )
{
  $fritz->logMessage($message);
}
else
{
  echo($message);
}
$fritz = null; // destroy the object to log out
?>
 
Hmm, schwierig. Erst mal: Das passiert im Browser, wenn man auf den Button "Neu starten" klickt:

Code:
Request URL: http://fritz.box/system/reboot.lua
Request Method: POST
Status Code: 303 See Other

Request Header
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 28
Content-Type: application/x-www-form-urlencoded
Host: fritz.box
Origin: http://fritz.box
Referer: http://fritz.box/system/reboot.lua?sid=f4393ea3f9bbf6b4
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31

Form Data
sid: f4393ea3f9bbf6b4
reboot:

Response Headers
Content-Length: 0
Location: http://fritz.box/reboot.lua?sid=f4393ea3f9bbf6b4



Request URL: http://fritz.box/reboot.lua?sid=f4393ea3f9bbf6b4
Request Method: GET
Status Code: 200 OK

Request Headers
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control: max-age=0
Connection: keep-alive
Host: fritz.box
Referer: http://fritz.box/system/reboot.lua?sid=f4393ea3f9bbf6b4
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31

Query String Parameters
sid: f4393ea3f9bbf6b4

Response Headers
Cache-Control: no-cache
Content-type: text/html; charset=utf-8
Expires: -1
Pragma: no-cache


Wir sehen also erst mal, dass die sid beim ersten POST-Request als POST-Field übertragen wird (warum auch immer), also rein damit. Nach
PHP:
$formfields['reboot'] = '';
kommt noch ein
PHP:
$formfields['sid'] = $fritz->getSID();

Soweit so gut, doch die Bude geht immer noch nicht. Da hier ein Redirect gemacht wird und der ggf. wichtig ist, habe ich in der API bei doPostForm noch mal testhalber die CURL-Anweisungen zum verfolgen von Redirects eingefügt:
PHP:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);

Leider reicht auch das nicht und jetzt bin ich ratlos. Das Webinterface macht offenbar noch irgendeinen anderen Check. Wenn Du Dir also die Mühe machen willst, experimentiere mal einfach mit diesen beiden Requests herum. Am besten kopierst Du Dir dazu die doPostForm-Methode aus der API in Dein Script, schmeißt die legacy-Sachen raus und hatkodierst so lange alles, was auf $this zugreift. Dann hast Du einen übersichtlichen POST-Request und kannst an den CURL-Sachen drehen.

Liebe Grüße und viel Erfolg,
Gregor
 
Danke...ich vermute dass das was mit ajax zu tun hat, denn weiter unten stehe im code:

ajaxGet("/reboot.lua?sid=ca0d789ffa199126&ajax=1", callback_state);

aber das hat auch nichts gebracht....ich bin ratlos...habe auch schon das probiert was du versucht hast, habe extra eine eigene function gebaut um das reboot abzusetzten...also manchmal könnte ich avm...
 
Die AJAX-Sache dient vermutlich nur der Abfrage, ob die Box schon wieder da ist, damit man zum Login fortschreiten kann.

Weitere Ansatzpunkte: Vielleicht will die Box beim ersten Request schon den Referer haben? Vielleicht sollte man den Content-Type auf application/x-www-form-urlencoded setzen (cURL lässt bei POST das standardmäßig x- weg)? Vielleicht sollte man schauen, was nach dem POST-Request an Headern und/oder Content zurück kommt.

So oder so, irgendwas hat AVM da reingetrickst.
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
245,301
Beiträge
2,228,753
Mitglieder
372,222
Neuestes Mitglied
A_K
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.