Aprende cómo crear un bot de Telegram avanzado [Curso – 2ª parte]

 

 

Introducción

Aunque me encantaría, hoy no seré yo el que vaya a daros conversación (¡pero si os apetece no descarto mantener una en los comentarios con todos vosotros!), si no tu propio bot. ¿Estás listo para darle más vida?

Para los nuevos, este artículo forma parte de una serie en la que aprenderás a crear un bot de Telegram totalmente funcional, desde cero y sin conocimientos previos de programación. Tampoco necesitarás aprender a programar durante los mismos si no quieres, ya que te explicaré lo justo y necesario que necesitas cambiar en el código (texto) para personalizarlo y hacerlo funcionar, ¡nada de tecnicismos! Además, al final de cada artículo tendrás un enlace para descargar el bot que programaré paso a paso contigo.

Si no leíste el primer artículo, te recomiendo que lo hagas antes de seguir, ya que hoy partiremos del bot que creamos para añadirle las nuevas funcionalidades avanzadas y también encontrarás lo necesario para iniciarte en la creación de bots de Telegram personalizados.

Dame conversación

En nuestra primera versión del bot, creamos funcionalidades de “pregunta-respuesta”, es decir, te daba una respuesta en función a un comando que le indicases. Pero… ¿Qué ocurre si tenemos que preguntarle varias cosas a nuestros clientes antes de poder darle una respuesta?

Creemos un nuevo comando /oferta con el que ofrecer a nuestros clientes la posibilidad de contactarnos para pedir información sobre un servicio seo que ofrecemos. Si lo hiciésemos con los conocimientos adquiridos anteriormente, el resultado sería el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas pidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es cilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("""Para comenzar, por favor indícame la web afectada.""")
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
    dp.add_handler(telegram.ext.CommandHandler("oferta", oferta))
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()
 

Como puedes ver, enviamos uno o varios mensajes en base a un comando solicitado por el usuario. Sin embargo, el bot no respondería si le escribiésemos con la información que nos solicita. Veamos ahora cómo añadirle un segundo paso en la conversación escribiendo el código de una manera diferente.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB = range(1)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

¡Ahora sí! Aunque simple, el bot ya es capaz de mantener una conversación guiada con nosotros.

¡Carlos, un poco más lento! No entiendo tanto código nuevo junto…

El código anterior corresponde a crear un conversación, asignarle el comando que abrirá dicha conversación, un segundo paso para continuarla y el comando /cancelar para finalizar la conversación si el usuario no quisiera seguir. Al principio puede parecer complejo, pero recuerda que solo tienes que copiarlo y modificar los textos en blanco, que son lo único que debes personalizar según tus necesidades. Ahora veremos cómo añadirle pasos a la conversación uno a uno, para que puedas apreciar mejor cada detalle.

Sigamos preguntando al usuario el número de personas interesadas, para ofrecerle una mejor oferta si se apuntan entre varios.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS = range(2)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?")
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc ")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

voilà! Esto va cobrando mucho más sentido, ¿no?

¡Sigamos!

Como siguiente paso, le preguntaremos al usuario por un email al que enviarle su oferta personalizada.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS, EMAIL = range(3)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?")
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡De acuerdo! ¿A qué email quieres que te mande la oferta?")
    return EMAIL
 
def email(bot, update, user_data):
    user_data['email'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
            EMAIL: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    email,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

¿Cómo vas? Tiene buena pinta, ¿no? Quién diría que estás hablando con tu propio bot…

Por último, como le estamos pidiendo información personal al usuario, podríamos hacer que aceptase explícitamente nuestra política de privacidad.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS, EMAIL, PRIVACIDAD = range(4)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?")
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡De acuerdo! ¿A qué email quieres que te mande la oferta?")
    return EMAIL
 
def email(bot, update, user_data):
    user_data['email'] = update.message.text
    update.message.reply_text("Antes de finalizar, ¿Aceptas nuestra [Política de privacidad](https://www.pasionseo.com/politicas/)?", parse_mode='Markdown')
    return PRIVACIDAD
 
def privacidad(bot, update, user_data):
    user_data['privacidad'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
            EMAIL: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    email,
                                    pass_user_data=True),],
            PRIVACIDAD: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    privacidad,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

¡Sí, puedes usar algunas etiquetas Markdown por ejemplo para añadir enlaces! Sólo tienes que añadir el nuevo fragmento que ves en el código (, parse_mode=’Markdown’) en cada mensaje que quieras mandar con Markdown.

Además, el usuario podrá hacer click en el enlace, leer tus políticas de privacidad sin salir de Telegram y contestar directamente.

Y con esto ya tendríamos finalizada una conversación completa. Vamos a añadir acciones más complejas a nuestro bot, ¡Presta atención!

Te habrás dado cuenta de que el usuario ha escrito todos sus datos, pero ¿dónde se manda esa información? Hagamos que nos la envíe a nosotros mismos por privado a través de Telegram.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS, EMAIL, PRIVACIDAD = range(4)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?")
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡De acuerdo! ¿A qué email quieres que te mande la oferta?")
    return EMAIL
 
def email(bot, update, user_data):
    user_data['email'] = update.message.text
    update.message.reply_text("Antes de finalizar, ¿Aceptas nuestra [Política de privacidad](https://www.pasionseo.com/politicas/)?", parse_mode='Markdown')
    return PRIVACIDAD
 
def privacidad(bot, update, user_data):
    user_data['privacidad'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    bot.send_message(XXXXXXXX, user_data['web']+"\n"+user_data['personas']+"\n"+user_data['email']+"\n"+user_data['privacidad'])
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
            EMAIL: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    email,
                                    pass_user_data=True),],
            PRIVACIDAD: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    privacidad,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

De esta manera mandamos un mensaje al usuario con ID “XXXXXXXX” (esta vez coincide que a nosotros mismos), en este caso con toda la información recogida durante la conversación.

Podríamos hacer lo mismo para, por ejemplo, enviar la información a un grupo que tuviésemos con todos los admin de nuestra web.

Ya empiezas a hablar en Chino… ¿Qué ID? ¿De qué me hablas?

Como el nombre completo y el nombre de usuario en Telegram puedes tenerlo o no y puedes cambiarlo cuando quieras, la forma de enviar información es a través de un ID, una serie de números que identifican a un usuario (o grupo o canal) y que nadie más lo tiene, al igual que tu DNI.

Entiendo… ¿Y cómo sé cuál es mi DNI de Telegram… quiero decir mi ID?

Existen múltiples maneras, pero para mí la más cómoda es usar otro de los bots que existen por Telegram y te lo dan instantáneamente, como @myidbot.

¡Psss! ¡No mires mi ID!

Teclado personalizado

Hasta ahora nuestro bot se ha tragado las respuestas de los usuarios sin más… ¿Pero qué ocurre si alguien escribe que estarían interesadas “93847583745”, “-4” o “avión” personas en la oferta? Bien sea por una equivocación del usuario o por evitar trolleos, spam y derivados debemos evitar que las respuestas de los usuarios sean al menos útiles para poder continuar con la conversación.

Comencemos por controlar que el número de personas sea como mínimo 1 y como máximo 10. Y para ponérselo más fácil aún a nuestros clientes, en vez de dejarlo a su elección y corregirle continuamente (cosa que no gusta a muchos), le sustituiremos su teclado por uno personalizado solo con las “teclas” disponibles que nosotros indiquemos.

What? ¡Eso tengo que verlo!

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS, EMAIL, PRIVACIDAD = range(4)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    reply_keyboard = [['1', '2', '3'],
        ['4', '5', '6'],
        ['7', '8', '9'],
        ['10']]
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?", reply_markup=telegram.ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡De acuerdo! ¿A qué email quieres que te mande la oferta?")
    return EMAIL
 
def email(bot, update, user_data):
    user_data['email'] = update.message.text
    update.message.reply_text("Antes de finalizar, ¿Aceptas nuestra [Política de privacidad](https://www.pasionseo.com/politicas/)?", parse_mode='Markdown')
    return PRIVACIDAD
 
def privacidad(bot, update, user_data):
    user_data['privacidad'] = update.message.text
    update.message.reply_text("¡Recibido! Contactaremos contigo con una oferta personalizada.")
    bot.send_message(XXXXXXXX, user_data['web']+"\n"+user_data['personas']+"\n"+user_data['email']+"\n"+user_data['privacidad'])
    user_data.clear()
    return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
            EMAIL: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    email,
                                    pass_user_data=True),],
            PRIVACIDAD: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    privacidad,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

¿Ahora entiendes por qué puse “teclas” entre comillas? Puedes poner que cada tecla o botón del teclado contenga un número, una palabra, un emoji, una frase… ¡Cualquier cosa! Cuando el usuario la pulse se enviará automáticamente como respuesta al bot…

…y por supuesto su teclado volverá a la normalidad.

Botones de acción

