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
Schrobben zonder stress: je elektrische tandenborstel als schoonmaakhulp in huis
© ID.nl
Gezond leven

Schrobben zonder stress: je elektrische tandenborstel als schoonmaakhulp in huis

Ga je een nieuwe elektrische tandenborstel kopen? Gooi vooral de oude niet weg! Met een nieuw setje (goedkope) opzetborstels heb je ineens een ultieme schoonmaakhulp in handen. Je krijgt 10 tips voor lastige schoonmaakklusjes waar je nu moeiteloos je tanden in zet.

Dankzij de roterende of trillende borstelkop werkt een elektrische tandenborstel perfect voor schoonmaakklusjes op lastige plekken of bij hardnekkig vuil. Heb je geen oudje meer liggen? Eenvoudige elektrische borstels van het drogisterijhuismerk zijn al prima inzetbaar als slimme schoonmaakhulp.

Lees ook: Dé 15 dingen die je altijd vergeet schoon te maken (maar nu niet meer!)

1. Lichtschakelaars

Bij het normale schoonmaakrondje worden lichtknoppen vaak over het hoofd gezien. Maar na verloop van tijd worden ze toch echt smoezelig, vooral als je ze vaak met vette of natte vingers aan en uit zet. Met een elektrische tandenborstel met een droge(!) opzetborstel maak je de schakelaar eenvoudig schoon: het vuil wordt als het ware losgetrild. De ronddraaiende borstelkop komt ook in de kiertjes rond de schakelaar, waar je met een doek lastig bij komt. Klaar? Neem dan af met een (weer droge) microvezeldoek om echt alle viezigheid weg te vegen.

2. Spoelbakken en werkbladranden

In de kier tussen spoelbak en keukenblad verzamelt zich vuil dat nauwelijks weg te krijgen is met een spons. Gebruik een elektrische borstel met een drupje afwasmiddel of ontvetter om dit randje schoon te maken. Laat de borstelkop rustig draaien langs de randen, spoel na met warm water en droog af.

3. Zolen en randen van sneakers

Witte zolen, rubberen randen en reliëflogo’s op schoenen fris je eenvoudig op met een elektrische tandenborstel en een papje van baking soda en water. Breng het mengsel aan op de vieze plekken en laat de draaiende borstel het vuil loswerken. Zo hoef je niet te schrobben met kracht. Werkt goed bij sportschoenen, sneakers en kinderschoenen.

4. Tussen toetsen of knopjes

Op toetsenborden, afstandsbedieningen en andere elektronische apparaten blijven stof en kruimels hangen. Met een droge borstelkop kun je vuil los trillen tussen de knoppen. Gebruik geen water, maar veeg het losgeborstelde vuil weg met een doek of zuig het op met een stofzuiger met smal mondstuk.

©splitov27

5. Fietsketting

Een elektrische tandenborstel is ook handig bij het onderhoud van je fiets. Smeer de ketting in met een ontvetter die specifiek geschikt is voor fietsonderdelen en laat de borstelkop het opgehoopt vuil, oude smeermiddelen en roest losmaken. Gebruik een opzetkop die je specifiek voor dit soort klussen bewaart. Spoel daarna grondig af en droog. Vergeet niet om daarna de ketting opnieuw in te smeren met een geschikte fietskettingolie of -vet.

6. Randen van douchedeuren of -wanden

Kalkaanslag en zeepresten hechten zich aan de rubbers en randen van douchedeuren. De elektrische tandenborstel werkt deze aanslag moeiteloos weg, vooral in combinatie met schoonmaakazijn. Laat kort inwerken, borstel schoon, en spoel na.

7. Ventilatieroosters

Ventilatieroosters of luchtopeningen zijn lastig schoon te houden. Met een droge borstelkop borstel je stof van de lamellen zonder dat het alle kanten op vliegt. Je kunt de borstel ook licht vochtig maken en daarna alles afnemen met een doek.

8. Sieraden

Sieraden met steentjes of fijne details kun je voorzichtig schoonmaken met een elektrische tandenborstel. Gebruik wat lauw water met een drupje afwasmiddel, laat de borstelkop zacht draaien, en werk vuil uit de randjes. Ideaal voor ringen, oorbellen of kettingen die je niet wilt beschadigen.

9. Kinderstoel

Kruimels, sap en plak verdwijnen niet zomaar uit de kieren van een kinderstoel. Met een elektrische borstel en een beetje afwasmiddel werk je dat vuil er makkelijk uit. Let op: niet te nat maken bij houten stoelen.

10. Douchekoppen, kraanonderdelen en bevestigingen

Op en rondom de douchekraan, de glijstang of de wandbevestiging van de douchekop blijven vaak vette zeepresten zitten. Met een elektrische tandenborstel en wat allesreiniger kom je makkelijk langs de randjes en rubbers. Even borstelen, naspoelen en droogwrijven.

💪 Schrobben zonder stress

Een elektrische tandenborstel met een aparte opzetkop is eigenlijk onmisbaar als je houdt van snel en grondig schoonmaken. Perfect voor randjes, kieren, rubber, profiel en reliëf. Reserveer een borstel alleen voor schoonmaak en je hebt een nieuwe favoriet in het keukenkastje!

▼ Volgende artikel
Uit de hoge hoed: zo genereer je random getallen in Excel
© Andreas Prott - stock.adobe.com
Huis

Uit de hoge hoed: zo genereer je random getallen in Excel

Af en toe heb je in Excel willekeurige getallen nodig voor een steekproef, om formules te testen of om een voorbeeld samen te stellen. Uiteraard kun je zelf wat cijfers op het toetsenbord roffelen, maar veel gemakkelijker is dit door Excel zelf te laten uitvoeren.

In drie stappen laten we zien hoe je Excel random getallen kunt laten genereren:

  • Typ de formule ASELECT in, voor decimalen tussen 0 en 1
  • Pas de waarden aan naar decimalen tussen 1 en 1000
  • Laat Excel gehele getallen genereren door ASELECT met GEHEEL te combineren

Een andere kant van Excel: Lol in Excel: laat het resultaat zien in emoji's

Stap 1: Willekeurige decimalen

Wanneer je in een cel de formule =ASELECT() typt, zal Excel een willekeurig getal tussen 0 en 1 vormen. Sleep die formule naar beneden om de kolom verder te vullen met lukrake getallen tussen 0 en 1. Dit zullen telkens waarden zijn van vijftien decimalen. Als je niet zover na de komma wilt werken, dan kun je de cellen selecteren en in het tabblad Start in de groep Getal de knop Minder decimalen gebruiken.

Wil je andere getallen, druk dan op de functietoets F9 zodat alles opnieuw berekend wordt. Je moet er wel rekening mee houden dat iedere keer dat je iets in dit rekenblad toevoegt of wijzigt, alle random waarden opnieuw worden berekend. Dus als je ergens in een cel bijvoorbeeld Hallo typt en je drukt op Enter, zullen alle ASELECT-waarden wijzigen. Dat los je op door al deze waarden te selecteren, te kopiëren en op dezelfde plaats te plakken met Plakken speciaal / Waarden plakken.

De formule =ASELECT() vormt willekeurige getallen tussen 0 en 1.

Stap 2: Reeks begrenzen

Dit zijn dus allemaal getallen kleiner dan 1. Wil je getallen tussen 1 en 10, dan kun je in de kolom daarnaast de formule =1+9*(A1) toepassen, in de veronderstelling dat het eerste gegenereerde getal van daarnet in A1 staat. Sleep dan het resultaat naar beneden en dan krijg je ook daar een kolom met waarden tussen 1 en 10.

Wil je willekeurige getallen tussen 1 en 100, dan wordt de formule =1+99*(A1). Voor getallen tussen 1 en 1000 is de formule =1+999*(A1) enzovoort.

In kolom C vragen we random waarden tussen 1 en 100, gebaseerd op de waarden van kolom A.

Stap 3: Raster vullen

Wil je gehele getallen tussen twee grenswaarden laten vormen door Excel, dan combineer je ASELECT met GEHEEL. Deze formule zal bijvoorbeeld willekeurige gehele getallen vormen kleiner dan 1000: =GEHEEL(ASELECT()*1000)

Het getal 1000 zal er zelf nooit bij staan. Sleep deze formule naar beneden om de kolom met willekeurige getallen te vullen en in dit voorbeeld hebben we de formule ook naar enkele kolommen daarnaast gesleept.

Ook hier dezelfde opmerking: om de random waarden te fixeren, moet je ze kopiëren en plakken als waarden.

Wanneer we de cellen naar beneden en naar rechts kopiëren, krijgen we een rooster met willekeurige getallen.