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

So gelöst und fritzbox_ring_phone.php entsprechend angepasst:

PHP:
<?php
$dial = '**610'; // set to the number to dial
$dialport = 1; // set port from where should be dialed
// 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();
  
  // update the setting
  $formfields = array(
	'telcfg:settings/UseClickToDial'	=> 1, // enable ClickToDial at FB
	'telcfg:settings/DialPort'      => $dialport, // set port from where should be dialed to FB
	'telcfg:command/Dial'      => $dial,
  );
  $fritz->doPostForm($formfields);
  $message .= 'Phone ' . $dial . ' ringed from port ' . $dialport . '.';
}
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
?>

Wer jetzt die Wählhilfe danach wieder deaktivieren will, fügt noch ein "'telcfg:settings/UseClickToDial' => 1," hinzu.

PHP:
...
  $formfields = array(
	'telcfg:settings/UseClickToDial'	=> 1,
	'telcfg:settings/DialPort'      => $dialport,
	'telcfg:command/Dial'      => $dial,
	'telcfg:settings/UseClickToDial'	=> 0, // disable ClickToDial at FB
  );
...

Und jetzt wird's noch etwas tricky bei manchen Fritz!Boxen.
Bei einigen kann es sein, dass wen man z.B. von den DECT Nebenstellen wie z.B. 610, 611, 612, etc. beim Port die mittlere 1 weglassen muss. Will man z.B. von der Nebenstelle 610 klingeln lassen so muss man den Port 60 ($dialport = 60; ) nehmen.

Ich hoffe irgendjemand anderem hilft's auch.

Viele Grüße
densidad
 
Zuletzt bearbeitet:
Ich möchte mich einfach nur mal bei allen Beteiligten bedanken, die ihr Wissen und Skripte so bereitwillig zur Verfügung gestellt haben.

Dank eurer Arbeit kann ich zusammen mit Geofency für iOS und CGI-Perl-Skripten auf dem RaspBerry, die eigentlich der Arbeitszeiterfassung dienen, auch meine Rufnummernumleitung beim Verlassen des Haus einschalten und wieder Ausschalten lassen.
 
Hallo,

mit großem Interesse habe ich diesen thread angefangen zu lesen. Ich besitze ein GSM-Modul, welches per Anruf Verbraucher steuern kann. Einschalten kann man den Verbraucher, indem man anruft und nach den ersten Freizeichen (1-ca. 3) wieder auflegt. Ausschalten kann man, indem man anruft und so lange klingeln lässt, bis die Gegenseite den Anruf abweist (nach ca. 4 Freizeichen) und das Besetztzeichen ertönt.
Nun meine Frage: Würden sich diese beiden Szenarien mit evtl. abgeänderten Skripten und einer Fritzbox 7360 realisiseren lassen?

schöne Grüße
Daniel
 
Das sollte möglich sein. Das Wählscript kann ja, wenn ich mich recht erinnere, externe Nummern anrufen und mit sleep() kann man die Skripausführung ja durchaus gezielt ein paar Sekunden anhalten.

Die Frage ist, ob es nicht einfacher ist, ein SIP-Skript zu besorgen und damit anzurufen. Gibt es überhaupt SIP-Skripte für PHP? Bestimmt :)
 
Hejhej,

ich nutze die API unter Ubuntu 14.04; da gibt es bei Verwendung von HTTPS einen Bug, der mich heute fast zur Weißglut trieb.
PHP-Version ist PHP 5.5.9-1ubuntu4.3, der Bug existiert aber dank OpenSSL 1.0.1f (Build vom 6 Jan 2014). Der Bug in OpenSSL ist seit ca. 2 Jahren bekannt, aber nicht gefixt. Ich gehe davon aus, dass alle unixoiden, die OpenSSL verwenden, ähnliche Probleme haben.

Phänomen:
Bei initSID() kommt Abbruch, weil kein XML vom Server zurückkommt.
Der $output von doGetRequest() (und auch doPostRequest()) ist leer.
Genauere Analyse mittels curl_getinfo($sh) und curl_error($sh) zeigt, dass nur HTTP Code 0 zurückkommt und folgende Fehlermeldung geworfen wird:
Code:
14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Abhilfe:

In doPostForm() und doGetRequest() muss das Ende lauten:

Code:
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, "RC4-SHA:RC4-MD5");

$output = curl_exec($ch);
curl_close($ch);
return $output;

