es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo almacenar los estados de ConversationHandler?

Creé una función ConversationHandler para mi bot.

Pero el problema es que lo subí a Heroku y allí mi script de bot sigue reiniciándose después de un tiempo específico. Por esa razón, en cada reinicio necesitamos iniciar ConversationHandler de nuevo enviando un comando y ese es el problema.

Entonces, quiero saber si hay alguna manera de almacenar los estados de ConversationHandler o algo en una base de datos y cargarlos en el script durante el reinicio para que ConversationHandler funcione automáticamente sin enviar ningún comando.

De lo contrario,

¿Hay algún otro sitio de alojamiento donde el script nunca se reinicia?

Por cierto, estoy usando python-telegram-bot y tengo una cuenta de base de datos en Firebase.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes almacenar los estados de ConversationHandler en una base de datos como Firebase y cargarlos de nuevo cuando el script del bot se reinicie. De esta manera, el ConversationHandler funcionará automáticamente sin necesidad de un comando cada vez que se reinicie el script.

    Para hacer esto, debes modificar tu script de bot para guardar los estados de ConversationHandler en la base de datos de Firebase cuando se finalice una conversación, y cargarlos de nuevo desde la base de datos cuando se reinicie el script. Puedes usar Firebase SDK para esto.

    Aquí están los pasos:

    1. Instalar Firebase SDK para Python:
    pip install firebase-admin
    
    1. Importa Firebase SDK e inicializa Firebase app:
    import firebase_admin
    from firebase_admin import credentials, firestore
    
    cred = credentials.Certificate("path/to/serviceAccountKey.json")
    firebase_admin.initialize_app(cred)
    

    Nota: necesitas descargar el archivo serviceAccountKey.json desde la consola de Firebase.

    1. Guarda los estados de ConversationHandler en la base de datos de Firebase:
    def save_conversation_states(user_id, chat_id, states):
        db = firestore.client()
        doc_ref = db.collection('conversation_states').document(f'{user_id}_{chat_id}')
        doc_ref.set(states)
    
    1. Carga los estados de ConversationHandler desde la base de datos de Firebase:
    def load_conversation_states(user_id, chat_id):
        db = firestore.client()
        doc_ref = db.collection('conversation_states').document(f'{user_id}_{chat_id}')
        doc = doc_ref.get()
        if doc.exists:
            return doc.to_dict()
        else:
            return None
    
    1. Modifica tu script de bot para usar las funciones save_conversation_states y load_conversation_states:
    from telegram.ext import Updater, ConversationHandler
    
    updater = Updater(token='TOKEN', use_context=True)
    dispatcher = updater.dispatcher
    
    def start(update, context):
        # tu código
        return CONVERSATION_HANDLER_STATE_1
    
    def conversation_handler(update, context):
        # tu código
        save_conversation_states(update.message.from_user.id, update.message.chat_id, context.conversation_data)
        return CONVERSATION_HANDLER_STATE_2
    
    conversation_handler_obj = ConversationHandler(
        entry_points=[CommandHandler('start', start)],
        states={
            CONVERSATION_HANDLER_STATE_1: [MessageHandler(Filters.text, conversation_handler)],
            CONVERSATION_HANDLER_STATE_2: [MessageHandler(Filters.text, conversation_handler)]
        },
        fallbacks=[],
        name='conversation_handler'
    )
    
    dispatcher.add_handler(conversation_handler_obj)
    
    # Carga los estados de ConversationHandler cuando se inicia el script
    def error_callback(update, context):
        try:
            user_id = update.message.from_user.id
            chat_id = update.message.chat_id
            states = load_conversation_states(user_id, chat_id)
            if states:
                context.conversation_data = states
        except Exception as e:
            print(e)
    
    updater.dispatcher.add_error_handler(error_callback)
    
    # Inicia el bot
    updater.start_polling()
    

    Con esta modificación, tus estados de ConversationHandler se guardarán en la base de datos de Firebase y se cargarán de nuevo cuando se reinicie el script, así que el ConversationHandler funcionará automáticamente sin necesidad de un comando.

    En cuanto a los servicios de alojamiento que no reinician el script, puedes consultar servicios como AWS Elastic Beanstalk o Google App Engine. Estos servicios están diseñados para mantener las aplicaciones en ejecución continuamente sin interrupciones.

Comments are closed.