Bot de Telegram en Python

Recientemente, obtuve una pasantía en una nueva empresa de TI para mí y nuestro proyecto (el de mi equipo) era un bot de telegramas que automatiza parte del trabajo de los gerentes de recursos humanos. La primera semana nos la dieron para auto-estudiar lo que consideráramos necesario (y estoy convencido de que la mejor forma de aprender algo es practicando), así que comencé a actuar. Se eligió el lenguaje de programación python (probablemente de la portada quede claro por qué), por lo que en este artículo analizaré un ejemplo con él.





BotFather

Para crear un cable-bot, puede escribir un comando de usuario @BotFather / newbot . Le pedirá el nombre y @nombredeusuario para el futuro bot. Nada complicado aquí, te lo dice todo (lo principal es que @nombredeusuario no está ocupado y termina con "bot"). BotFather enviará un token de API HTTP, que usaremos para trabajar con el bot.





Creación de bot
Creación de bot

Telebot y el poder de Python

Siempre me pareció que crear un bot no es tan fácil. Honestamente, quise intentarlo durante mucho tiempo, pero o no tuve suficiente tiempo (pensé que tomaría más de una noche), o no pude elegir la tecnología (de alguna manera vi el tutorial de c #), pero lo más probable es que fuera solo pereza. Pero luego lo necesitaba para funcionar, así que no me atreví a posponerlo más.





python . , , . ( ) 6 (!) . :





import telebot
bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')
@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, "Hello!")
bot.polling()
      
      



Primer mensaje

/start, . : telebot ( pyTelegramBotAPI pip install pyTelegramBotAPI



( pip install telebot



!), , , BotFather. , ( “/start”), , , “Hello!”. , , , . - , "" .





Flask & Requests

Telebot, , , “”. , hr- (), / / . , . python - flask. , 5000- (http://localhost:5000/):





from flask import Flask
 
app = Flask(__name__)


@app.route("/", methods=["GET"])
def index():
    return "Hello, World!"
 
 
if __name__ == "__main__":
    app.run()
      
      



, . (habr), . , “Hello!” :





from flask import Flask, request
import requests

app = Flask(__name__)


def send_message(chat_id, text):
    method = "sendMessage"
    token = "1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8"
    url = f"https://api.telegram.org/bot{token}/{method}"
    data = {"chat_id": chat_id, "text": text}
    requests.post(url, data=data)


@app.route("/", methods=["POST"])
def receive_update():
    chat_id = request.json["message"]["chat"]["id"]
    send_message(chat_id, "Hello!")
    return "ok"


if __name__ == "__main__":
    app.run()
      
      



, . , . , , . telegram API setWebhook. , url, ( http://localhost:5000/). , : " localhost", localhost . , setWebhook https url-. ngrok, . ngrok, “ngrok http 5000”. :





ngrok
ngrok

setWebhook, , postman. post https://api.telegram.org/bot<>/setWebhook url. :





setWebhook
setWebhook

telebot, . , flask’e, . ? -, send_message . :





from flask import Flask, request
import telebot

app = Flask(__name__)
 
bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')


@app.route("/", methods=["POST"])
def receive_update():
    chat_id = request.json["message"]["chat"]["id"]
    bot.send_message(chat_id, "Hello!")
    return "ok"


if __name__ == "__main__":
    app.run()
      
      



, , , , @bot.message_handler - , (, , , . .). , flask , telebot. bot.polling(), “ ”. , - . , :





from flask import Flask, request
import telebot

bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8')
bot.set_webhook(url="https://8c6f687b75c9.ngrok.io")
app = Flask(__name__)


@app.route('/', methods=["POST"])
def webhook():
    bot.process_new_updates(
        [telebot.types.Update.de_json(request.stream.read().decode("utf-8"))]
    )
    return "ok"


@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, 'Hello!')


if __name__ == "__main__":
    app.run()
      
      



Aquí usamos el método set_webhook, similar a cómo lo hicimos antes a través de cartero, y en una ruta vacía escribimos "un poco de magia" para recibir con éxito las actualizaciones de los bots. Por supuesto, esta no es una muy buena manera, y en el futuro es mejor escribir la funcionalidad para procesar los mensajes entrantes usted mismo. Pero primero, creo que esta es la mejor solución.





Conclusión

Realmente no es tan difícil escribir un bot de telegrama en Python, pero también hay trampas de las que traté de hablar en este artículo. Por supuesto, esto es solo el comienzo, pero el último fragmento de código se puede usar como plantilla para el lado del servidor, que funcionará con el bot de telegramas. Entonces solo queda aumentar la funcionalidad a su discreción.








All Articles