Nein, wer sagt das denn.
Du musst beide alten Funktionen durch die jeweiligen neuen ersetzen.
Da beide nicht mehr funktioniert haben.
Michael
Bin auch kein Profi, aber so geht etwas einfacher:
function QueryKlickTelDe ($Rufnummer)
{
$url = 'http://www.klicktel.de/rueckwaertssuche/' . $Rufnummer;
# Create a DOM parser object
$dom = new DOMDocument();
# Parse the HTML from klicktel
# The @ before the method call suppresses any warnings that
# loadHTMLFile might throw because of invalid HTML or URL.
@$dom->loadHTMLFile($url);
if ($dom->documentURI == null)
{
WriteLogMessage(WARNING, 'Datei: '.__file__.' Zeile: '.__line__, 'Timeout bei Abruf der Webseite '.$url);
return false; // DOH! nix geladen zurück
}
$finder = new DomXPath($dom);
$h3Nodes = $finder->query("//h3"); // suche alle h3 Nodes
if ($h3Nodes->length == 0) return false;
$record = array(
'Name' => trim(utf8_decode(utf8_decode($h3Nodes->item(0)->nodeValue)))
);
return $record;
}
Gruß
Burkhard
Hallo Michael,
Sorry Fehler lag bei mir! Habe den post falsch interpretiert!!
Gruß Bernd
Gesendet von meinem iPad mit Tapatalk
@bumaas
Ist ja super.
Sag ja war Q&D. Ich hatte mich zu dem Zeitpunkt noch nicht mit xpath beschäftigt. Somit hatte ich mich an das gehalten was ich ‚konnte‘.
Michael
Hallo zusammen,
leider funktioniert das Script:
<?
/*************************************************************************************************/
/* Konfiguration */
/*************************************************************************************************/
// FritzBox / Adresse:
// Tragen Sie hier den Hostnamen (z.B. Fritz.Box) oder die IP-Adresse (z.B. 192.168.1.1) der
// Fritzbox ein:
$fritzbox_Adresse = 'fritz.box';
// FritzBox / Password:
// Zum auslesen der Anruferliste ein evtl. gesetztes Fritzbox-Kennwort benötigt. Wenn Sie die
// Fritzbox-GUI mit einem Kennwort gesichert haben (empfohlende Einstellung) dann tragen Sie hier
// das entsprechende Kennwort ein. Haben Sie kein Kennwort für die GUI tragen Sie bitte einen
// Leerstring ("") ein:
$fritzbox_Password = '***********';
// FritzBox / Filter:
// Die Fritzbox erfasst alle ein- und ausgehenden Verbindungen. Das können sein:
// 1 = ankommende Verbindung, die entgegengenommen wurde
// 2 = ankommende Verbindung, die niemand entgegengenommen hat (sog. verpasster Anruf)
// 3 = abgehende Verbindung
// Tragen Sie in das Array die Kennnummern der Verbindungstypen ein, die im WebFront angezeigt
// werden sollen:
$liste_Filter = array(4,2,1);
// Liste / Anzahl:
// Je nach Platzverhältniss im WebFront passen mehr oder weniger Zeilen in die Anzeige. Sind mehr
// Zeilen in der Tabelle als Platz im Anzeigebereich vorhanden ist, wird automatisch ein Scroll-
// balken eingeblendet. Um das zu vermeiden kann die Anzahl der anzuzeigenden Verbindungen limi-
// tiert werden. Tragen Sie hier einen Wert zwischen 1 und 300 ein (die Fritzbox liefert maximal
// 300 Einträge zurück):
$liste_Anzahl = 25;
// Liste / Limit Namen:
// Sind die Einträge im Feld Namen zu lang für ihre Anzeige, so können Sie diese kürzen lassen.
// Die Funktion schneidet an der letzten möglichen Wortgrenze. Sie können hier Werte zwischen
// 0 und n eintragen, wobei 0 für NICHT kürzen steht, jeder andere Wert für kürzen auf n Zeichen:
$liste_LimitNamen = 30;
// Liste / Filter Nebenstellen:
// Mit diesem Parameter legen Sie fest, welche Nebenstellen nicht in der Anzeige dargestellt werden
// sollen (sie werden durch die eigene Rufnummer ersetzt). Dies ist z.B. dann sinnvoll, wenn hinter
// der Fritzbox eine ISDN-Anlage sitzt und diese in der Fritzbox als solche ohne spezielle MSN
// eingetragen ist. Dadurch erscheint in der Fritzbox-Anruferliste unter Nebenstelle immer nur der
// Name, mit dem die Telefonanlage eingetragen ist. Und durch Eintragen dieses Namens in den Konfi-
// gurationsparameter wird dieser nichtssagende Eintrag die die angerufene MSN ersetzt:
$liste_FilterNebenstelle = array('ISDN Gerät');
// Suche / Modus:
// Mit dieser Einstellung legen Sie fest, ob das Skript bei fehlendem Namen evtl. ein öffent-
// liches Telefonverzeichnis per Invers-Suche befragen soll. Derzeit stehen 3 Telefonverzeichnisse
// zur Verfügung. Sie können hier folgende Werte eintragen:
// 0 Invers-Suche abgeschaltet
// 1 Invers-Suche bei DasOertliche.de
// 2 Invers-Suche bei KlickTel.de
// 3 Invers-Suche bei TelSearch.ch
$suche_Modus = 1;
// Suche / TelNummerWennNichtGefunden
// Mit dieser Einstellung legen Sie fest, ob bei nicht erfolgreicher Suche die Telefonnummer
// im Namensfeld eingetragen oder ob ein vorgegebener, statischer Text dort erscheinen soll.
// 1 Es wird die Telefonnummer des Anrufers im Feld Name eingetragen,
// wenn die Inverssuche nicht erfolgreich war.
// 0 Es wird der stat. Text Suche/TextTelNummerNichtGefunden eingetragen.
$suche_TelNummerWennNichtGefunden = 1;
// Suche / TextTelNummerNichtGefunden
// Mit dieser Einstellung legen Sie den Text fest, der angezeigt werden soll, wenn eine
// durchgeführte Inverssuche kein Ergebnis geliefert hat. Siehe auch Einstellung des
// Parametes Suche/TelNummerWennNichtGefunden
$suche_TextTelNummerNichtGefunden = "-Unbekannt-";
// Suche / Ergebnis Felder:
// Zu verwendene Ergebnisfelder bei Invers-Suche:
// Die Inverssuche liefert einen Datensatz mit den folgenden Feldern:
// Name Name des Anrufers
// Strasse Strasse des Anrufers, ohne Hausnummer
// Hausnummer Hausnummer des Anrufers
// PLZ Postleitzahl des Anrufers
// Ort Ort des Anrufers
// StrasseHausnummer Kombifeld, besteht aus Strasse, einem Leerzeichen und Hausnummer
// PLZOrt Kombifeld, besteht aus PLZ, einem Leerzeichen und Ort
// Mit diesem Parameter legen Sie fest, welche/s Feld/er Sie in der Anzeige haben möchten
// (Achtung: auch hierfür ist die Längenbegrenzung $liste_LimitNamen wirksam):
$suche_ErgebnisFelder = array('Name');
// Suche / Feldseparator:
// Mit dieser Einstellung legen Sie fest, welche/s Zeichen zwischen den Feldern eingefügt werden
// soll. Voreingestellt ist ein Leerzeichen. Um z.B. eine mehrzeilige Anzeige zu erreichen können
// Sie den Feldseparator auf CRLF ändern:
$suche_FeldSeparator = ', ';
// Suche / Treffer Markieren:
// Mit diesem Parameter legen Sie fest, ob per Invers-Suche gefundene Einträge markiert werden
// sollen oder nicht. Die folgenden Optionen stehen zur verfügung:
// 0 Keine Markierung
// 1 Markierung per Klammerstern "(*)" am ANFANG des Eintrags.
// 2 Markierung per Klammerstern "(*)" am ENDE des Eintrags.
// 3 Markierung per Symbol am ANFANG des Eintrags (Symbol = SEARCHHIT)
// 4 Markierung per Symbol am ENDE des Eintrags (Symbol = SEARCHHIT)
$suche_TrefferMarkieren = 3;
// Suche / CacheExpireTime
// Zur Beschleunigung der Listenerstellung und zur Entlastung der Suchseiten ist in die Such-
// funktionen ein Caching der Ergebnisse eingebaut. Für jeden erfolgreich ermittelten Eintrag
// wird eine Datensatz in diesem Suchcache angelegt, der zukünftig sofort das Ergebnis liefert.
// Damit dieser Cache nicht unendlich groß wird, hat jeder Datensatz eine Ablaufzeit. Danach
// wird er aus dem Cache wieder entfernt.
// Dieser Parameter steuert, wie lange gefundene Einträge zu Rufnummern im Cache verbleiben.
// Die Angabe erfolg in Sekunden, für 24 Stunden ist also 86400 (=24*60*60) einzutragen:
$suche_cacheExpireTime = 86400 /*[Objekt #20864 existiert nicht]*/;
// Suche / CacheVarID
// Mit diesem Parameter kann der Cache für mehrere Skripte gemeinsam genutzt werden.
// Ist dieser Parameter ungleich 0 ist, so wird er als VariablenID aufgefasst und der Cache in
// der entsprechenden Variable gespeichert. Damit einhergehend wird eine Verriegellung gegen
// gleichzeitige Zugriffe auf den Cache aktiviert, die mehrere Instanzen des Skripts
// untereinander im Zugriff synchronisiert. Defaultmäßig ist diese Funktion deaktiviert (d.h.
// der Parameter ist auf 0 gesetzt:
$suche_cacheVarID = 0;
// Anzeige / Felder:
// Zur Anzeige im Webfront wird eine HTML-Tabelle erzeugt. Mit dieser Einstellung legen Sie fest,
// welche Felder in welcher Reihenfolge in der Tabelle angezeigt werden sollen. Die folgenden
// Felder stehen ihnen dafür zur Verfügung:
// 0: Typ Anzeige des Verbindungstyps. Je nach Typ wird ein entsprechendes Symbol
// angezeigt (1 = CALLIN, 2 = CALLFAIL, 3 = CALLOUT, siehe Anzeige/Symbole)
// 1: Datum Datum und Uhrzeit des Anruft
// 2: Name Name des Anrufers
// 3: Rufnummer Rufnummer des Anrufers
// 4: Nebenstelle Die eigene Nebenstelle. Ist dieses Feld leer oder trifft eine der Werte
// aus $keineNebenstelle zu, so wird das Feld "Eigene Rufnummer" verwendet
// 5: Eigene Rufnummer Hier erscheint die Multiple Subscriber Number (MSN), welche der Anrufer
// erreichen wollte.
// 6: Dauer Hier wird die Dauer des Gesprächs ausgegeben. Die Dauer wird minutengenau
// erfasst und als Stunden:Minuten darstestellt.
// Tragen Sie in den Parameter die Indexnummern der Felder in der gewünschten Reihenfolge ein, die
// in der Ergebnistabelle erscheinen sollen:
$anzeige_Felder = array(0, 1, 2, 3, 4, 6);
// Anzeige / Datum Maskieren:
// Diese Option aktivert eine Ersetzung das Datums, wenn der Eintrag von Heute oder Gestern ist.
// Somit sind die aktuellen Einträge leicher von älteren Einträgen zu unterscheiden.
// Folgende Optionen stehen zur verfügung:
// True Einträge mit aktuellem Datum durch "Heute", mit Datum von gestern durch
// "Gestern" ersetzen. Die Uhrzeitanzeige bleibt davon unberühert.
$anzeige_DatumMaskieren = true;
// Anzeige / Spaltenbreite
// Mit dieser Option legen Sie die Spaltenbreite der anzuzeigenden Spalten fest. Die Option definiert
// für jede Spalte die Breite individuell, adressiert über den Feldindex gemäß Option Anzeige/Felder.
$anzeige_SpaltenBreite = array(
0 => '30em',
1 => '210em',
2 => '300em',
3 => '125em',
4 => '125em',
5 => '75em',
6 => '50em'
);
// Anzeige / Tabellenstyle
// Mit dieser Option können CSS-Styleangaben für die verschiedenen Tabellenelemente machen.
// Die Tabelle hat folgenden Aufbau, die Feldkennzeichner stehen in {}-Klammern:
// <table style="{T}">
// <thead style="{H}">
// <tr style="{HR}"><th style="{HFn}">text</th><th style="{HFn}">text</th>...<th style="{HFn}">text</th></tr>
// </thead>
// <tbody style="{B}">
// <tr style="{BRG}"><td style="{DFGn}">daten</td><td style="{DFGn}">daten</td>...<td style="{DFGn}">daten</td></tr>
// <tr style="{BRU}"><td style="{DFUn}">daten</td><td style="{DFUn}">daten</td>...<td style="{DFUn}">daten</td></tr>
// ...
// </tbody>
// </table>
// Die gewünschten Styleangaben werden als String im Array hinterlegt, jeweils mit dem
// entsprechenden Feldkennzeichner. Das (n) im Feldkennzeichner steht für den Feldindex, wie er im
// Parameter Anzeige/Felder festgelegt ist, d.h. sie legen im Style-Array für jedes Feld ein Style fest,
// unabhängig davon, wo Sie das entsprechende Feld letztlich anzeigen lassen.
$anzeige_Styles = array(
// <table>-Tag:
'T' => 'margin:0 auto; font-size:0.8em;',
// <thead>-Tag:
'H' => '',
// <tr>-Tag im thead-Bereich:
'HR' => '',
// <th>-Tag Feld Typ:
'HF0' => 'width:35px; align:left;',
// <th>-Tag Feld Datum:
'HF1' => 'width:35px; align:left;',
// <th>-Tag Feld Name:
'HF2' => 'width:35px; align:left;',
// <th>-Tag Feld Rufnummer:
'HF3' => 'width:35px; align:left;',
// <th>-Tag Feld Nebenstelle:
'HF4' => 'width:35px; align:left;',
// <th>-Tag Feld Eigene Rufnummer:
'HF5' => 'width:35px; align:left;',
// <th>-Tag Feld Dauer:
'HF6' => 'width:35px; align:left;',
// <tbody>-Tag:
'B' => '',
// <tr>-Tag:
'BRG' => 'background-color:#000000; color:ffff00;',
'BRU' => 'background-color:#000000; color:ffff00;',
// <td>-Tag Feld Typ:
'DFG0' => 'text-align:center;',
'DFU0' => 'text-align:center;',
// <td>-Tag Feld Datum:
'DFG1' => 'text-align:center;',
'DFU1' => 'text-align:center;',
// <td>-Tag Feld Name:
'DFG2' => '',
'DFU2' => '',
// <td>-Tag Feld Rufnummer:
'DFG3' => 'text-align:center;',
'DFU3' => 'text-align:center;',
// <td>-Tag Feld Nebenstelle:
'DFG4' => 'text-align:center;',
'DFU4' => 'text-align:center;',
// <td>-Tag Feld Eigene Rufnummer:
'DFG5' => 'text-align:center;',
'DFU5' => 'text-align:center;',
// <td>-Tag Feld Dauer:
'DFG6' => 'text-align:center;',
'DFU6' => 'text-align:center;'
// ^- Der Buchstabe "G" steht für gerade, "U" für ungerade. Die Zählung mit 0, d.h. mit gerade.
);
// Anzeige / Symbole:
// Bei der Anzeige im WebFront kommen 4 verschiedene Symbole zum Einsatz. Mit diesem Parameter
// legen Sie fest, welches Symbol für welchen Zweck verwendung finden soll. Sie können alle
// Bilddateien angeben die der Browser anzeigen kann. Achten Sie darauf, das die Symbole eine
// angemessene Größe haben, da der Browser die Symbole mit Originalabmessung anzeigt.
// Die Symbole und ihre Bedeutung sind:
// CALLIN Dieses Symbol wird in der Spalte Typ angezeigt, wenn ein eingehender Anruf
// angenommen wurde (d.h. ein Gespräch ist zustande gekommen)
// CALLFAIL Dieses Symbol wird in der Spalte Typ angezeigt, wenn ein eingehender oder
// ausgehender Anruf NICHT angenommen wurde (d.h. es hat geklingelt und
// NIEMAND hat abgehoben)
// CALLOUT Dieses Symbol wird in der SPalte Typ angezeigt für alle Verbindungen, die
// ausgehend sind (d.h. es wurde jemand angerufen und der jenige hat
// abgehoben)
// SEARCHHIT Dieses Symbol wird am Anfang oder am Ende der Spalte Name angezeigt, wenn
// der Eintrag per Invers-Suche ermittelt wurde und Markierung aktiviert ist
$anzeige_Symbole = array(
'CALLIN' => '/user/fritz/Callin.png',
'CALLFAIL' => '/user/fritz/Callinfailed.png',
'CALLOUT' => '/user/fritz/Callout.png',
'SEARCHHIT' => '/user/fritz/suche.png'
);
// Anzeige / Symbolgrösse
// Dieser Parameter legt die Anzeigegröße für alle Symbole einheitlich fest. Geben Sie einen
// beliebigen Pixel-Wert an, welcher für die Attribute Width und Height eingetragen wird:
$anzeige_Symbolgroesse = 16;
// Anzeige / Symbolstyle
// Mit diesem Parameter können Sie für jedes der Symbole weitere CSS-Styles festlegen, die in
// die Tabelle übernommen werden sollen. Sie können je Symboltyp (siehe Anzeige/Symbole)
// individuelle Angaben machen.
$anzeige_SymbolStyle = array(
'CALLIN' => 'margin:1px 0 0;',
'CALLFAIL' => 'margin:1px 0 0;',
'CALLOUT' => 'margin:1px 0 0;',
'SEARCHHIT' => 'margin:1px 0 0;'
);
// Sonstiges / LogMode:
// Mit dieser Option stellt am ein, aus welche Art und Weise Logging-Meldungen vom Skript
// erzeugt werden. Es werden derzeit 2 Varianten unterstützt:
// 0 Keine Logmeldungen erzeugen
// 1 Logmeldungen via IPS_LogMessage (default)
// 2 Logmeldungen via IPSLogger (ACHTUNG: IPS-Library mit IPSLogger muss
// installiert sein um diese Funktion nutzen zu können).
$sonstige_LogMode = 1;
/*************************************************************************************************/
/* Ab hier nichts mehr ändern */
/*************************************************************************************************/
if ($sonstige_LogMode == 2) {
IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");
}
define('CRLF', "
", true);
define('CR', "\r", true);
define('LF', "
", true);
define('TAB', " ", true);
// Loglevel für Meldungen
define('FATAL', 0, true);
define('ERROR', 1, true);
define('WARNING', 2, true);
define('NOTIFICATION', 3, true);
define('INFORMATION', 4, true);
define('DEBUG', 5, true);
define('COMMUNICATION', 6, true);
define('TRACE', 7, true);
define('TEST', 8, true);
$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);
}
// Adresse der Fritzbox-GUI in Variable ablegen (wird später öfters verwendet)
$fritzgui = 'http://' . $fritzbox_Adresse . '/cgi-bin/webcm';
// Step 1 - Login in die Fritzbox
$ch = curl_init('http://'.$fritzbox_Adresse.'/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
else
{
$challenge = $session_status_simplexml->Challenge;
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritzbox_Password, "UCS-2LE", "UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
$sendlogin = curl_exec($ch);
curl_close($ch);
$session_status_simplexml = simplexml_load_string($sendlogin);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
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).CRLF.'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' => '../FRITZ!Box_Anrufliste.csv',
'sid' => $SID
));
$opts = array('http' => array(
'method' => 'POST',
'header' => 'Content-Length: '.strlen($postdata).CRLF.'Content-Type: application/x-www-form-urlencoded',
'content' => $postdata
));
$context = stream_context_create($opts);
$URL = "http://".$fritzbox_Adresse."/fon_num/foncalls_list.lua?sid=".$SID."&csv=";
$anrufliste = utf8_decode(file_get_contents($URL, false, $context));
$anrufliste = explode(LF, $anrufliste);
$felder = array('Typ', 'Datum', 'Name', 'Rufnummer', 'Nebenstelle', 'Eigene Rufnummer', 'Dauer');
print_r($felder);
// Kopf der Tabelle erzeugen
$str = "<table bgcolor='#000000'><body scroll=no><body bgcolor='#000000'><table style=".$anzeige_Styles['T'].'">'.CRLF;
$str .= '<colgroup>'.CRLF;
foreach($anzeige_Felder as $feldIndex) {
$str .= '<col width="'.$anzeige_SpaltenBreite[$feldIndex].'" />'.CRLF;
}
$str .= '</colgroup>'.CRLF;
$str .= '<thead style="'.$anzeige_Styles['H'].'">'.CRLF;
$str .= '<tr style="'.$anzeige_Styles['HR'].'">';
foreach($anzeige_Felder as $feldIndex) {
$str .= '<th style="color:ffff00; '.$anzeige_Styles['HF'.$feldIndex].'">'.$felder[$feldIndex].'</th>';
}
$str .= '</tr>'.CRLF;
$str .= '</thead>'.CRLF;
$str .= '<tbody style="'.$anzeige_Styles['B'].'">'.CRLF;
$pos = 0;
$search_marker = false;
$searchFailed = array();
// Liste aller in diesem Lauf bereits erfolglos gesuchter Nummern
Echo count($anrufliste);
for($i = 2; $i <= count($anrufliste) - 2; $i++) {
set_time_limit(30);
$eintrag = explode(';', $anrufliste[$i]);
// Daten des aktuellen Eintrags überarbeiten und anschließend Datenzeile erstellen.
// 1.) Unbekannte Anrufer im Internet suchen und Anzeigenamen kürzen
if($eintrag[2] == '') {
if ($suche_Modus == 0) {
$eintrag[2] = '-Unbekannt-';
} else {
if (in_array($eintrag[3], $searchFailed)) {
} else {
$result = TelSuche($eintrag[3], $suche_Modus);
}
if ($result == false) {
$searchFailed[] = $eintrag[3];
$eintrag[2] = ($suche_TelNummerWennNichtGefunden == 1 ?
$eintrag[3] : $suche_TextTelNummerNichtGefunden);
} else {
$search_marker = true;
$ersterEintrag = true; // Kennung für ggf. erforderliches Symbolkennzeichen
foreach($suche_ErgebnisFelder as $feldName) {
$eintrag[2] .= ($ersterEintrag ? '' : $suche_FeldSeparator) . $result[$feldName];
$ersterEintrag = false;
}
}
}
}
// Abschließend wird JEDER Eintrag noch auf Länge geschnitten
$eintrag[2] = TextAbschneiden($eintrag[2], $liste_LimitNamen);
// 2.) Nebenstelle mit Eigene Rufnummer ersetzen wenn leer oder Treffer in liste_FilterNebenstelle
if(strlen($eintrag[4]) == 0 or in_array($eintrag[4], $liste_FilterNebenstelle) == true) {
$eintrag[4] = $eintrag[5];
}
// 3.) "Keine Nummer" für leere Einträge bei Anrufernummer
if(strlen($eintrag[3]) == 0) {
$eintrag[3] = 'Keine Nummer';
}
// 4.) Heute und Gestern ersetzen falls Funktion aktiviert
if ($anzeige_DatumMaskieren) {
$parts = preg_split('/[ .:]/', $eintrag[1]);
$datum = mktime(0, 0, 1, (int)$parts[1], (int)$parts[0], (int)$parts[2]);
$heute = mktime(0, 0, 0);
$gestern = $heute - 86400;
if ($datum > $heute) {
$eintrag[1] = 'Heute, ';
} elseif ($datum > $gestern) {
$eintrag[1] = 'Gestern, ';
} else {
$eintrag[1] = date('d.m.y ', $datum);
}
$eintrag[1] .= $parts[3].':'.$parts[4];
}
$caller = $eintrag[0];
switch($caller) {
case 4: $eintrag[0] = '<img src="'.$anzeige_Symbole['CALLOUT'].'" width="'.$anzeige_Symbolgroesse.'px" height="'.$anzeige_Symbolgroesse.'px" style="'.$anzeige_SymbolStyle['CALLIN'].'">'; break;
case 2: $eintrag[0] = '<img src="'.$anzeige_Symbole['CALLFAIL'].'" width="'.$anzeige_Symbolgroesse.'px" height="'.$anzeige_Symbolgroesse.'px" style="'.$anzeige_SymbolStyle['CALLFAIL'].'">'; break;
case 1: $eintrag[0] = '<img src="'.$anzeige_Symbole['CALLIN'].'" width="'.$anzeige_Symbolgroesse.'px" height="'.$anzeige_Symbolgroesse.'px" style="'.$anzeige_SymbolStyle['CALLOUT'].'">'; break;
default: $eintrag[0] = '';
}
// Falls ein Suchsymbol benötigt wird
if ($search_marker) {
$logo = '<img src="'.$anzeige_Symbole['SEARCHHIT'].'" width="'.$anzeige_Symbolgroesse.'px" height="'.$anzeige_Symbolgroesse.'px" style="'.$anzeige_SymbolStyle['SEARCHHIT'].'">';
switch($suche_TrefferMarkieren) {
case 0: break;
case 1: $eintrag[2] = '(*)'.$eintrag[2]; break;
case 2: $eintrag[2] = $eintrag[2].'(*)'; break;
case 3: $eintrag[2] = $logo.' '.$eintrag[2]; break;
case 4: $eintrag[2] = $eintrag[2].' '.$logo; break;
}
$search_marker = false; // Die Markierung zurücksetzen
}
// Die Datenzeile zum aktuellen Eintrag erstellen, WENN der Eintragtyp auch angezeigt werden soll
if(in_array($caller, $liste_Filter)) {
$str .= '<tr style="'.$anzeige_Styles['BR'.($pos % 2 ? 'U':'G')].'">';
foreach($anzeige_Felder as $feldIndex) {
$str .= '<td style="'.$anzeige_Styles['DF'.($pos % 2 ? 'U':'G').$feldIndex].'">'.$eintrag[$feldIndex].'</td>';
}
$str .= '</tr>'.CRLF;
$pos++;
}
if($pos >= $liste_Anzahl) {
break;
}
}
$str .= '</tbody>'.CRLF;
$str .= '</table>'.CRLF;
// ErgebnisListe in Content-Variable speichern
$vid = CreateVariableByName($parentID, 'Content', 3);
IPS_SetIcon($vid, 'speaker');
IPS_SetVariableCustomProfile($vid, '~HTMLBox');
SetValue($vid, $str);
// Von der FritzBox-GUI abmelden
$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).CRLF.'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;
}
function TextAbschneiden($Text, $Laenge) {
if ($Laenge == 0) {
return $Text;
} else {
$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;
}
}
}
// Führt eine Cache-unterstützte Suche nach der Rufnummer durch
function TelSuche($Rufnummer, $modus) {
global $parentID, $suche_cacheExpireTime, $suche_cacheVarID;
// Daten aus dem Suchcache laden
$cacheData = GetCacheData();
// Ergebnisrecord mit false vorbelegen
$record = false;
// Suchcache checken, ob ein Eintrag passend zur Rufnummer vorhanden ist
if (isset($cacheData[$Rufnummer])) {
// Treffer im Cache, Daten holen und rück zum Aufrufer springen
$record = $cacheData[$Rufnummer]['Data'];
}
// Wenn im Cache kein Treffer gefunden wurde, eine Websuchmaschine befragen
if ($record === false) {
switch ($modus) {
case 1: $record = QueryKlickTelDe($Rufnummer); break;
case 2: $record = QueryDasOertlicheDe($Rufnummer); break;
case 3: $record = QueryTelSearchCh($Rufnummer); break;
}
// Wenn wir jetzt einen Treffer haben, muss der noch in den Cache...
if ($record !== false) {
AddRecordToCache($Rufnummer, $record);
}
}
// So, jetzt sind wird fertig, zurück zum Aufrufer...
return $record;
}
// Liefert die aktuellen Daten aus dem Cache als Array an den Aufrufer
function GetCacheData() {
global $suche_cacheVarID, $parentID;
$globalCache = false;
// ID der Cachevariable ermitteln
if ($suche_cacheVarID == 0) {
// Wir arbeiten mit einem eigenen Cache
$varID = CreateVariableByName($parentID, 'search_cache', 3);
} else {
$globalCache = true;
$varID = $suche_cacheVarID;
}
// Wenn wir mit globalem Cache arbeiten müssen wir jetzt ein Lock holen
if ($globalCache) {
if (!IPS_SemaphoreEnter('FB_cache_lock', 2000)) {
return false; // Und ende... beim nächsten mal mehr Glück...
}
}
// Die Cache-Daten aus der Variable holen und deserialisieren
$data = GetValue($varID);
if ($globalCache) {
// Jetzt noch die Semaphore zurückgeben
IPS_SemaphoreLeave('FB_cache_lock');
}
// und deserialisieren
if (($result = @unserialize($data)) === FALSE) {
$result = array();
}
// fertig, das Array mit den cache-daten an den Aufrufer zurückliefern
return $result;
}
function AddRecordToCache($Rufnummer, $record) {
global $suche_cacheVarID, $suche_cacheExpireTime, $parentID;
$globalCache = false;
// ID der Cachevariable ermitteln
if ($suche_cacheVarID == 0) {
// Wir arbeiten mit einem eigenen Cache
$varID = CreateVariableByName($parentID, 'search_cache', 3);
} else {
$globalCache = true;
$varID = $suche_cacheVarID;
}
// Wenn wir mit globalem Cache arbeiten müssen wir jetzt ein Lock holen
if ($globalCache) {
if (!IPS_SemaphoreEnter('FB_cache_lock', 2000)) {
return false; // Und ende... beim nächsten mal mehr Glück...
}
}
// Die Cache-Daten aus der Variable holen und deserialisieren
$data = GetValue($varID);
if (($cache = @unserialize($data)) === FALSE) {
$cache = array();
}
// Jetzt den neuen Eintrag in $data vornehmen
$cache[$Rufnummer] = array('Expire' => (time() + $suche_cacheExpireTime), 'Data' => $record);
// Das ganze wieder serialisieren und in die Variable zurückschreiben
$data = serialize($cache);
SetValue($varID, $data);
if ($globalCache) {
// Jetzt noch die Semaphore zurückgeben
IPS_SemaphoreLeave('FB_cache_lock');
}
return true;
}
function QueryDasOertlicheDe($Rufnummer)
{
$record = false;
$url = "http://www.dasoertliche.de/Controller?form_name=search_inv&ph=$Rufnummer";
# Create a DOM parser object
$dom = new DOMDocument();
# Parse the HTML from klicktel
# The @ before the method call suppresses any warnings that
# loadHTMLFile might throw because of invalid HTML or URL.
@$dom->loadHTMLFile($url);
if ($dom->documentURI == null)
{
WriteLogMessage(WARNING, 'Datei: '.__file__.' Zeile: '.__line__, 'Timeout bei Abruf der Webseite '.$url);
return false; // DOH! nix geladen zurück
}
$finder = new DomXPath($dom);
$classname="hit clearfix ";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), '$classname')]");
if ($nodes->length == 0) return false;
$cNode = $nodes->item(0); //div left
if ($cNode->nodeName != 'div') return false;
if (!$cNode->hasChildNodes()) return false;
$ahref = $cNode->childNodes->item(1); // a href
if (!$ahref->hasChildNodes()) return false;
foreach ($ahref->childNodes as $div)
{
if ($div->nodeName == "a" ) break;
}
$record = array(
'Name' => trim(utf8_decode($div->nodeValue))
);
return $record;
}
function QueryKlickTelDe ($Rufnummer)
{
$url = 'http://www.klicktel.de/rueckwaertssuche/' . $Rufnummer;
# Create a DOM parser object
$dom = new DOMDocument();
# Parse the HTML from klicktel
# The @ before the method call suppresses any warnings that
# loadHTMLFile might throw because of invalid HTML or URL.
@$dom->loadHTMLFile($url);
if ($dom->documentURI == null)
{
WriteLogMessage(WARNING, 'Datei: '.__file__.' Zeile: '.__line__, 'Timeout bei Abruf der Webseite '.$url);
return false; // DOH! nix geladen zurück
}
$finder = new DomXPath($dom);
$classname="results direct";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
if ($nodes->length == 0) return false;
$ulNode = $nodes->item(0); //ul
if ($ulNode->nodeName != 'ul') return false; // doch kein ul
if ($ulNode->childNodes->length == 0) return false;
$liNode = $ulNode->childNodes->item(0); //li
if ($liNode->nodeName != 'li') return false; // doch kein li
if ($liNode->childNodes->length < 1) return false; // kein Eintrag
$divNode = $liNode->childNodes->item(1); //1.div
if ($divNode->nodeName != 'div') return false; // kein div
if ($divNode->childNodes->length < 2) return false; // anzahl stimmt nicht
$h3Node = $divNode->childNodes->item(3); // h3
if ($h3Node->tagName != 'h3') return false; // doch kein h3
$record = array(
'Name' => trim(utf8_decode(utf8_decode($h3Node->nodeValue)))
);
return $record;
}
function QueryTelSearchCh($Rufnummer) {
$record = false;
$pageurl = "http://tel.search.ch/?tel=$Rufnummer";
$wsdata = @Sys_GetURLContent($pageurl);
if ($wsdata === false) {
WriteLogMessage(WARNING, 'Datei: '.__file__.' Zeile: '.__line__, 'Timeout bei Abruf der Webseite '.$pageurl);
} else {
$data = str_replace(array(CRLF, LF), ' ', $wsdata);
if (preg_match('/class="fn">(.*?)<\/a>.*class="adrgroup street-address">(.*) ([0-9]+[0-9a-zA-Z]*)'.
'<\/span>.*class="postal-code">(.*?)<\/span>.*class="locality">(.*?)<\/span>/', $data, $result)) {
$record = array(
'Name' => html_entity_decode(trim($result[1])),
'Strasse' => html_entity_decode(trim($result[2])),
'Hausnummer' => html_entity_decode(trim($result[3])),
'PLZ' => html_entity_decode(trim($result[4])),
'Ort' => html_entity_decode(trim($result[5])),
'StrasseHausnummer' => html_entity_decode(trim($result[2]).' '.trim($result[3])),
'PLZOrt' => html_entity_decode(trim($result[4]).' '.trim($result[5]))
);
}
}
return $record;
}
// Erzeugt je nach Einstellung eine Meldung im IPS Logbuch oder via IPSLogger (sonstige/LogMode)
function WriteLogMessage($level, $location, $information) {
global $sonstige_LogMode;
$logLevel = array(
'Fatal:', // LogLevel=0: Schwerwiegende Fehler, führt normalerweise zu einem kompletten
// Programmabbruch
'Error:', // LogLevel=1: 'Normale' Fehler
'Warning:', // LogLevel=2: Warnungen
'Notification:', // LogLevel=3: Notifizierung, wird benutzt um sich über bestimmte Ereignisse im
// System informieren zu lassen (Beschattung wurde aktiviert, oder Rasenbewässerung
// gestartet)
'Information:', // LogLevel=4: Informationsmeldungen, zur Protokollierung von Schaltvorgängen usw.
'Debug:', // LogLevel=5: Debug Meldungen
'Communication:', // LogLevel=6: Protokollierung von Kommunikations Instanzen (Senden/Empfangen über
// RS232, Sockets, ...)
'Trace:', // LogLevel=7: Sehr detailierte Meldungen, um diverse Ablauffehler zu finden
'Test:' // LogLevel=8: Test Meldungen, verwende ich nur temporär um Fehler zu finden, man kann
// nach diesen Meldungen suchen und sie nach finden des Fehlerers wieder entfernen
);
switch ($sonstige_LogMode) {
case 1: // Logging via IPS_LogMessage
IPS_LogMessage($location, $logLevel[$level].' '.$information);
break;
case 2: // Logging via IPSLogger
switch ($level) {
case 0: IPSLogger_Fat($location, $information); break;
case 1: IPSLogger_Err($location, $information); break;
case 2: IPSLogger_Wrn($location, $information); break;
case 3: IPSLogger_Not($location, $information); break;
case 4: IPSLogger_Inf($location, $information); break;
case 5: IPSLogger_Dbg($location, $information); break;
case 6: IPSLogger_Com($location, $information); break;
case 7: IPSLogger_Trc($location, $information); break;
case 8: IPSLogger_Tst($location, $information); break;
}
break;
}
}
?>
nach dem Update auf 3.3 nicht mehr.
Es wird folgeder Fehler angezeigt:
Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in C:\IP-Symcon\scripts\40602.ips.php on line 329
Warning: simplexml_load_string(): Internal communication error in C:\IP-Symcon\scripts\40602.ips.php on line 329
Warning: simplexml_load_string(): ^ in C:\IP-Symcon\scripts\40602.ips.php on line 329
Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\40602.ips.php on line 332
Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\40602.ips.php on line 334
Array
(
[0] => Typ
[1] => Datum
[2] => Name
[3] => Rufnummer
[4] => Nebenstelle
[5] => Eigene Rufnummer
[6] => Dauer
)
2
hat jemand einen Tipp?
Gruß
Thomas
Auf den ersten Blick nicht.
Scheint mal wieder am Login zu liegen, sehe sonst kein SimpleXml.
Diese Variante schon mal ausprobiert ?
Anrufliste auslesen – IP-Symcon
Michael
Abend Thomas!
Ich verwende auch die von Michael genannte Variante mit SOAP, kann ich also absolut empfehlen. Das läuft einfach super! Verbunden mit dem Anrufmonitor (Client Socket auf Port 1012 der Fritzbox) eine geniale Sache.
SOAP scheint mir die Zukunft zu sein und ist dazu noch wunderbar schnell und Ressourcen schonend
Die Einrichtung ist genauso leicht wie bei dem Skript was du verwendest. Nur die Art die Daten zu holen ist anders, aber das muss dich nicht unbedingt interessieren. Wenn doch > FritzBox mit SOAP auslesen und steuern
Grüße,
Chris
Weis vielleicht noch jemand wie ich die Nebenstellen Filtern kann, sodass z.B.
Nebenstelle 1 = sieht nur Anrufe etc. von Nebenstelle 1
Nebenstelle 2 = sieht nur Anrufe etc. von Nebenstelle 2
Nebenstelle 3 = sieht nur Anrufe etc. von Nebenstelle 3
angezeigt werden? Wir sind ein Generationen Haus und ich würde das noch je Wohneinheit splitten.
Du kannst diese (FritzBox mit SOAP auslesen und steuern - Seite 14) Version nehmen, aber konfiguriere die AB’s im Script nicht.
Die Bugs im Script und in der AVM Firmware 6.2x für die Anrufbeantworter sind wohl noch nicht behoben.
Aber deine Forderung ist umgesetzt, nur nicht über Nebenstellen, sondern über die externen Rufnummern.
Michael
Hallo Nall Chan,
danke dir, habs hinbekommen funktioniert einwandfrei.
Eine Frage habe ich noch, auch wenn die AB-Funktion im Moment nicht geht:
Muss das Skript „ab“ im Ordner liegen, wo die Icons liegen? (Laut dem .zip-Package, sieht das so aus.)
So aus dem Kopf, ja.
Aber es wird nur aufgerufen wenn über das WebFront der AB bedient wird.
Also brauchst du es zur Zeit nicht. (Ich hoffe mal das ich da demnächst weiter machen kann.)
Michael
mein Codeschnipsel zum schreiben der verpassten Anrufe von heute in eine txt geht irgendwie nicht mehr. Hat vielleicht da jemand was fertiges?
Folge den Links in Post 326 (WiKi Version) oder 329 (SOAP-Fred).
Also eine Seite zurückblättern.
Letzte kann auch mehrere Listen erzeugen. Nur am Anrufbeantworter (und fehlender Zeit bei mir) hakt es noch.
Michael
Hallo.
Kann es sein, dass die Code-Schnipsel aus den Posts 315 und 322 für die Rückwärtssuche nicht mehr funktionieren?
Habe sie gerade ausprobiert und bei mir kommen keine Daten für eine Rufnummer zurück welche auf den originären Webseiten gefunden wird.
Nur ein Problem bei mir oder allgemein?
Sind die identisch mit den aus den Wiki ?
Ich muss das alte Script erst mal reaktivieren; habe hier ein seit drei Monaten brach liegendes FritzBox Projekt am ,reifen’.
(Meine SW/Scripte sind halt wie Bananen… reifen auf dem Weg zum Kunden. )
Michael
Habe ich nicht verglichen. Ich dachte mir die Versionen aus den Posts haben mindestens die Aktualität des Wikis - zumal sie u.a aus Deiner Feder stammen :).
Ich wollte einfach nur nachgefragt haben ob das Problem vor dem Rechner sitzt oder ob die Skripte tatsächlich kein brauchbares Ergebnis liefern.
Also ich hatte die Version im Wiki immer (nach)gepflegt.
Eben mal bei mir getestet, zwei Treffer bei KlickTel und Einen bei dem Örtlichen.
Dafür ging bei mir einiges anderes nicht mehr, seitdem AVM mal wieder was an der XML-Anrufliste geändert hat
Ist aber unabhängig von den Inversuchen-Funktionen.
UPDATE:
Ich muss mich verbessern, mein Cache hatte noch ‚alte‘ Daten.
Klicktel geht bei mir auch nicht mehr, Das Örtliche aber schon.
Michael
Hallo.
Ich habe mir gerade die neue Labor-SW (6.25-30630 Beta) auf meine Fritzbox 7390 aufgespielt.
Leider funktioniert jetzt das Auslesescipt von … (ja von wem eigendlich ?) nicht mehr.
Offensichtlich funktionieren die beiden folgenden Scriptteile nicht mehr:
//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).CRLF.'Content-Type: application/x-www-form-urlencoded',
'content' => $postdata
));
$context = stream_context_create($opts);
$getnewlist = file_get_contents($fritzgui, false, $context);
// Von der FritzBox-GUI abmelden
$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).CRLF.'Content-Type: application/x-www-form-urlencoded',
'content' => $postdata
));
$context = stream_context_create($opts);
$logout = file_get_contents($fritzgui, false, $context);
Ich habe die beiden Teile einfach auskommentiert. Jetzt funktioniert das Script erst einmal.
Das kann aber nicht die Lösung sein.
Vielleicht könnte bitte jemand von den PHP- / Fritzbox Spezialisten nachsehen, was hier zu ändern wäre, dass die beiden Scriptteile wieder funktionieren.
Danke und einen schönen Abend.
lueralba
Abend!
Ich verwende immer die aktuelle Labor-Firmware auf meiner 7490 und ich kann dir nur SOAP empfehlen
Nall chan hat da einen super tollen Thread mit lauter super tollen Scripten
FritzBox mit SOAP auslesen und steuern
Und dann gäbe es noch das IPS Wiki
Anrufliste auslesen – IP-Symcon
Grüße,
Chris
Hallo Chris.
Danke für den Tip. Hatte ich vorhin glatt „drüber weg gesucht“
Werde ich am WE mal in Ruhe umstellen.
Schönen Abend.
lueralba