Lo primero es crear el bot. Para ello hay un Bot dedicado de telegram, llamado BotFather https://t.me/botfather. Hacemos un /newbot y seguimos instrucciones asignando un nombre y un nombre público para el bot. Obtenemos una API key que guardamos convenientemente en un lugar seguro. Por último añadimos a nuestro Bot a lista de administradoras del canal o grupo donde queremos que pueda actuar

Añadir un webhook a Django

Lo siguiente es añadir un webhook para que Telegram se comunique con él cada vez que alguien interactúa con el bot. Este no es más que un endpoint/vista de django accesible públicamente.

Para ello creamos una url pública (exenta de pasar el token CSRF a la vista):

    #!python

    from django.views.decorators.csrf import csrf_exempt

    urlpatterns = [
        path(
            'telegram-webhook',
            csrf_exempt( views.TelegramWebhookView.as_view() ),
            name='telegram_webhook'
        ),
    ]

Y creamos la vista que se comunicará con el canal:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# views.py

import json
import requests
# django
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
# project
from django.conf import settings

# Create your views here.
class TelegramWebhookView(View):

    def get(self, request, *args, **kwargs):
        return JsonResponse({"ko": "Rasklat!"})

    def post(self, request, *args, **kwargs):
        try:
            data = json.loads(request.body)
            message = data["message"]
            chat    = message["chat"]
            self.send_message(
                "Gracias",
                chat["id"]
            )
        except Exception as e:
            return JsonResponse({
                "ko" : "Bad Request"
            })
        return JsonResponse({
            "ok": "Succesful request"
        })

Vemos que es una vista que simplemente acepta peticiones POST conteniendo datos JSON siguiendo el formato:

1
2
3
4
5
6
7
{
    'data' : {
        'message' : {
            'chat': 'CHAT_ID'
        }
    }
}

Simplemente usaremos estos datos para comunicarnos de vuelta con el canal, añadiendo a la vista un método para lanzar mensajes al mismo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# views.py (añadir a TelegramWebhookView)
@staticmethod
def send_message(message, chat_id):
    data = {
        "chat_id"    : chat_id,
        "text"       : message,
        "parse_mode" : "Markdown",
    }
    try:
        response = requests.post(
            "%s%s/sendMessage" % (
                "https://api.telegram.org/bot",
                TELEGRAM_BOT_TOKEN
            ), data=data
        )
    except Exception as e:
        return JsonResponse({
            "ko" : "There was a problem connecting to Telegram API"
        })

Para ello necesitaremos definir en los private_settings el token del bot:

1
2
3
4
#! python

# private_settings.py
TELEGRAM_BOT_TOKEN = '2121544592:ABGaANw8y4GM8XXI-A12NB0XyWmXotiNwhK'

Podemos probarlo desde consola usando CURL:

1
curl -X POST http://localhost:8000/webhooks/1.0/telegram -d '{ "message" : { "chat" : { "id" : "BotTest" } } }'

Añadir el webhook a Telegram

https://core.telegram.org/bots/api#setwebhook

Por último añadimos el webhook a Telegram visitando la siguiente URL (habiendo sustituido previamente token y URL base):

https://api.telegram.org/bot<token>/setWebhook?url=<url>/telegram-webhook