Anruferliste aus FritzBox auslesen

Dieses Skript liest die Anruferliste der FritzBox aus und erstellt eine Tabelle die im WebFront als TextBox dargestellt werden kann.

Der Vorteil dieser Version ist, dass sie KEINE PHP Extensions benötigt.
Die HTTP/CURL/MBString Extensions werden nicht benötigt.

Dank an RWN - Der Code basiert auf auf seinen Skripten :slight_smile:

Vorraussetzung: Eine FritzBox mit einer Firmware besser als xx.xx.76

Um die Icons für eingehende/abgehende Anrufe anzuzeigen, müsst ihr im folgenden Ordner die Icons reinkopieren:


/webfront/user/fritz/Callin.png
/webfront/user/fritz/Callinfailed.png
/webfront/user/fritz/Callout.png

Passende Icons: http://www.ip-symcon.de/forum/82275-post45.html


<?

//Konfiguration
$fritzbox = 'fritz.box';
$fritzgui = 'http://' . $fritzbox . '/cgi-bin/webcm';
$password = 'blabla';
$anzeigen = array(1, 2, 3); //1 = Kommend, 2 = Kommend (Fehler), 3 = Gehend
$anzahl = 10;

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//Installer
if ($IPS_SENDER == "Execute")
{

    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Auslese-Skript");

    $parentObject = IPS_GetObject($parentID);
    if ($parentObject['ObjectType'] !== 1)
    {
        $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($instanceID, $parentID);
        $parentID = $instanceID;
        IPS_SetParent($IPS_SELF, $parentID);
        IPS_SetName($instanceID, "Anruferliste");
    }
    
    IPS_SetScriptTimer($IPS_SELF, 300);

}

$login = file_get_contents('http://' . $fritzbox . '/cgi-bin/webcm?getpage=../html/login_sid.xml');

$session_status_simplexml = @simplexml_load_string($login);

if($session_status_simplexml === false)
{
    die("Fehler beim einlesen der XML Daten. Wahrscheinlich ist eine zu alte Firmware installiert");
}
else if ($session_status_simplexml->iswriteaccess == 1)
{
    $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
    $response = $challenge . '-' . md5(iconv("UTF-8", "UCS-2LE", $challenge . '-' . $password));
   $postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'login:command/response' => $response));
   
    $opts = array('http' =>
                                array(
                                    'method' => 'POST',
                                 'header' => 'Content-Length: '.strlen($postdata)."
".
                                                'Content-Type: application/x-www-form-urlencoded',
                                    'content'=> $postdata
            )
    );

    $context  = stream_context_create($opts);
   $sendlogin = file_get_contents($fritzgui, false, $context);
   
   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;
    }
}

//Anrufliste aktualisieren
$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html','sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$getnewlist = file_get_contents($fritzgui, false, $context);

