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.