Probleme mit Scripts Fritzbox 7270

Hallo zusammen,

ich habe mich jetzt auch einige Zeit an dem PHP-Script versucht und komme leider zu keiner Lösung :frowning:

Mit einer Friztbox 7390 funktioniert der Login auf die Fritzbox leider nicht. (Somit der rest auch nicht…)

Ich nutze momentan folgenden Script-Schnipsel:

<?php
// Melde alle PHP Fehler
error_reporting(E_ALL);
echo "<pre>";
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$filename    = "c:\\Kindersicherung.txt";// anpassen
$password    = 'MEIN-PASSWORT'; //PW eingeben

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($ch);
$session_status_simplexml = simplexml_load_string($login);
print_r($session_status_simplexml);
if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge.'-'.$password, "UCS-2LE", "UTF-8"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
echo "<br>vor Response abschicken";
   $sendlogin = http_post_fields($fritzgui, $login);
echo "<br>nach Response abschicken";
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

Die Ausgabe „vor Response abschicken“ wird ausgegeben, die Ausgabe „nach Response abschicken“ wird nicht mehr ausgegeben.

Zum testen habe ich auf einem Webserver mit PHP das Script nativ eingebunden (test.php) um des direkt aufrufen zu können.

Hat zufällig wer von euch eine Idee? Ich weiß leider nicht weiter, da überhaupt keine Fehlermeldung ausgegeben wird. :frowning:

Vielen Dank & Gruß
Marc

[EDIT]
Ich muss mich korrigieren - mit IPS funktioniert das Script auf einer FritzBox 7390 perfekt!
Warum es native mit PHP nicht funktioniert verstehe ich zwar nicht - Aber egal :slight_smile:

Hallo,

leider hat es meine FB7270 geschrottet, so das ich eine FB7390 dranhängen mußte. Mit der FB7390 bekomme ich eine Socket Error. Was läuft da falsch ?:confused:

Andreas

Port vergessen zu öffnen auf der Box.

Danke Rainer,

#965 :rolleyes: hatte ich glatt vergessen zu aktivieren.

Da ich die Box bei der ersten Installation zerschossen hatte und ich nochmals einen neues Image drauf patchen mußte.

AVM hat leider ein „kleines“ Problem. Wenn du eine bei einer z.B. 7270 das Telefonbuch ausließt und danach eine 7390 aufrufst und danach etwas ändert schreibst du Müll in die Box. Das bewirkt dann zum Beispiel das du keine DECT-Geräte mehr anmelden kannst oder deine WLAN Verbindungen sind instabil und reconnecten häufig etc.
AVM kennt das Problemchen … aber würde ja fast nie passieren:mad:

Andreas

Kann mir vielleicht jemand von euch helfen und mir zeigen, was ich in abgehangenem Skript ändern muss, damit dies auch mit der neuen IPS 2.5 Version wieder läuft?

Momentan bekomme ich die Fehlermeldung:

Fatal error: Call to undefined function http_post_fields() in C:\Programme\ipsymcon_v2\scripts\18283.ips.php on line 22

Der gleiche Fehler wird wahrscheinlich nochmal auftreten bei Zeile 36.
Durch welchen neuen Befehl kann ich bitte den nicht mehr funktionierenden Befehl „function http_post_fields()“ ersetzen?

Hab mir natürlich schon die neuen Skripte angeschaut, werde daraus aber leider nicht (mehr) schlau. :confused:

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($ch);
$session_status_simplexml = simplexml_load_string($login);

if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
   $sendlogin = http_post_fields($fritzgui, $login);
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

$telefonbuch = array('getpage' => $fritzseite, 'sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'fonbuch');
$save = http_post_fields($fritzgui, $telefonbuch);

$dateiname = "C:/Programme/IPSYMCON_V2/webfront/user/Fritzbox/fonbuch.txt"; // Name der Datei

// Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
$handler = fOpen($dateiname , "w+");
fWrite($handler , $save); // Dateiinhalt in die Datei schreiben
fclose($handler);
?>

Hallo obicom,

Die Erweiterung php_http.dll wird mit PHP 5.4 nicht mehr unterstützt. Hier muß man auf die cURL-Erweiterung umsteigen.

Rainer hat mittlerweile alle seine Fritzbox-Skripte für die Version 2.5 umgebaut.

Schau Dir nochmal die Original-Threads an, dort wirst Du sicherlich fündig.

Danke Werner, das habe ich natürlich schon getan. Aber ich werde daraus nicht schlau. in dem für 2.5 angepasstem Skript wird nun mit Hilfe des Telefonbuchs nur nach dem Namen des letzten Anrufers gesucht (soweit ich das erkennen kann). Gibt es denn für den „alten“ Befehl keinen „einfachen“ Nachfolge Befehl?

Weil einfach einfach einfach ist. Nicht wirklich

Der der mit cURL nicht wirklich fit ist tut sich einfach schwer. Da zähle ich mich auch dazu.

Da ich nur die Steuerung (WLAN / AB) sowie den letzten Anruf nutze kann ich Dir leider hier nicht weiterhelfen. Da mußt Du auf ein Feedback von Rainer warten.

Sieh dir genau an was anderts geworden ist!

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);

$session_status_simplexml = simplexml_load_string($login);

if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
    preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

curl_setopt($ch, CURLOPT_POSTFIELDS, "getpage={$fritzseite}&sid={$SID}&var:menu=home&var:pagename=fonbuch");
$save = curl_exec($ch);

$dateiname = "C:/Programme/IPSYMCON_V2/webfront/user/Fritzbox/fonbuch.txt"; // Name der Datei

// Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
$handler = fOpen($dateiname , "w+");
fWrite($handler , $save); // Dateiinhalt in die Datei schreiben
fclose($handler);
curl_close($ch);
?>

Der Teil ist überall gleich, den muss man nur austauschen.

if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
    preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

Hallo Rainer,

erst einmal vielen dank für deine schnelle Hilfe.
Wie ich das sehe, musstest du nicht wirklich viel verändern. Wenn sich jemand wie ich aber gar nicht auskennt, der tut sich damit wirklich schwer.

Jemand wie du lacht vielleicht drüber, aber für mich sind das „Welten“ in die ich mich erst tagelang einlesen müsste um auch nur annähernd solch eine elegante Lösung zustande zu bringen.

Ich kanns nur noch mal wiederholen: DANKE ! :loveips:

Kurze Suche ist manchmal ausreichend … :wink:

Gruß
Bruno

Lieber Bruno,

natürlich habe ich vorher gesucht und auch das von den von Dir benannten Thread gefunden. Leider hat dieser aber einem NOB wie mir, wenig geholfen.
Solche Antworten wie die deine sind (IMHO) da leider wenig hilfreich …

Wieso die fast gleiche Antwort von damals und heute plötzlich Verständnis auslöst entzieht sich leider meiner Kenntnis und ist für mich nicht voraussehbar. Freut mich trotzdem, wenn es klappt. :wink:

Gruß
Bruno