Fritzbox 7270/Wlan Repeater Scripts

Ich hatte ja schon mal geschrieben, dass die SID benötigt wird.

Funktioniert nur mit Firmware ab xx.04.74 oder neuer. Ältere unterstützen keine Session !!
Diese gilt für alle Scripts !!!

So geht es, prof of concept.

Die benötigten Dateien im Anhang nach ext kopieren und Dienst neu starten.

Passwort eintragen.

Variable für Webfront anlegen mit Profil ~Switch. Variable dem Script zuweisen. Fertig.

Hier der Link. für SID.

Bitte kurzes Feedback.

Bei Problemen mit den Scripts, bitte hier posten. http://www.ip-symcon.de/forum/f52/probleme-scripts-fritzbox-7270-a-8269/

Script für Anruferliste ohne extension!

Viel Spass :slight_smile:

<?
if ($IPS_SENDER == "WebFront")
{
    SetValue(32754 /*[Anrufbeantworter]*/, $IPS_VALUE);
}

$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = 'xxxxxx';
$ein         = '1';
$aus         = '0';

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

if ($IPS_VALUE)
{
    $settam = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'tam:settings/TAM0/Active' => $ein));
}
else
{
   $settam = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'tam:settings/TAM0/Active' => $aus));
}

$logout = array('getpage' => $fritzseite, 'sid' => $SID, 'security:command/logout' => 'logout');
$sendlogout = http_post_fields($fritzgui, $logout);


?>


Script nur mit cURL Abfrage als Beispiel!

<?
if ($IPS_SENDER == "WebFront")
{
    $fritzbox_ip = 'fritz.box';
    $fritzgui    = 'http://fritz.box/cgi-bin/webcm';
    $fritzseite  = '../html/de/menus/menu2.html';
    $password    = 'xxxxx';
    $ein         = '1';
    $aus         = '0';

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

    if($IPS_VALUE)
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$ein}");
        curl_exec($ch);
    }
    else
    {
       curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&tam:settings/TAM1/Active={$aus}");
       curl_exec($ch);
    }
    curl_close($ch);
    SetValue($IPS_VARIABLE, $IPS_VALUE);
}

?>

dateien.rar (684 KB)

dateienV2.2.rar (726 KB)

Habe den Beitrag mal rauskopiert, da ich ihn für ein tolles und nützliches Skript halte :slight_smile:

paresy

Find ich auch und schon in der http://www.ip-symcon.de/forum/f52/script-library-sammlung-6234/.

Wlan ein/aus

$wlan = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'wlan:settings/ap_enabled' => $ein));
$wlan = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'wlan:settings/ap_enabled' => $aus));

Mediaserver ein/aus

$mediaserver = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'mediasrv:settings/enabled' => $ein));
$mediaserver = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'mediasrv:settings/enabled' => $aus));

Normal kann man so alles ein und aus schalten.
Auf der entsprechenden Seite der Fritzbox, rechter Mausklick=>Aktueller Frame=>Frame Quelltext anzeigen. Das gewünschte auswählen und in Script eintragen.

Mit Rückmeldung ob Ein oder Ausgeschaltet.

<?
if ($IPS_SENDER == "WebFront")
{
    $fritzbox_ip = 'fritz.box';
    $fritzgui    = 'http://fritz.box/cgi-bin/webcm';
    $fritzseite  = '../html/de/menus/menu2.html';
    $password    = 'xxxxxxx';
    $ein         = '1';
    $aus         = '0';

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

    if ($IPS_VALUE)
    {
        $settam = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'tam:settings/TAM0/Active' => $ein));
    }
    else
    {
       $settam = http_post_fields($fritzgui, array('getpage' => $fritzseite, 'sid' => $SID, 'tam:settings/TAM0/Active' => $aus));
    }

    $checksetting = array('getpage' => $fritzseite, 'var:menu' => 'home', 'var:pagemaster' => 'fondevices', 'var:pagename' => 'fondevices');
    $sendcheck = http_post_fields($fritzgui, $checksetting);
    preg_match('@name="tam:settings/TAM0/Active" value="([10])"@i', $sendcheck, $matches);
    if (isset($matches[1]) && $matches[1] == 1)
    {
        SetValue(32754 /*[Fritzbox\Anrufbeantworter\Anrufbeantworter]*/, 1);
    }
    else
    {
       SetValue(32754 /*[Fritzbox\Anrufbeantworter\Anrufbeantworter]*/, 0);
    }

    $logout = array('getpage' => $fritzseite, 'sid' => $SID, 'security:command/logout' => 'logout');
    $sendlogout = http_post_fields($fritzgui, $logout);
}

