ID.nl logo
Huis

Bouw je eigen Telegram-chatbot

Er is een hele hype rond chatbots, die op steeds meer plaatsen opduiken. In dit artikel laten we zien wat je er zelf mee kunt. We bouwen onze eigen Telegram-chatbot en vertellen wat je daar allemaal mee kunt doen.

Er zijn diverse websites met tools om een bot te bouwen. Leerzamer is het om er zelf eentje te maken. Om inspiratie op te doen kun je kijken op storebot.me van Telegram of het bredere botlist.co. Ook Microsoft zet vol in op bots, de website bots.framework.com geeft een goede indruk. In deze masterclass gebruiken we een bot als ‘communicatiekanaal’.

Vanaf een server kunnen we hier bijvoorbeeld teksten en foto’s naar versturen. De meldingen lees je via de Telegram-app, waar en wanneer je maar wilt. We laten ook zien hoe je die bot gebruikt voor het afvangen van meldingen van de home automation software Domoticz. Hierna maken we de chatbot zodat deze op commando’s kan reageren.

BotFather

Telegram maakt het bouwen en gebruiken van een bot relatief eenvoudig. Er is prima documentatie, een relatief eenvoudige api en de BotFather waarmee je in een paar stappen zelf een chatbot maakt. Alle berichten die de chatbot verstuurt en ontvangt lopen via Telegram. Daarom heb je een (gratis) Telegram-account nodig. Je kunt je eenvoudig registreren via web.telegram.org door het opgeven van je mobiele telefoonnummer. Je ontvangt dan een sms-bericht en kunt via de instructies op het scherm het account maken.

Heb je al een Telegram-account, dan kun je dat gebruiken voor de stappen in deze masterclass via het bovengenoemde webadres. Je kunt ook een van de vele Telegram-apps gebruiken. Telegram heeft een eigen bot genaamd BotFather die je gebruikt voor het registreren van je nieuwe chatbot. Een conversatie met BotFather kun je starten via telegram.me/botfather.

Een bot bij Telegram kan behalve berichten ook specifieke commando’s ontvangen die met een slash (/) beginnen. Het maken van een bot gaat ook met commando’s. Stuur

/newbot

naar de BotFather om een bot te maken. Kies een naam gevolgd door een (unieke) gebruikersnaam. Wij kiezen PCM_DemoBot. Kies voor je eigen bot een andere gebruikersnaam. Je ontvangt hierna meteen een bevestiging met een token die je nodig hebt bij het gebruik van de api. De eenvoudigste manier om de api te gebruiken is via een browser. Blader naar de url https://api.telegram.org/bot<jouw-bot-token>/getme waarbij je op de plaats van

<jouw-bot-token></jouw-bot-token>

je token invult. De letters bot voor de token zijn belangrijk, maar worden vaak vergeten. De token dient voor het vinden van je bot én voor autorisatie dus houd de token geheim. De respons is nu bijvoorbeeld

{"ok":true,"result":{"id":309266712,"first_name":"PCM Demo Bot","username":"PCM_DemoBot"}}

Door in de aanroep de opdracht getme te vervangen door getUpdates krijg je (in het json-formaat) een respons met alle berichten die naar de bot zijn verstuurd. Omdat het een nieuwe bot is zie je nu nog geen berichten. Daarom gaan we eerst een conversatie opzetten met de bot.

Chatten

Om een conversatie met je bot te starten blader je naar https://telegram.me/<gebruikersnaam> of zoek je naar @<gebruikersnaam> in een van de Telegram-apps. Klik daarna op Begin. Stuur een willekeurige tekst naar je bot (bijvoorbeeld Hallo). Als je nu de url https://api.telegram.org/bot<jouw-bot-token>/getUpdates opent zie je wél berichten.