Con todo lo que ya sabemos parece que podríamos hacer cualquier cosa, sin embargo poner un teclado a nuestros clientes para que respondan “Sí” o “No” a la Política de privacidad sería algo absurdo, sobre todo teniendo en cuenta que no deben continuar si no aceptan, sí o sí, nuestra Política de privacidad (y esto te conviene que lo hagan más a ti que a ellos).

¿Por qué no habilitarles un botón para que (ehem, una vez que lean completamente nuestra Política de privacidad, por supuesto) le den a “Acepto” y listo? ¡No te lo preguntes, just do it!

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import telegram
import telegram.ext
import random
 
WEB, PERSONAS, EMAIL, PRIVACIDAD = range(4)
 
def start(bot, update):
    update.message.reply_text("Hola, ¿En qué puedo ayudarte? 😀")
 
def ayuda(bot, update):
    update.message.reply_text("""Aprende los mejores trucos SEO con PasionSeo.
 
Aprende un nuevo consejo con el comando /consejo o un sitio con Dofollow con el comando /dofollow.
 
¡Y si quieres estar al día con articulos del sector, visita www.pasionseo.com!""")
 
def consejo(bot, update):
    lista = [
        "Si lo que tienes es un negocio local, puede interesarte la aplicación Foursquare, con ella podrás recompensar a los clientes que acuden frecuentemente a tu establecimiento; El Corte Inglés, Jimmy Choo, Dominios pizza, Telepizza, Danone, Pepsi, Lufthansa,… y muchas otras marcas han hecho sorteos, retos y gynkanas maravillosas con esta aplicación y, a su vez, haciendo ruido en las redes sociales.", 
        "No me pongas un código QR enorme si después de molestarme en echar la foto me vas a llevar a tu HOME. ERROR. 7 de cada 10 personas que han abierto un QR afirman que no mereció la pena.", 
        "Para que la experiencia de compra sea única, debemos centrarnos previamente en entender el comportamiento del cliente o consumidor. Y luego, darle paso a la tecnología.",
        "El Email Marketing es una de las acciones mas rápidas de realizar,  reduciendo el tiempo y el esfuerzo en enviar las novedades de una web, tanto si es información o productos para un e-commerce.",
        "El Email Marketing es fácilmente medible en repercusión y efectividad. Mensajes enviados, recibidos, abiertos, geolocalizados (y un largo etc.)",
        "En cuanto a la publicación de fotos en Instagram y la utilización de tu perfil como escaparate para las marcas, realmente está demostrado que esta clase de marketing de contenidos funciona y muy bien.",
        "La inyeccion de Likes en las publicaciones o reproduccion en el caso de los videos, se utiliza para nivelar la balanza de las continuas restriucciones de algoritmo de Instagram, el mismo que hemos sufrido en Facebook.",
    ]
    update.message.reply_text(random.choice(lista))
 
def dofollow(bot, update):
    chat_id = update.message.chat_id
    lista = [
        ("http://os.dotq.org/", "dofollow1.png"),
        ("http://www.internetmarketing-tipps.de/", "dofollow2.png"),
        ("http://www.repossessedcars2009.com/", "dofollow3.png"),
        ("http://prohumorist.com/", "dofollow4.png"),
    ]
    choice = random.choice(lista)
    bot.send_photo(chat_id=chat_id, photo=open("imagenes/{}".format(choice[1]), 'rb'))
    update.message.reply_text(choice[0])
 
def oferta(bot, update, user_data):
    update.message.reply_text("""Actualmente ofrecemos un servicio de Limpieza SEO totalmente personalizado para resolver la penalización de Google derivada de una agresiva campaña de Link Building.
 
Prepárate para todo lo que podemos hacer por ti en solo 30 días...
️ Informe para detectar penalizaciones
️ Analisis de 1000 enlaces entrantes
️ Reporte y desautorización de Links Penalizados
️ Solicitud de Reconsideracion a Google
¡Y mucho más!""")
    update.message.reply_text("Para comenzar, por favor indícame la web afectada.")
    return WEB
 
def web(bot, update, user_data):
    user_data['web'] = update.message.text
    reply_keyboard = [['1', '2', '3'],
        ['4', '5', '6'],
        ['7', '8', '9'],
        ['10']]
    update.message.reply_text("¡Genial! ¿Cuántas personas estaríais interesadas en esta oferta?", reply_markup=telegram.ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))
    return PERSONAS
 
def personas(bot, update, user_data):
    user_data['personas'] = update.message.text
    update.message.reply_text("¡De acuerdo! ¿A qué email quieres que te mande la oferta?")
    return EMAIL
 
