Hashmania
Blog

Code by Hashmania


Bots de Telegram con Python


Los bots de Telegram son aplicaciones que se ejecutan dentro de la aplicación de mensajería. A continuación veremos todo el proceso para crearlos y cómo automatizar diversas tareas.

Cómo crear un bot


1) En Telegram buscamos al usuario BotFather y pulsamos Iniciar

2) Pulsamos /newbot

3) Introducimos el nombre del bot:
Ejemplo: mi_robot

4) Introducimos el nombre de usuario (debe acabar en _bot):
Ejemplo: mi_robot_bot

5) Esto nos da el token y la dirección:
Ejemplo de token: 1758835624:BCFK-vk8bFd6W93_BG9W6CD34b93snmOZ3X

Ejemplo de dirección: t.me/mi_robot_bot

6) Entramos en la dirección y pulsamos en Iniciar

7) Enviamos el primer comando (sustituir <TOKEN> por nuestro token y sin espacios en la dirección):
https://api.telegram.org/bot <TOKEN>/getme

8) Volvemos a entrar en la dirección, pulsamos en Iniciar y escribimos cualquier cosa en el chat, por ejemplo: hola

9) Para recuperar mensajes (sustituir <TOKEN> por nuestro token y sin espacios en la dirección):
https://api.telegram.org/bot <TOKEN> /getUpdates

10) Cogemos el ID del json que nos devuelve y enviamos el primer mensaje (sustituir <TOKEN> por nuestro token e <ID> por nuestra ID, y sin espacios en la dirección):
https://api.telegram.org/bot <TOKEN> /sendMessage?chat_id= <ID> &text=TestReply

Nuestro bot ya está configurado correctamente y podemos crear nuestros scripts en Python.


Scripts en Python


Para nuestros scripts de Python solo vamos a usar la librería requests, que será la que nos sirva para realizar las peticiones http. Si no la tienes instalada basta con ejecutar pip install requests en la consola de comandos.

*Nota: en los scripts solo tendremos que sustituir <TOKEN> y <USER_ID> por nuestro token y nuestro ID.

*Nota: puedes copiar los scripts con la indentación correcta haciendo click en COPY, en la esquina superior derecha de cada script.


Script para enviar mensaje de texto


import requests

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

method = 'sendMessage'
mensaje = 'Hola, esto es una prueba.'

response = requests.post(
    url=f'https://api.telegram.org/bot{TOKEN}/{method}',
    data={'chat_id': USER_ID, 'text': mensaje}).json()
print(response)

Script para enviar audio


import requests

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

method = 'sendAudio'
audio = 'audio.mp3'

response = requests.post(
    url=f'https://api.telegram.org/bot{TOKEN}/{method}',
    files={'audio': (audio, open(audio, 'rb'))},
    data={'chat_id': USER_ID, 'caption': audio}).json()
print(response)

Script para enviar imagen


import requests

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

method = 'sendPhoto'
foto = 'imagen.jpg'

response = requests.post(
    url=f'https://api.telegram.org/bot{TOKEN}/{method}',
    files={'photo': (foto, open(foto, 'rb'))},
    data={'chat_id': USER_ID, 'caption': foto}).json()
print(response)

Script para enviar video


*Nota: actualmente el tamaño del video no puede exceder de 50mb.

import requests

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

method = 'sendVideoNote'
video = 'video.mp4'

response = requests.post(
    url=f'https://api.telegram.org/bot{TOKEN}/{method}',
    files={'video_note': (video, open(video, 'rb'))},
    data={'chat_id': USER_ID, 'caption': video}).json()
print(response)

Script para enviar archivo adjunto


import requests

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

method = 'sendDocument'
document = 'libro.pdf'

response = requests.post(
    url=f'https://api.telegram.org/bot{TOKEN}/{method}',
    files={'document': (document, open(document, 'rb'))},
    data={'chat_id': USER_ID, 'caption': document}).json()
print(response)

Script para recibir mensajes


import json
import requests
import time
import urllib

TOKEN = '<TOKEN>'
URL = f"https://api.telegram.org/bot{TOKEN}/"

def get_url(url):
    response = requests.get(url)
    content = response.content.decode("utf8")
    return content

def get_json_from_url(url):
    content = get_url(url)
    js = json.loads(content)
    return js

def get_updates(offset=None):
    url = URL + "getUpdates"
    if offset:
        url += "?offset={}".format(offset)
    js = get_json_from_url(url)
    return js

def get_last_update_id(updates):
    update_ids = []
    for update in updates["result"]:
        update_ids.append(int(update["update_id"]))
    return max(update_ids)

def echo_all(updates):
    for update in updates["result"]:
        text = update["message"]["text"]
        chat = update["message"]["chat"]["id"]
        print(text)

def get_last_chat_id_and_text(updates):
    num_updates = len(updates["result"])
    last_update = num_updates - 1
    text = updates["result"][last_update]["message"]["text"]
    chat_id = updates["result"][last_update]["message"]["chat"]["id"]
    return (text, chat_id)

def send_message(text, chat_id):
    text = urllib.parse.quote_plus(text)
    url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
    get_url(url)

def main():
    print("BOT online!!!\n\n")
    last_update_id = None
    while True:
        updates = get_updates(last_update_id)
        if len(updates["result"]) > 0:
            last_update_id = get_last_update_id(updates) + 1
            echo_all(updates)
        time.sleep(0.5)

if __name__ == '__main__':
    main()


Una vez tengamos dominados estos conceptos es muy fácil crear una aplicación e integrarla con nuestro bot, a continuación os dejo el script para crear un bot que convierta a audio el texto que le enviemos.

Bot para convertir texto a audio


import os
import json
import time
import urllib
# librerías externas
import requests
import pydub
import pyttsx3

TOKEN = '<TOKEN>'
USER_ID = '<USER_ID>'

URL = f"https://api.telegram.org/bot{TOKEN}/"

# Configuración voz
engine = pyttsx3.init(driverName='sapi5')

rate = engine.getProperty('rate')
velocidad = 180                           
engine.setProperty('rate', velocidad)    

volume = engine.getProperty('volume')
volumen = 1    
engine.setProperty('volume', volumen)    

voices = engine.getProperty('voices')      
engine.setProperty('voice', voices[0].id) 

def voz(text):
    engine.say(text)
    engine.save_to_file(text, 'audio.wav')
    engine.runAndWait()
    sound = pydub.AudioSegment.from_wav("audio.wav")
    sound.export("voz.mp3", format="mp3",tags={'artist': text})
    os.remove("audio.wav")

def send_audio():
    method = 'sendAudio'
    audio = 'voz.mp3'
    response = requests.post(
        url=f'https://api.telegram.org/bot{TOKEN}/{method}',
        files={'audio': (audio, open(audio, 'rb'))},
        data={'chat_id': USER_ID, 'caption': audio}).json()

def get_url(url):
    response = requests.get(url)
    content = response.content.decode("utf8")
    return content

def get_json_from_url(url):
    content = get_url(url)
    js = json.loads(content)
    return js

def get_updates(offset=None):
    url = URL + "getUpdates"
    if offset:
        url += "?offset={}".format(offset)
    js = get_json_from_url(url)
    return js

def get_last_update_id(updates):
    update_ids = []
    for update in updates["result"]:
        update_ids.append(int(update["update_id"]))
    return max(update_ids)

def echo_all(updates):
    for update in updates["result"]:
        text = update["message"]["text"]
        chat = update["message"]["chat"]["id"]
        print(text)
        if text.startswith("###"):
            text=text.replace("###","")
            print(f"\nProcesando audio -> {text}")
            voz(text)
            send_audio()
            print("Audio enviado\n")

def get_last_chat_id_and_text(updates):
    num_updates = len(updates["result"])
    last_update = num_updates - 1
    text = updates["result"][last_update]["message"]["text"]
    chat_id = updates["result"][last_update]["message"]["chat"]["id"]
    return (text, chat_id)

def send_message(text, chat_id):
    text = urllib.parse.quote_plus(text)
    url = URL + "sendMessage?text={}&chat_id={}".format(text, chat_id)
    get_url(url)

def main():
    print("Conversor de texto a audio online!!!\n\n")
    last_update_id = None
    while True:
        updates = get_updates(last_update_id)
        if len(updates["result"]) > 0:
            last_update_id = get_last_update_id(updates) + 1
            echo_all(updates)
        time.sleep(0.5)

if __name__ == '__main__':
    main()

Ya tenemos listo nuestro bot conversor de texto a audio, para diferenciar los mensajes que queremos convertir a audio de los que no, los escribiremos precedidos de 3 almohadillas, por ejemplo: ###hola.

Si deseas conocer algo más acerca del lenguaje Python puedes consultar Python Para Neófitos.