?>

Zum testen.

Im user Verzeichnis einen Ordner Fritzbox anlegen mit Datei Anrufliste.csv,
dort wird die Datei gespeichert und steht so auch in Excel Anwendungen zur Verfügung.
Wem das mit der Hintergrundfarbe nicht gefällt, kann dieses ändern, ist im Script vermerkt.

Kurzes Feedback wäre schön, ob alles geht.

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$filename   = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\Anrufliste.csv";// anpassen
$password    = 'xxxxxx';
$ein         = '1';
$aus         = '0';

$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;
    }
}
    
//Anrufliste aktualisieren 
$gotopage = array('getpage' => $fritzseite,'sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls'); 
$getnewlist = http_post_fields($fritzgui, $gotopage); 
 
//Anrufliste abholen 
$anrufliste = http_post_fields($fritzgui, array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID)); 
$anrufliste = explode(';', $anrufliste, 4); 
$anrufliste = $anrufliste[3]; 
$fileHandle = @fopen($filename, 'wb+'); 
@fwrite($fileHandle, $anrufliste); 
@fclose($fileHandle);  

    
$filename = "../webfront/user/Fritzbox/Anrufliste.csv"; 
$id = @fopen($filename, "r"); 
while ($data = fgetcsv($id, filesize($filename),";")) 
$table[] = $data; 
@fclose($id);

echo "<table width='995' border='0' cellspacing='0' cellpadding='0' style = 'background-color:#283040'>"; // Farbe anpassen oder style entfernen

foreach($table as $row)
{
    echo "<tr>";
    foreach($row as $data)
    echo '<td width="auto"><div align="center">'.$data.'</div></td>';
    echo "</tr>
";
}
echo "</table>
";

$logout = array('getpage' => $fritzseite, 'sid' => $SID, 'security:command/logout' => 'logout');
$sendlogout = http_post_fields($fritzgui, $logout);
?>

Hallo Rainer,

Dein Script funtioniert - vielen Dank dafür!

Hab mich auch schon länger mit der SID der Box herumgeschlagen. Durch Deinen Beitrag hat es dann auch bei mir „klick“ gemacht! :slight_smile:

Eine Kleinigkeit sollte noch in das Skript:
Damit man immer die aktuelle CSV-Datei bekommt, muss man diese vorher aktualisieren.
z.B.:


//Anrufliste aktualisieren
$gotopage = array('getpage' => $fritzseite,'sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls');
$getnewlist = http_post_fields($fritzgui, $gotopage);

//Anrufliste abholen
$anrufliste = http_post_fields($fritzgui, array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID));
$anrufliste = explode(';', $anrufliste, 4);
$anrufliste = $anrufliste[3];
$fileHandle = @fopen($filename, 'wb+');
@fwrite($fileHandle, $anrufliste);
@fclose($fileHandle);

Viele Grüße
MTec

Hallo MTec,

ist mir noch nicht aufgefallen. Danke.

Habs oben eingefügt.

Ja und wieder mal muss ich sagen … danke danke danke.
Läuft 1a :smiley:
Der WAF steigt stätig.

Grüße Mirco

Läuft 1a, danke für das Script

Gruß Sven

Vorraussetzung Freigabe des Port 1012 an der Fritzbox.
Zum öffnen des Port.
Angeschlossenes Telefon und #965 eingeben und Bestättigungston abwarten.
Zum Schliessen des Port.
Angeschlossenes Telefon und #964 eingeben und Bestättigungston abwarten.

[ul]
[li]Script anlegen[/li][li]Client Socket anlegen, IP Adresse und Port Fritzbox eintragen.[/li][li]Registervariable anlegen und mit Client Socket verbinden, das Script der Registervariable zuweisen.[/li][li]Dummymodul anlegen.[/li][li]Stringvariablen anlegen, Profil ~Textbox[/li][/ul]

<?

// Daten aus Registervariable lesen
$daten = explode(";", $IPS_VALUE);

// Datum/Uhrzeit mit ausgeben
define ("datetime", $daten[0]);