Om de respons beter leesbaar te maken selecteer je alle tekst in de browser met Control+A. Kopieer de tekst met Control+C en plak het in een venster van de online tool JSONLint (http://jsonlint.com). Druk dan op Validate JSON. We zijn op dit moment alleen geïnteresseerd in de id die onder chat wordt genoemd in de sectie result. Dat is de chat-id. In ons voorbeeld is dat 58332350. Je kunt nu een antwoord via de api versturen met die chat-id. Om een antwoord te sturen open je de url https://api.telegram.org/bot<jouw-bot-token>/sendMessage?chat_id=<chat-id>&text=<jouw-tekst> in de browser waarbij je <chat-id> vervangt door de correcte chat-id en <jouw-tekst> door de gewenste tekst. In de Telegram-app zie je vervolgens deze reactie van de bot in de chat. We zullen nu andere manieren verkennen om tekst en afbeeldingen via de bot te versturen.

©PXimport

Curl

Het openen van een url in de browser kun je zien als een http-get actie. Voor het versturen van bestanden, zoals een afbeelding, is een http-post actie nodig. Een handige en veelgebruikte tool voor http-get en http-post via de opdrachtprompt is curl. Zeker in Linux-omgevingen is dit meestal standaard geïnstalleerd en anders kun je de tool onder Debian/Ubuntu gemakkelijk met

apt-get install curl

installeren. Om een tekst naar de chat te sturen met een http-get gebruik je onderstaande commando waarbij je uiteraard weer de correcte chat-id en gewenste tekst invoert.

curl -i -X GET "https://api.telegram.org/bot<jouw-bot-token>/sendMessage?chat_id=<chat-id>&amp;text=<jouw-tekst></jouw-tekst></chat-id></jouw-bot-token>

Wil je een foto versturen dan kun je een http-post doen inclusief afbeelding met onderstaande commando, waarbij je achter @ het volledige pad naar de foto opgeeft.

curl -s -X POST "https://api.telegram.org/bot<jouw-bot-token>/sendPhoto" -F chat_id=<chat-id> -F photo="@/pad/naar/foto"</chat-id></jouw-bot-token>

Meldigen van Domoticz

In een paar stappen kun je de bekende home-automation-software Domoticz zo instellen dat het notificaties naar de bot stuurt. Open de gebruikersinterface van Domoticz in de browser en ga naar Setup / Settings. Op het tabblad Notifications vink je Enabled aan bij Custom HTTP/Action. Vul bij #TO de chat-id in. In het veld URL/Action voer je het volgende in: https://api.telegram.org/bot<jouw-bot-token>/sendMessage?chat_id=#TO&text=#MESSAGE. Vervang <jouw-bot-token> door je token. Bij een notificatie komt de melding in #MESSAGE en wordt #TO vervangen door de ingevulde chat-id. Met wat knutselen is Domoticz zelfs volledig via een bot te besturen.

Onze chat kan handig als ‘berichtenstroom’ voor een server dienen, bijvoorbeeld om meldingen van Domoticz te ontvangen. Dat is een stuk praktischer dan e-mail. Ten eerste kun je overal de meldingen lezen omdat de Telegram-app voor zeer veel platforms beschikbaar is. Bovendien heb je veel controle over de meldingen. Zo kun je bijvoorbeeld opmaak toepassen in je berichten (markdown of html) en naast foto’s ook mp3-bestanden, documenten en video’s versturen.

De limiet is ruimhartig (50 MB per bestand). Verder kun je desgewenst updates voor berichten plaatsen of, op het moment dat je een bericht verstuurt, met een parameter aangeven dat het ‘in stilte’ moet worden verzonden: een iPhone zal dan geen notificatie geven, een Android doet dat stilletjes. Je kunt de bot in de Telegram-app ook altijd even op stil zetten als je tijdelijk geen notificaties wilt ontvangen. In de prima documentatie van Telegram-api lees je meer over deze en talloze andere opties.

©PXimport

Interactieve chatbot

In deze stap maken we onze chatbot interactief. Daarvoor gebruiken we de programmeertaal Python. Er zitten aardig wat haken en ogen aan als je het helemaal zelf wilt schrijven. Voor een http-get en het decoderen van json-data zijn natuurlijk bibliotheken maar je moet ook bijvoorbeeld rekening houden met berichten die je al hebt afgehandeld. Ook moet de bot efficiënt werken door bijvoorbeeld de verbinding met Telegram langer open te houden tussen updates. Dat is beter dan het steeds opnieuw opzetten van een verbinding.

Denk verder ook aan het juist aanroepen van speciale karakters zoals een + of & in je tekst, anders geven ze problemen bij het versturen van de http-get. Ook hiervoor is overigens een bibliotheek. Een ‘echte’ bot heeft ook baat bij een geheugen: met een database (bijvoorbeeld SQLite) kun je informatie voor specifieke gebruikers onthouden. Veel sneller en handiger is het om pyTelegramBotAPI te gebruiken. Met deze bibliotheek kun je zonder in het diepe te springen alle mogelijkheden van de api gebruiken.

Python instellen

Je hebt voordat we beginnen natuurlijk Python nodig, dat in veel Linux-omgevingen standaard is geïnstalleerd en anders gemakkelijk is toe te voegen. De Telegram-bibliotheek werkt zowel met Python 2.x als 3.x. Bij de op Debian gebaseerde besturingssystemen, zoals Debian, Ubuntu of Raspbian op de Raspberry Pi, installeer je Python 3.x en de packagemanager pip met

sudo apt-get install python3 python3-pip

Met de packagemanager kun je gemakkelijk bibliotheken toevoegen. Met

pip3 install pyTelegramBotAPI

installeer je de bibliotheek voor Telegram. Maak nu met

touch bot.py

py een nieuw Python-bestand en open dit met je favoriete teksteditor of gebruik nano vanaf de opdrachtprompt met

nano bot.py

Zet hier onderstaande code in. Vul bij jouw-bot-token weer de eerder gemaakte token in. Bewaar de tekst met Control+O en verlaat nano met Control+X,

import telebot bot = telebot.TeleBot("<jouw-bot-token>") # Opdracht 'start' afhandelen @bot.message_handler(commands=['start']) def send_welcome(message): bot.reply_to(message, u"We gaan van start...") # Opdracht 'help' afhandelen @bot.message_handler(commands=['help']) def send_welcome(message): bot.reply_to(message, u"Ik help je graag!") bot.polling() </jouw-bot-token>

De bot starten

Start het programma vanaf de opdrachtprompt met

python3 bot.py

Vanaf nu is je bot actief totdat je het programma beëindigt met Control+C. In Telegram kun je de opdrachten /start en /help geven en de bijbehorende reactie lezen. Je ziet dat met weinig code je bot operationeel is, al zijn er geavanceerdere toepassingen te bedenken. Belangrijk is

import telebot

waarmee de bibliotheek wordt geladen. We definiëren daarna de bot met

bot = telebot.TeleBot("<jouw-bot-token>")</jouw-bot-token>

Met een

message_handler

stel je filters in waar een bericht aan moet voldoen. De eerste reageert op het commando start (/start). Voldoet het bericht daaraan dan zal de bijbehorende functie genaamd

send_welcome

worden uitgevoerd. Die naam mag je zelf kiezen, zolang er maar één parameter is, die met het bericht (message). De tweede message_handler reageert op het commando help met een passende tekst. De volgorde van filters is belangrijk: ze worden getest tot een passende message_handler is gevonden. Aan het einde van het script wordt de bot met bot.polling() daadwerkelijk aan het werk gezet.

Filters

In een message_handler kun je natuurlijk niet alleen op commando’s testen via commands. Je kunt ook met content_types testen op bepaalde content, zoals een foto of document, in plaats van gewoon tekst. Erg praktisch zijn reguliere expressies waarbij je op bepaalde karakters of reeksen kunt testen. De message_handler in het voorbeeld hieronder reageert als een reeks getallen is ingevoerd.

Er mogen geen andere karakters worden ingevoerd. In de reguliere expressie markeren de ^ en $ respectievelijk het begin en einde van de string. De [0-9]* gebruik je voor een reeks getallen. Een reguliere expressie is ook handig voor testen op bepaalde woorden in een tekst.

@bot.message_handler(regexp="^[0-9]*$") def handle_message(message): bot.reply_to(message, u"Dat zijn alleen nummers!")

Ook erg praktisch is dat je een functie kunt aanroepen. Dat mag ook een anonieme lambdafunctie zijn, zoals in het voorbeeld hieronder. Een lambdafunctie is een feature van Python. Zo’n functie bevat geen return zoals gewoonlijk maar geeft een expressie terug, in dit geval true (altijd waar). Onderstaande message_handler reageert op ieder bericht met de oorspronkelijke tekst die beschikbaar is in message.text. We noemen dit ook wel ‘echoën’.

@bot.message_handler(func=lambda m: True) def echo_all(message): bot.reply_to(message, message.text)

De documentatie biedt nog geavanceerdere voorbeelden voor het gebruik van de bibliotheek, waaronder keuzemenu’s. Feitelijk kun je haast alle methodes van de Telegram-api in je code gebruiken, maar soms met net iets andere namen. Belangrijk is dat je regelmatig de Python-bibliotheek update met

pip install pytelegrambotapi --upgrade

Volgens de makers zijn er regelmatig updates om in lijn te blijven met de api van Telegram. De documentatie van Telegram is natuurlijk ook een belangrijke referentie. Je hebt nu een basis om serieus met bots aan de slag te gaan. Wil je verder de diepte in? Op de GitHub-pagina van de pyTelegramBotAPI vind je verwijzingen naar bots die met deze bibliotheek zijn gemaakt, inclusief broncode.

Tekst: Gertjan Groen

▼ Volgende artikel
Waar voor je geld: 5 alles-in-één laserprinters voor een mooie prijs
© Tim Allen
Huis

Waar voor je geld: 5 alles-in-één laserprinters voor een mooie prijs

Bij ID.nl zijn we gek op producten waar je niet de hoofdprijs voor betaalt. Een paar keer per week speuren we daarom binnen een bepaald thema naar zulke deals. Een all-in-one-printer is een handig apparaat voor het scannen, kopiëren en printen van documenten en foto's. De allerbeste afdrukkwaliteit krijg je met een laserprinter. Wij vonden vijf betaalbare modellen voor je.

Een laserprinter maakt gebruik van toner in plaats van inkt om afdrukken te produceren. Toner is een fijn poeder dat met hoge temperaturen op het papier wordt gesmolten. Dit proces zorgt ervoor dat je met grote toners kunt printen, wat betekent dat je langere tijd kunt blijven afdrukken zonder de toner te hoeven vervangen. Laserprinters zijn vaak snel en efficiënt, waardoor ze uitstekend zijn voor gebruik op kantoor. Maar ook als je thuis veel print, bijvoorbeeld als zzp'er, kan een laserprinter uitkomst bieden.

HP Color Laser 179fnw

De HP Color Laser MFP 179fnw is een van de kleinste kleurenlaserprinters in zijn klasse en is daardoor ideaal voor thuisgebruik en plekken waar niet veel plek voor een printer is. Met functies zoals printen, scannen, kopiëren en zelfs nog faxen biedt deze 4-in-1 printer een hoop veelzijdigheid. De afdruksnelheid bedraagt tot 18 pagina's per minuut in zwart-wit en 4 ppm in kleur, met een resolutie van 600 x 600 dpi.

Dankzij de automatische documentinvoer (ADF) voor 40 pagina's en wifi-verbinding is deze printer gebruiksvriendelijk en multi-inzetbaar. Hoewel de afdruksnelheid lager ligt dan bij sommige concurrenten, is zijn compacte formaat juist een pluspunt.

Brother DCP 1610W

De Brother DCP-1610W is een compacte zwart-wit laserprinter die printen, kopiëren en scannen combineert. Met een afdruksnelheid van 20 pagina's per minuut en een resolutie van 2400 x 600 dpi levert hij haarscherpe resultaten. Dankzij wifi-connectiviteit kunnen meerdere gebruikers eenvoudig draadloos printen.

De papierlade biedt plaats aan 150 vellen en het apparaat is voorzien van anti-jam-technologie om papierstoringen tot een minimum te beperken. In vergelijking met de HP Color Laser MFP 179fnw biedt deze printer geen kleurafdrukken, maar hij is wel een stuk sneller met zijn afdrukken.

HP Laserjet Pro 2Z622

De HP LaserJet Pro 2Z622 is geschikt voor onder meer kantooromgevingen. Met afdruksnelheden tot 42 pagina's per minuut en functies zoals dubbelzijdig printen, scannen, kopiëren en faxen is dit een lekker veelzijdige 4-in-1-laserprinter. Het apparaat ondersteunt zowel bekabelde als draadloze netwerken en biedt geavanceerde beveiligingsfuncties.

Canon i-SENSYS MF272wd

De Canon i-SENSYS MF272dw is een monochrome laserprinter en drukt af met en snelheid van 29 pagina's per minuut. Met een resolutie van 2400 x 600 dpi levert hij snelle en scherpe resultaten. Dankzij automatische dubbelzijdige afdrukken, wifi- en ethernetverbinding is hij veelzijdig inzetbaar.

In vergelijking met de Brother DCP-1610W levert deze Canon i-SENSYS MF272dw snellere prestaties en meer connectiviteitsopties, hoewel hij geen kleurendruk ondersteunt; dan moet je toch echt bij de HP Color Laser MFP 179fnw zijn.

Xerox B225 A4

De Xerox B225 is een zwart-wit all-in-one-laserprinter die printen, kopiëren en scannen combineert. Met een afdruksnelheid van maar liefst 34 pagina's per minuut en een eerste afdruktijd van slechts 6,4 seconden is hij goed in te zetten als je veel en vaak print. De printer beschikt over automatische dubbelzijdige afdrukken, een papierlade voor 250 vellen en kan via wifi of een vaste netwerkverbinding met je thuisnetwerk worden verbonden.

▼ Volgende artikel
Garmin kondigt Instinct 3 - Tactical Edition aan
Gezond leven

Garmin kondigt Instinct 3 - Tactical Edition aan

Garmin heeft de Instinct 3 - Tactical Edition aangekondigd, een nieuwe serie tactische smartwatches die verkrijgbaar zijn met een AMOLED-scherm of een display op zonne-energie.

De smartwatches zijn volgens Garmin ontworpen voor gebruik in uitdagende omgevingen en voorzien van een met metaal versterkte rand voor extra duurzaamheid, een rucking-activiteit voor training en ingebouwde LED-verlichting op zowel de 45mm als 50mm modellen. De batterijduur van het AMOLED-model kan oplopen tot 24 dagen in smartwatchmodus, terwijl de modellen op zonne-energie onder ideale omstandigheden onbeperkt kunnen functioneren.

Robuust ontwerp

De Instinct 3 - Tactical Edition is voorzien van een stevige constructie met een metalen versterkte rand, een behuizing van met vezels versterkt polymeer en een krasbestendig scherm. De smartwatches zijn gebouwd volgens de MIL-STD 810 norm voor thermische en schokbestendigheid en zijn waterdicht tot 100 meter. De ingebouwde zaklamp biedt variabele lichtsterktes, een groene modus om het natuurlijke nachtzicht te behouden en een stroboscoopmodus voor locatiebepaling in moeilijk terrein. Voor nachtelijk gebruik is er een NVG-modus (Night Vision Goggle) die het scherm dimt tot een niveau dat functioneel blijft voor de gebruiker maar vrijwel onzichtbaar is voor anderen.

Uitgebreide functionaliteit

De Instinct 3 - Tactical Edition beschikt over diverse speciale functies, waaronder rucking-activiteit waarmee gebruikers het gewicht van hun bepakking kunnen invoeren voor beter inzicht in hun fysieke inspanning. Deze functie kan ook worden gebruikt bij activiteiten zoals trailrunning, wandelen en hiken. Alle modellen bevatten de Applied Ballistics solver en zijn compatibel met de Applied Ballistics Quantum app.

De smartwatches zijn verkrijgbaar in twee formaten: 45mm of 50mm met display op zonne-energie, en een 50mm-variant met AMOLED-scherm. De zonne-efficiëntie is verbeterd met een grotere, efficiëntere zonnelens. Vergeleken met het vorige model heeft het nieuwe 50mm model op zonne-energie een vijf keer langere batterijduur in GPS-modus bij opladen via zonlicht.

De smartwatch biedt multi-band GPS met SatIQ technologie voor nauwkeurige positiebepaling met geoptimaliseerde batterijduur. Voor gezondheidsmonitoring houdt de Instinct 3 stappen, hartslag, slaap, zuurstofsaturatie via de pols, hartslagvariabiliteit en meer bij.

Gebruikers ontvangen e-mails, sms'jes en meldingen direct op het horloge wanneer dit is gekoppeld met een compatibele Apple of Android smartphone.

Navigatie en veiligheid

Gebruikers kunnen navigeren met een 3-assig kompas, barometrische hoogtemeter en multi-band GPS. De Instinct 3 kan worden gekoppeld met de Garmin Explore App voor gedetailleerde kaarten, waypoints en routes.

Voor gebruik op gevoelige locaties biedt de Stealth Mode de mogelijkheid om draadloze communicatie uit te schakelen terwijl het horloge nog steeds activiteitsgegevens verzamelt zonder locatiegegevens op te slaan. De Kill Switch kan alle gebruikersgeheugen wissen als de veiligheid in het geding komt. Andere functies zijn weergave van twee posities tegelijkertijd op één scherm, Jumpmaster en geprojecteerde waypoints.

Trainingsfuncties

De Instinct 3 - Tactical Edition bevat sportapps voor rucken, wandelen, hardlopen, klimmen, jagen, skiën en meer. De TracBack-functie helpt bij het uitstippelen van een route terug naar het beginpunt. Naast buitensportapps bevat de smartwatch ook apps voor HIIT, cardio, hardlopen op binnen- en buitenbanen, basketbal en andere activiteiten.

Gebruikers kunnen trainingsplannen volgen met Garmin Coach voor hardlopen en fietsen, of workouts maken uit meer dan 1.600 oefeningen in de Garmin Connect app. De smartwatch volgt ook intensiteitsminuten, VO2 max en hersteltijd.

Veiligheidsfuncties zoals incidentdetectie en Assistance kunnen een bericht met de GPS-locatie van de gebruiker naar contactpersonen sturen in noodsituaties, wanneer het horloge gekoppeld is met een smartphone.

Beschikbaarheid en prijzen

Het Instinct 3 - Tactical Edition AMOLED-model is vanaf 30 april te bestellen op Garmin.com voor een adviesprijs van 599,99 euro. De modellen op zonne-energie beginnen bij een adviesprijs van 499,99 euro.

Bekijk andere Garmin-producten op Kieskeurig.nl: