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`