// Nummern ohne Eintrag im öffentlichen Telefonbuch welche aber bekannt sind und übertragen werden ($intern).
// unendlich erweiterbar
  $array["Nummer"][1] = "xxxxxx";
  $array["Name"]  [1] = "Rainer";
  $array["Nummer"][2] = "xxxxxxx";
  $array["Name"]  [2] = "Gabi";
  $array["Nummer"][3] = "xxxxxx";
  $array["Name"]  [3] = "Rainer Handy";
  $array["Nummer"][4] = "xxxxx";
  $array["Name"]  [4] = "Rainer Firma";
  $array["Nummer"][5] = "";
  $array["Name"]  [5] = "Unbekannt";
  $array["Nummer"][6] = "xxxxxx";
  $array["Name"]  [6] = "Ernst ";

// Daten aus Registervariable auswerten
switch($daten[1])
{
    case "RING":
   $Rufnummer = $daten[3];
    if(in_array($Rufnummer, $array["Nummer"]))
   {
       $intern = array_search($Rufnummer, $array["Nummer"]);
       SetValue(30996 /*[Fritzbox\Anrufe\Eingehender Anruf]*/, "am ".datetime. " von ".$array["Name"][$intern]);
       SetValue(27227 /*[Fritzbox\Anrufe\Letzter Anruf]*/, "am ".datetime. " von ".$array["Name"][$intern]);
       echo "Anruf am ".datetime. " von ".$array["Name"][$intern];
       return;
   }
   else
   {
      $Rufnummer = SucheNummer($Rufnummer);
   }
   break;
   
   case "CALL":
   $interneNummer = $daten[4];
   if ($interneNummer == 982966)
   {
      $interneNummer = "Rainer";
    }
    else
    {
       $interneNummer = "Gabi";
    }
    $externeNummer = $daten[5];
    SetValue(25006 /*[Fritzbox\Anrufe\Ausgehender Anruf]*/, "von ".$interneNummer." zu ".$externeNummer);
   break;
                
   case "DISCONNECT":
   RegVar_SetBuffer(35544 /*[Fritzbox\FritzPort1012]*/, "");
   SetValue(30996 /*[Fritzbox\Anrufe\Eingehender Anruf]*/, "");
   SetValue(25006 /*[Fritzbox\Anrufe\Ausgehender Anruf]*/, "");
   return;
   break;
}

