NEWS
Fritzbox rückwärtssuche mit iobroker?
-
var request = require('request'); on({id: 'tr-064.0.callmonitor.ringing', val: true, ack: true}, function (obj) { // wenn Anruf var value = obj.state.val; var oldValue = obj.oldState.val; log("Skript2 klingeln"); var nummer = String(getState("tr-064.0.callmonitor.inbound.caller").val, 2000, false); // caller Nummer auslesen log(' caller=' + nummer); var namen = String(getState("tr-064.0.callmonitor.inbound.callerName").val, 2000, false); // caller Name auslesen if (!namen.length){ // Namen leer in Fritz Telefonbuch, dann Namen in Das Örtliche suchen log('namen ist leer.'); var url = 'http://www.dasoertliche.de/Controller?form_name=search_inv&ph='+ nummer; // suche namen request(url, function(err, stat, body) { if(err) log('Error: ' + err, error); var matches = body.match(/class="name ".*?<.*?>(.*?)&/); // in matches[1] steht der Namen aus Das Örtliche log('Name' + matches[1]); if (!matches[1].length){ // Das Örtliche kein Name gefunden log('Namen Unbekannt'); setState('tr-064.0.callmonitor.inbound.calleeName').String('Unbekannt'); } else { log (Namen= + matches[1]); setState('tr-064.0.callmonitor.inbound.calleeName').matches[1]; } }); } });
Hatte dieses alte Script noch rumliegen. Keine Ahnung ob das noch funktioniert. Vielleicht kann das ja mal jemand testen.
-
@Marsx79 Habs mal probiert, jedoch kommt der body.match mit der URL-Antwort nicht zurecht.
Firefox meint, daß content-encoding gzip ist.
Ich weiß nicht ob request mit gzip zurecht kommt. -
@Marsx79 Hab mal ein log vom body gemacht, da erscheint des als Klartext, kommt also mit gzip zurecht. Scheint noch ein Problem mit der Zeile body.match zu sein
-
Mit Scripten kenne ich mich leider nicht so aus. War nur als Anregung gedacht. Vielleicht kann da ja jemand was mit anfangen und es entsprechend anpassen.
-
@Marsx79 Also rausgefunden habe ich , daß die Klasse jetzt "st-treff-name" heißt und nicht mehr "name".
Ich komme aber mit dem Ausdruck .?<.?>(.*?)&/ nicht klar.
Hier scheint sich JS aufzuhängen.
Evtl. kann jemand da helfen.Problem bei der ganzen HTML Geschichte ist, daß bei der nächsten Änderung der Klassenname wieder anders sein kann.
Eine Abfrage mit Get und Antwort als JSON wäre da besser. -
@Gargano Hier nun der geänderte Code für die Rückwärtssuche im 'Das Örtliche'
// Rückwärtssuche von das Örtliche const callerName = 'tr-064.0.callmonitor.inbound.callerName'; const lastCallerName ='tr-064.0.callmonitor.lastCall.callerName'; var request = require('request'); on({id: 'tr-064.0.callmonitor.ringing', val: true, ack: true}, function (obj) { // wenn Anruf log("Skript2 klingeln"); var nummer = String(getState("tr-064.0.callmonitor.inbound.caller").val, 2000, false); // caller Nummer auslesen log(' caller=' + nummer); var namen = String(getState(callerName).val, 2000, false); // caller Name auslesen if (!namen.length){ // Namen leer in Fritz Telefonbuch, dann Namen in Das Örtliche suchen log('namen ist leer.'); var url = 'http://www.dasoertliche.de/Controller?form_name=search_inv&ph='+ nummer; // suche namen log (url); request(url, function(err, body) { if(err) log('Error: ' + err); var matches = body.match(/class="st-treff-name"\>(.*?)\</); // in matches[1] steht der Namen aus Das Örtliche if (!matches){ // Das Örtliche kein Name gefunden log('Namen Unbekannt'); setState(callerName,'Unbekannt'); setState(lastCallerName,'Unbekannt'); } else { log ('Namen= '+ matches[1]); setState(callerName,matches[1]); setState(lastCallerName,matches[1]); } }); } });
-
Super! Werde ich nachher gleich mal ausprobieren.
-
@Marsx79 Ups , doch ein Schreibfehler
const lastCallerName ='tr-064.0.callmonitor.lastCall.callerName';
-
@Marsx79 Nach der letzten Version vom JS Adapter kam bei mir eine Fehlermeldung mit der 'match' Funktion, daß diese nicht definiert sei.
Ich habe jetzt das aktuellere axios Modul verwendet :
Dazu muß in der JS Instanz unter den zusätzlichen NPM-Module axios eingetragen werden.// Rückwärtssuche von das Örtliche const callerName = 'tr-064.0.callmonitor.inbound.callerName'; const lastCallerName ='tr-064.0.callmonitor.lastCall.callerName'; const ringing = 'tr-064.0.callmonitor.ringing'; const caller = 'tr-064.0.callmonitor.inbound.caller'; const axios = require('axios'); function getCallerName(url) { axios.get(url) .then(function (response) { // handle success var matches = response.data.match(/class="st-treff-name"\>(.*?)\</); // in matches[1] steht der Namen aus Das Örtliche if (!matches){ // Das Örtliche kein Name gefunden setState(callerName,'Unbekannt'); setState(lastCallerName,'Unbekannt'); } else { setState(callerName,matches[1]); setState(lastCallerName,matches[1]); } }) .catch(function (error) { // handle error console.log(error); }) } on({id: ringing, val: true, ack: true}, function (obj) { // wenn Anruf var nummer = String(getState(caller).val, 2000, false); // caller Nummer auslesen var namen = String(getState(callerName).val, 2000, false); // caller Name auslesen if (!namen.length){ // Namen leer in Fritz Telefonbuch, dann Namen in Das Örtliche suchen var url = 'http://www.dasoertliche.de/Controller?form_name=search_inv&ph='+ nummer; // suche namen getCallerName(url); } });
-
@gargano
Dein Post hat mir damals sehr geholfen. Mir ist aber aufgefallen, dass sich offenbar der Aufbau der Seite von www.dasoertliche.de geändert hat, wodurch die Rückwärtssuche nicht mehr funktioniert. Mit folgenden Anpassungen funktioniert es bei mir zumindest wieder:var url = 'https://mobil.dasoertliche.de/Themen?nummer='+ nummer;
Folgender regulärer Ausdruck liefert bei mir dann den Namen bzw. die Firma zur Rufnummer:
var matches = response.data.match('<h2 class="tao-cb tao-b\">(.*)<\/h2>');
Vielleicht hilft das dem einen oder anderen, so wie es mir damals geholfen hat.