Telegram is een messenger service - vergelijkbaar met Whatsapp - maar dan veel beter. Je kunt het bijvoorbeeld gebruiken zonder smartphone. Erg handig voor mij, want ik die heb niet. Maar je kunt er nog veel meer handige dingen mee doen. Zo ontvang ik in Telegram een bericht als er een storing is met deze website en al mijn andere webapplicaties.
Hoe werkt dat dan? Wie stuurt mij dan dat bericht? Dat doet een zogenaamde bot. Een bot is Telegram-account, dat gebruikt wordt door software en niet zoals gebruikelijk door een persoon. Iedere gebruiker van Telegram kan bots aanmaken en in gebruik nemen. In dit geval heb ik een bot aangemaakt met de bedoeling dat deze mij informeert als er iets niet in orde is met deze blog of mijn andere webapplicaties.
Een bot maken in Telegram werkt best grappig. Daarvoor is namelijk een bot met de naam BotFather in het leven geroepen. Ik opende een gesprek met de BotFather en gaf de opdracht om een nieuwe bot aan te maken, door de volgende tekst in te voeren /newbot
. De BothFather wilde vervolgens weten hoe de nieuwe bot moest heten (de zichtbare naam en een voor Telegram unieke gebruikersnaam). Zodra ik dit invoerde, kreeg ik direct de gegevens terug van nieuw aangevraagde bot: een adres en een uniek nummer of token.
Een bot voorziet mij dus van informatie, maar hoe werk dat dan? Een bot kan worden aangestuurd via opdrachten die die via het internet ontvangt. Een bot heeft een een eigen internetadres en naar dat internetadres kunnen bepaalde opdrachten verzonden worden. In mijn geval maak ik gebruik van een heel basale opdracht om een bepaald bericht te versturen, namelijk 'sendMessage'. De hele opdrachtregel ziet er dan ongeveer zo uit:
https://api.telegram.org/bot$TOKEN/sendMessage?chat_id=12345&text=Hello+World
. Op de plaats van $TOKEN
vullen we een unieke tekenreeks in, dat zo het unieke internetadres vormt van mijn bot. Het nummer achter chat_id
geeft aan naar welk gesprek het bot dit bericht moet sturen. In dit geval het gesprek of de convertatie tussen mijn bot en mijzelf.
Hoe wordt deze opdracht dan naar mijn bot verstuurt? Mijn webapplicaties worden beheerd door een procesmanager, genaamd pm2. Deze procesmanager kan de applicatie, starten, stoppen, herstarten etc, maar houdt de applicatie ook continu in de gaten. Het mooie van pm2 is verder dat er plugins voor geschreven kunnen worden.[1] Nu is er iemand zo vriendelijk te zijn geweest om een plugin[2] te schrijven, die pm2 bij bepaalde gebeurtenissen een boodschap naar mijn bot kan sturen.
Op de computer of server waar ik met pm2 mijn webapplicaties beheer, installeer met dit commando de genoemde pm2 install pm2-telegram-nofiy
.
Vervolgens vertel ik aan het programma welke url gebruikt moet worden voor het verzenden van de notificaties en naar welk gesprek het gestuurd moet worden.
Voordat ik dat echter kan doen, moet ik nog één nummer achterhalen: het 'chat_id', ofwel het gespreksnummer. Dit is nog eigenlijk het lastigste onderdeel, of beter gezegd de meest vreemde exercitie. Je moet namelijk eerst een gesprek beginnen met je bot door deze een of meerdere berichtjes te sturen. Vervolgens via een opdracht aan je bot haal je dit gesprekje op. En in de meta-informatie van dit gesprekje kunnen het chat_id ontdekken. Bent u er nog?
Dit is de opdracht om de chat binnen te halen: https://api.telegram.org/bot$TOKEN/getUpdates
, waarbij we bij $TOKEN vervangen met het unieke bot-nummer. Het antwoord dat je dan krijgt ziet er dan ongeveer zo uit.
{"ok":true,
"result":[
{"update_id":123123123,
"message":{
"message_id":12,
"from":{
"id":12345,
"first_name":"Bob",
"last_name":"Jones",
"username":"bjones"},
"chat":{
"id":12345,
"first_name":"Bob",
"last_name":"Jones",
"username":"bjones",
"type":"private"},
"date":1452933785,
"text":"Hi there, bot!"}}]}
En hieruit kunnen we destileren van het 'id' van 'chat', ofwel het 'chat_id' gelijk is aan '12345'. We hebben nu alle informatie om de module pm2-telegram-nofity aan het werk te zetten, met de volgende opdrachten.
pm2 set pm2-telegram-notify:telegram_url https://api.telegram.org/bot<YOUR BOT TOKEN>/sendMessage
pm2 set pm2-telegram-notify:chat_id <YOUR CHAT_ID>
En vanaf dit moment wordt ik via Telegram geïnformeerd over issues met dit blog en andere webapplicaties.
Bronnen
Een heldere uitleg over het maken van een bot en het vinden van een chat_id: https://www.forsomedefinition.com/automation/creating-telegram-bot-notifications/
De code en documentatie van de pm2-module: https://github.com/korolyov88/pm2-telegram-notify
Met een plugin, module of extensie kan er iets aan een applicatie worden aangepast of toegevoegd. ↩︎