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

Hi spackmat,

danke für Deine fixen Anpassungen. Die AVM'ler bringen mich aber echt zur Verzweiflung. Wenn ich meine Fritzbox über https://<name>.dyndns.org zuhause aufrufe, bekomme ich den Login aus dem Intranet. Möchte ich das Problem umgehen und schalte die User+PW Abfrage auch aus dem Heimnetz an, bietet er mir statt der Usereingabe im Textfeld eine Dropdownliste aller möglichen User?!?! Argh!

Offensichtlich merkt die Fritzbox, dass ich sie aus dem Intranet via dyndns aufrufe. Keine Ahnung, wie, aber es stört in meinem Fall.

Könntest Du noch ein Login mittels der Dropdownbox einbauen?

Der relevante Teil des Logins ist:

<label for="uiViewUser">Benutzername</label>
<select id="uiViewUser" tabindex="1">
<option value="">Bitte wählen...</option>
<option value="admin" selected="selected">admin</option>
<option value="test" >test</option>
</select>
 
Die Unterscheidung ist leicht zu treffen: 1. kommt der Remotezugang über https, also Port 443. 2. und noch viel unterschiedlicher kommt der Remotezugriff am WAN-Interface der Box an und nicht am LAN-Interface. Die Sache mit dem Dropdown ist praktisch für den lokalen Zugriff, für uns aber absolut kein Hindernis, im Hintergrund wird das Formularfeld username halt mit dem Wert aus dem Dropdown gefüllt. Wir schicken aber sowieso direkt Werte ans Formular, also ist und das Dropdown völlig latte.

Wie auch immer, ist nur eine kleine Änderung an der API, dann klappts auch mit einem Usernamen für den Login. Anbei Version 0.5.0b6 mit Unterstützung dafür. Einfach in der Config einen Wert für username setzen und gut ist.
 

Anhänge

  • fritzbox_api_php_v0.5.0b6.zip
    15.7 KB · Aufrufe: 121
Hi spackmat,

vielen Danke für Dein on the fly debugging. Leider erhalte ich aktuell bei Zugriff lokal und über Internet die Fehlermeldung:

Fatal error: Uncaught exception 'Exception' with message 'Response of initialization call /login_sid.lua in initSID was not xml-formatted.' in /Applications/MAMP/htdocs/fritzbox_api.class.php:306
 
Der Fehler kommt, wenn schon vor dem Login keine gültige Antwort von der Box zurück kommt. Das Script fragt erst mal, ob man schon eingeloggt ist und holt dazu eine xml-Datei ab, wo u.a. die SID drin steht. Das scheitert bei Dir schon. Das kann eigentlich nur zwei Gründe haben: Entweder Du fragst gar nicht bei der Fritz!Box an, dann solltest Du die fritzbox_ip in der Config prüfen (die muss ohne http:// eingegeben werden, einfach nur die IP bzw. den (dyndns-)Domainnamen). Oder Du versuchst es mit der falschen login-Methode, dann solltest Du use_lua_login_method in der Config umstellen. Wenn das trotzdem noch stehen bleibt, kannst Du in Zeile 217 der fritzbox_api.class.php mal vor dem Aufruf von $this->error ein
Code:
var_dump($this->doGetRequest(array('getpage' => $loginpage)));
einfügen. Dann bekommst Du ausgegeben, was da zurückkommt (wenn eine der obigen Bedingungen erfüllt ist, wahrscheinlich nichts).

Liebe Grüße,
spackmat
 
Hi,

Fröhliche Weihnachten! Nach der ganzen Fresserei habe ich mich nochmal kurz hingesetzt und bin zunächst nicht weiter gekommen. Habe dann mal die API & Config aus dem ZIP Archiv genommen und neu angepaßt. Danach ging es. Scheint offensichtllch nur ein Schreibfehler meinerseits gewesen zu sein.

Jetzt versuche ich noch, die WAV Datei auf einem iPad auszugeben. Diese ist aktuell nicht mal in der Fritz!Box Oberfläche auf einem iPad zu öffnen. Tippe mal auf den Dateinamen und versuche, die Datei lokal als .wav zu speichern und dann wiederzugeben. Wenn ich die Datei mit SID auslesen will, bekomme ich wieder den Loginscreen. Müßte ich also wieder über die API öffnen. Wie öffne ich denn die Adresse http://xyz.dyndns.org/lua/photo.lua...StorageDevice-01/FRITZ/voicebox/rec/rec.0.001

Wie ich da per FTP rankomme, weiß ich ja, aber ich würde es gerne über die API lösen.

Danke!
 
Zuletzt bearbeitet:
@skyynet: Ich würde das mal so probieren:

Code:
$params = array(
  'getpage'         => '/lua/photo.lua',
  'myabfile'         => '/var/media/ftp/Mass-StorageDevice-01/FRITZ/voicebox/rec/rec.0.001',
  // oder, muss man ausprobieren:
  'myabfile'         => '%2Fvar%2Fmedia%2Fftp%2FMass-StorageDevice-01%2FFRITZ%2Fvoicebox%2Frec%2Frec.0.001',
);
$output = $fritz->doGetRequest($params);

in $output ist dann das drin, was die Box zurückliefert, im besten Fall also die wav-Datei, die Du dann mit file_put_contents() wegschreiben kannst oder halt direkt an den abrufenden Browser senden.


Davon abgesehen habe ich eine neue Version am Start, die das defekte logfile-Logging in den einzelnen Scripts fixt (Tippfehler, war != 'fritzbox_api' statt == 'fritzbox_api', so dass das Logging immer auf der Konsole landete). Zudem habe ich eine Möglichkeit vorgesehen, der API als Parameter eine abweichende Configdatei mitzugeben (new fritzbox_api('alt') lädt dann fritzbox_user_alt.conf.php statt fritzbox_user.conf.php).
 

Anhänge

  • fritzbox_api_php_v0.5.0b7.zip
    15.8 KB · Aufrufe: 143
Hi spackmat,

funktioniert gut!

Falls jemand sowas braucht, hier mal mein Code von der AB Anzeige:

Code:
function buildData($string) {
 $messages = array();
 $ab       = array();
 $count    = preg_match_all('/<tr[^>]*>(.*?)<\/tr>/is', $string, $matches);
 for ($i = 0; $i < $count; ++$i) {
  $messages[] = $matches[0][$i];

  if (substr($messages[$i],17,7) == 'uiIsNew') { $ab[$i]['new'] = TRUE; $skipNewGfx = 57; }
  else                                         { $ab[$i]['new'] = FALSE; $skipNewGfx = 0; }
  $ab[$i]['date'] = substr($messages[$i],23+$skipNewGfx,6);
  $ab[$i]['time'] = '<span class="time">'.substr($messages[$i],32+$skipNewGfx,5).'</span>';
  $tmp_endofname  = strpos($messages[$i], '</td>',46+$skipNewGfx);
  $ab[$i]['name'] = substr($messages[$i],46+$skipNewGfx,$tmp_endofname-46-$skipNewGfx);
  if ($ab[$i]['new']) $ab[$i]['name'] = '<span class="new">'.$ab[$i]['name'].'</span>';
  $tmp_endofmess  = strpos($messages[$i], '<button',($tmp_endofname+91))-($tmp_endofname+93);
  $ab[$i]['mess'] = substr($messages[$i],$tmp_endofname+91+45,$tmp_endofmess-45); # 45 ok?
 }
 
 return $ab; 
}

require_once('fritzbox_api.class.php');
$fritz = new fritzbox_api();

$params = array(
    'getpage'             => '../html/de/menus/menu2.html',
    'var:menu'            => 'fon',
    'var:pagename'        => 'foncalls',
    'var:errorpagename'   => 'foncalls',
    'var:type'            => '0',
  );
$fritz->doPostForm($params);
  
$params = array(
    'getpage'         => '/fon_devices/tam_list.lua',
  );
$output = $fritz->doGetRequest($params);
  
$fritz = null; // destroy the object to log out


$tmp = substr($output,strpos($output,'<table class="zebra"><tr><th></th><th>Datum</th><th>Name/Rufnummer</th><th>Eigene Rufnummer</th><th>Dauer (hh:mm)</th><th></th><th></th><th></th></tr>')+150);
$tmp = substr($tmp, 0,strpos($tmp, '</table><div class="ShowBtnRight"><button type="submit" name="delete_all" onclick="return OnDeleteAll();'));

$rec = explode('</tr>',$tmp);

if (is_array($rec)) $zaehler = count($rec)-1;
else                $zaehler = 0;
if (preg_match('/keine Nachrichten auf diesem Anrufbeantworter/i',$rec[0])) $zaehler = 0;

$message = '';

if ($zaehler == 0)
{
 $filename = 'gfx/ab.png';
 $message  = 'keine Nachrichten';
 $padding  = 30;
}
else
{

$ab = buildData($tmp);
 $filename = 'gfx/ab'.$zaehler.'.png';
 $lines    = 3;
 
 for ($i = $zaehler-1; $i >= 0; $i--) {
  if ($lines > 0) $message.= $ab[$i]['date'].' '.$ab[$i]['time'].' <a href="ab_player.php?f='.$ab[$i]['mess'].'">'.$ab[$i]['name'].'</a><br />';
      if ($zaehler == 1) $padding = 30;
  elseif ($zaehler == 2) $padding = 20;
  elseif ($zaehler == 3) $padding = 10;
  else                   $padding = 5;
  $lines -= 1;
 }
 $padding = 0;
}

echo '<a href="#" onclick="updateAB();" title="Daten aktualisieren per Klick"><img class="ab" src="'.$filename.'" /></a><div class="abtext" style="padding-top:'.$padding.'px;">'.$message.'</div>';

und der vom Player:
Code:
if ($_GET && $_GET['f']) $file = $_GET['f'];
else exit('No filename given');

require_once('fritzbox_api.class.php');
$fritz = new fritzbox_api();

$params = array(
  'getpage'         => '/lua/photo.lua',
  'myabfile'        => $file,
);

$wav = $fritz->doGetRequest($params);
file_put_contents('ab.wav', $wav) or die('WAV Datei konnte nicht geschrieben werden');

echo $file.'<br />';

echo '<a href="ab.wav">Play</a>';

Funktioniert sogar auf dem iPad, was nichtmal in der original Fritz!Box Oberfläche geht ;-)
 
@ skyynet:

Irre Idee, ich benutze auch das iPad. Da kommt mir sowas wie gerufen.
Allerdings hat das Script nicht funktioniert.
Nach langem suchen hab ich dann was gefunden.
Der Link zur Datei war falsch.
Code:
e=/var/media/ftp/JetFlash-TS128GSSD18C3-01/FRITZ/voicebox/rec/rec.0.000
Dann habe ich einfach mal explode das "e=" abgeschnitten.... und siehe da es funktioniert. Komisch.

Ist das bei dir auch so?

Was rufst du mit der javascript Funktion updateAB ab? Nur einen Seitenrefreh oder steckt da mehr dahinter?
PHP:
echo '<a href="#" onclick="updateAB();" title="Daten aktualisieren per Klick"><img class="ab" src="'.$filename.'" /></a><div class="abtext" style="padding-top:'.$padding.'px;">'.$message.'</div>';

Jetzt kommt noch hinzu, dass ich 3 Anrufbeantworter habe.
Das Script fragt ja nur den ersten, also den sichtbaren auf der /fon_devices/tam_list.lua Seite ab?
Oder irre ich mich jetzt damit.
Die anderen zwei stehen auch auf der Seite sind aber mit display:none ausgeblendet.
Gibts da schon irgendwelche Gedanken zu?

Ich habe jetzt die wav-Datei direkt in die player.php mit eingebunden.
PHP:
echo '<embed autostart="false" src="ab.wav" width="200" height="60">';

Echt geil, Danke Danke Danke =)

Daumen hoch für alle die Versuchen unseren Planeten ein bisschen smarter zu machen =) :eek:
 
Ich benutzte das API schon etwas länger nur um WLAN und AB zu schalten...
Hab jetzt erst so richtig gesehen was da hinter steckt.
Hat denn schonmal jemand versucht die callsdaten.xml mit php auszuwerten?
 
Die XML-Datei der alten Firmwares lässt sich ohne weiteres mit SimpleXML durcharbeiten, statt sie irgendwo hin zu speichern. Die CSV-Datei der neueren Firmwares ist etwas komplizierter. Da das Format aber eigentlich recht simpel ist, kann man da Zeilenweise durchgehen und mit einer kleinen Regex die Datenrausziehen, die man haben will. Beides sollte keine echte Herausforderung sein. Spannender ist, was man dann hinten wieder ausgibt und nach welchen Kriterien man das auswerten will.
 
Hey! Ist ja ne super Sache ide API! Danke!

Habe allerdings ein Problem hier. Wenn ich versuche, mich mittels der API beim Paketmitschnitt einzuloggen, klappt es nicht. (https://.../html/capture.html)
Da ist es wohl irgend so ein wilder mix aus altem und neuem Login-Verfahren. Oder, was wahrscheinlicher ist, ist verpeile etwas.
Habe die 7270v3-Box mit 5.22 OS.

Wäre für Hilfe sehr dankbar!
 
Wenn ich das auf die Schnelle richtig gesehen habe, ist dafür ein normaler Login nötig. Auf der 7390 mit aktueller Firmware jedenfalls. Klappt denn der Login bei Dir mit anderen Scripten? Ich probiere es immer mit dem ring_phone-Script. Wenn der Login damit klappt, liegt das Problem eher nicht innerhalb der API, sondern im verwendeten Script. Wie sieht denn Dein Script aus? Und welchen Mitschnitt willst Du überhaupt ziehen? Da kommt ja erst mal nur die Übersichtsseite mit der Auswahl der Mitschnitte. Und vor allem, was funktioniert denn eigentlich nicht?

Das Mitschneiden wird aber ohnehin kompliziert, weil man das erst mal startet und dann wird immer mal wieder was in Echtzeit in den zurückgegebenen Dateidownload gesendet. Da wird irgendwann der CURL-Timeout (in der API bei 5 meine ich) zuschlagen oder die PHP Scriptlaufzeit und dem Spuk ein Ende bereiten. Ich befürchte, für diesen Anwendungszweck ist diese PHP-basierte API nicht die beste Wahl. Natürlich kann man die API nur für den Login benutzen und den CURL-Kram mit laaaangem Timeout im Script selber regeln und die PHP-Skriptlaufzeit ist ja auch schnell auf einen sehr hohen Wert gesetzt. Aber irgendwie scheint mir das durch die Brust ins Auge gedacht.
 
Hi, schon mal Danke für die Antwort! :)

Naja, habe jetzt nur einwenig rumprobiert. Hier und da was an der config angepasst. Und vielleicht ist dabei auch was schiefgegangen.
Bei mir ist es so, daß ich von remote auf die Box zugreife.

Code:
$this->config->setItem('use_lua_login_method', true);
$this->config->setItem('fritzbox_ip', 'bla.myfritz.net');
$this->config->setItem('enable_remote_config', true);
$this->config->setItem('remote_config_user', 'bla');
$this->config->setItem('remote_config_password', 'blub');
$this->config->setItem('username', false);
$this->config->setItem('password', 'dumdidum');

und hier mein Dummy-Script. Da wird aber keine SID ausgegeben.
Code:
try {
    // load the fritzbox_api class
    require_once('fritzbox_api.class.php');
    $fritz = new fritzbox_api();
    $fritz->logMessage($fritz->getSID());
    return;

Im Grunde brauche ich ja nur die SID, um weiter was machen zu können. Kann mir vorstellen, daß man dann den aufruf an die konsole übergeben könnte.
Dumm nur, daß nicht einmal der login klappt.
 
capture login per cURL

hi@ll

habe hier ein shell-skript von wget auf cURL portiert.
somit folgende sys-voraussetzungen:
  • cURL
  • xmlstarlet
  • iconv



im Moment funzt nur die Login-Routine

wie man sieht, funktioniert das ganze ziemlich wild. zunächst wird XML angefordert.
dann die standard Seite
und die Rückgabe bekommt man aus dem Response-Header heraus

ich hoffe, das kann man irgendwie schöner machen
Code:
#!/bin/bash
#alles nur geklaut

FRITZ_IP="dingsbums.myfritz.net"
FRITZ_PASS="pass_für_formular_feld"
HTTP_USER="user_für_remote_zugriff"
HTTP_PASS="pass_für_remote_zugriff"


ChallengeXML=`curl --insecure --user $HTTP_USER:$HTTP_PASS https://$FRITZ_IP/login_sid.lua?page=/cgi-bin/capture_notimeout`
echo ChallengeXML = $ChallengeXML

SID=`echo $ChallengeXML | xmlstarlet sel -t -m '/SessionInfo/SID' -v "."`
echo SID = $SID

Challenge=`echo $ChallengeXML | xmlstarlet sel -t -m '/SessionInfo/Challenge' -v "."`
echo Challenge = $Challenge

# login aufbauen und hashen
CPSTR="$Challenge-$FRITZ_PASS"
MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
RESPONSE="$Challenge-$MD5"
POST_DATA="response=$RESPONSE&get_page=/cgi-bin/capture_notimeout"

echo POST_DATA = $POST_DATA

TRY_SID=`curl -D "/tmp/fritzcapture.header" --insecure --data "$POST_DATA" --user $HTTP_USER:$HTTP_PASS https://$FRITZ_IP/login.lua`
echo TRY_SID = $TRY_SID
cat /tmp/fritzcapture.header | grep Location

exit 1

getestet: Ubuntu 12.04 server => 7270v3 5.22
 
Hallo,
diese API benutze ich seit einiger Zeit begeistert zum automatisierten wählen einer Nummer, mit dem Script "fritzbox_ring_phone.php".
Nun versuche ich mich ein wenig einzuarbeiten, um ein Script zum DECT Ein/Aussschalten zu basteln, aber vor Allem um das Prinzip zu verstehen und selbst bei Bedarf Scripte für die API erstellen zu können. Habe mich dazu mit Firebug bewaffnet und die Funktion im Webinterface näher angeguckt. Ich hatte auf Grund des Beispiels in Post #20 gehofft, ohne "Schubs" auszukommen, aber scheinbar brauche ich doch einen. In der aktuellen Firmware sieht das ziemlich anders aus, oder ich habe die richtige Stelle noch nicht gefunden.

Daher würde ich mich sehr freuen, wenn mir spackmat, oder ein anderer Programmierkundiger so ein Beispiel wie von Post #20, nur für die DECT On/Off- Funktion reinstellen könnte. Meine Box ist die 7390 mit FRITZ!OS 5.50 (84.05.50).


Bisher gefunden habe ich dazu:

Die Seite:
http://fritz.box/dect/dect_settings.lua?sid=439h562e101ac049

Die Schaltfunktion:
Ein:
dect_activ=on&btnSave=
Aus:
dect_assi=0&btnSave=

Bekomme das aber nicht in eine Webadresse gepackt, die in der Browserbefehlszeile schon mal macht, was sie soll.


Bei der Wählhilfefunktion ist mir das wenigstens schon mal geglückt:

http://fritz.box/fon_num/dial_fonca...l=**610&xhr=1&t1358234452509=nocache HTTP/1.1

bzw.:GET /fon_num/dial_foncalls.lua?sid=439h562e101ac049&dial=**610&xhr=1&t1358234452509=nocache HTTP/1.1


Viele Grüße und vielen Dank!
 
In meinem Tool sowie in Java geht das hier:

Code:
// Dect an/aus per Post
    String sDect = "1"; // 1=ein 0=aus

    url = "http://" + box_address + "/cgi-bin/webcm";
    postdata = "sid=" + sRetSID + "&dect:settings/enabled=" + sDect;

    sRetText = http.Post(url, postdata);
    System.out.println("-> " + sRetText);

// Dect Status per Get
    url = "http://" + box_address + "/cgi-bin/webcm";
    postdata = "sid=" + sRetSID + "&getpage=../html/query.txt&var:cnt=1&var:n[0]=dect:settings/enabled";

    url = url + "?" + postdata;
    postdata = "";
    
    sRetText = http.Post(url, postdata);
    System.out.println("-> " + sRetText);

Gruß Erwin ;)
 
