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

Sehr gut.
Ich wollte schon aus $output ein array() machen, was nicht so toll war.
 
PHP:
<?php
/**
 * Fritz!Box PHP tools CLI script to enable or disable answering machines
 *
 * Must be called via a command line, shows a help message if called without any or an invalid argument
 * Can log to the console or a logfile or be silent
 * new in v0.2: Can handle remote config mode via https://example.dyndns.org
 * new in v0.3: Refactored code to match API version 0.5
 *
 * Check the config file fritzbox.conf.php!
 * 
 * @author   Gregor Nathanael Meyer <Gregor [at] der-meyer.de>
 * @license  http://creativecommons.org/licenses/by-sa/3.0/de/ Creative Commons cc-by-sa
 * @version  0.4 2013-01-02
 * @package  Fritz!Box PHP tools
 * 
 * Geändert: 19.01.2015 mit query.lua ab Firmware xxx.04.88 
 */

try
{
  // load the fritzbox_api class
  require_once('fritzbox_api.class.php');
  $fritz = new fritzbox_api();

  // init the output message
  $message = date('Y-m-d H:i') . ' ';

  // handle the CLI arguments or give a help message
  if (isset($argv[1]) && ($argv[1] == 0 || $argv[1] == 1 || $argv[1] == 2) )
  {
    $mode = (int)$argv[1];
  }
  else
  {
    if ( $fritz->config->getItem('logging') == 'console' )
    {
      echo '
  Enables or disables an answering machine (TAM) of a Fritz!Box

  Usage on UNIX systems:
    /path/to/php ' .  $argv[0] . ' {0|1} [optional: TAM]

  Usage on Windows systems:
    c:\path\to\php.exe ' .  $argv[0] . ' {0|1} [optional: TAM]

  0 disable the TAM
  1 enable the TAM

  The optional argument TAM and addresses the nth answering machine
  Defaults to 0, which is the TAM **600; 1 is the TAM **601 and so on
  
  Warning: A non existent TAM will not lead to an error message but adds a
  new TAM to the Fritz!Box, which will answer all incoming calls by default!
      ';
    }
    else
    {
      $fritz->logMessage($message . 'ERROR: Script was called without or with an invalid argument');
    }
    exit;
  }
  $tam = (isset($argv[2]) && $argv[2] >= 0 && $argv[2] <= 9) ? (int)$argv[2] : 0;

  // TAM Status mode = 2
  if ($mode == 2)
  {
  	$formfields = array(
  		'getpage' => '/query.lua',
  		'tam_'.$tam.'_Active' => 'tam:settings/TAM'.$tam.'/Active',
  		'tam_'.$tam.'_Name' => 'tam:settings/TAM'.$tam.'/Name',
  		'tam_'.$tam.'_NumNewMessages' => 'tam:settings/TAM'.$tam.'/NumNewMessages',
  		'tam_'.$tam.'_NumOldMessages' => 'tam:settings/TAM'.$tam.'/NumOldMessages'
  	);

  	$output = $fritz->doGetRequest($formfields);

  	$output_o = json_decode($output);

  	$message .= "TAM".$tam." Active: ".$output_o->{'tam_'.$tam.'_Active'}." |".
  			" Name: ".$output_o->{'tam_'.$tam.'_Name'}." |".
  			" NumNewMessages: ".$output_o->{'tam_'.$tam.'_NumNewMessages'}." |".
  			" NumOldMessages: ".$output_o->{'tam_'.$tam.'_NumOldMessages'};
  }
  else
  {

  // update the setting
  $formfields = array(
  	'tam:settings/TAM'.$tam .'/Active' => $mode
  );

  $dummy = $fritz->doPostForm($formfields);

  // check if the update succeded
  $formfields = array(
  	'getpage' => '/query.lua',
  	'tam_'.$tam => 'tam:settings/TAM'.$tam.'/Active'
  );

  $output = $fritz->doGetRequest($formfields);
  
  preg_match('@"tam_' . $tam . '": "([10])"@i', $output, $matches);

  if (isset($matches[1]) && $matches[1] == $mode)
  {
    $message .= $mode == 1 ? 'TAM' . $tam . ' enabled' : 'TAM' . $tam . ' disabled';
  }
  else if (isset($matches[1]))
  {
    $message .= 'ERROR: TAM' . $tam . ' status change failed, should be ' . $mode . ', but is ' . $matches[1];
  }
  else
  {
    $message .= 'NOTICE: TAM' . $tam . ' status change could have failed, should be ' . $mode . ' now, but I don\'t now if it actually is. Check your check section in the script.';
  }
  } // Status
}
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

?>

Status mit fritzbox_tam_on_off.php 2 wenn's OK ist mit der Anzeige
ansonsten kannst du es ja Anpassen.

geändert
PHP:
  	$message .= "TAM".$tam." Active: ".$output_o->{'tam_'.$tam.'_Active'}." |".
  	"TAM".$tam." Name: ".$output_o->{'tam_'.$tam.'_Name'}." |".
  	"TAM".$tam." NumNewMessages: ".$output_o->{'tam_'.$tam.'_NumNewMessages'}." |".
  	"TAM".$tam." NumOldMessages: ".$output_o->{'tam_'.$tam.'_NumOldMessages'};
in
PHP:
  	$message .= "TAM".$tam." Active: ".$output_o->{'tam_'.$tam.'_Active'}." |".
  			" Name: ".$output_o->{'tam_'.$tam.'_Name'}." |".
  			" NumNewMessages: ".$output_o->{'tam_'.$tam.'_NumNewMessages'}." |".
  			" NumOldMessages: ".$output_o->{'tam_'.$tam.'_NumOldMessages'};
sollte besser passen.


Hier: fritzbox_api_php_v0.5.0b7_21012015.zip per Anhang

Dateien Geändert: 21.01.2015

fritzbox_user.conf.php
fritzbox_api.class.php
fritzbox_tam_on_off.php
fritzbox_phonebook_import.php
fritzbox_phonebook_export.php
example_pb.xml

im Ordner fritzbox_api_php_v0.5.0b7_21012015


fritzbox_phonebook_import.php --overwrite <--Upload
fritzbox_phonebook_export.php <--Download

Kleine Änderung hier:
fritzbox_phonebook_export.php 0 <--Download
die PhonebookId Optional als Parameter beim Aufruf mit Uebergeben

Übernommen und Angepasst von hier: carlos22/fritzbox_api_php

Gruß Erwin ;)
 

Anhänge

  • fritzbox_api_php_v0.5.0b7_21012015.zip
    25.6 KB · Aufrufe: 213
Zuletzt bearbeitet:
Hallo

ich versuch das jetzt schon seit stunden, ich hab zwei Fritzboxen in meinem Netzwerk eine ältere und eine neuere (7360)

bei der älteren klappts kann ich rebooten, aber bei der neueren welche ich eigentlich steuern wollte bekomm ich immer wieder die Fehlermeldung:

php fritzbox_reboot.php
PHP Warning: simplexml_load_string(): Entity: line 1: parser error : AttValue: " or ' expected in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): <META HTTP-EQUIV=Refresh CONTENT="0; URL=/login.lua?requestedpage=../html/login_ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): ^ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): Entity: line 1: parser error : attributes construct error in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): <META HTTP-EQUIV=Refresh CONTENT="0; URL=/login.lua?requestedpage=../html/login_ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): ^ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): Entity: line 1: parser error : Couldn't find end of Start Tag META line 1 in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): <META HTTP-EQUIV=Refresh CONTENT="0; URL=/login.lua?requestedpage=../html/login_ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): ^ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): Entity: line 1: parser error : Extra content at the end of the document in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): <META HTTP-EQUIV=Refresh CONTENT="0; URL=/login.lua?requestedpage=../html/login_ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Warning: simplexml_load_string(): ^ in /opt/FritzBox/lib/fritzbox_api.class.php on line 338
PHP Notice: Trying to get property of non-object in /opt/FritzBox/lib/fritzbox_api.class.php on line 341
PHP Notice: Trying to get property of non-object in /opt/FritzBox/lib/fritzbox_api.class.php on line 349
ERROR: ERROR: Login failed with an unknown response

an was liegt das muss ich noch was am Login ändern?

schon mal danke....
 
Hab´s gefunden man sollte eben immer die neueste Version verwenden.......

klappt wunderbar!!
 
gibts eine Möglichkeit die Fritzbox neu zu starten?
ich hab das Problem das manchmal mein Download etwas schlechter ist, in diesem Fall hilft kein neu verbinden aber ein reboot, jetzt wollte ich das mit Speedtest prüfen und bei bedarf die Fritzbox rebooten .....
 
OK klappt auch mit Fritz!Box Neustart: #990*15901590*

:) toll so eine Fritzbox
 
Hallo nochmal...

ich hab eine Fritzbox 7362sl OS06.20
und leider kann ich das GastWlan nicht an und abschalten
wenn ich es anschalte klappt das aber es wird immer auf ungesichert gesetzt und abschalten geht gar nicht mit dem script, hat jemand so ein ähnliches Problem?

kann mir jemand helfen?
wäre schon Toll wenn ich das Gast Wlan steuern könnte ...


schon mal Danke
 
Dieser Post könnte dir vielleicht helfen ....
 
Moin

Na, dann bin ich ja mal gespannt, welcher Link noch in 5-15 Jahren funktioniert.
:rolleyes:
 
ich bekommen es nicht zum laufen :-(

Ich habe ein sehr merkwürdiges Problem: Er scheint bei mir die Settings aus fritzbox_user.conf.php nicht richtig zu lesen.

Ich habe 2 Fritzboxen im Netz, eine ziemlich verrammelte 6360 (Kabel) von UnityMedia und eine völlig offene 7390, auf der FHEM läuft (von dem ich letztlich die 6360 steuern möchte).
Um anfangs erstmal zu testen, liegen die php-Dateien alle auf meinem iMac (OSX 10.10.2). In "fritzbox_user.conf.php" habe ich alles soweit eingetragen, zunächst mit Ziel auf die 6360. Beim Versuch im OSX-Terminal "php ./fritzbox_diverity0on" aufzurufen, bekomme ich allerdings immer die Fehlermeldung:
Code:
ERROR: Login failed with an unknown response.
Auf der 6360 steht dann im System-Log
Code:
Anmeldung des Benutzers admin an der FRITZ!Box Benutzeroberfläche von IP-Adresse [I](meine IPv6-Adresse)[/I] gescheitert (falsches Kennwort).

Dann habe ich einen zweiten Fritzbox-User mit Mega-Einfachst-Passwort angelegt, um Sonderzeichen-Probleme auszuschließen, aber der gleiche Fehler.
Also hab ich mir gedacht, probierste mal die 7390 aus und hab die in die "fritzbox_user.conf.php" eingetragen. Doch die Fehlermeldung im Terminal bleibt die selbe. Allerdings fanden sich im Log der 7390 keinerlei Einträge :shock: Dafür aber im Log der 6390!!! Wie kann das denn sein???

Ich habe auch das Terminal geschlossen und wieder geöffnet, habe die Fritzbox neu gestartet und jetzt bin ich mit meinem Latein ziemlich am Ende!
Vielleicht ist es nur ein dummer Anfänger-Fehler... aber irgendwie bräucht ich mal einen schlauen Hinweis...

Vielen Dank im Voraus!
 
Versuch es mal über die IPv4-Adresse (der Name wird dann nicht gehen, da er über IPv6 aufgelöst wird)
 
Also, du meinst in fritzbox_user.conf.php nur die IP (v4) Adresse korrekt setzen und den Namen auf irgendwas abstruses?
Das habe ich auch probiert, hat aber nichts geändert.
 
Abend

Im LAN brauchst du diese Einstellungen für Fritz!Box Benutzer/Passwort.
...und nicht alles auf einmal.
 
DANKE!!!

Das war der entscheidende Link!

Mein Fehler war ein fundamentales Missverständnis über wie man in PHP Werte setzt.
Es ist:
Code:
$this->config->setItem('NAME_des_Parameters', 'WERT_des_Parameters');

Ursache der Konfusion waren die Beispielwerte in der Standard user.conf Dort stand ...setItem('passwort', 'false')... was mich zu der Annahme verleitete, dass 'passwort' durch mein Passwort ersetzt werden muss....

Also, eine typische :newbie: - Sache!

Nochmal Danke für den Hinweis! :bier:
 
Kleiner Hinweis: In der aktuellen c't 06/2016 ist ein sehr spannender Artikel über die Steuerung der Fritz!Box via TR-64 (standardisierte SOAP-API). Wenn sich ein Problem darüber lösen lässt, sollte man diesen Weg auf jeden Fall bevorzugen. SOAP mit PHP macht so mittel Spaß, daher ist es vielleicht. Keine dumme Idee den Ball flach zu halten und das so hämdsärmelig zu imppementieren, wie die Beispiele in PoweShell aus dem Artikel das vor machen. Also das XML von Hand bauen und gut ist.

http://www.heise.de/ct/ausgabe/2015-6-Fritzbox-per-Skript-fernsteuern-2550325.html

Eine andere spannende Alternative zu dieser PHP-API hier ist übrigens PhantomJS, das hatte ich bereits erwähnt. Vielleicht mehr was für die Hipster unter Euch. Einfacher wird der Umgang übrigens mit dem Wrapper http://www.nightmarejs.org/
 
Fritz!Box Reboot bei neueren Firmwares 6.x

ich versuch das jetzt schon seit stunden, ich hab zwei Fritzboxen in meinem Netzwerk eine ältere und eine neuere (7360)
bei der älteren klappts kann ich rebooten, aber bei der neueren welche ich eigentlich steuern wollte bekomm ich immer wieder die Fehlermeldung:
Für alle die ein Shell-Script suchen welches dies erfolgreich macht sei ins Administrator.de Forum verwiesen:
Fritz!Box Reboot "ohne" Telnet mit Bash Shell-Script (für aktuelle Firmware-Versionen 6.x)

Die letzte Zeile des Skripts ist die zielführende für den Reboot die man sonst nirgendwo im Web findet.

Gruß
 
Zuletzt bearbeitet:
Abend

Klar wenn du eine sid= hast die gerade gültig ist.
Die _SID holen ist der 2. curl Aufruf in Zeile 8, das braucht: ${_CHALLENGE}
Das 1. curl wird für die _CHALLENGE ausgeführt (Zeile 5).
Das dritte curl, das GET, wird mit dem Ergebnis des 2. curl Aufrufs (_SID) als Paramter ausgeführt.
 
Abend

Klar wenn du eine sid= hast die gerade gültig ist.
Die _SID holen ist der 2. curl Aufruf in Zeile 8, das braucht: ${_CHALLENGE}
Das 1. curl wird für die _CHALLENGE ausgeführt (Zeile 5).
Das dritte curl, das GET, wird mit dem Ergebnis des 2. curl Aufrufs (_SID) als Paramter ausgeführt.

Das weis ich selber, ich habe ja nur dem User der das Problem hatte geantwortet, und hatte keine Frage !

Lösungen für einen direkten Reboot via URL-Aufruf gibts ja für die neueren Firmwares im Netz bislang noch nicht, deswegen die Verlinkung auf den Beitrag, welcher das zuverlässig ermöglicht !
 
Zuletzt bearbeitet:
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.