//Anrufliste abholen
$postdata = http_build_query(array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$anrufliste = file_get_contents($fritzgui, false, $context);
$anrufliste = explode("
", $anrufliste);

$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
$str .= "<tr><td></td><td><b>Datum</b></td><td><b>Name/Rufnummer</b></td><td><b>Nebenstelle</b></td><td><b>Zeit</b></td></tr>";

$pos = 0;
for($i=3; $i<=sizeof($anrufliste); $i++)
{
    $eintrag = explode(";", $anrufliste[$i]);
    if(strlen($eintrag[2]) > 0)
      $eintrag[3] = $eintrag[2];
    unset($eintrag[2]);
    if(strlen($eintrag[4]) > 0)
      $eintrag[5] = $eintrag[4];
    if(strlen($eintrag[3]) == 0)
      $eintrag[3] = "Unbekannt";
    unset($eintrag[4]);
    $caller = $eintrag[0];
    switch($caller) {
       case 1:
          $eintrag[0] = "<img src=/user/fritz/Callin.png>";
          break;
       case 2:
          $eintrag[0] = "<img src=/user/fritz/Callinfailed.png>";
          break;
       case 3:
          $eintrag[0] = "<img src=/user/fritz/Callout.png>";
          break;
        default:
           $eintrag[0] = "";
           break;
    }
    if(in_array($caller, $anzeigen))
    {
        $str .= "<tr>";
        foreach($eintrag as $data)
            $str .= '<td>'.$data.'</td>';
        $str .= "</tr>";
        
        $pos++;
    }
    if($pos >= $anzahl)
        break;
}
$str .= "</table>";

$vid = CreateVariableByName($parentID, "Content", 3);
IPS_SetIcon($vid, "Speaker");
IPS_SetVariableCustomProfile($vid, "~HTMLBox");
SetValue($vid, $str);

$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'sid' => $SID, 'security:command/logout' => 'logout'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$logout = file_get_contents($fritzgui, false, $context);

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}

?>

Hay
habe mal die Icons überarbeitet

viel spass

mike

Callout.png

Callinfailed.png

Callin.png

Fritzbox.png

[… das zitieren können wir uns einfach mal sparen…]

Ich habe das um eine Suche des Namens erweitert.


//Konfiguration
$fritzbox = 'fritz.box';
$fritzgui = 'http://' . $fritzbox . '/cgi-bin/webcm';
$password = 'blablablablablabl';
$anzeigen = array(1, 2, 3); //1 = Kommend, 2 = Kommend (Fehler), 3 = Gehend
$anzahl = 17;                 // Anzahl der Anrufe einstellen
$namenbeschneiden = 50;       // Den Namen abschneiden nach


//Ab hier nichts mehr ändern
function TextAbschneiden($Text, $Laenge)
{
    $GekuerzterText = substr($Text, 0, strpos(wordwrap($Text, $Laenge-1, "*!U-M-B-R-U-C-H*"), "*!U-M-B-R-U-C-H*"));

    if($GekuerzterText)
    {
        return $GekuerzterText;
    }
    else
    {
        return $Text;
    }
}
function TelSuche($callerNumber) {
$url_orig="http://www.klicktel.de/inverssuche/index/search?method=searchSimple&_dvform_posted=1&phoneNumber=#TEL#";
$url=str_replace("#TEL#","$callerNumber",$url_orig);
$handle=fopen("$url", "r");
if (!$handle)
{
   // error cannot open file
   echo("ERROR : CANNOT OPEN URL : '$url'
");
}
$lineNb = 0;
$searchTag0 = 'namelink';
$searchTag01 = '<strong>';
$searchTag02 = '</strong>';
$found = 0 ;
while(!$found && !feof($handle))
{
    $lineNb++;
    $buffer = fgets($handle);

    if (strpos($buffer, $searchTag0) != false)
    {
        //echo "Name gefunden in Zeile: ".$lineNb."
";
        $found = 1 ;

        $startLN = strpos($buffer, $searchTag01);
        $endeFN = strpos($buffer, $searchTag02) ;
        $name = substr($buffer, $startLN+8, $endeFN) ;
        $foundName1 = $name;
    }
    else {$foundName1 = "Unbekannt";}
}
fclose($handle);
$foundName1 = html_entity_decode($foundName1);
return $foundName1;
}


$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

//Installer
if ($IPS_SENDER == "Execute")
{

    IPS_SetHidden($IPS_SELF, true);
    IPS_SetName($IPS_SELF, "Auslese-Skript");

    $parentObject = IPS_GetObject($parentID);
    if ($parentObject['ObjectType'] !== 1)
    {
        $instanceID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($instanceID, $parentID);
        $parentID = $instanceID;
        IPS_SetParent($IPS_SELF, $parentID);
        IPS_SetName($instanceID, "Anruferliste");
    }

    IPS_SetScriptTimer($IPS_SELF, 300);

}

$login = file_get_contents('http://' . $fritzbox . '/cgi-bin/webcm?getpage=../html/login_sid.xml');

$session_status_simplexml = @simplexml_load_string($login);

if($session_status_simplexml === false)
{
    die("Fehler beim einlesen der XML Daten. Wahrscheinlich ist eine zu alte Firmware installiert");
}
else if ($session_status_simplexml->iswriteaccess == 1)
{
    $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
    $response = $challenge . '-' . md5(iconv("UTF-8", "UCS-2LE", $challenge . '-' . $password));
   $postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'login:command/response' => $response));

    $opts = array('http' =>
                                array(
                                    'method' => 'POST',
                                 'header' => 'Content-Length: '.strlen($postdata)."
".
                                                'Content-Type: application/x-www-form-urlencoded',
                                    'content'=> $postdata
            )
    );

    $context  = stream_context_create($opts);
   $sendlogin = file_get_contents($fritzgui, false, $context);

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

//Anrufliste aktualisieren
$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html','sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$getnewlist = file_get_contents($fritzgui, false, $context);

//Anrufliste abholen
$postdata = http_build_query(array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$anrufliste = file_get_contents($fritzgui, false, $context);
$anrufliste = explode("
", $anrufliste);

$str = "<table width='90%' align='center'>"; // Farbe anpassen oder style entfernen
$str .= "<tr><td></td><td><b>Datum</b></td><td><b>Name</b></td><td><b>Rufnummer</b></td><td><b>Nebenstelle</b></td><td><b>Zeit</b></td></tr>";

$pos = 0;
for($i=3; $i<=sizeof($anrufliste); $i++)
{
    $eintrag = explode(";", $anrufliste[$i]);
        if($eintrag[2] == "")
      $eintrag[2] = TextAbschneiden(TelSuche($eintrag[3]), $namenbeschneiden);
        if(strlen($eintrag[4]) > 0)
      $eintrag[5] = $eintrag[4];
    if(strlen($eintrag[3]) == 0)
      $eintrag[3] = "Keine Nummer";
    unset($eintrag[4]);
    $caller = $eintrag[0];
        switch($caller) {
       case 1:
          $eintrag[0] = "<img src=/user/fritz/Callin.png>";
          break;
       case 2:
          $eintrag[0] = "<img src=/user/fritz/Callinfailed.png>";
          break;
       case 3:
          $eintrag[0] = "<img src=/user/fritz/Callout.png>";
          break;
        default:
           $eintrag[0] = "";
           break;
    }
    if(in_array($caller, $anzeigen))
    {
        $str .= "<tr>";
        foreach($eintrag as $data)
            $str .= '<td>'.$data.'</td>';
        $str .= "</tr>";

        $pos++;
    }
    if($pos >= $anzahl)
        break;
}
$str .= "</table>";

$vid = CreateVariableByName($parentID, "Content", 3);
IPS_SetIcon($vid, "speaker");
IPS_SetVariableCustomProfile($vid, "~HTMLBox");
SetValue($vid, $str);

$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'sid' => $SID, 'security:command/logout' => 'logout'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$logout = file_get_contents($fritzgui, false, $context);

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}

Habe mal alle Beiträge aufgeräumt. Ladet euch das für euch passende Skript neu und tauscht es aus. Dann wird alles wieder gut. Die Icons sind jetzt per default png, weil die von Mike einfach toll sind :slight_smile:

paresy

Super geht bei mir! Dankeschön.

Hallo zusammen,

das Skript ist echt super. Nur leider springt die Content-Variable nach kurzer Zeit von HTMLBox wieder in String zurück. Wie kann ich das dauerhaft auf HTMLBox einstellen?

Danke im voraus

Weil dann folgende Zeile in deinem Skript scheinbar noch nicht angepasst:

IPS_SetVariableCustomProfile($vid, "~HTMLBox");

Bei Dir wird dort wohl noch „~TextBox“ stehen.

Hallo zusammen,

hier mal eine kleine Erweiterung, die das Update sofort nach Beendigung eines Anrufes ausloesst und zusaetzlich bei einem Anruf eine kleine Notification im Webfont anzeigt.
Um das möglich zu machen muss auf der Fritzbox der Anrufmonitor freigeschaltet werden. Dazu auf einem analogen Anschluss #965 waehlen. Dies oeffnet einen TCP Port auf 1012 an dem IPS lauschen kann.

das Notify Script:

<?
$callmonitor = explode(";", $IPS_VALUE);

print $IPS_VALUE;

if ($callmonitor[1] == "RING")
{
WFC_SendNotification ( 21503 /*[WebFront Configurator]*/, "Anruf!", $callmonitor[3], "", 60);
}

if ($callmonitor[1] == "DISCONNECT")
{
IPS_RunScript(16820 /*[Telefon\Anruferliste\Auslese-Skript]*/);
}

?>

Gruss, Michael

PS. ich denke, das ist noch ausbaufähig;)

Danke Michael,

endlich eine Alternative zur Benachrichtigung durch das fehlerhafte ISDN-Modul.:slight_smile:
Übrigens: der Anrufmonitor der Fritzbox lässt sich auch von jedem DECT-Gerät freischalten.

@ robi,

nicht das es sowas noch nicht gegeben hätte.

das gibt es noch zig mal in anderen Ausführungen. :slight_smile:

@RWN, tja, is halt schade das solche Sachen (incl. dem IPS Manual) in den Untiefen dieses Forums stecken…

Gruss, Michael

Hallo Michael,

die Doku ist nicht im Forum sondern unter Service. Dort befindet sich dick ein Button „Dokumentation“.

Hier hilft auch ein Blick hinein.

Hallo,

beim Versuch den Client Socket zu öffnen bekomme ich folgende Meldung (siehe Anhang). Die erste Frage wäre wohl, wieso stimmen die Ports nicht überein???

Hat jemand ein Erklärung?

Chris

socket.jpg

Wenn der Port in der Box nicht offen ist kommt so eine Meldung!

Habe den Anrufmonitor erneut aktiviert, jetzt funktioniert es.

Gruß,

Christian

Da fällt mir doch glatt mein Lieblingswitz ein:

Kunde: Mein Monitor geht nicht.
Support: Ist er angeschaltet?
Kunde: Ja, ich bin doch nicht blöd!
Support: Dann schalten sie ihn bitte aus.
Kunde: Komisch, jetzt geht er…

Der ist GUT :smiley:

vlt sollten wir hier noch eine Witzeseite eröffnen-

tusch :slight_smile: geil!

Achso, nebenbei, gibts eine Möglichkeit die HTML Sache einfach mit einem Befehl aus dem String raus zu löschen damit man die Daten in einer sauberen String Variable hätte um evtl. eine Email weiter zu leiten?

Gruß

Kai

Hallo Kai,

strip_tags entfernt alle PHP- und HTML-Tags aus einem String.

Als Alternative könntest Du parallel zur „$str“ eine eigene Stringvariable in der gewünschten Formatierung mitschreiben.

Viele Grüße
Roland