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:

    #!python

    # 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:

    #!js

    {
        '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:

    #!python

    # 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:

    #! python

    # private_settings.py
    TELEGRAM_BOT_TOKEN = '2121544592:ABGaANw8y4GM8XXI-A12NB0XyWmXotiNwhK'
 
Podemos probarlo desde consola usando CURL:

    #!bash

    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`