def build_menu(buttons,
               n_cols,
               header_buttons=None,
               footer_buttons=None):
    menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
    if header_buttons:
        menu.insert(0, header_buttons)
    if footer_buttons:
        menu.append(footer_buttons)
    return menu
 
def email(bot, update, user_data):
    user_data['email'] = update.message.text
    button_list = [
        telegram.InlineKeyboardButton("Acepto", callback_data='Acepto'),
    ]
    reply_markup = telegram.InlineKeyboardMarkup(build_menu(button_list, n_cols=1))
    update.message.reply_text("Antes de finalizar, ¿Aceptas nuestra [Política de privacidad](https://www.pasionseo.com/politicas/)?", parse_mode='Markdown', reply_markup=reply_markup)
    return PRIVACIDAD
 
def privacidad(bot, update, user_data):
    query = update.callback_query
    if query.data == 'Acepto':
        bot.edit_message_text(text="Antes de finalizar, ¿Aceptas nuestra [Política de privacidad](https://www.pasionseo.com/politicas/)?",
                                  parse_mode='Markdown',
                                  chat_id=query.message.chat_id,
                                  message_id=query.message.message_id)
        bot.send_message(query.message.chat_id, "¡Recibido! Contactaremos contigo con una oferta personalizada.")
        bot.send_message(XXXXXXXX, user_data['web']+"\n"+user_data['personas']+"\n"+user_data['email'])
        user_data.clear()
        return telegram.ext.ConversationHandler.END
 
def cancelar(bot, update, user_data):
    user_data.clear()
    update.message.reply_text("La petición de oferta ha sido cancelada.", reply_markup=ReplyKeyboardRemove())
    return telegram.ext.ConversationHandler.END
 
def main():
    updater = telegram.ext.Updater("550123453:AAKHIiZ33hDwcsWV8a6A9lYbBqLGqi3e-ABc")
    dp = updater.dispatcher
 
    dp.add_handler(telegram.ext.CommandHandler("start", start))
    dp.add_handler(telegram.ext.CommandHandler("ayuda", ayuda))
    dp.add_handler(telegram.ext.CommandHandler("consejo", consejo))
    dp.add_handler(telegram.ext.CommandHandler("dofollow", dofollow))
 
    conv_handler = telegram.ext.ConversationHandler(
        entry_points=[telegram.ext.CommandHandler('oferta', oferta, pass_user_data=True)],
 
        states={
            WEB: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    web,
                                    pass_user_data=True),],
            PERSONAS: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    personas,
                                    pass_user_data=True),],
            EMAIL: [telegram.ext.MessageHandler(telegram.ext.Filters.text,
                                    email,
                                    pass_user_data=True),],
            PRIVACIDAD: [telegram.ext.CallbackQueryHandler(privacidad,
                                    pass_user_data=True),],
        },
 
        fallbacks=[telegram.ext.CommandHandler("cancelar", cancelar, pass_user_data=True)]
    )
 
    dp.add_handler(conv_handler)
 
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

Por más que escriba el usuario, el bot no le hará caso… hasta que no acepte la Política de privacidad.

Entonces desaparecerá el botón y, ahora sí, finalizará la conversación y el bot enviará a su creador (¡Tú!) la información facilitada por el usuario.

¿Qué cómo desaparece el botón? Si te fijas en las nuevas líneas de código que hemos escrito, hay una en la que se escribe “edit_message_text” y en la que hemos vuelto a escribir exactamente lo mismo que escribimos cuando le enviamos el mensaje preguntándole si aceptaba la Política de privacidad. Esto hace que se edite el mensaje escribiendo exactamente lo mismo, pero sin el botón.

¡Y se acabó lo bueno por hoy! Ya que veo que os gusta el tema, pronto me veréis de nuevo por aquí con un nuevo artículo para explicaros cómo tener vuestro bot corriendo 24/7 en un servidor… ¡No te lo pierdas!

 

 

 Carlos  – Ingeniero de Software

 

 Apasionado de 10 cosas: la tecnología y la música. Dirijo, diseño y desarrollo proyectos software de la oficina a mi casa.

 

¡Y recuerda! Si te surge cualquier duda acerca de esta guía o de cualquier aspecto relacionado con los bots de Telegram, ¡No dudes en preguntarme en los comentarios! Estaré encantado de ofreceros mi opinión, conocimiento y debatir con vosotros (:

 

 

suscribete a los comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *