NEWS
Variable Telegram-Empfänger
-
Moin zusammen!
Ich bin gerade dabei ein vielleicht etwas kompliziertes Konstrukt zu bauen. Aber eigentlich kanns so schlimm nicht sein. Ich habe eine IP-Cam, die über LTE und VPN verbunden in Schweden steht. Damit nicht permanent Daten durch die Leitung gehen würde ich gerne eine einfache Möglichkeit haben auch für nicht Technik-Versierte Menschen auf die Schnelle ein Bild zu bekommen.
Kurz zur Infrastruktur vor Ort: Ich habe eine FritBox 6820v3, eine Intel NUC und eine Instar-Kamera. Die NUC baut einen VPN-Tunnel zu mir nach hause auf, darüber kann ich mit allen Geräten in Schweden kommunizieren. Klappt auch bestens.Idee:
Ein Script auf der NUC, welches einfach jede Stunde ein Bild per http://bot.telegram.com/token=73738383&message=halloichbineintest&group=11111 verschickt. Das sollte soweit einfach sein, da das Ziel (eine Gruppe) immer identisch ist.Ein zweites Script soll auf Abruf ein Bild an denjenigen schicken, der es angefordert hat. Das kann entweder per inline in der Gruppe sein (/screenshot@botname_bot) oder direkt mit dem Bot sprechend (per inline "Screenshot"). Jetzt ist mein Problem, dass die Antwort ja dort hin muss, wo sie her kommt. Die Anfrage-ChatID wird ja in dem Objekt requestChatID gespeichert. Soweit easy. Mein Problem ist allerdings, wenn ich mir eine Variable aus der requestChatID baue und diese Variable (auch testweise als "toString") in dem "Empfänger"-Feld in dem Telegram-Script einbaue ich nur ein "(9300) 1 of 1 recipients are unknown!" zurück bekomme.
Wie kann ich das also am besten lösen? Die Nachricht muss also entweder an die Gruppe oder an denjenigen per Bot-Direktnachricht gehen, der sie angefordert hat.
Über Hilfe würde ich mich an dieser Stelle SEHR freuen!
Danke!
Edit: Mir fiel noch was auf. Ich habe dafür eine 2. Telegram-Instanz, weil ich ein separates Passwort vergeben möchte, außerdem möchte ich das nicht mit meinen "internen" Sachen für Telegram vermischen. Alles, was ich hier beschreibe bezieht sich also auf die Instanz "telegram.1", da "telegram.0" meine interne Instanz ist.
Ich hab mal Debugging und Verbose für das gezeigte Blockly aktiviert und sehe dann folgendes:11:25:05.447 info javascript.0 (9795) Stop script script.js.12345.GetScreenshot 11:25:05.451 info javascript.0 (9795) Start javascript script.js.12345.GetScreenshot 11:25:05.456 info javascript.0 (9795) script.js.12345.GetScreenshot: subscribe: {"pattern":{"id":"telegram.0.communicate.requestMessageId","change":"ne","q":0},"name":"script.js.12345.GetScreenshot"} 11:25:05.456 info javascript.0 (9795) script.js.12345.GetScreenshot: getState(id=telegram.1.communicate.requestChatId, timerId=undefined) => {"val":67890,"ack":false,"ts":4572457,"q":0,"from":"system.adapter.telegram.1","user":"system.user.admin","lc":247542572457} 11:25:05.456 info javascript.0 (9795) script.js.12345.GetScreenshot: setTimeout(ms=1000) 11:25:05.457 info javascript.0 (9795) script.js.12345.GetScreenshot: registered 1 subscription and 0 schedules 11:25:06.456 info javascript.0 (9795) script.js.12345.GetScreenshot: sendTo(adapter=telegram.1, cmd=send, msg={"text":"text","user":67890})
In Zeile 3 taucht die falsche Instanz auf. Kann es damit zusammenhängen?
Edit2: Noch eine Beobachtung. Wenn ich als Empfänger einfach ein Textbaustein mit der ID hinterlege klappt es problemlos. Ein Debug-Block zeigt mir auch, dass die ID in der Variable eigentlich korrekt ist. Nur scheint der nicht mit Variablen zurechzukommen sondern erwartet unbedingt ein Text?!
-
-
@dslraser Danke, aber ich glaube das hilft mir nur bedingt. Aber vielleicht ist es auch einfach zu umfangreich, dass ich irgendwas übersehe.
Ich weiß am Ende nicht genau, wer alles in der Gruppe ist, bzw. möchte nicht für jeden BotUser ein use-case basteln, das auf ihn zugeschnitten ist.
Ich habe es jetzt aber anders gelöst bekommen, habs allerdings direkt als JS bauen müssen, da das Problem glaube ich ein Bug in dem Adapter zu sein scheint (Wo kann ich sowas am besten mal zur Überprüfung anregen?)var text; text = '1 ' + '2'; if (getState("telegram.1.communicate.requestChatId").val == '[ChatIdDerGruppe]') { sendTo("telegram.1", "send", { text: text, chatId: '[ChatIdDerGruppe]' }); } else if (getState("telegram.1.communicate.requestChatId").val != '[ChatIdDerGruppe]') { sendTo("telegram.1", "send", { text: text, chatId: String((getState("telegram.1.communicate.requestChatId").val)) }); }
Das sorgt jetzt dafür: Ist die letzte requestChatId die ID der Gruppe, dann wird das erste sendTo genutzt, dort ist hardcoded die Gruppe als Empfänger drin. Ist die letzte requestChatId ungleich der ID der Gruppe, dann wird das 2. sendTo genutzt, wo als chatId die ID aus requestChatId steht.
Warum ich glaube, dass es ein Bug ist? Nutzt man im Blockly das "Empfänger"-Attribut, dann wird es im backend als "user: " ausgefüllt und nicht als "chatId". "user" geht allerdings nur mit User-IDs. Daran erkennbar, dass sie kein "-" als präfix haben. Sobald dort hart im Text ein "-" auftaucht wird das im backend zur "chatId", die kompatibel mit negativen Werten ist. (Dass das so ist habe ich irgendwo - ich glaube direkt vom Erschaffer des Adapters - gelesen.)
Nutze ich allerdings eine Variable wird das vom Blockly nicht als negativ erkannt und es wird weiterhin mit "user" geschickt. Der Wert für "user", der negativ ist wird allerdings von Telegram nicht als gültiger User erkannt, daher gibts die Meldung "1 of 1 recipients are unknown!". Und darum muss man den Umweg über JavaScript statt Blockly gehen, da man dort direkt statt "user" "chatId" als Empfänger eintragen kann und schon ist das Problem gelöst. Ist also ein Bug im Blockly. -
@Joshude
geht auch mit Blockly. Lese mal hier (sind nur 12 Beiträge)
Da findest Du auch Blockly Lösungen. -
@dslraser Danke! Das ist ja sogar recht aktuell, hatte ich bisher nicht gefunden.
Auf die Idee, einen normalen SendTo-Block zu nutzen bin ich bisher tatsächlich nicht gekommen. Da mein Script aber soweit ohnehin schon komplett ist oder ich Kleinigkeiten auch mit JS hinzufügen kann werde ich es erstmal so benutzen, weiß aber jetzt wo ich Abhilfe finde. Vielen Dank dafür!