function SucheNummer($Rufnummer)
{
   $url_orig="http://www.klicktel.de/inverssuche/index/search?method=searchSimple&_dvform_posted=1&phoneNumber=#TEL#";
   $url = str_replace("#TEL#", $Rufnummer, $url_orig);
   $Ausgabe = fopen($url, "r");
   if (!$Ausgabe)
    {
      echo("ERROR : Kann URL nicht öffnen : $url
");
   }
   $lineNb     = 0;
   $searchTag0 = 'namelink';
   $searchTag1 = '<strong>';
   $searchTag2 = '</strong>';
   $gefunden   = 0;
   while(!$gefunden && !feof($Ausgabe))
   {
       $lineNb++;
        $buffer = fgets($Ausgabe);
      if (strpos($buffer, $searchTag0) != false)
      {
            $gefunden = 1;
            $startLN = strpos($buffer, $searchTag1) + strlen($searchTag1);
          $endeFN = strpos($buffer, $searchTag2) ;
            $Name = substr($buffer, $startLN, $endeFN - $startLN) ;
            $Name = html_entity_decode($Name);
            SetValue(30996 /*[Fritzbox\Anrufe\Eingehender Anruf]*/, "am ".datetime. " von ".$Name);
            SetValue(27227 /*[Fritzbox\Anrufe\Letzter Anruf]*/, "am ".datetime. " von ".$Name);
            echo "Anruf am ".datetime. " von ".$Name;
      }
   }
   fclose($Ausgabe);
   return $Name;
}

?>

Hallo Rainer,
läuft super, danke!
Ich habe noch einen else Zweig eingefügt, damit die Rufnummer eingefügt wird wenn der Name nicht gefunden wird.

while(!$gefunden && !feof($Ausgabe))
   {
       $lineNb++;
        $buffer = fgets($Ausgabe);
        //echo $buffer;
      if (strpos($buffer, $searchTag0) != false)
      {
            $gefunden = 1;
            $startLN = strpos($buffer, $searchTag1) + strlen($searchTag1);
            $endeFN = strpos($buffer, $searchTag2) ;
            $Name = substr($buffer, $startLN, $endeFN - $startLN) ;
            $Name = html_entity_decode($Name);
            SetValue(53165 /*[Telefon\Telefon\Anrufer]*/, $Name);
            #echo "Anruf von " . $Name;
       }
       else
       {
        SetValue(53165 /*[Telefon\Telefon\Anrufer]*/, $Rufnummer);

         }

Würdet ihr bitte, wenn ihr ältere Beiträge ändert, den Grund näher erläutern.
Ein >Text erweitert/Script aktualisiert/Bild hinzugefügt< o.ä. würde schon reichen.
Danke

Hallo Rainer,

deine Skripte für die Fritzbox sind einfach super.
Was mir noch fehlt, ist die Anzeige für die Onlinezeit meiner Kinder.

Hier noch mal ein Script zum auslesen der Budgetzeit von User2 am Freitag.

Das ganze kann für alle Tage und User entsprechend Code angelegt werden.

Die Ausgabe im Webfront kann dann z.B. so aussehen. :slight_smile:

<?
$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">@', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}
$heute = date('d.m.y');
$user2ip = array('getpage' => $fritzseite, 'sid' => $SID, 'var:menu' => 'internet', 'var:pagename' => 'useradd2', 'var:userid' => 'user2');
$checkuserip = http_post_fields($fritzgui, $user2ip);
preg_match('@name="user:settings/user2/name" value="(\b(?:\d{1,3}\.){3}\d{1,3}\b)"@', $checkuserip, $ipuser2); // IP-Adresse
$ip2 = $ipuser2[1];

$user2time = array('getpage' => $fritzseite, 'var:menu' => 'internet', 'var:pagename' => 'useradd2', 'var:userid' => 'user2');
$checkusertime = http_post_fields($fritzgui, $user2time);
preg_match('@name="user:settings/user2/budget_time_friday" value="(((\b[0-9]+)?\.)?[0-9]+\b)"@', $checkusertime, $budgettime); // Zeit auslesen
$user2budget = $budgettime[1]/3600;
$maxtime = "Testrechner mit IP-Adresse $ip2 hat am $heute eine Budgetzeit von $user2budget h";

SetValue(45621 /*[Fritzbox\Online Zeit\Budgetzeit]*/, $maxtime);

$logout = array('getpage' => $fritzseite, 'sid' => $SID, 'security:command/logout' => 'logout');
$sendlogout = http_post_fields($fritzgui, $logout);


?>

Guten Morgen zusammen,

ich würde mir noch ein Button wünschen, bei dessen betätigen sich die Anruferliste in der Fritzbox resetet sprich alle Anrufe in der Liste werden gelöscht.

Grüße Mirco

Das sieht ja wohl super aus … was jetzt noch fehlt, um es absolut zu perfektionieren, wäre 1.) das gleiche mit dem FritzBox Telefonbuch zu machen, also abholen und anzeigen … und dann 2.) mit Hilfe des Telefonbuchs und ggfs. der KlickTel ReverseSuche die Anrufliste mit „Namen“ füllen. Das gleiche mache ich ja immer noch über JFritz und XML Dateien. Dies auf dem von Dir beschriebenen Weg umzustellen, wäre natürlich der absolute Hit !!

Ich habe die beiden Scripte von RWN Quick and dirty zusammengepackt.
Bei Meldung ‚Ring‘ wird der Name ausgegeben, bei ‚Disconnect‘ wird die Tabelle generiert und in einer IPS Variablen abgelegt. Dann kann man sie schnell aufrufen ohne auf die Fritzbox warten zu müssen.

Bei Interesse kann ich das mal online stellen.

Allerdings ist noch kaum etwas kommentiert und mein ‚Programierstiel‘ dürfte etwas holperig sein :rolleyes:

Gruß
Klaus

Hallo Klaus,
ich hätte schon interesse an dein script, bin gerade dabei dies in mein Projekt einzufügen.

cu uwe

Das folgende Script habe ich an die REGVar geknüpft.


   <?

// Daten aus Registervariable lesen
$daten = explode(";", $IPS_VALUE);

