qualidat
Goto Top

Fritzbox-Telefonbuch per SOAP abfragen funktioniert sein letzten Update nicht mehr - warum?

Bis vor ein paar Tagen funktionierte der XML-Download des Fritzbox-internen Telfonbuches durch meine Grandstream-Telefone im Büro einwandfrei. Die Sache ist etwas "tricky" realisiert:

Weil die Telefone eine XML-Datei per HTTP downloaden wollen, habe ich per htaccess ein PHP-Script auf die Endung ".xml" re-writed ... d.h. das Telefon ruft ein XML ab, in Wirklichkeit wird der enthaltene PHP-Code ausgeführt und erzeugt on-the-fly den erwarteten Datenstrom ... wie gesagt, lief seit Monaten problemlos.

Vor ein paar Tagen gabs dann das automatische Update auf FrizOS 6.8x und nun geht nix mehr. Leider bin ich in "SOAP" nicht ganz so firm, hatte den Kern das Scrips damals nur reinkopiert und selber dann mit dem nötigen PHP-Umfeld zur Formatierung der Daten versehen. Gibts hier einen Kundigen, der mal einen Blick reinwirft und mutmaßen könnte, woran es liegt?

Die Fehlermeldung lautet so:
<br />
<b>Fatal error</b>:  Uncaught SoapFault exception: [HTTP] Unauthorized in /share/MD0_DATA/Web/gxp/gs_phonebook.xml:97
Stack trace:
#0 [internal function]: SoapClient-&gt;__doRequest('&lt;?xml version=&quot;...', 'http://192.168....', 'urn:dslforum-or...', 1, 0) 
#1 /share/MD0_DATA/Web/gxp/gs_phonebook.xml(97): SoapClient-&gt;__call('GetPhonebook', Array) 
#2 /share/MD0_DATA/Web/gxp/gs_phonebook.xml(97): SoapClient-&gt;GetPhonebook(Object(SoapParam))
#3 {main}
  thrown in <b>/share/MD0_DATA/Web/gxp/gs_phonebook.xml</b> on line <b>97</b><br />

Das zugehörige Script sieht so aus:
<?php

    $user = "extern";  
    $pass = "esssb";  
    $fadr = "192.168.200.1";  
    
        function uml($inp)
        {
            
            $ret=str_replace('Ä',chr(196),$inp);  
            $ret=str_replace('Ö',chr(214),$ret);  
            $ret=str_replace('Ü',chr(220),$ret);  
            $ret=str_replace('ä',chr(228),$ret);  
            $ret=str_replace('ö',chr(246),$ret);  
            $ret=str_replace('ü',chr(252),$ret);  
            $ret=str_replace('ß',chr(223),$ret);  
            return $ret;
        
        }
        
        function get_name($inp)
	{
		$anf=strpos($inp,'<realName>')+strlen('<realName>');  
		$end=strpos($inp,'</realName>');  
		$nam=substr($inp,$anf,$end-$anf);
		$nam=str_replace('_',' ',$nam);  
		$nam=str_replace('_',' ',$nam);  
		$nam=str_replace('  ',' ',$nam);  
		$nam=str_replace('  ',' ',$nam);  
               $ret=explode(' ',$nam);  
               $out='';  
               for($i=0; $i<count($ret); $i++)
               {
                 $out=$out.$ret[$i].' ';  
               }
               
		return uml(substr($out,0,strlen($out)-1));
	}

	function get_anz($inp)
	{
		return substr_count($inp,'<number type=');  
	}
	
	function get_part($inp, $n)
	{
		$sub='<number type=';  
		$ct  =0;
		$pos =0;
		$anf =0;
		while($pos = strpos($inp, $sub, $pos))
		{
			if (++$ct == $n) {$anf=$pos+strlen($sub); break;}
			$pos++;
		}
		
		$sub='</number>';  
		$ct  =0;
		$pos =0;
		$end =0;
		while($pos = strpos($inp, $sub, $pos))
		{
			if (++$ct == $n) {$end=$pos+strlen($sub); break;}
			$pos++;
		}
		return substr($inp,$anf,$end-$anf);	
	} 
	
	function get_typ($inp)
	{
		return strtoupper(substr($inp,1,3));
	}
	
	function get_num($inp)
	{
		$anf=strpos($inp,'>')+1;  
		$end=strpos($inp,'</number>');  
		return substr($inp,$anf,$end-$anf);
	}
// -----------------------------------------------------------------------------



$client = new SoapClient(
    null,
    array(
        'location'      => 'http://'.$fadr.':49000/upnp/control/x_contact',  
        'uri'           => 'urn:dslforum-org:service:X_AVM-DE_OnTel:1',  
        'noroot'        => True,  
        'login'         => $user,  
        'password'      => $pass,  
        'trace'	 => true,  
        'exeptions'     => false  
    )
);

$result = $client->GetPhonebook(new SoapParam($id, 'NewPhonebookID')); //<===== das ist die Zeile 97, die den Error wirft  
$phonebook = file_get_contents($result['NewPhonebookURL']);  

//echo($phonebook.'<hr>'); 
		  		  
		$records=explode('<contact>',$phonebook);  
               echo('<?xml version="1.0" encoding="ISO-8859-1" ?>');  
		echo('<AddressBook>');  
		  
		  for ($i=0; $i<count($records);$i++)
		{
			$rec=$records[$i];
			$nam=get_name($rec);
			$cnt=get_anz($rec);
                        
                        

						
			if ($nam>'' and $cnt>0 )  
			{					
				for($k=1;$k<=$cnt; $k++)
				{
					
					$part=get_part($rec,$k);
					$typ=get_typ($part);
					if($typ>':' and $typ!='INT' and $typ!='MEM')  
					{
						echo('<Contact>');  
						echo('<LastName>' .substr($nam,0,16).'</LastName>');  
						echo('<FirstName>'.$typ.'</FirstName>');  
						echo('<Phone>');  
						echo('<phonenumber>'.get_num($part).'</phonenumber>');  
						echo('<accountindex>0</accountindex>');  
						echo('</Phone>');  
						echo('</Contact>');  
					}
				}	
			}
		}  
		  
        echo('</AddressBook>');    
?>

Content-ID: 328586

Url: https://administrator.de/forum/fritzbox-telefonbuch-per-soap-abfragen-funktioniert-sein-letzten-update-nicht-mehr-warum-328586.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr