Telegram Bots programmieren



Über die letzten Monate hab ich mehrere kleine Telegrambot-Protoypen geschrieben (keiner von denen ist gerade aktiv). Falls das Interessant klingt, hier eine kurze Zusammenfassung was ich da wie gemacht habe. Einer ist zum nebläufigen Gospielen im Chat gedacht, der andere um Kollaborativ ein Kartenspiel zu erstellen, was man dann ganz analog ausdrucken und spielen kann. Aber egal, ob ihr mit einem Bot das Licht bei euch zu Hause anschalten wollt, oder einen Pizzalieferbot machen wollt, hier ein paar Grundlagen/Ansätze dazu.

Am Anfang müsst ihr euch bei Telegramm---

Alle Bots habe ich in python mit der Bibliothek python-telegram-bot implementiert. Das Einführungsbeispiel gibt uns schon ziemlich viel zu sehen:

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

# Define a few command handlers. These usually take the two arguments update and
# context. Error handlers also receive the raised TelegramError object in error.
def start(update, context):
    """Send a message when the command /start is issued."""
    update.message.reply_text('Hi!')

def help_command(update, context):
    """Send a message when the command /help is issued."""
    update.message.reply_text('Help!')

def echo(update, context):
    """Echo the user message."""
    update.message.reply_text(update.message.text)

"""Start the bot."""
updater = Updater("TOKEN", use_context=True)
# Get the dispatcher to register handlers
dp = updater.dispatcher

# on different commands - answer in Telegram
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help_command))

# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))

# Start the Bot
updater.start_polling()

# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()

Man kann den Bot nach dem installieren aller Abhängigkeiten auf seinem Computer direkt starten. Der Bot antwortet dann nur, solange das Programm bei euch auf dem Rechner läuft. Euer Programm meldet sich mit eurem Bot-Token beim Telegramserver und bekommt von diesem bei allen Anfragen an euren Bot dann eine Nachricht.

Für die Befehle, die zuvor bei Telegram registriert wurden können dann wie oben zu sehen Handler hinterlegt werden, die was bei erhalten eines Befehles getan oder geantwortet wird bestimmen. Hier ersteinmal nur eine feste Antwort.

from io import BytesIO
from PIL import Image, ImageFont, ImageDraw

OFFSET=40

def drawBoard(string, size, lastXY=None):
    woodColor, whiteStone, blackStone = (255,202,40), (0xec,0xef,0xf1), (0x00,0x00,0x00)
    im = Image.new('RGB', (60*size+OFFSET+1,60*size+OFFSET+1), woodColor)
    dr = ImageDraw.Draw(im)
    fnt = ImageFont.truetype("/usr/share/fonts/gnu-free/FreeMonoBold.otf", 24)
    fnt.size=30
    for i in range(size**2):
        x, y, xPix, yPix =  (i%size), (i//size), (i%size)*60+OFFSET/2+30, (i//size)*60+OFFSET/2+30
        if x!=size-1 and y!=size-1:
            dr.rectangle(((xPix, yPix),(xPix+60,yPix+60)), fill=woodColor, outline = "black")
        if x==0: dr.text((-10,yPix-10), "%2d" % y, (0, 0, 0, 0), font=fnt)
        if y==0: dr.text((xPix-10,60*size+15), str("ABCDEFGHIJKLMNOPQRS"[x]), (0, 0, 0, 0), font=fnt)
        if lastXY and lastXY[0]==x and lastXY[1]==y:
            dr.ellipse( ((xPix-35, yPix-35),(xPix+35,yPix+35)), fill=(40,192,92), outline = "black")
        if string[i]!='0':
            dr.ellipse( ((xPix-30, yPix-30),(xPix+30,yPix+30)), fill=whiteStone if string[i]=='1' else blackStone, outline = "black")
    return im

def goBoardPicture(boardString, lastXY=None):
    bio = BytesIO()
    drawBoard(boardString, 19, lastXY).save(bio, 'JPEG')
    bio.seek(0)
    return bio

Kommentare

About
Ich bin Paul, lebend in Dresden und sich beschäftigend mit Technik, Sprachen, der Gesellschaft und deren Spielen. Dies ist ein Ort, an dem einiger Gedankenmüll abgeladen wird. Alles ist immmer im Aufbau, also ein bisschen Geduld ^^