// Nummern ohne Eintrag im öffentlichen Telefonbuch welche aber bekannt sind und übertragen werden ($intern).
// unendlich erweiterbar
  $array["Nummer"][1] = "xxxx";
  $array["Name"]  [1] = "Susi und Klaus";
  $array["Nummer"][2] = "xxxxx";
  $array["Name"]  [2] = "Klaus Mobil";
  $array["Nummer"][3] = "xxxxxx";
  $array["Name"]  [3] = "Klaus Danfoss";
  $array["Nummer"][4] = "xxxxx";
  $array["Name"]  [4] = "Rainer Firma";
  $array["Nummer"][5] = "";
  $array["Name"]  [5] = "Ohne Nummer";
  $array["Nummer"][6] = "xxxxxx";
  $array["Name"]  [6] = "Ernst ";

// Daten aus Registervariable auswerten
switch($daten[1])
{
    #Ab hier Auswertung für Anrufer-------------------------------------------------
     case "RING":
    $Rufnummer = ($daten[3]);
    if(in_array($Rufnummer, $array["Nummer"]))
   {
       $intern = array_search($Rufnummer, $array["Nummer"]);
       SetValue(53165 /*[Telefon\Telefon\letzter Anrufer]*/, $array["Name"][$intern]);
       #echo "Anruf von " .  $array["Name"][$intern];
       return;
   }
   else
   {
      $Rufnummer = SucheNummer($Rufnummer);
   }
   break;
   #Ab hier Auswertung für Anrufliste----------------------------------------------
    case "DISCONNECT":
   RegVar_SetBuffer(48728 /*[Telefon\FritzBoxRegVar]*/, "");  #ANPASSEN!

   $anrufliste="";
   $fritzbox_ip = 'fritz.box';
   $fritzgui    = 'http://fritz.box/cgi-bin/webcm';
   $fritzseite  = '../html/de/menus/menu2.html';
   $filename   = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\Anrufliste.csv";// anpassen
   $password    = 'xxxxxxxxx';  #ANPASSEN!
   $ein         = '1';
   $aus         = '0';

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

     //Anrufliste aktualisieren
    $gotopage = array('getpage' => $fritzseite,'sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls');
    $getnewlist = http_post_fields($fritzgui, $gotopage);

    //Anrufliste abholen
    $anrufliste = http_post_fields($fritzgui, array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID));
    $anrufliste = explode(';', $anrufliste, 4);
    $anrufliste = $anrufliste[3];
    $fileHandle = @fopen($filename, 'wb+');
    @fwrite($fileHandle, $anrufliste);
    @fclose($fileHandle);

    //Anrufliste einlesen
    $filename = "../webfront/user/Fritzbox/Anrufliste.csv";
    $id = @fopen($filename, "r");
    while ($data = fgetcsv($id, filesize($filename),";"))
      $table[] = $data;
    @fclose($id);
    //Anrufliste auswerten
    $anruferliste="<table width=\'100%\' border=\'0\' cellspacing=\'0\' cellpadding=\'8\' ><tr> <td width=\'35%\'>Anrufer</td><td width=\'28%\'>Nummer</td><td width=\'32%\'>Datum</td>  <td width=\'10%\'>Dauer</td><td width=\'5%\'><div align=\'center\'>Ange..</div></td></tr><tr><td width=\'auto\'><div align=\'center\'> </div></td> <td width=\'auto\'><div align=\'center\'> </div></td> <td width=\'auto\'> </td> <td width=\'auto\'> </td><td width=\'auto\'> </td></tr>";
    array_shift($table); #die ersten drei Zeilen aus dem Array löschen
    array_shift($table);#die ersten drei Zeilen aus dem Array löschen
    array_shift($table);#die ersten drei Zeilen aus dem Array löschen
    foreach($table as $row)#Rest der Tabelle auswerten
      {
      if ($row[0]<> 3)  #Abgehende Anrufe ausblenden
        {
#-----------------------------------------------------------------------------
          $Rufnummer = $row[3];  #Rufnummer aus Array holen
            if(in_array($Rufnummer, $array["Nummer"]))
          {
          $intern = array_search($Rufnummer, $array["Nummer"]);
           $row[2]=$array["Name"][$intern];  #Namen in Array schreiben
            }
        else
          {
           $url_orig="http://www.klicktel.de/inverssuche/index/search?method=searchSimple&_dvform_posted=1&phoneNumber=#TEL#";
           $url = str_replace("#TEL#","$Rufnummer",$url_orig);
           $Ausgabe = fopen($url, "r");
           if (!$Ausgabe)
             {
             echo("ERROR : Kann URL nicht öffnen : '$url'
");
             }
           $lineNb     = 0;
           $searchTag0 = 'namelink';
           $searchTag1 = '<strong>';
           $searchTag2 = '</strong>';
           $gefunden   = 0;
           while(!$gefunden && !feof($Ausgabe))
               {
              $lineNb++;
              $buffer = fgets($Ausgabe);
              if (strpos($buffer, $searchTag0) != false)
                {
                $gefunden = 1;
                $startLN = strpos($buffer, $searchTag1) + strlen($searchTag1);
                $endeFN = strpos($buffer, $searchTag2) ;
                $Name = substr($buffer, $startLN, $endeFN - $startLN) ;
                $Name = html_entity_decode($Name);
                $row[2]=$Name;
                }
              else $row[2]="unbekannt";  #Keine Nummer gefunden
          }
         }
       echo "<tr>";
       if ($row[0] == 1) $row[0]="Ja";  #Angenommen JA
       else $row[0]="Nein";             #Angenommen Nein
       #Jetzt Zeile in String speichern
       $anruferliste= $anruferliste.'<tr><td width="auto">'.$row[2].'</td><td width="auto">'.$row[3].'</td><td width="auto">'.$row[1].'</td><td width="auto">'.$row[6].'</td><td width="auto"><div align="center">'.$row[0].'</div></td></tr>';
   }
}

$anruferliste =$anruferliste."</table>
";
setvalue(29974 /*[Telefon\Telefon\Anruferliste]*/, $anruferliste);  #ANPASSEN!  IPS Variable für speichern der Liste
#echo $anruferliste;
$logout = array('getpage' => $fritzseite, 'sid' => $SID, 'security:command/logout' => 'logout');
$sendlogout = http_post_fields($fritzgui, $logout);










#--------------------------------------------------------------------------------
    return;
   break;
}

function SucheNummer($Rufnummer)
{
   $url_orig="http://www.klicktel.de/inverssuche/index/search?method=searchSimple&_dvform_posted=1&phoneNumber=#TEL#";
   $url = str_replace("#TEL#","$Rufnummer",$url_orig);
   $Ausgabe = fopen($url, "r");
   if (!$Ausgabe)
    {
      echo("ERROR : Kann URL nicht öffnen : '$url'
");
   }
   $lineNb     = 0;
   $searchTag0 = 'namelink';
   $searchTag1 = '<strong>';
   $searchTag2 = '</strong>';
   $gefunden   = 0;
   while(!$gefunden && !feof($Ausgabe))
   {
       $lineNb++;
        $buffer = fgets($Ausgabe);
        //echo $buffer;
      if (strpos($buffer, $searchTag0) != false)
      {
            $gefunden = 1;
            $startLN = strpos($buffer, $searchTag1) + strlen($searchTag1);
            $endeFN = strpos($buffer, $searchTag2) ;
            $Name = substr($buffer, $startLN, $endeFN - $startLN) ;
            $Name = html_entity_decode($Name);
            SetValue(53165 /*[Telefon\Telefon\letzter Anrufer]*/, $Name);  #ANPASSEN!
      }
       else
       {
        SetValue(53165 /*[Telefon\Telefon\letzter Anrufer]*/, $Rufnummer); #ANPASSEN!

         }
   }
   fclose($Ausgabe);
   return $Name;
}

?>

Mir ist klar, dass ich die Funktion zur Rückwärtssuche zwei mal drinnen habe. Ich bin halt nur froh, das es erst einmal läuft :rolleyes:

Schöner machen kann man es immer noch.

Den Inhalt der Variablen hole ich mir dann in einem anderen Script, dass ich vom Webfront aus aufrufe:

<?
$anruferliste=getvalue(29974 /*[Telefon\Telefon\Anruferliste]*/); #ANPASSEN!
echo $anruferliste;
?>

Das geht schneller als erst die Daten aus der Fritzbox zu holen wenn man die Liste ausgeben will. Die Rückwertssuche dauert einige Sekunden.

Fragen beantworte ich gern. Für weite Teile habe ich RWNs Scripte benutzt (Danke RWN!). Da kann ich nur versuchen zu helfen. (Vieles davon verstehe ich leider nicht)

Gruß
Klaus

Anmerkung: Ich gebe nur ankommende Anrufe in der Liste aus und nur ob angenommen, Name, Anrufernummer und Datum.
Wer mehr will muß die HTML Ausgabe erweitern.