Anrufer im Verzeichnis der Fritzbox finden

Dieses Script stellt eine Funktion bereit, mit der eine übergebene Rufnummer in einer Sicherungskopie des Fritzbox Telefonverzeichnisses gesucht wird.
Der Zugriff auf diese Datei ist sehr schnell möglich, im Gegensatz zum Webfront der Fritzbox. Da ist bei mir das Telefonbuch schnarchlangsam.

Ob alle Fritzboxen das Telefonbuch in gleichen XML-Format sichern, ist mir nicht bekannt. Aber mit der 7270 klappt es in jedem Fall.

<?
function Name_aus_Liste($Rufnummer) {
$gefunden = false;
	$daten = file_get_contents("./Telefonbuch.xml");
	$daten = explode("<contact>" , $daten);
	for ($zaehler = 1; $zaehler < count($daten); $zaehler++) {
		ereg("\">(.*)</number>" , $daten[$zaehler] , $nummer);
		// Vielleicht sind mehrer Nummern zu diesem Kontakt vorhanden:
		$nummern = explode("
", $nummer[1]);
		for ($zaehler2 = 0; $zaehler2 < count($nummern); $zaehler2++) {
      	$pos = stripos($Rufnummer, $nummern[$zaehler2]);
			if ($pos !== false ) {
         	$gefunden = true;
         }
			else {
				$pos = stripos($nummern[$zaehler2], $Rufnummer);
				if ($pos !== false ) {
	         	$gefunden = true;
	         }
	 		}
	 		// Jetzt noch den Namen zur Nummer suchen und raus:
	 		if ($gefunden) {
	 			ereg("<realName>(.*)</realName>" , $daten[$zaehler] , $name);
	 			return $name[1];
	 		}
		}
	}
}
?>

Ja ich weiß, dass dieser Beitrag schon 2 Jahre her ist :p.
Wollte nur kurz mal 2 Scripte dazu packen, da man ja erstmal an die XML (Telefonbuch) rankommen muss und wegen der veralteten Funktion „ereg“ PHP etwas zickig reagiert.

(mein)Ziel:
Wenn ein Anruf rein kommt, soll erst eine namentliche Zuordnung zum internen Telefonbuch versucht werden und danach eine Suche beim „Örtlichen“. Die Zuordnung soll direkt geschehen, um bereits den Namen ansagen/anzeigen zu lassen ehe man dran gegangen ist. Später bringt nix, da weiß ich es auch so :stuck_out_tongue:

Keine dieser Scripte hab ich wirklich selbst geschrieben, nur aus Foren zusammengesucht und angepasst.

Telefonbuch aus Fritzbox holen:

<?
//Daten anpassen
	$FritzBox="192.168.178.2";
	$Password="xxxxxxxxx";
   $filename   = IPS_GetKernelDir()."\	elefon\\rohdaten\	elefonbuch.xml";
   
//ab hier nichts mehr verändern
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, "http://".$FritzBox."/cgi-bin/webcm?getpage=../html/login_sid.xml");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	preg_match('/<Challenge>([0-9a-f]*)<\/Challenge>/', curl_exec($ch), $matches);
	$Challenge = $matches[1];
	$CPSTR=$Challenge."-".$Password;
	$MD5=md5(iconv("ISO8859-1", "UTF-16LE", $CPSTR));
	$RESPONSE=$Challenge."-".$MD5;
	curl_setopt($ch, CURLOPT_URL, "http://".$FritzBox."/cgi-bin/webcm");
	curl_setopt($ch, CURLOPT_POST, 1);
	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);
	$SID = $matches[1];
	curl_setopt($ch, CURLOPT_URL, "http://".$FritzBox."/cgi-bin/firmwarecfg");
	curl_setopt($ch, CURLOPT_POSTFIELDS, array("sid" => $SID, "PhonebookId" => 0, "PhonebookExportName" => "Telefonbuch", "PhonebookExport" => "") );
	$xml =  curl_exec($ch);
	curl_close($ch);
	$fileHandle = @fopen($filename, 'wb+');
	@fwrite($fileHandle, $xml);
	@fclose($fileHandle);
?>

Namen zu Nummer aus dem Telefonbuch ermitteln:

<?
//$Rufnummer muss beim Aufruf übergeben werden
$gefunden = false;
$daten = file_get_contents("..\	elefon\\rohdaten\	elefonbuch.xml");
$daten = explode("<contact" , $daten);
for ($zaehler = 1; $zaehler < count($daten); $zaehler++) {
	preg_match_all('#>(.*)</number>#', $daten[$zaehler] , $nummer); //finde alle Nummern zu Kontakten
   $nummern=$nummer[1];
   for ($zaehler2 = 0; $zaehler2 < count($nummern); $zaehler2++) {// Vielleicht sind mehrer Nummern zu diesem Kontakt vorhanden:
      $pos = stripos($Rufnummer, $nummern[$zaehler2]);
      if ($pos !== false){
         $gefunden = true;
         }else{
         	$pos = stripos($nummern[$zaehler2], $Rufnummer);
         	if ($pos !== false ){
         	$gefunden = true;
         	}
         }
      // Jetzt noch den Namen zur Nummer suchen:
      if ($gefunden) {
         preg_match('#<realName>(.*)</realName>#', $daten[$zaehler] , $name);
         //print_r($name[1]);
         echo $name[1];
         return;
      }
   }
}
?>

Aufruf:

$AnruferName=IPS_RunScriptWaitEx(/*ScriptID*/,Array("Rufnummer"=>"0123456789"));

Namen zu Nummer aus „DasÖrtliche“ ermitteln:

<?
//$Rufnummer muss bei Aufruf übergeben werden

$url="http://www.dasoertliche.de/Controller";
$query=array(
    "form_name"=>"search_inv",
    "ph"=>$Rufnummer
);
$data=http_post_fields($url,$query);
if(preg_match('/na: "(.*)"/', $data, $result)){    // Haben wir ein Ergebniss?
    $name=$result[1];
}else{
    $name="Nicht gefunden";
}
//Hier wird nur die Reihenfolge zu "Vorname  Nachname" angepasst(optional) 
if($name!="Nicht gefunden"){
	$tmp = explode(" ",$name);
	$tmp = array_reverse($tmp);
	$name= implode(" ",$tmp);
}
echo $name;
return;
?>

Aufruf:

$AnruferName=IPS_RunScriptWaitEx(/*ScriptID*/ ,Array("Rufnummer"=>"0123456789"));

Funktion getestet mit einer Fritzbox 7270 (Firmware 74.05.05).
Klappt wunderbar;-).

Viel Spaß damit.

@brausepaul

Laufen bei dir die Skripte auch mit der aktuelle Firmware (05.52)???
Ich habe die 7390.

Vielen Dank, Andreas

PS:
Bei mir kommt:

Notice: Undefined offset: 1 in C:\IP-Symcon\scripts\35440.ips.php on line 12

Notice: Undefined offset: 1 in C:\IP-Symcon\scripts\35440.ips.php on line 20