Zuletzt bearbeitet:
@kleptes Wenn der Login mit Deinem angegebenen Code schon nicht klappt, dann läuft etwas falsch. Hat Deine 7270v3 5.22 überhaupt schon den neuen Login-Mechanismus? Falls nicht, musst Du
Code:
$this->config->setItem('use_lua_login_method', false);
setzen, dann wird der alte Modus benutzt.

@fidodido Das Formular wird per POST übertragen, Du lagst also mit den Parametern gar nicht falsch (dect_activ: on bzw. off), nur dass Du das nicht einfach in die URL codierst, sondern mit der $fritz->doPostForm()-Methode abschickst, also analog zum ring_phone-Beispiel:

Code:
$formfields = array(
  'getpage'         => '/dect/dect_settings.lua',
  'dect_activ'      => 'on',
  'dect_pin'        => '****', // Da werden wirklich Sternchen übergeben, was offenbar "keine Änderung" bedeutet
  'dect_eco'        => 'on',
  'dect_eco_modi'   => '1',
  'dect_security'   => '0',
  'dect_assi'       => '0',
  'btnSave'         => '',
);
$fritz->doPostForm($formfields);

Das Problem ist, dass es sein kann, dass das Formular immer alle Parameter übergeben haben will, weil es sonst die Werte der anderen Felder leert (muss man ausprobieren). In dem Fall wird es komplizierter, weil man erst alle Werte auslesen muss, um sie dann wieder zu übergeben. Das kannst Du Dir zum Beispiel beim Script fritzbox_guestwlan_on_off.php ansehen (Zeilen 58-104). Sieht komplex aus, ist es aber eigentlich nicht, nur etwas Fleißarbeit mit regulären Ausdrücken. Die regulären Ausdrücke für die verschiedenen Typen (Checkbox, Selectbox, Inputfeld) kann man aus dem Script übernehmen und an die DECT-Felder anpassen.
 
Fritzbox Fon 7390 DECT Base on off schalten

Vielen Dank euch beiden!
Das hilft mir sehr viel weiter. Werde mich mit spackmats Tipps weiter rantasten und bei Erfolg hier posten.
Das Beispiel von Pikachu ist ja eine fertige Lösung, aber der Weg um es selbst hinzubekommen, scheint ein anderer zu sein?
Von der "cgi-bin/webcm" - Schnittstelle ist im Quelltext oder demFirebug - Mitschnitt weit und breit nichts zu sehen. ;o)
Ich tippe mal auf die CGI- Kommandos von der "wehavemorefun.de" Seite, aber dafür fehlt mir noch einiges an Wissen.

Viele Grüße

Frank

Edit 17.1.2013:

Es gibt erste Erfolge zu vermelden: Habe mit spackmats API und Tipps weitergefoscht. Jetzt habe ich 2 statische Skripte hinbekommen, die in Verbindung mit der API DECT Ein- bzw. ausschalten.
Spackmat, du hattest Recht, das Formular will alle Daten haben, sonst schaltet es nicht. In den nächsten Tagen werde ich mal versuchen, alles in ein Sript zu bekommen, per "argv" die 0/1 extern als Parameter für off/on zu übergeben und ggf. per GET die Daten aus der Webseite vorher auszulesen. Im Moment habe ich meine Daten statisch im Script drin.

Edit 18.1.2013:

Hab mich mangels Geduld gleich heute früh mal rangesetzt und ein wenig "programmiert". Dabei rausgekommen ist ein Script nach der Vorlage "fritzbox_guestwlan_on_off.php", was zumindest bei mir macht, was es soll. Wie die Vorlage, liest es zuerst die Einstellungen von der DECT- Seite aus und steckt sie in das Array. Je nach Argument ("1" oder "0") wird dann das gesamte Array, bzw. Formular incl. auf "on" gesetzem "DECT Ein/Aus- Feld" an die Seite zurückgeschickt. Es bleiben also immer auch alle restlichen Einstellungen der Seite erhalten. Bei Argument "0" gibt es eine Besonderheit: Da zum DECT ausschalten nur der Save-Button und "dect_assi" übermittelt werden muss, habe ich das Array in diesem Fall komplett gelöscht und dann neu aufgebaut. Jetzt befindet sich nur noch die Seitenadresse, "dect_assi" und der Save- Button darin.
Die regulären Ausdrücke habe ich noch nicht verstanden, aber ich habe sie aus der Vorlage so übernommen, dass sie zu den erwarteten Werten von der DECT- Seite passen. Sehe ich mir aber noch an, ist interessant. ;) Die restlichen Features, wie Hilfetext/Usage, Kommentare, Logfunktion und die Fehlererkennung habe ich ebenfalls übernommen und angepasst.
Es können natürlich Fehler enthalten sein, ich überblicke das Ganze ja bisher nur ansatzweise.

Also nochmals vielen Dank an Spackmat und Pikachu für die tolle API, die Tipps und die Vorlagen! Habe wieder was gelernt und freue mich!

Edit 20.1.2013:

Update wegen Fehlerbeseitigung im Bereich "Aktualwerte auslesen" und "setzen auf DECT aus".


Die Benutzung ist wie folgt (getestet auf Fritzbox 7390 mit FRITZ!OS 5.50 (84.05.50):

DECT on: fritzbox_dect_on_off.php 1
DECT off: fritzbox_dect_on_off.php 0

Viele Grüße

Frank



Edit 5.2.2013:

Habe mal das Script "fritzbox_ring_phone.php" um eine "Argument- Funktion" erweitert. Man kann jetzt als Parameter eine Telefonnummer angeben, die dann vom Script übernommen und gewählt wird. Die Nummer wird nicht gefiltert und muss so formatiert sein, wie man sie auch am Telefon wählen würde - also z.B. ohne Leerzeichen. Es funktionieren auch Fritzbox- Kurzwahlen, wie z.B. "**706".

Die Benutzung ist wie folgt (getestet auf Fritzbox 7390 mit FRITZ!OS 5.50 (84.05.50):

Wählen 030123456: fritzbox_call_phone.php 030123456
 

Anhänge

  • fritzbox_dect_on_off.zip
    1.6 KB · Aufrufe: 97
  • fritzbox_call_phone.zip
    1.1 KB · Aufrufe: 123
Zuletzt bearbeitet:
@kleptes Wenn der Login mit Deinem angegebenen Code schon nicht klappt, dann läuft etwas falsch. Hat Deine 7270v3 5.22 überhaupt schon den neuen Login-Mechanismus? Falls nicht, musst Du
Code:
$this->config->setItem('use_lua_login_method', false);
setzen, dann wird der alte Modus benutzt.
Hi, genau das meine ich. So wie ich es gemacht habe, funktioniert das ja. Aber es sieht aus, als wäre das neue Login-Verfahren nicht durchgehend umgesetzt. Zumindest nicht bei der Box mit der Firmware.

Auf jeden Fall bleibe ich aber dran :)
 
Tipp zm Auslesen der Aktualwerte aus der Frizbox- Oberfläche erwünscht

Hallo zusammen,

als Ergänzung zum "ring_phone" / "call_phone"- Script, wollte ich eine Funktion basteln, mit der man den Fon- Port der Wählhilfe umschalten kann. Das Script funktioniert bereits, allerdings verstehe ich Folgendes nicht: Das Auslesen der Aktualwerte aus der Oberfläche klappt scheinbar nicht, obwohl ich es genau so mache, wie bei meiner "dect_on_off"- Funktion. Die Reg. Ausdrücke habe ich daraufhin mal zerpflückt, aber es sieht so aus, als ob es damit klappen müsste, soweit ich das verstehe. Sinn der Sache: Ich wollte, wie bei Spackmats Scripten, nach dem Update der Werte noch eine Erfolgskontrolle einbauen. Dazu müsste ich natürlich den aktuellen Port aus der Oberfläche auslesen können. Für sachdienliche Hinweise wenden sie sich bitte an mich und nicht an die örtlichen Polizeidienststellen! ;)
Das fertige Script stelle ich dann wieder als Zip hier rein.

Viele Grüße,

Frank

Code:
<?php

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] == 1 || $argv[1] == 2 || $argv[1] == 50 || $argv[1] == 60) )
  {
    $port = $argv[1];
  }
  else
  {
    if ( $fritz->config->getItem('logging') == 'console' )
    {
      echo '
  Switches the phone-port for the "clicktodial"- function of a Fritz!Box Fon.
  
  Usage on UNIX systems:
    /path/to/php ' .  $argv[0] . ' {1|2|50|60}}
  
  Usage on Windows systems:
    c:\path\to\php.exe ' .  $argv[0] . ' {1|2|50|60}


 1, 2, 50, 60 are the Phone-Ports: Fon1, Fon2, ISDN, DECT 

 
';
    }
    else
    {
      $fritz->logMessage($message . 'ERROR: Script was called without or with an invalid argument');
    }
    exit;
  }
  
 
  
  // read the current settings from page
  $formfields = array('getpage' => '/fon_num/dial_foncalls.lua');
  $output = $fritz->doGetRequest($formfields);
 
 
// zu uebermittelnde Werte:
// clicktodial	on  (checked="checked" fuer Ein, oder checked nicht vorhanden fuer Aus)
// port	2
// btn_apply


   // read clicktodial setting (Checkbox; Value: "on" or "empty")
  preg_match('@name="clicktodial"[^>]+(checked)[^>]*@', $output, $matches);
  $formfields['clicktodial'] = isset($matches[1]) ? $matches[1] : '';
 

  // read port setting (Dropdownbox; Value: "1" or "2" or "50" or "60")
  preg_match('@name="port".*?<option value="(\d+)"[^>]+?selected.*?</select>@s', $output, $matches);  
  $formfields['port'] = isset($matches[1]) ? $matches[1] : '';


  // shows the values after reading (for test) - geht noch nicht richtig, aber regexp stimmen scheinbar 
  // ###### bekomme keine Werte fuer "clicktodial" und "port" ausgelesen, bzw. angezeigt!!!###

  $message .= 'getpage:' .  $formfields['getpage'] . '; ' ;
  $message .= 'read_clicktodial:' .  $formfields['clicktodial'] . '; ' ;
  $message .= 'read_port:' .  $formfields['port'] . '; ' ;


  // set new given port from argument
  
  //     unset ($formfields);
  //     $formfields['getpage'] = '/fon_num/dial_foncalls.lua';
  //     $formfields['clicktodial'] = 'on';
  $formfields['port'] = $port;

  // shows the port before update (for test)
  $message .= 'updateport:' .  $formfields['port'] . '; ' ;


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



  // checks if port has changed properly: ###### bekomme keinen Wert zurueck!!!######

  preg_match('@name="port".*?<option value="(\d+)"[^>]+?selected.*?</select>@s', $output, $matches);  

//  if ( isset($matches[1]) == $port )

  if ( isset($matches[1]) )

    {
    $message .= 'Phone Port is now set to "' . $matches[1] . '"';
    }



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