Erläuterung:
Die eigentlich wichtige Zeile ist die letzte (CURLOPT_SSL_CIPHER_LIST); offenbar möchten OpenSSL und die Fritz!Box unterschiedliche Cipher sprechen, und das präferierte der Box wird von cURL nicht angeboten.
Es gibt verwandte Bugs, bei denen cURL beharrlich auf der falschen SSL-Version (2 statt 3) bleibt, daher die Zeile davor.
Falls dann noch Dinge schief gehen, kann es noch an den ersten beiden Optionen liegen: VERIFYPEER und VERIFYHOST können böse enden, wenn man z. B. die Fritzbox mittels IP anruft, sie sich aber mit Hostnamen zurückmeldet. Bitte einfach anlassen, falls es geht.

Ich hoffe, das hilft euch weiter, falls ihr vor ähnlichen Problemen steht.
Danke für die grandiose API! Ich habe sogar beim Bugsuchen gerade viel gelernt :)
 
@spackmat: Danke. es muss nicht unbedingt PHP sein. Alles was ich als Skript auf Linux starten kann wäre auch gut. Hast Du zu SIP-slripten einen guten link? Habe davon ziemlich keine Ahnung :(
 
@Danni378: Ich leider auch nicht. Das Protokoll ist nicht ganz trivial, aber dieser einfache Usecase sollte sich an sich leicht umsetzen lassen, im Zweifel mit einem Softphone, das eine Kommandozeilenschnittstelle mitbringt. Würde mich wundern, wenn in den Paketquellen der üblichen Distributionen sowas nicht drin wäre.
 
@thisdyingsoul: Extrem cool, gute Recherchearbeit und danke, dass Du das Ergebnis mit uns teilst.
 
Ok, danke. Ich werde mich da mal einlesen :)
 
Hallo,

tolle Gechichte die API, Danke.

Leider hänge ich total.

Ich möchte gerne das Telefonbuch per API auf meinem Ubuntu Server speichern.
Habe jetzt mal zum Test die Anruferliste genommen.
Leider kommt immerfolgender Fehler: unexpected endof file ... line 53

AUch bin ich mir noch nicht ganz sicher, wo ich welchen User eintragen muss.

Bin jetzt soweit, dass ich beim Anruf zum Holen der Anrufliste folgende Fehlermeldung erhalte:

PHP Warning: Missing argument 2 for fritzbox_api_config::setItem(), called in /home/markus/Downloads/fritzbox_user.conf.php on line 15 and defined in /home/markus/Downloads/fritzbox_api.class.php on line 423
PHP Notice: Undefined variable: value in /home/markus/Downloads/fritzbox_api.class.php on line 425
PHP Notice: Undefined variable: message in /home/markus/Downloads/fritzbox_get_foncallslist_xml.php on line 59
 
Zuletzt bearbeitet:
Hallo,

ich habe die Api jetzt erfolgereich ans Laufen bekommen und bedanke mich erst mal für alle die hier Posten und helfen :)

Jetzt zu meinem anliegen ;)
Ich würde die Anruferliste gerne als XML format oder in der MYSQL abspeichern. Hat hier schon jemand einen Ansatz oder sogar ein Script ?

Danke schon mal im Vorraus.

P.S. Für die Leute die die API auf einen Webserver betreiben schaut auch mal myfritz.net an :)

Gruss
Darks
 
Hallo zusammen,

hier ein weiteres Modul für die PHP-basierte Steuerung der FritzBox von spackmat.
Mit diesem kann man das WLAN aktivieren und auch wieder deaktivieren. Ferner kann man auch den aktuellen WLAN-Status abfragen. Ich habe bewusst nicht die Telefon-Methode verwendet.

PHP:
<?php
/**
 * Fritz!Box PHP tools CLI script to enable or disable WLAN
 * @version  0.1 2014-09-22
 * @package  Fritz!Box PHP tools
 */

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') . ' ';

    // read the current settings
    $formfields = array(
                      'getpage' => '/wlan/wlan_settings.lua',
                  );
    $output = $fritz->doGetRequest($formfields);

    // set new given setting
    if ( isset($argv[1]) )
    {

        if( $argv[1] == 0 )
        {
            unset($formfields['active']);
        }
        else
        {
            $formfields['active'] = 'on';
            $formfields['hidden_ssid'] = 'on';
            //$formfields['StickAndSurf'] = 'on';

        }
        // do the update
        $formfields['apply'] = '';
        $output = $fritz->doPostForm($formfields);
    }

    preg_match('@name="active"[^>]+(checked)[^>]*@', $output, $matches);
    if ( isset($matches[1]) )
    {
        $message .= 'WLAN is active.';
    } else
    {
        $message .= 'WLAN is inactive.';
    }

}
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
?>

Startet man diese 'fritzbox_wlan_on_off.php' ohne Parameter, so gibt sie den aktuellen Status des WLANs aus. Mit dem Parameter '0' wird das WLAN deaktiviert und mit '1' aktiviert.

Gruß
Daniel
 
Zuletzt bearbeitet:
Hallo Zusammen,

vorab erst mal zur API und allen anderen Scripten hier, super Sache, hat mir schon viel geholfen, danke.

Ich habe eine 7490 mit neuster Firmware und offiziell gibt es da keine Nachtschaltung bzw. Klingelsperre für alle Telefone. Aber dann fand ich "/system/ring_block.lua".

Mit:
PHP:
$formfields=array(
        'getpage'        = "/system/ring_block.lua",
        'active'         = "",
        'start_hour'     = "00",
        'start_minute'   = "00",
        'end_hour'       = "24",
        'end_minute'     = "00",
        'apply'          = ""
        );

$fritz->doPostForm($formfields);
konnte ich die "Klingelsperre" einschalten.

Mit dem Ausschalten hatte ich dann Schwierigkeiten. Bis ich gesehen habe, dass in der Weboberfläche unter "System" nun die "Nachtschaltung" auftaucht.

klingelsperre.jpg

Der Haken "Klingelsperre aktiv" ist vollkommen ohne Funktion. Zum wirklichen Deaktivieren muss Startzeit gleich Endzeit sein.

Tipp: Zum Testen, einfach die "Info-LED" mit "Klingelsperre" belegen, das spart das ständige sich selbst anrufen. Vorstufe zu Selbstgesprächen ;)

Hinweis: Die Klingelsperre greift nur für DECT- und Analog-Telefone. Smartphone, PC müsst ihr selbst "beruhigen", wenn ihr Ruhe haben wollt.

Hoffe jemand findet das hilfreich.
 
DDNS ein und ausschalten

Gerade zusammengebastelt und an meiner alten 7170 getestet.
Zwei Skripte zum ein und Ausschalten der DDNS funktion.
Eigentlich nur umgebaut aus fritzbox_diversity_on.php

Vielleicht kann es jemand brauchen.
 

Anhänge

  • fbddns.zip
    1 KB · Aufrufe: 12
Hilfe,

wie bekomme ich unter Fritz.OS 6.10 wieder das Script zum Laufen, mit dem man den LAN4-Gastzugang steuern kann? Funktioniert nicht mehr :-(
 
So, Gäste-LAN geht wieder, die Oberfläche hatte sich deutlich verändert. Problem ist, dass man immer alle Felder auslesen muss – auch die unsichtbaren – und beim Ändern wieder mitschicken. Macht die Sache immens fragil. Mit Fritz!OS 6.20 auf meiner 7490 geht es jetzt jedenfalls wieder. Da lese ich alle Felder korrekt aus und gebe sie wieder mit.

Das Auslesen des Gäste-LAN4-Settings scheiterte übrigens daran, dass das checked ohne Leerzeichen direkt hinter einem anderen Attribut ausgegeben wird, habe jetzt alle regulären Ausdrücke zum Finden des checked-Attributs in diesem Script daran angepasst, dass das passieren kann.

Liebe Grüße,
Gregor

PHP:
<?php
/**
 * Fritz!Box PHP tools CLI script to enable or disable the LAN4 guest access
 *
 * 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
 *
 * Check the config file fritzbox.conf.php!
 *
 * Changelog:
 * 
 * v0.4: rebuilt compatibility with Fritz!OS 6.20
 * 
 * @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 2014-10-18
 * @package  Fritz!Box PHP tools
 */

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) )
  {
    $mode = (bool)$argv[1];
  }
  else
  {
    if ( $fritz->config->getItem('logging') == 'console' )
    {
      echo '
  Enables or disables the LAN4 guest access of a Fritz!Box
  
  Usage on UNIX systems:
    /path/to/php ' .  $argv[0] . ' {0|1}
  
  Usage on Windows systems:
    "c:\path\to\php.exe" ' .  $argv[0] . ' {0|1}
  
  0 disables the guest access
  1 enables the guest access
  ';
    }
    else
    {
      $fritz->logMessage($message . 'ERROR: Script was called without or with an invalid argument');
    }
    exit;
  }
  
  
  // read the current settings
  $formfields = array(
    'getpage' => '/net/network_settings.lua',
  );
  $output = $fritz->doGetRequest($formfields);
  
  // read eth0 setting
  preg_match('@checked[^>]*value="(\d)"[^>]*name="eth0"[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['eth0'] = $matches[1];
  }
  // read eth1 setting
  preg_match('@checked[^>]*value="(\d)"[^>]*name="eth1"[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['eth1'] = $matches[1];
  }
  // read eth2 setting
  preg_match('@checked[^>]*value="(\d)"[^>]*name="eth2"[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['eth2'] = $matches[1];
  }
  // read eth3 setting
  preg_match('@checked[^>]*value="(\d)"[^>]*name="eth3"[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['eth3'] = $matches[1];
  }
  
  // read set_tr_064 setting
  preg_match('@name="set_tr_064"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['set_tr_064'] = 'on';
  }
  
  // read upnp_activ setting
  preg_match('@name="upnp_activ"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['upnp_activ'] = 'on';
  }
  
  // read use_broadcast setting
  preg_match('@name="use_broadcast"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['use_broadcast'] = 'on';
  }
  
  // read time_server setting
  preg_match('@name="time_server"[^>]+value="([^"]*)"[^>]*@', $output, $matches);
  $formfields['time_server'] = isset($matches[1]) ? $matches[1] : '0.europe.pool.ntp.org';
  
  // read time_server_activ setting
  preg_match('@name="time_server_activ"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['time_server_activ'] = 'on';
  }
  
  // read ipv6_pref setting
  preg_match('@name="ipv6_pref"[^>]+value="([^"]*)"[^>]*@', $output, $matches);
  $formfields['ipv6_pref'] = isset($matches[1]) ? $matches[1] : '0';
  
  // read dns_rebind_list setting
  preg_match('@<textarea.*?name="dns_rebind_list".*?>(.*?)<\/textarea>@i', $output, $matches);
  $formfields['dns_rebind_list'] = isset($matches[1]) ? $matches[1] : '';
  
  // read other_prefix_allowed setting
  preg_match('@name="other_prefix_allowed"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['other_prefix_allowed'] = 'on';
  }
  
  // read dnsv6_server_activ setting
  preg_match('@name="dnsv6_server_activ"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) )
  {
    $formfields['dnsv6_server_activ'] = 'on';
  }
  
  
  // set new given setting
  if ( $mode == true )
  {
    $formfields['guest_enabled'] = 'on';
  }
  
  // do the update
  $formfields['btnSave'] = '';
  $output = $fritz->doPostForm($formfields);

  preg_match('@name="guest_enabled"[^>]*(checked)[^>]*@', $output, $matches);
  if ( isset($matches[1]) && $mode == true )
  {
		$message .= 'LAN4 guest access is now active.';
  }
  else if ( !isset($matches[1]) && $mode == false )
  {
    $message .= 'LAN4 guest access is now inactive.';
  }
  else if ( isset($matches[1]) && $mode == false )
  {
    $message .= 'ERROR: LAN4 guest access status change failed, should be inactive, but is still active.';
  }
  else if ( !isset($matches[1]) && $mode == true )
  {
    $message .= 'ERROR: LAN4 guest access status change failed, should be active, but is still inactive.';
  }
}
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
?>
 
Hallo Gregor,

super - das klappt jetzt wieder wie am Schnürchen. Hätte ich alleine wohl nicht hinbekommen. Updates sind ja wichtig, aber hoffentlich ändert AVM dabei nicht ständig die Oberfläche...

Vielen lieben Dank für die schnelle Code-Bereitstellung! Absolut TOP!

Grüße
Volker
 
Hallo spackmat und manni22 !

Zunächst an spackmat vielen Dank für diese super Möglichkeit, Fritzbox-Einstellungen von außerhalb der Fritzbox-Oberfläche zu setzen!
Ich bin gerade umgestiegen, um FHEM nicht mehr auf der Fritzbox, sondern auf einem Cubitruck laufen zu lassen.
Da nutzte ich das bisherige Script des WLAN-Schaltens. Doch es hat dann anschließend unser Telefon so blockiert, daß kein Anruf mehr an uns
durchkam, sondern der externe Anrufer nur 2x Klingeln hörte und dann das Besetzt-Zeichen kam.
Das hat sich mit dem letzten Script von manni22 zum Guten gewendet! Vielen Dank für den Code!
Ich habe nur eine kleine Änderung vornehmen müssen:
...
$formfields['active_24'] = 'on';
...
 
Hallo an alle,

benutze das Script um mein Gäste WLAN ein/auszuschalten über FHEM.

Um eine Anwesenheitserkennung in FHEM einzubauen, würde ich gerne noch den Status von 2 iPhones abfragen.
D.h. eine Abfrage ob Gerät x im Fritzbox WLAN angemeldet ist.

Hat jemand so etwas schon gemacht?

Ingo
 
Gemacht nicht, aber die Abfrage der Netzwerkliste sollte kein Problem sein und da kann man leicht prüfen, ob die Zeile mit dem gesuchten Gerät das grüne Lämpchen hat oder nicht (bzw. ob sie über oder unter der Zwischenüberschrift für Offline-Geräte kommt). Das Herumfuhrwerken in der Netzwerkliste ist in dem Skript zum Leeren der Liste bekannter Offline-Geräte bereits drin, das müsste man entsprechend abändern.

Liebe Grüße,
Gregor
 

Statistik des Forums

Themen
246,195
Beiträge
2,247,818
Mitglieder
373,748
Neuestes Mitglied
fanti88
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.