[Plataforma] [Tutorial] Creando un bot de Telegram


  • 0

    Hilo en construcción

    Me apetece crearme un bot para enviarme algo de información de vez en cuando o para calcular algunas cosas, así que iré poniendo por aquí lo que vaya haciendo (si tengo paciencia).

    @Pixel dice que él es un experto en el tema, así que también va a contribuir :sisi3:

    Para los despistados, algunos ejemplos de bots:
    -ExodoBot: el bot para leer y escribir en éxodo. Dirijan sus quejas a @kNN.
    -ImageTranslateBot: de viaje por Japón? Te has comprado una SIM para que no te sablen con el roaming? Sácale una foto a los carteles y este bot te los traduce. Yo lo probé con japonés y funciona más o menos bien, así que con idiomas occidentales me imagino que irá incluso mejor :qmeparto:

    Para usuarios de WINDOWS, id a este ESTE POST de @Pixel para aprender a instalar Python.

    De momento estoy empezando con esta librería de Python:
    https://github.com/python-telegram-bot/python-telegram-bot

    Para instalarla:

    pip install python-telegram-bot --upgrade
    

    O bien:

    git clone https://github.com/python-telegram-bot/python-telegram-bot
    cd python-telegram-bot
    python setup.py install
    

    Supongo que en Windows se hará parecido, pero yo nunca he usado Python fuera de Linux :triste:

    De momento poco más he hecho que mirar este ejemplo:
    https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot2.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    # Simple Bot to reply to Telegram messages
    # This program is dedicated to the public domain under the CC0 license.
    """
    This Bot uses the Updater class to handle the bot.
    First, a few handler functions are defined. Then, those functions are passed to
    the Dispatcher and registered at their respective places.
    Then, the bot is started and runs until we press Ctrl-C on the command line.
    Usage:
    Basic Echobot example, repeats messages.
    Press Ctrl-C on the command line or send a signal to the process to stop the
    bot.
    """
    
    from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
    import logging
    
    # Enable logging
    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                        level=logging.INFO)
    
    logger = logging.getLogger(__name__)
    
    
    # Define a few command handlers. These usually take the two arguments bot and
    # update. Error handlers also receive the raised TelegramError object in error.
    def start(bot, update):
        update.message.reply_text('Hi!')
    
    
    def help(bot, update):
        update.message.reply_text('Help!')
    
    
    def echo(bot, update):
        update.message.reply_text(update.message.text)
    
    
    def error(bot, update, error):
        logger.warn('Update "%s" caused error "%s"' % (update, error))
    
    
    def main():
        # Create the EventHandler and pass it your bot's token.
        updater = Updater("TOKEN")
    
        # Get the dispatcher to register handlers
        dp = updater.dispatcher
    
        # on different commands - answer in Telegram
        dp.add_handler(CommandHandler("start", start))
        dp.add_handler(CommandHandler("help", help))
    
        # on noncommand i.e message - echo the message on Telegram
        dp.add_handler(MessageHandler([Filters.text], echo))
    
        # log all errors
        dp.add_error_handler(error)
    
        # Start the Bot
        updater.start_polling()
    
        # Run the bot until the you presses Ctrl-C or the process receives SIGINT,
        # SIGTERM or SIGABRT. This should be used most of the time, since
        # start_polling() is non-blocking and will stop the bot gracefully.
        updater.idle()
    
    
    if __name__ == '__main__':
        main()
    

    Se mete en un archivo.py y después sólo hay que sustituir "TOKEN" por el código que os da el "@BotFather" cuando os creáis un bot.
    Para ponerlo a funcionar basta con ejecutarlo

    python archivo.py
    

    Y ya podéis hablar con el bot... que de momento no hace nada más que repetir lo que le escribís.... :qmeparto:



  • 1

    mis dies tienes



  • 2

    :aplauso:
    Pillo sitio y todo eso.
    Nos enseñarás a hacer cosa maléficas?



  • 3

    Pillo sitio. Yo quiero saber como mandar un mensaje sin escribir muchas líneas xD

    Asi m cambio a tu libreria, yo usaba otra.



  • 4

    Pues muy interesante todo.



  • 5

    10/10 Muy buen hilo.



  • 6

    Bueno, ayer me hice una "calculadora". La idea es que le escribo una fórmula y el valor en el que quiero evaluarla, y me devuelve el resultado. Por ejemplo:

    /calc sin(2*pi*x/4.7)/3+exp(-3*y)-1.5 4.3 1.2
    

    Con ese comando el bot interpreta

    sin(2*pi*x/4.7)/3+exp(-3*y)-1.5
    

    Como una función y la evalúa en x=4.3, y=1.2 (lo escribo como x = [4.3, 1.2], que es más fácil xD)

    Function 'sin(2*pi*x/4.7)/3+exp(-3*y)-1.5' evaluated at 'x= [4.3, 1.2]':
     -1.6425483099594653
    

    Para que el bot le haga caso a mis comandos y pueda responder a ellos, al principio tengo que importar:

    from telegram.ext import Updater, CommandHandler
    

    Y después de dp=updater.dispatcher añado:

    dp.add_handler(CommandHandler("calc", calc, pass_args=True))
    

    Eso hará que cuando yo escriba el comando "/calc hola adiós" el bot ejecute la función "calc" con argumentos args = ["hola", "adiós"]. Sólo hay que definir la función "calc":

    def  calc(bot, update, args):
        user = update.message.from_user #éste es el usuario que ha escrito un mensaje al bot 
        if user.id not in id_whitelist: #esto es una lista en la que he metido el id de los usuarios a los que permito usar el bot
            return
    
        update.message.reply_text("Error: invalid formula: "+str(args)) #esta línea responde al usuario. "args" es una lista de python, podéis acceder a ella con un "for arg in args:"...
    
    

    Lo he simplificado 100% (de hecho no podéis ver aún cómo calculo la fórmula, pero bueno, eso lo hago con unas librerías que tengo instaladas, no me lo he inventado yo :roto2: , así que no os perdéis nada :qmeparto: )
    Este ejemplo debería ser suficiente para que @Pixel mejore su bot xD.



  • 7

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )



  • 8

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Tan simple no puedes hacerlo, para enviar una respuesta necesitas indicar a quien la envías, y para ello necesitarás primero esperar que un usuario te envíe un mensaje. Y para ello, necesitas si o si, definir una función que haga de "handler" para el evento de recibir mensaje (comando).

    :mmm:
    De todas formas, una vez tengas un identificador de usuario, debe haber una función que reciba el identificador y el mensaje de respuesta, así que lo que tu quieres hacer se podría hacer con identificadores que ya conozcas cuales son.



  • 9

    @kNN dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Tan simple no puedes hacerlo, para enviar una respuesta necesitas indicar a quien la envías, y para ello necesitarás primero esperar que un usuario te envíe un mensaje. Y para ello, necesitas si o si, definir una función que haga de "handler" para el evento de recibir mensaje (comando).

    :mmm:
    De todas formas, una vez tengas un identificador de usuario, debe haber una función que reciba el identificador y el mensaje de respuesta, así que lo que tu quieres hacer se podría hacer con identificadores que ya conozcas cuales son.

    Yo actualmente hago esto (con otra librería):

    TOKEN = " LJLKJLJ " #Aquí pongo el token del bot
    tb = telebot.TeleBot(TOKEN) 
    tb.send_message('-188899999999L',"lkjasdlkfj") #mando un mensaje a un 'chat_id' 
    

    supongo que tendré que ver como declarar ese identificador y así poder sustituir :elboinas:



  • 10

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Mira aquí: https://github.com/eugenio412/PogomBOT/blob/master/pogobot.py#L589

    Defines una variable updater y otra Bot. El updater es para recibir los mensajes, y el bot para controlar el bot(responder mensajes, etc.). Si haces algo como:

    
    updater = Updater(token)
    b = Bot(token)
    logger.info("BotName: <%s>" % (b.name))
    
    b.sendMessage(chat_id, text)
    
    

    Edito: el updater no es necesario si no quieres estar atento de recibir mensajes.



  • 11

    @kNN dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Mira aquí: https://github.com/eugenio412/PogomBOT/blob/master/pogobot.py#L589

    Defines una variable updater y otra Bot. El updater es para recibir los mensajes, y el bot para controlar el bot(responder mensajes, etc.). Si haces algo como:

    
    updater = Updater(token)
    b = Bot(token)
    logger.info("BotName: <%s>" % (b.name))
    
    b.sendMessage(chat_id, text)
    
    

    Edito: el updater no es necesario si no quieres estar atento de recibir mensajes.

    mis dies :misdies: Thanks!!

    from telegram import Bot
    TOKEN = '2asdfasdfasdfasdfasdfasE' # Ponemos nuestro Token generado con el @BotFather
    b = Bot(TOKEN)
    print b.send_message("-188888899999999H","lkjlkj")
    

    con esto mando un mensaje sencillo, y me lo imprimo por consola para verlo. Ya puedo cambiar mis antiguos scripts por esta librería



  • 12

    Python en Windows

    • Nos descargaremos la versión 2.X (2.7 en el momento de crear este post) de la página de python https://www.python.org/ (en el momento de crear el post https://www.python.org/downloads/release/python-2712/). La instalamos y ya está, si nos pregunta algo de añadir las variables PATH le decimos que sí (si no, tocará hacerlo a mano!)

    • Para escribir el código podemos utilizar: Notepad++ (https://notepad-plus-plus.org/download/). Crearemos archivos con extensión .py

    • Para ejecutar los scripts:
      a) Podemos hacer doble click sobre ellos
      b) Desde Notepad++: Click en EJECUTAR -> "Ejecutar..." -> Escribimos python.exe "$(FULL_CURRENT_PATH)" -> Pulsamos "Guardar..." -> Le ponemos un nombre y unas teclas (como SHIFT + F5). Luego pulsando esas teclas se ejecutaría el script.

    @SgtBurden si quieres avisa de este post, para los novatos en el mundo de python que usen windows :sisi3:



  • 13

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @kNN dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Mira aquí: https://github.com/eugenio412/PogomBOT/blob/master/pogobot.py#L589

    Defines una variable updater y otra Bot. El updater es para recibir los mensajes, y el bot para controlar el bot(responder mensajes, etc.). Si haces algo como:

    
    updater = Updater(token)
    b = Bot(token)
    logger.info("BotName: <%s>" % (b.name))
    
    b.sendMessage(chat_id, text)
    
    

    Edito: el updater no es necesario si no quieres estar atento de recibir mensajes.

    mis dies :misdies: Thanks!!

    from telegram import Bot
    TOKEN = '2asdfasdfasdfasdfasdfasE' # Ponemos nuestro Token generado con el @BotFather
    b = Bot(TOKEN)
    print b.send_message("-188888899999999H","lkjlkj")
    

    con esto mando un mensaje sencillo, y me lo imprimo por consola para verlo. Ya puedo cambiar mis antiguos scripts por esta librería

    Ten en cuenta que un bot no puede enviar mensajes a usuarios que no hayan hecho "/start" en un chat con dicho bot (creo que Telegram lo limita para que no haya abusos :sisi: ).
    Pero si es sólo para ti, todo bien.



  • 14

    @SgtBurden dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @kNN dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden yo quiero hacer algo más tipo esto:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from telegram.ext import Updater
    updater = Updater('TOKEN')
    update.message.reply_text("Enviar una string simple") 
    

    pero eso no va porque 'update' no está definido, pero no sé como definirlo :roto2: con eso puedo sustituir esas lines de código en lo que tengo actualmente y borrar la otra librería (no me gusta mezclar :roto2: )

    Mira aquí: https://github.com/eugenio412/PogomBOT/blob/master/pogobot.py#L589

    Defines una variable updater y otra Bot. El updater es para recibir los mensajes, y el bot para controlar el bot(responder mensajes, etc.). Si haces algo como:

    
    updater = Updater(token)
    b = Bot(token)
    logger.info("BotName: <%s>" % (b.name))
    
    b.sendMessage(chat_id, text)
    
    

    Edito: el updater no es necesario si no quieres estar atento de recibir mensajes.

    mis dies :misdies: Thanks!!

    from telegram import Bot
    TOKEN = '2asdfasdfasdfasdfasdfasE' # Ponemos nuestro Token generado con el @BotFather
    b = Bot(TOKEN)
    print b.send_message("-188888899999999H","lkjlkj")
    

    con esto mando un mensaje sencillo, y me lo imprimo por consola para verlo. Ya puedo cambiar mis antiguos scripts por esta librería

    Ten en cuenta que un bot no puede enviar mensajes a usuarios que no hayan hecho "/start" en un chat con dicho bot (creo que Telegram lo limita para que no haya abusos :sisi: ).
    Pero si es sólo para ti, todo bien.

    Es solo para mi, aqui cada uno que se haga su bot :ahsisi:



  • 15

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    Python en Windows

    • Nos descargaremos la versión 2.X (2.7 en el momento de crear este post) de la página de python https://www.python.org/ (en el momento de crear el post https://www.python.org/downloads/release/python-2712/). La instalamos y ya está, si nos pregunta algo de añadir las variables PATH le decimos que sí (si no, tocará hacerlo a mano!)

    • Para escribir el código podemos utilizar: Notepad++ (https://notepad-plus-plus.org/download/). Crearemos archivos con extensión .py

    • Para ejecutar los scripts:
      a) Podemos hacer doble click sobre ellos
      b) Desde Notepad++: Click en EJECUTAR -> "Ejecutar..." -> Escribimos python.exe "$(FULL_CURRENT_PATH)" -> Pulsamos "Guardar..." -> Le ponemos un nombre y unas teclas (como SHIFT + F5). Luego pulsando esas teclas se ejecutaría el script.

    @SgtBurden si quieres avisa de este post, para los novatos en el mundo de python que usen windows :sisi3:

    Puedes añadir cómo se instalan las librerías desde Windows?



  • 16

    @SgtBurden dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    Python en Windows

    • Nos descargaremos la versión 2.X (2.7 en el momento de crear este post) de la página de python https://www.python.org/ (en el momento de crear el post https://www.python.org/downloads/release/python-2712/). La instalamos y ya está, si nos pregunta algo de añadir las variables PATH le decimos que sí (si no, tocará hacerlo a mano!)

    • Para escribir el código podemos utilizar: Notepad++ (https://notepad-plus-plus.org/download/). Crearemos archivos con extensión .py

    • Para ejecutar los scripts:
      a) Podemos hacer doble click sobre ellos
      b) Desde Notepad++: Click en EJECUTAR -> "Ejecutar..." -> Escribimos python.exe "$(FULL_CURRENT_PATH)" -> Pulsamos "Guardar..." -> Le ponemos un nombre y unas teclas (como SHIFT + F5). Luego pulsando esas teclas se ejecutaría el script.

    @SgtBurden si quieres avisa de este post, para los novatos en el mundo de python que usen windows :sisi3:

    Puedes añadir cómo se instalan las librerías desde Windows?

    con python se instala pip, y ya funciona igual. Lo importante es añadirlo al PATH (como en linux) porque si no, hay que entrar primero en la carpeta antes de poner pip .... o python ....



  • 17

    @SgtBurden o @kNN para mandar archivos me encuentro esto:

    http://python-telegram-bot.readthedocs.io/en/latest/telegram.html#telegram.Bot.send_document

    document – File to send. You can either pass a file_id as String to resend a file that is already on the Telegram servers, or upload a new file using multipart/form-data.

    Sabéis a qué se refiere? he probado a leer un archivo y mandarlo sin éxito :roto2: ya no sé si por error mio o por lo de 'using multipart/form-data'



  • 18

    @Pixel dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    @SgtBurden o @kNN para mandar archivos me encuentro esto:

    http://python-telegram-bot.readthedocs.io/en/latest/telegram.html#telegram.Bot.send_document

    document – File to send. You can either pass a file_id as String to resend a file that is already on the Telegram servers, or upload a new file using multipart/form-data.

    Sabéis a qué se refiere? he probado a leer un archivo y mandarlo sin éxito :roto2: ya no sé si por error mio o por lo de 'using multipart/form-data'

    No se exactamente que quiere decir. Pero debe funcionar como este: https://geekytheory.com/telegram-programando-un-bot-en-python/. Supongo que con:

    
    f = open('/path/to/file', 'rb')
    bot.send_document(chat_id, f)
    
    

    debe funcionar. O quizás con:

    
    bot.send_document(chat_id, '/path/to/file')
    
    


  • 19

    @kNN dijo en [Plataforma] [Tutorial] Creando un bot de Telegram:

    f = open('/path/to/file', 'rb')
    bot.send_document(chat_id, f)

    pues sí, sí que va :elboinas: será fallo mio entonces. Dejo ya puestos el trozo de código para enviar un archivo:

    #!/usr/bin/env python
    import telegram
    TOKEN = 'asdfasdf:asdfasdf'
    chat_id='-asdfasdfasdf'
    bot = telegram.Bot(TOKEN)
    	
    with open('asdfasdfasdf', 'rb') as f:
    	print bot.send_document(chat_id, f)
    
    


  • 20

    @kNN es que el problema que me encuentro es que soy un desastre xD y tengo una array hecha del siguiente modo:

    [Nombre de archivo, Archivo], [Nombre de archivo, Archivo], ....

    y no sé cómo revisarla o algo, porque los 'archivo' son gigantescos y tapan toda la consola :roto2: :roto2: el plan b es leerme el código tranquilamente pero no soy muy de eso :elrisas: (y eso que son, exactamente, 3 lineas)


    edit: solucionado, ahora sólo me falta conseguir arreglar nosequé de la codificación xD este es mi intento:

    b.send_document(chat_id,file[0],urllib.quote(file[1],safe=''))

    pero no va por:

      File "C:\main.py", line 422, in <module>
        b.send_document(chat_id,filename,urllib.quote(file,safe=''))
      File "C:\Python27\lib\site-packages\telegram\bot.py", line 126, in decorator
        result = func(self, *args, **kwargs)
      File "C:\Python27\lib\site-packages\telegram\bot.py", line 152, in decorator
        result = self._request.post(url, data, timeout=kwargs.get('timeout'))
      File "C:\Python27\lib\site-packages\telegram\utils\request.py", line 201, in post
        **urlopen_kwargs)
      File "C:\Python27\lib\site-packages\telegram\utils\request.py", line 141, in _request_wrapper
        message = self._parse(resp.data)
      File "C:\Python27\lib\site-packages\telegram\utils\request.py", line 99, in _parse
        raise TelegramError('Invalid server response')
    telegram.error.TelegramError: Invalid server response```
    
    realmente estoy probando a descargar un archivo, y sin guardarlo en el pc, enviarlo :elboinas: podría hacerlo de otra forma pero así lo veo más limpio



Has perdido la conexión. Reconectando a Éxodo.