GeekzeugSoftware

Einführung in Telegram-Bots: Nachrichten und Dateien aus dem Terminal senden

Für Telegram gibt es sogenannte Bots – letztlich sind das einfach Nutzer-Accounts für Programme/Roboter statt Menschen. Diese Konten lassen sich dann per API/Schnittstelle ansprechen und ganz „normal“ in Telegram nutzen. Ihr könnt also beispielsweise Umfragen für Terminvereinbarungen in eine Telegram-Gruppe einbauen, eigene Clients schustern, von der Kommandozeile aus Dateien, Fotos oder Text senden, Nachrichten als Telegram-Messages anzeigen und so weiter. Das Schicke daran: Den Bot erstellt Ihr ganz simpel über das Telegram-Standard-Konto Botfather im Dialog. Wir zeigen Euch Schritt für Schritt, wie Ihr einen Bot erstellt und von der Kommandozeile aus Texte und Dateien sendet. Vorwissen wird nicht benötigt.

[UPDATE] Im zweiten Teile zeigen wir Euch, wie Ihr Nachrichten im Terminal empfangen könnt.

[UPDATE 2] Da der Artikel schon was älter ist: Stand September 2017 funktioniert das Vorgehen für Telegram-Bots immer noch. Wenn irgendetwas nicht funktioniert, kontrolliert die Anführungszeichen!

Natürlich gibt es auch fertige Telegram-Bots, für Hundebilder und sowas, hier geht es aber darum, eigene Bots zu erstellen:

1. Botfather integrieren

Fügt zunächst den „Nutzer“ @botfather hinzu – über die Suchfunktion oder den Link auf der Homepage.

telegra-bots
Zunächst fügt Ihr den @Botfather hinzu – ein Angebot, dass Ihr nicht …

2. Telegram-Bot erstellen

Um Euren Bot zu erstellen, sendet dem neuen Nutzer Botfather einfach die Nachrichten

/newbot

und vergebt anschließend auf Nachfrage Nutzer- und Bot-Namen – letztere müssen auf bot enden. Zum Abschluss bekommt Ihr den sogenannten Token, eine längere Zeichenkette, die Euren Bot eindeutig identifiziert. Am besten kopiert Ihr Euch den Token-Code direkt. Optional könnt Ihr noch eine About-Seite, ein Nutzerbild für den Bot etc. einrichten – sendet einfach im Telegram-Client Befehle wie /setuserpic, /help und so weiter. Nicht vergessen: Ihr müsst den Bot jetzt starten und eine erste Nachricht versenden, sonst funktioniert der nächste Schritt nicht.

telegram-bot
Sehr cool: Bots erstellt Ihr im Dialog mit @botfather

3. ID des Chats herausfinden

Um eine Nachricht an einen Telegram-Chat oder eine Telegram-Gruppe zu senden, benögtigt Ihr die entsprechende Chat-ID, die Ihr über folgendes Kommando bekommt:

curl -X POST https://api.telegram.org/bot123456:abcde1234ABCDE/getUpdates

Zunächst: 123456:abcde1234ABCDE müsst Ihr natürlich durch Euren Token-Code ersetzen – das vorangestellte „bot“ muss aber bleiben. Das Linux-Standard-Werkzeug curl dient lediglich dazu, eine HTTP-Anfrage an Telegram abzusetzen. Unter Windows müsst Ihr zunächst curl für Windows installieren. Übrigens: cURL steht für „see url“, aber egal. Das Ergebnis dieser Anfrage ist etwas in der Art:

{"ok":true,"result":[{"update_id":638422092,
"message":{"message_id":9,"from":{"id":268963852,"first_name":"Gizlog"},"chat":{"id":268963852,"first_name":"Gizlog"},"date":1437389925,"text":"c"}},{"update_id":638422093, 

Wichtig ist hier die ID des Chats, in diesem Beispiel also 268963852. Anmerkung: Natürlich könnt Ihr Euren neuen Bot wie jeden anderen Account einer Gruppe hinzufügen – dann taucht beim obigen Ergebnis auch die ID des Gruppen-Chats auf, den Ihr nutzen könnt, um in die Gruppe zu posten. Falls keine Chats erscheinen: Postet eine Nachricht in den gewünschten Chat – ohne Nachrichten gibt es natürlich auch keine Updates!

telegra-bots
Die ID des Chats müsst Ihr auslesen.

4. Nachrichten und Dateien an Telegram senden

Auch zum Senden von Nachrichten nutzen wir wieder curl:

curl -X  POST 'https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text="texty text"'

Ihr seht schon, es ist wieder dasselbe Konstrukt wie oben, aber mit der Methode/dem Befehl „sendMessage“ und daran angefügt, abgetrennt per ?, zunüchst die Chat-ID und dann mit & abgetrennt der zu sendende Text. Und schon landet die Nachricht „texty text“ in Eurem Telegram-Account, abgesandt von „Nutzer“ TutoBot in unserem Beispiel. Das Senden von Dateien und Fotos ist dann selbsterklärend:

curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendDocument" -F chat_id=-419426123 -F document="@/home/mirco/misto.txt"

Die Methode heißt nun sendDocument – allerdings muss die HTTP-Anfrage im Format „multipart/form-data“ gesendet werden, weshalb Chat-ID und Dokumentenpfad separad via F-Parameter an den curl-Befehl angehängt werden. In diesem Beispiel wird die Datei misto.txt an unseren Tutonaut-eigenen Gruppen-Chat gesendet (der Strich gehört zur Gruppen-Chat-ID!). Denkt an das @ vor dem Dokumentenpfad. Der Foto-Befehl ist komplett analog:

curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendPhoto" -F chat_id=-4194264 -F photo="@/home/mirco/rathaus.jpg"
Messaging aus der Bash - viel einfacher kann API-Nutzung kaum sein.
Messaging aus der Bash – viel einfacher kann API-Nutzung kaum sein.

Telegram-Bots produktiv nutzen

Bis hierher ist das ganze freilich nur Spielerei – wie geht’s weiter? Zum einen könntet Ihr Telegram natürlich auch über Programmiersprachen ansprechen und ganze Programmlogiken darum herum stricken. Aber schon auf der Kommandozeile geht noch einiges: Statt eines fixen Texts könnt Ihr natürlich auch eine Variable einsetzen, also statt „texty text“ etwa „$text“ – und diese Variable ließe sich über Skript oder Nutzeranfragen ganz einfach besetzen. Ein Super-Simpel-Beispiel wäre ein Mini-Skript wie:

echo "Gib die Nachricht ein:" &&
read text &&
curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=$text"

Wenn Ihr das etwa als Alias oder Skript abspeichert und dann aufruft, wird zunächst „Gib die Nachricht ein“ ausgegeben, dann gebt Ihr eben die Nachricht ein und per Return wird der eingegebene Text an Telegram gesendet. Soweit einfach mal als Einstieg.

Wenn was unklar ist, einfach fragen, „dumme“ Fragen gibt es bei so einem Thema eh nicht. Und was macht Ihr mit Bots? Oder würdet Ihr gerne machen? Was haltet Ihr überhaupt davon?

Wir haben mittlerweile übrigens eine ganze Reihe von Telegram-Artikeln, etwa zu Titten und Katzen oder einem schicken CLI-Client.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help

103 Kommentare

    1. In einer einzigen curl-Anfrage wird das nicht funktionieren. Aus dem Bauch heraus würde ich zum Posten in mehrere Chats die ID aus der curl-Anfrage einfach durch eine Variable ersetzen:

      id1=botABCDE:123456
      id21=botZDXYW:99887766
      curl -X  POST 'https://api.telegram.org/'$id1'/sendMessage?chat_id=-111111111&text="texty text"'
      curl -X  POST 'https://api.telegram.org/'$id2'/sendMessage?chat_id=-111111111&text="texty text"'
      

      Da könntest Du dann bei Bedarf per Schleife Dutzende Chats bespaßen.

  1. Vielen Dank für die Hilfe… leider funktioniert das wie o.g. nur bei Linux.
    Ich habe es nach langem tüfteln und mit Hilfe rausbekommen.

    Trotzdem vielen Dank

  2. Hey,
    Vielen Dank für deine Anleitung. Leider komme ich nicht weiter, weil ich die ChatID einfach nicht bekommen.
    Mein Bot ist schon einige Jahre alt und ich benutze ihn regelmäßig. Trotzdem bekomme ich das (auch weiter oben mehrmals von anderen erwähnte):
    {„ok“:true,“result“:[]}
    als Antwort mit curl…
    Ich habe dann extra nochmal einen neuen Bot erstellt mit dem selben Ergebnis. Neben „/start“ habe ich auch einfach mal „teeeest“ etc in den Chat mit dem Bot geschrieben. Leider ohne Erfolg.
    Hast du noch nen Tip für mich? Geht die Methode evtl nicht mehr um die ID zu erfahren? (Wenn man die ID mal hat, könnte es ja sein, dass es weiterhin funktioniert).
    Vielen Dank im Voraus
    Max

      1. Hey,
        vielen Dank für die schnelle Antwort.
        Leider steht da bei mir nur „@BOTNAME“ oder „@CHATNAME“ und keine ID…
        also im Chat mit botfather steht da „@botfather“ in meinem testkanel „@testkanal“.
        Nur bei der Meldung von Telgram, dass sich jemand im Netz angemeldet hat (ich – gerade im Browser), steht eine ID… Alle anderen Chats und Kanäle sind nur per Name benannt :(

    1. Das dürfte an den Privacy-Einstellungen liegen: Im Botfather über /setprivacy deaktivieren oder versuch mal, eine Nachricht in dem Chat abszusetzen, die mit / beginnt, also zum Beispiel /foobar. Nachrichten mit / kann der Bot trotz gesetzter Privacy-Option lesen. In beiden Fällen nicht vergessen, erst eine Nachricht abzusenden, dann über curl das getUpdates absenden – sonst bleibt das Updaten natürlich leer.

      1. Hey,
        auch dir danke für die schnelle Antwort.
        Leider hat das keinen Erfolg gebracht. Beide bots waren tatsächlich auf „enable“ bei /setprivacy gesetzt. Das disablen hat aber leider nichts gebracht.
        Ich habe beide Bots abgefragt und beim zweiten kam die Meldung, dass zwei Bot Instanzen laufen (nach ein paar Sekunden, dann aber wieder die „leere“ Antwort).
        Ich habe bei meinem alten Bot schon sehr viele /1234abc Nachrichten geschickt seit es den gibt.
        EDIT: Während ich das hier geschrieben habe, habe ich weiter probiert und plötzlich ging es. Es scheint, als ob irgendwas ein paar Gedenk minuten braucht um zu reagieren. Außerdem scheint es wichtig zu sein, einen Kanal anzulegen und den Bot hierein einzuladen? Ich muss jetzt leider arbeiten und kann nicht weiter testen. Aber folgendes ist jetzt passiert:
        BOTalt ist in einem öffentlichen Kanal (von mir erstellt) zusammen mit mir. Ich habe dort über die WEBapi eine nachricht geschrieben. Wenn ich jetzt über CURL den BOTneu abfrage, bekomme ich IDs angezeigt der Nachrichten im Kanal mit dem alten Bot… Also irgendwie seltsam… Ich Frage den neuen Bot ab und bekomme die Nachrichten im Kanal mit dem alten Bot angezeigt? Wenn ich von der Arbeit komme, versuche ich es nochmal andersrum und dann versuche ich es nochmal nachdem ich den BOTneu mal lösche.

      2. So, ich bin jetzt zuhause und habe es getestet.
        Mit meinem Bestandsbot klappt es einfach nicht. Ich habe alles so gemacht wie beim neuen bot und bekomme einfach keine ID… sehr seltsam. Muss ich wohl zwei Bots unterhalten:(

        1. Also, um mich selbst zu korrigieren.
          Wenn ich mit dem Token des neuen Bots den CURL Befehl eingebe, bekomme ich die ID des ALTEN Bots angezeigt, sowie die Chat-ID des Kanals in dem der ALTE Bot ist.
          Andersrum klappt es nicht. Ist mir aber auch egal, da ich den NEUEN Bot jetzt gelöscht habe und über den CURL….sendMessage Befehl inkl Token des ALTEN Bots jetzt Nachrichten an den alten Bot und den Kanal mit dem alten Bot schicken kann. Alles etwas komisch, aber es klappt

  3. Servus

    folgende Frage
    Ich bekomme regelmäßig Faxe… aber immer mit Datum und Uhrzeit versehen. Das sich natürlich ändert..
    Hier muss ich ja den genauen Dateinamen angeben. Gibt es eine Möglichkeit das er das immer sendet trotz anderen ziffern?
    Am besten gleich mit der möglichkeit nach dem versenden an Telegram zu löschen im Ordner…..

    (BEISPIEL)
    curl -X POST „https://api.telegram.org/botxxxxxx:xxxxxxx/sendDocument“ -F chat_id=-12345678 -F document=“@//Fritz-nas/fritz.nas/Sony-StorageMedia-01/FRITZ/faxbox/25.08.19_14.19_Telefax.080000854334565.pdf“

    1. Es kommt ein wenig drauf an, was genau Du tust und was in den Ordner liegt. Angenommen in dem Ordner liegt nur diese eine PDF-Datei, die verschickt und dann gelöscht werden soll, dann wäre das hier ein möglicher Workflow:

      fax=$(ls *.pdf)
      curl -X POST „https://api.telegram.org/botxxxxxx:xxxxxxx/sendDocument“ -F chat_id=-12345678 -F document=“@//Fritz-nas/fritz.nas/Sony-StorageMedia-01/FRITZ/faxbox/$fax“
      rm $fax
      

      Du gibst also eine Variable statt des Dateinamens an. Wie genau Du den korrekten Dateinamen in die Variable bekommst, hängt von den Umständen ab. Ein „ls *.pdf“ funktioniert natürlich nur, wenn es nur ein PDF im Ordner gibt. Ansonsten müsstes Du mit regulären Ausdrücken arbeiten, also (recht komplexen) Beschreibungen des Dateinamens:

      fax=$(find . -maxdepth 1  -printf "%f\n" | egrep '^[[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2}_[[:digit:]]{2}\.[[:digit:]]{2}_Telefax.080000854334565.pdf')
      

      Die Regex nach egrep passt, wenn die Zeile mit zwei Ziffern beginnt (^), dann ein Punkt folgt (.), dann wieder zwei Ziffern, ein Punkt, zwei Ziffern, ein Unterstrich, zwei Ziffern, ein Punkt, zwei Ziffern, ein Unterstrich und dann Telefax.080000854334565.pdf.

      Zum Testen kannst Du auf Regex101 herumspielen.

  4. Servus

    folgende Frage
    Ich bekomme regelmäßig Faxe… aber immer mit Datum und Uhrzeit versehen. Das sich natürlich ändert..
    Hier muss ich ja den genauen Dateinamen angeben. Gibt es eine Möglichkeit das er das immer sendet trotz anderen ziffern?
    Am besten gleich mit der möglichkeit nach dem versenden an Telegram zu löschen im Ordner…..

    (BEISPIEL)
    curl -X POST „https://api.telegram.org/botxxxxxx:xxxxxxx/sendDocument“ -F chat_id=-12345678 -F document=“@//Fritz-nas/fritz.nas/Sony-StorageMedia-01/FRITZ/faxbox/25.08.19_14.19_Telefax.08213240.pdf“

  5. Hallo, ich betreibe einen Chat auf unserer Vereinshomepage. Ich lasse mir per Telegrambot eine Nachricht schicken, wenn jemand den Chat betreten hat. Ich möchte jetzt auch die Nachricht bekommen, dass sich der Chatuser auch ausloggt!
    Bin kein php oder html Kenner und habe mir bisher alles aus dem Internet zusammen gelesen, aber für die Logout habe ich absolut nichts gefunden.
    Kannst du mir helfen?
    Danke Christof

    1. Da muss ich passen, das ist eher eine Frage des eingesetzten Chats.

      Grundsätzlich sehe ich zwei Möglichkeiten: Entweder in der Chat-Software wird das Ein- und Ausloggen schlicht mit einem zusätzlichen (PHP-)Befehl versehen, sprich es wird eine URL aufgerufen, die der hier im Artikel beschriebenen Terminal-Variante recht ähnlich ist. Vielleicht hilft hier ein Beitrag auf Stack Overflow weiter. Oder wenn das nicht geht: Basteln/Scripting. Auch hier kommt es auf die Chat-Software an, aber vermutlich könnte man irgendwie die angemeldeten Nutzer auslesen, in einer temporären „Datenbank“ (Array, Textdatei, echte Datenbank) speichern, diese zum Beispiel fünfminütlich abfragen und bei Änderungen entsprechend per Telegram Meldungen verschicken.

      Aber wie gesagt, da kann vermutlich der Hersteller der Chat-Software eher helfen. Ich weiß, dass das nicht immer in Frage kommt, aber die einfachste Variante wäre vermutlich: Chat von der Website in eine Telegram-Grupp verlegen ;) Aber gut, da müssten dann alle Mitglieder mitziehen …

  6. Hallo,

    ich verwende einen Telegram-Bot mit ioBroker. Habe mir ein script geschrieben, das mir den Status meiner Smarthome-Geräte via Telegram schickt. Soweit funktioniert auch alles, allerdings bekomme ich nach jeder Nachricht eine zweite geschickt. Der Inhalt der Nachricht lautet: „Test message“.
    Warum wird mir diese Nachricht geschickt und wie bekomme ich die weg?

    LG,
    Philipp

    1. Ich muss ein wenig raten … Von Telegram dürfte die Nachricht eigentlich nicht stammen, ist mir jedenfalls noch nie untergekommen und ich wüsste auch nicht wo die herkommen sollte. Nutzt Du vielleicht den ioBroker telegram adapter von https://github.com/iobroker-community-adapters/ioBroker.telegram? Falls ja: In den Beispielaufrufen kommt exakt „Test message“ vor – da würde ich vermuten, dass Dir beim Aufsetzen irgendwo so ein Beispiel mit rein gerutscht ist. Die einzige Alternative, die mir spontan einfällt wäre, dass irgendein Smarthome-Gerät diese Nachricht schickt – erscheint mir aber nicht sonderlich plausibel.
      Wie gesagt, ich muss ein wenig raten, für alles andere gibt es da für mich zu viele Unbekannte (Skripte, genutzte Geräte etc.).

      1. Hallo Mirco,

        Ja ich benutze den https://github.com/iobroker-community-adapters/ioBroker.telegram Adapter.

        Habe ihn jetzt auch schon gelöscht und ihn nochmals installiert. Die Meldung wird weiterhin gesendet.

        Habe schon in allen Objekten die den telegram adapter betreffen und auch die von text2command nachgeschaut. Finde jedoch nichts was das auslösen könnte.

        Habe jetz ein einfaches JavaScript erstellt, und führe dieses aus.

        sendTo(„telegram“, „send“, {
        text: ‚Hallo Welt!‘
        });

        Immer noch die zweite nachricht die mir Test message anzeigt.

        Keine Ahnung.
        Danke für deine Antwort!
        LG,
        Philipp

  7. curl -X POST ‚https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=“texty text“‚
    […]
    Und schon landet die Nachricht „texty text“ in Eurem Telegram-Account, abgesandt von „Nutzer“ TutoBot in unserem Beispiel.

    Das ist leider nicht der Fall, es kommt lediglich eine Fehlermldung (not found). Das war’s dann wohl. Ich liebe solche Anleitungen, die davon ausgehen, dass alles klappt, und wenn nicht, dann eben nicht…

    1. So ist das eben mit Anleitungen, man kann darin nicht jede Eventualität abbilden … Wenn Du ein paar mehr Infos als die unvollständige Fehlermeldung hast, wuppen wir Dich bestimmt noch auf die klappt-Seite. Wenn Du zum Beispiel „command not found“ meinst, könnte schlicht das Programm curl fehlen.

      Ich habe den Befehl eben nochmal getestet – funktioniert immer noch. In Deinem zitierten String steht der ganze http-String in Kommata, obwohl da einfache Anführungszeichen hingehören, also so:

      curl -X  POST 'https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text="texty text"'
      

      Ohne die Anführungszeichen würde der Terminal alles nach dem & als neuen Befehl interpretieren und entsprechend für den Nicht-Befehl „text“ ein „command not found“ ausgeben. Hilft das vielleicht schon?

  8. Für Dummies:
    Wann ist das online? Muss der PC dafür an sein? Muss man einen Server mieten? Oder läuft das über Telegrams Server dauerhaft?

  9. Irre ich mich, oder steht wirklich nirgends, wozu man das gebrauchen kann? Wenn ich richtig verstehe, kann ich Texte versenden, aber ich erkenne nicht, an wen ich die versenden kann. Gibt es vielleicht irgendwo eine Erläuterung, die man verstehen kann, wenn man nicht schon vorher Bescheid weiß?

    1. An wen Du schreibst, steht unter Schritt 2 – an die herausgefundene Chat-ID. Die Chat-ID steht für einen der Kontakte/Chats. Über die Namen der Kontakte geht das leider nicht.

  10. Hallo!

    Toller Beitrag!
    Gibt es auch eine Möglichkeit Videoanrufe zu tätigen?
    Ich möchte, dass mich der Bot auf Anfrage anruft und mir einen Livestream meines 3D Druckers sendet.

    1. Danke! Und: Sehr schöne Frage, hört man auch nicht alle Tage ;)
      Ich glaube eher nicht dran, die Bot-API scheint nichts zum Initiieren von Anrufen herzugeben, da müsstest Du vermutlich über die Telegram-API richtig programmieren, einen Video-Call-only-Client oder sowas. Sicher bin ich mir da allerdings nicht.

      Ich hab’s eher mit kruden Umwegen.
      So aus dem Bauch heraus: Man könnte bestimmt einen Telegram-(Web)-Client so einstellen, dass er immer nur die neueste Nachricht zeigt. Und da so ein Webcam-Livestream nur eine Reihe von Bildern ist, könnt man ihn in Einzelbilder zerlegen davon 25 pro Sekunde an Telegram schicken; oder wie viele auch immer die Technik überhaupt möglich machen würde. Einfacher dürfte es sein, ein Skript auf Zuruf ein X-Skunden langes Video zu machen und dann per Telegram zu verschicken – wenn es nur um kurze Kontrollen geht. So oder so ist es Skripterei-Bastelarbeit.

      Ich persönlich würde vermutlich den Aufwand scheuen und einfach die Weboberfläche einer Webcam nutzen …

      1. Die Bot-API könnte doch was hergeben: Beim Senden von Videos gibt es eine Option „supports_streaming“ – vielleicht läuft das eine Möglichkeit hinaus. Wenn die Kamera in eine Videodatei streamt – wer weiß, vielleicht ließe sich diese Datei senden und noch vielleichter würde das als Stream ankommen … Ich würde jedenfalls mal da ansetzen.

  11. Vielen Dank für diese Super-Beschreibung! Mein Sohn wollte für seine HomeMatic Überwachung diesen Dienst nutzen, hatte aber nichts zu Senden an Gruppen gefunden. Mit dieser Anleitung hat es bei mir auf Anhieb geklappt.

  12. Wie kann ich Telegram beibringen, mir zu bestimmten Zeiten das Guten Morgen und gute Nacht Wünschen abzunehmen? Wahlweise meinetwegen mit Emojis…

  13. Danke für die Anleitung
    die erst Hürde zur Erkennung der ChatID (Chat erst starten) könnte man evtl. noch einfacher darstellen

    und mit curl unter Windows war auch trickreich
    Die Hochkommata tausch war bei mir nicht genug, das Minus – vor der Chat-ID hat er auch nicht angenommen.
    Falls da noch jemand drüber stolpern sollte :)
    curl -X POST „https://api.telegram.org/botBOTID/sendMessage?chat_id=CHAT-ID&text=’texty text'“

  14. Erst einmal danke für das gute Tutorial hat mir sehr geholfen.
    Nun hätte ich eine Frage, am einer bestimmten Anzahl an Updates werden nur noch die gleichen Messages angezeigt, wie bekomme ich die neuesten Nachrichten?

    VG
    Sven

  15. Hallo

    Ich nutze mehrere Überwachungskamera mit Gprs Funktion, wo ich die Bilder per Mail bekomme, das ist aber sehr unübersichtlich.
    Ich möchte möchte diese Bilder direkt auf Telegram senden evtl auch direkt in eine Gruppe , gibt es da schon eine Anleitung.
    Danke schon im Voraus

    Gruß Michael

  16. Hallo ich möchte eine URL die mir die datei Test.mp3 zusendet wenn ich die URL öffne (ich habe curl nicht installiert)
    wenn ich diese Url
    https://api.telegram.org/bot123456:abcd … text=$text
    im Firefox öffne wird mir eine Nachricht mit „text“ gesendent bis jetzt habe ich es noch nicht hinbekommen das mir die MP3 geschickt wird.

    Kann mir da jemand helfen?

  17. Abend zusammen, kann mir jemand erklären ob es das auch als Group basierende Lösung gibt? Fand bislang nur Möglichkeiten für den benannten Channel. Ob der Bot dabei ist oder nicht, ist erst einmal für mich nicht wichtig.

    Lieben Gruß, schönen Abend
    Tobi

  18. Eine Frage zu den Gruppen – ich würde gerne automatisch Antworten an den Bot per Skript auswerten … dies funktioniert allerdings bei mir aktuell nur, wenn ich den Bot direkt anschreibe – schreib ich in die Gruppe, kriegt er nix mit. (es steht auch bei den Gruppeneinstellungen beim Bot „keinen Zugriff auf Nachrichten“) – ist das eine generelle Einschränkung oder mach ich da was falsch?

    Danke,
    Philipp

    1. „Keinen Zugriff auf Nachrichten“ ist die Standardeinstellung für die Privatsphäre, Du kannst Bots auch den Zugriff auf Nachrichten erlauben. Einfach im BotFather /setprivacy ausführen und dann die Privacy-Einstellung auf Disabled setzen.

  19. Hallo
    danke für deine Infos

    wie aber kann ich zum Beispiel

    hostname
    hostname –ip-address

    df -T /

    diese Infos in einem Telegram versenden?
    muss ich diese Infos in ein file schreiben
    dann das file auslesen mit cat auslesen und senden?

    1. Ah – Du bist schon selbst auf die Lösung gekommen ;) Dann war die Antwort von eben wohl überflüssig.

      Statt über eine Textdatei ließe sich das sicherlich auch über Variablen regeln, aber im Grunde passt das schon so wie Du geschrieben hast: Der Text muss Telegram schon direkt übergeben werden. Eine Datei schicken und sie quasi auf Client-Seite auszulesen, klingt aus dem Bauch heraus nicht wirklich machbar.

  20. Hallo
    ich hab ein problem bei Textfile versenden unter Debian (im Verzeichniss telegram ist das file und lesbar

    hostname > fdisk3.txt
    fdisk -l >> fdisk3.txt
    curl -X POST „https://api.telegram.org/botNUMMER -F chat_id=NUMMER -F document=“@/telegram/fdisk3.txt“

    im command line habe ich am schluss nur ein
    >

        1. Das ist auch so gedacht ;) Wenn Du den Inhalt einer Textdatei schicken willst, nutz einfach den normalen Text-Senden-Befehl. Statt fixem Text setzt Du dort eine Variable, der Du wiederum vorher den Text zuordnest

        2. Das Prinzip mit der Variablen entspricht dem letzten Kapitel „Telegram-Bots produktiv nutzen“, nur dass die Variable hier nicht eingelesen sondern vorher manuell zugewiesen wird. Zum Beispiel das Senden des Inhalts der Datei MeineDatei.txt:

          a=$(cat MeineDatei.txt)
          curl -X POST „https://api.telegram.org/botBlaBlaBlaBlaBla/sendMessage?chat_id=-123456789&text=$a“‚

          Statt nach dem Gleichzeichen zu sendenden Text direkt zu schreiben, kommt dort einfach die Variable hin. Wie Du die Variable vorher belegst, ist Dir überlassen. Statt cat könnte man beispielsweise irgendwelche Befehle direkt „in die Variable schreiben lassen“, etwa:

          a=$(ls ./MeinVerzeichnis)
          a=$(curl https://www.tutonaut.de)
          a=$(MeinSkript.sh)

  21. hallo,
    #
    kann mir jemand helfen ?
    habe einen telegram bot .
    Nach diesem Skript sehe ich den ersten Post auf meiner PHP Webseite
    dafür steht die [0]
    möchte aber alle posts anzeigen lassen !
    Wie realisiere ich das ?

    $bottoken = „kjbkjebflkneföfokrogjorjgpr“;
    $website = „https://api.telegram.org/bot“.$bottoken;

    $update = file_get_contents($website.“/getupdates“);
    $updatea = json_decode($update, TRUE);

    $text = $updatea[„result“][0][„message“][„text“];
    print_r($text);

  22. Hallo Mirco

    habe nun nach deiner Anleitung mir einen Text schicken können, jedoch ein Docoment oder ein Foto will weder als URL Eingabe im Firefox noch als Terminal Eingabe funktionieren (Text funktioniert beides)

    #send message (funktioniert)
    curl -X POST ‚https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=123456789&text=“texty text“‚

    #send photo (funktioniert nicht)
    curl -X POST ’https://api.telegram.org/bot123456:abcde1234ABCDE/sendPhoto“ -F chat_id=123456789 -F photo=“@home/benutzer/test.jpg“‚

    #send docoment (funktioniert nicht)
    curl -X POST ’https://api.telegram.org/bot123456:abcde1234ABCDE/sendDocument“ -F chat_id=123456789 -F document=“@/home/benutzer/test.jpg“‚

    Habe nun einige Varianten durchgespielt mit den Anführungszeichen oder Leerzeichen, usw

    Kannst du mir hier bitte weiterhelfen, denn eigentlich sollte das doch zu schaffen sein.
    Zumindest denk ich so
    Der Fehler kann doch nur in der Zeile zu finden sein, oder?

    gruß Stefan

    1. #send message (funktioniert)
      curl -X POST ‚https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=123456789&text=“texty text“‚

      nach „texty text“ wird ein Beistrich angeführt, schreibe dies aber schon mit ’ falls es Ungereimtheiten kommen sollte

    2. Also in Deinen Beispielen passen die Anführungszeichen nicht: Vor https ein einzelnes und hinter sendDocument ein doppeltes. Wenn Du das erste änderst, sollte es passen. Zumindest wäre dann die Syntax korrekt. Wenn Dateipfad, ID und Token stimmen, dürfte es funktionieren.
      Falls nicht: Was kam denn für eine Fehlermeldung?

  23. Hi Mirco,
    ich habe eine interessante Anwendung deines Artikels gefunden, komme aber an einer Stelle nicht weiter.
    Der bot pusht Bilder die ich aus dem internet adressiere, jedoch keine lokalen Bilder vom NAS oder meinem PC.

    Die Anwendung wäre das Commando später in die Commandozeile der Axis CCTV Kamera einzutragen.
    Diese wird im Step 1 vorweg einen snapshoot erstellen und per FTP zu einem synology NAS laden.
    Im Step 2 soll der telegram Befehl abgegeben werden und das Bild zum Iphone senden.

    Der Trigger der Kamera ist Bewegungserkennung.
    Ergebnis: Bild auf dem Iphone & Watch wenn Bewegung an Haustür.

    Testen versuche ich unter Win10, Eingabe in Firefox Adressleiste.

    das klappt: (ID’s geändert)
    https://api.telegram.org/bot12345678:AAabababababababZw/sendPhoto?chat_id=141414141&photo=http://www.rattengift.com/wp-content/uploads/2011/04/ratten-paar.jpg

    das nicht:
    https://api.telegram.org/bot12345678:AAabababababababZw/sendPhoto?chat_id=141414141&photo=http:/192.168.1.44/image.jpg

    auf der IP ist das synology NAS mit apache Webserver.

    auch nicht so:
    https://api.telegram.org/bot12345678:AAabababababababZw/sendPhoto?chat_id=141414141&photo=„http:/192.168.1.44/image.jpg“

    Das Bild ansich ist im firefox über http:/192.168.1.44/image.jpg auch anzeigbar.

    Adressiere ich falsch?
    Fehler 400 „Bad Request: wrong file identifier/HTTP URL specified“

    Ich peil es nicht.. so schwer kann das doch nicht sein…
    Hast Du eine Idee für mich?

    1. Ich habe nie mit Online-Dateien herumgespielt, aber mal aus dem Bauch heraus: Du übergibtst die lokale Adresse 192.1268.1.44 an den Telegram-Server – und der kann mit Deiner lokalen Adresse vermutlich nichts anfangen. Eigentlich komisch, weil ja auch ein normaler Dateipfad funktioniert, aber spontan fällt mir da nichts besseres ein.
      Falls Du einen DDNS nutzt, versuch es mal über die Adresse.

  24. Hey…ich hab jetzt alles so gemacht, wie in der Anleitung beschrieben…ich hab zwar ne id, kann aber per message.sendmessage (ka, ob das richtige schrieben ist) keine Nachrichten an den bot versenden…woran liegt das?

  25. Hallo kannst du mir sagen wie ich Button in einen Bot einbauen kann?
    Also sprich das nicht zb /1 als Befehl eingeben werden muss sondern man einen Button dafür hat.
    Das wäre cool :-)

      1. Hallo,

        ich habe das gleiche Problem. Ich habe meinen Bot eingerichtet und ich kann auch FHEM aktion auslösen usw.
        Nun brauche ich allerdings die ChatID für Tasker.

        Jemand eine Idee?

        Habe testweise einen weiteren Bot erstellt (/start natürlich gemacht und mehrmals Texte geschreiben) da bekomme ich auch nur
        {„ok“:true,“result“:[]}

        1. Hab ich auch versucht. Beim neuen Bot das gleiche Ergebnis. getMe funktioniert, getUpdates immer nur {„ok“:true,“result“:[]}.
          Auch hat meine Suche an anderen Stellen des Netzes nix gebracht. Ein Tip wäre schön! Danke

  26. Danke für Deine tolle Anleitung. Ich benutze den Bot für ioBroker und Hausautomation. Das heisst, ich kann mit meinem Haus chatten und z.B. das Licht aus den Ferne einschalten oder Status Meldungen erhalten. Das funktioniert prima. Um nun mit IFTTT zu arbeiten, muss ich Befehle über die URL versenden, da es zur Zeit noch keine Telegram Instanz für IFTTT gibt. Um die Chat ID zu bekommen, bin ich Deiner Anleitung gefolgt, erhalte aber immer: {„ok“:false,“error_code“:404,“description“:“Not Found“} als Ergebnis.

    Am Mac Terminal benutze ich folgende Eingabe:

    sudo curl -X POST https://api.telegram.org/R2D2:296974797:XXXXXh1KTMmccQAqh6767R5mYk4b0/getUpdates

    Wenn der Bot R2D2 heißt und er Username Peter ist, dann gebe ich ein R2D2, Peter@R2D2 oder R2D2_bot ein? Ich habe alle Varianten durch und bestimmt keinen Fehler beim Token gemacht. Was kann ich noch tun?

    1. Der Bot-Name muss gar nicht in die URL, nur der Token, den den der Botfather ausgegeben hat, so dass dann sowas rauskommt: …/botTOKEN/getUpdates. „bot“ steht hier nicht stellvertretend für den Bot-Namen, es sollten tatsächlich die drei Buchstabe bot sein. Wenn das hilft, gib doch mal kurz bescheid, dann füge ich noch einen Hinweis in den Text ein.

      1. Das hat geholfen. Jedenfalls etwas ;-)
        Ich bekomme jedoch immer {„ok“:true,“result“:[]} als response. Die Gruppe ist aktiv, ich habe Nachrichten versendet und vom Bot empfangen. Nur der Parameter getMe bringt die Chat ID vom Bot. Der Parameter getUpdates bringt immer nur das leere Ergebnis.

  27. Gute Beschreibung. Danke.
    Ich schaffe es nur leider nicht die ID zu Bekommen. Ich erhalte immer nur ein:

    {„ok“:true,“result“:[]}

    Die API stimmt, ändere ich eine Zahl kommt soort als Antwort ein Fehler.
    Haben die was geändert?
    Grüße,
    Gal

  28. Ich habe folgendes „Problem“ und bin mir nicht ganz klar darüber, ob ich das mit Telegram-Bots lösen kann bzw. sollte oder ob es das einfachere/bessere Methoden gibt :

    mehrere Personen werden per E-Mail von einem Server automatisch alarmiert und jeder muß dann entscheiden, ob er zum Einsatz fährt oder nicht. Bis jetzt gibt es keine Möglichkeit, die anderen alarmierten Personen darüber zu informieren, ob man kommt und wie lange die Anfahrt dauert. So kann es passieren, daß wir überbesetzt sind oder – noch schlimmer – zu wenige Leute sind, da jeder meint, der andere wird eh schon fahren. Das möchte ich mit einer Feedbackmöglichkeit an alle Alarmierten ändern.
    Es werden von den Leute die unterschiedlichsten Endgeräte, Betriebssysteme und E-Mail-Programme benutzt.

    Macht das Sinn, das mit so einem Telegram-Bot zu lösen ? Gibt’s Meinungen/Vorschläge dazu ?

    1. Mmmhhh, auf Anhieb klingt das so, als würde es helfen, statt oder zusätzlich zu Mails Telegram-Nachrichten an zu verschicken. Das könnte einfach an eine Gruppe geschickt werden, in der alle drin sind – Feedback könnte dann jeder ganz einfach geben. Ein wenig mehr Aufwand würde es bedeuten, das per Bot zu lösen, der zum Beispiel sowas könnte: Nachricht geht an die einzelnen Nutzer und diese antworten über einen Ja/Nein-Button und vielleicht noch eine Auswahl für die Zeit, etwa 15/30/45/60 Minuten.

      Generell würde ich sagen, Telegram wäre eine gute Lösung dafür, da es im Gegensatz zu Mail synchrone Kommunikation ist – und „Einsatz“ klingt jetzt eher nach was Dringlichen. Die Frage ist, wie die bisherige Mail verschickt wird. Variante 1: Macht das jemand manuell, kann derjeniger auch eine Telegram-Nachricht an die Gruppe verschicken – technischer Aufwand ist dann gleich null. Variante 2: Wenn die Mail automatisiert, etwa von einem Informationssystem, verschickt wird und dann einfach zusätzlich die Telegram-Nachricht raus soll, müsste das irgendwie per Skript gelöst werden – technischer Aufwand hängt vom Mail-Verschick-System ab, auf Telegram-Seite wäre es in etwa das, was hier im Artikel steht. Variante 3: Wenn das ganze komfortabel per Bot passieren soll, muss dafür ein wenig Logik erstellt werden – das dürfte nicht allzu schwierig sein, aber man bräuchte schon einen Menschen, der Grundwissen Scripting/Programmierung hat und die Zeit, sich einzuarbeiten.

      Alternativ kannst Du auch mal schauen, ob es nicht Quick&Dirty-Möglichkeiten gibt. Beispielsweise gibt es den @PollBot, der Umfragen samt Antwortmöglichkeiten per Button und Auswertungen erstellt. Du erreichst den Bot über die Suchfunktion von Telegram – vielleicht ließe sich der zweckentfremden.

      Wenn „Einsatz“ hier nicht zeitkritisch ist, und bei E-Mail muss ich eigentlich davon ausgehen, würde es mich allerdings wundern, wenn sich nicht irgendwo ein entsprechendes Stück Software finden lassen würde; beispielsweise als Add-on für ein Content Management System. Stichworte die hier zielführend sein könnten: Vereinsverwaltung, Leitsystem, Konferenz-Management, Echtzeit-Terminverwaltung (Doodle auf Bot-Basis wäre perfekt ;) ) oder vielleicht auch irgendwas aus dem Bereich Feuerwehr, da scheint es auch Open-Source-Leitsystem-Lösungen zu geben …

      Ist jetzt alles ein wenig Brainstorming-mäßig, aber vielleicht ist ja ein passender Ansatz dabei.

      1. Vielen Dank für die schnelle Antwort.
        Das Beispiel von der Feuerwehr geht schon in die Richtung, wir sind aber Teil des Rettungsdienstes. Alarmiert werden wir vollautoamtisch von der Leitstelle, aber in erster Linie über den Piepser (also Funk) und nur zusätzlich per E-Mail und SMS. Der Piepser ist aber nur Funkempfänger und kann nichts Zurücksenden. Dass das nicht optimal ist, ist bekannt, aber zur Zeit gibt’s dafür noch keine akzeptierte Lösung.
        Bis da was kommt wollen wir hier vor Ort zumindest eine Quick&Dirty-Lösung haben, die auch nur als Zusatzinfo genutzt werden wird – 100% darauf verlassen werden wir uns sicher nicht.

        Beim Leitstellensystem können wir nix ändern und sicherlich auch die ITler nicht dazu überreden; alles was wir machen ist sowieso nicht amtlich und damit Grauzone. Die Varianten 1 + 2 fallen also aus.

        Brainstorming war schon richtig. Ich war mir hier nur nicht im Klaren, ob ich das Bot-System richtig verstanden habe.
        Ich such dann also mal weiter und werd nich bei Bedarf nochmal melden.

        Vielen herzlichen Dank für die Mühe und die Antwort !

      1. result[] bleibt leer, wenn der bot zuvor nicht in Aktion getreten ist. Also einfach einmal den bot anschreiben. Der Botfather gibt dir bei der Erstellung des bots einen Link hierfür. Danach nochmal getUpdates ausführen und es sollte funktionieren.

  29. Hallo
    bei mir kommt der fehler,
    curl: (60) SSL certificate problem: self signed certificate in certificate chain
    More details here: http://curl.haxx.se/docs/sslcerts.html

    curl performs SSL certificate verification by default, using a „bundle“
    of Certificate Authority (CA) public keys (CA certs). If the default
    bundle file isn’t adequate, you can specify an alternate file
    using the –cacert option.
    If this HTTPS server uses a certificate signed by a CA represented in
    the bundle, the certificate verification probably failed due to a
    problem with the certificate (it might be expired, or the name might
    not match the domain name in the URL).
    If you’d like to turn off curl’s verification of the certificate, use
    the -k (or –insecure) option.

    was mache ich da falsch
    mfg Farmer

    1. Irgendwo auf dem Weg von Dir zum angesprochenen Server liegt ein ungültiges SSL-Zertifikat – wo und warum genau kann ich nicht sagen. Du könntest wie vorgeschlagen den Schalter „-k“ nutzen, der auch SSL-Verbindungen ohne Zertifikatscheck erlaubt. Im Zweifelsfall könnte die Transportverschlüsselung über SSL somit angreifbar/unsicher sein. Sofern es zunächst mal ums Testen geht und/oder keine lebenswichtigen Daten telegrammiert werden, ist das nun aber auch nicht so tragisch.
      Was das Problem an sich angeht: Funkst Du vielleicht aus einem komplexeren Netzwerk heraus? Konfiguriert da jemand selbst SSL? (Falls ja: DER muss es wissen.) Oder hat sich das Problem mittlerweile vielleicht schon erledigt?

  30. Zu dieser Anmerkung hätte ich ’ne Anmerkung ;)

    → »Anmerkung: Natürlich könnt Ihr Euren neuen Bot wie jeden anderen Account einer Gruppe hinzufügen«

    Denn wenn ich versuche, in einem Kanal von mir (in dem nur ich selbst Mitglied bin, da auch nur für mich selbst gedacht) meinen Bot hinzuzufügen (über den Web-Client), so erscheint bei mir folgende Fehlermeldung:

    ===
    Fehler
    Eine Parameter fehlt oder ist ungültig.
    Method: channels.inviteToChannel
    Result: {„_“:“rpc_error“,“error_code“:400,“error_message“:“USER_BOT“}
    Stack: Error
    at u (https://web.telegram.org/js/app.js:18:3697)

    Ist Dir dieser „Fehler“ bekannt?

    Danke!
    webaschtl

  31. … dann gilt dies bei mir = nur unter Windows ;)

    Denn curl -X POST ‚https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=“texty text“‚ konnte ich NICHT ausführen. Erst nachdem ich die Anführungszeichen „umgedreht“ hatte …

    Doch ’ne ganz andere Frage: ließen sich mit einem solchen Bot auch die Nachrichten eines Kanals auslesen, den nur ich selbst „fülle“, quasi nur für eigene Zwecke nutze?

    DANKE & demnächst ’ne Gute Nacht! :)

        1. Auch wenn du es wahrscheinlich nicht mehr brauchst. Für die nach uns :D

          Du musst deinen Bot auch erst mit einer Nachricht anschreiben. Das Standardmäßige „/start“ reicht auch schon

        2. Bei mir lag es daran das ich bereits ein Beispielscript am laufen hatte und es somit keine „unbearbeiteten“ Updates gab.

        3. Hi Mirco,

          Vielen Dank für die gute Anleitung.

          Ich habe jedoch ein kleines Problem damit.

          Ich habe folgendes script:

          output=$(date)

          curl -X POST „https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=“$output“

          Der bot soll schicken: Tue Dec 24 12:40:32 UTC 2019

          Es kommt jedoch nur folgendes an: Tue

          Frohe Weihnachten

          Malte

        4. Frohe Weihnachten!

          Das Anführungszeichen vor $output muss weg, dann sollte es funktionieren. Tendenziell bekommst Du nach dem Befehl oben auch nicht direkt das „Tue“, sondern erst ein „>“ im Terminal, das mit Enter bestätigt werden muss – weil eben auf ein schließendes Anführungszeichen gewartet wird. Ein Tue, oder hier ein „Mi,“ entsteht, weil das erste Leerzeichen in der Variablen quasi als Ende des Variablenwerts gewertet wird.

          Bei Bash-Bedingungen gibt es das auch, etwa:

          a="Hallo Welt"
          [ $a = $a ] && echo "echo wird nie ausgeführt, weil die Aussage unwahr ist ..."
          [ "$a" = "$a" ] && echo "Mit Anführungszeichen ist die Aussage wahr"
          Lustigerweise:
          [[ $a = $a ]] && echo "Wahr - aber das ist ein anderes Thema ;)"
          

          Das nur mal nebenbei. Die eigentliche Erkenntnis: Es sind immer die verdammten Anführungszeichen schuld :(

  32. Uuups – Danke für den Hinweis, das stimmte in der Tat was mit den Anführungszeichen nicht. Der POST-Befehl war in der Art:

    POST ' blabla "'
    

    sollte aber sein:

    POST " blabla " 
    

    also nur ganz normale Anführungszeichen um die Adresse herum. Hab’s geändert, sollte jetzt passen.
    Ich hatte das aus meinem Alias herauskopiert, weshalb hinten dran das „‚“ war – und dann habe ich irgendwann wohl verschlimmbessert. Wenn im Terminal was nicht klappt, sind’s aber auch fast immer diese ollen Anführungszeichen … ;-(

  33. Hallo,

    schöne Einführung. Allerdings will dein Befehl mit der Variablen nicht funktionieren. Als Resultat erhalte ich nur „$text“.
    Muss da noch was geändert werden?

    Gruss Andreas

Schreibe einen Kommentar zu Philipp Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Do NOT follow this link or you will be banned from the site!
Close
Close