'50em', 1 => '410em', 2 => '450em', 3 => '225em', 4 => '225em', 5 => '75em', 6 => '100em' ); // 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: // // // ... // // // ... // ... // ... // //
texttexttext
datendatendaten
datendatendaten
// 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( // -Tag: 'T' => 'margin:0 auto; font-size:0.8em;', // -Tag: 'H' => '', // -Tag im thead-Bereich: 'HR' => '', // -Tag: 'B' => '', // -Tag: 'BRG' => 'background-color:#000000; color:ffff00;', 'BRU' => 'background-color:#000000; color:ffff00;', //
-Tag Feld Typ: 'HF0' => 'width:35px; align:left;', // -Tag Feld Datum: 'HF1' => 'width:35px; align:left;', // -Tag Feld Name: 'HF2' => 'width:35px; align:left;', // -Tag Feld Rufnummer: 'HF3' => 'width:35px; align:left;', // -Tag Feld Nebenstelle: 'HF4' => 'width:35px; align:left;', // -Tag Feld Eigene Rufnummer: 'HF5' => 'width:35px; align:left;', // -Tag Feld Dauer: 'HF6' => 'width:35px; align:left;', //
-Tag Feld Typ: 'DFG0' => 'text-align:center;', 'DFU0' => 'text-align:center;', // -Tag Feld Datum: 'DFG1' => 'text-align:center;', 'DFU1' => 'text-align:center;', // -Tag Feld Name: 'DFG2' => '', 'DFU2' => '', // -Tag Feld Rufnummer: 'DFG3' => 'text-align:center;', 'DFU3' => 'text-align:center;', // -Tag Feld Nebenstelle: 'DFG4' => 'text-align:center;', 'DFU4' => 'text-align:center;', // -Tag Feld Eigene Rufnummer: 'DFG5' => 'text-align:center;', 'DFU5' => 'text-align:center;', // -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/Search_KlickTel.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 = 26; // 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', "\r\n", true); define('CR', "\r", true); define('LF', "\n", true); define('TAB', "\t", 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 = "
'.CRLF; $str .= ''.CRLF; foreach($anzeige_Felder as $feldIndex) { $str .= ''.CRLF; } $str .= ''.CRLF; $str .= ''.CRLF; $str .= ''; foreach($anzeige_Felder as $feldIndex) { $str .= ''; } $str .= ''.CRLF; $str .= ''.CRLF; $str .= ''.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] = ''; break; case 2: $eintrag[0] = ''; break; case 1: $eintrag[0] = ''; break; default: $eintrag[0] = ''; } // Falls ein Suchsymbol benötigt wird if ($search_marker) { $logo = ''; 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 .= ''; foreach($anzeige_Felder as $feldIndex) { $str .= ''; } $str .= ''.CRLF; $pos++; } if($pos >= $liste_Anzahl) { break; } } $str .= ''.CRLF; $str .= '
'.$felder[$feldIndex].'
'.$eintrag[$feldIndex].'
'.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; $pageurl = "http://www.dasoertliche.de/Controller?form_name=search_inv&ph=$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('/getItemData(.*)/', $data, $result)) { $result = explode("', '",$result[1]); $record = array( 'Name' => html_entity_decode(trim($result[5])), 'Strasse' => html_entity_decode(trim($result[6])), 'Hausnummer' => html_entity_decode(trim($result[7])), 'PLZ' => html_entity_decode(trim($result[3])), 'Ort' => html_entity_decode(trim($result[4])), 'StrasseHausnummer' => html_entity_decode(trim($result[6]).' '.trim($result[7])), 'PLZOrt' => html_entity_decode(trim($result[3]).' '.trim($result[4])) ); } } return $record; } function QueryKlickTelDe($Rufnummer) { $record = false; $pageurl = "http://www.klicktel.de/inverssuche/index/search?". "method=searchSimple&_dvform_posted=1&phoneNumber=$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('/(.*)<\/strong>.*

(.*?)([0-9][0-9A-Za-z].*?)'. '
\s*?([0-9]{5})\s*?(.*?)<\/p>/', $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; } 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; } } ?>