CallbackQueryHandler telegram-bot

di il
2 risposte

CallbackQueryHandler telegram-bot

Buongiorno a tutti stavo sviluppando un mini script che interagisce con telegram di sotto lo script, non riesco a far funzionare il CallbackQueryHandler come si nota nello script l'utente dopo aver inserito tutti i dati manda un messaggio con un secondo bot il quale ha presente 2 bottoni sotto il post uno dei quali esempio conferma che una volta cliccato eseguirà poi delle funzioni ma non riesco a far funzionare il processo ho una def button_callback che appena chiamata dovrebbe eseguirmi una print ma ovviamente senza successo il programma è in fase di sviluppo e sono agli inizi quindi mancano ancore molte cose, potete aiutarmi?

Chiedo scusa per il casino grazie mille in anticipo

import telegram
from telegram import Bot
from telegram.ext import Updater, CommandHandler, MessageHandler, ConversationHandler, CallbackQueryHandler, Filters
from telegram import Bot, InlineKeyboardButton, InlineKeyboardMarkup
import re
import os
PHOTO_DIR = "Mia_path"


API_KEY = "primo_token"

# Token e Chat ID del secondo bot per inviare il riepilogo
SECOND_BOT_TOKEN = "secondo_token"
SECOND_BOT_CHAT_ID = "id"

# Inizializza il bot e il dispatcher
updater = Updater(API_KEY)
dispatcher = updater.dispatcher

# Definizione degli stati della conversazione
SELEZIONE=0
TITOLO_LIBRO= 1
ANNO_EDIZIONE=2
MATERIA=3
UNIVERSITA=4
PREZZO=5
FOTO_COPERTINA=6
CONTATTO=7
RIEPILOGO=8
CONFERMA_MODIFICA=9
WELCOME = 10

def start(update_obj, context):
    nome = update_obj.effective_user.first_name
    rt = update_obj.message.reply_text
    rt(f"Ciao {nome}\nIo sono libbot creato per aiutarti nel inserire la vendita che desideri\nPremi Avvio",
        reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
    return WELCOME

def welcome(update_obj, context):
    nome = update_obj.effective_user.first_name
    if update_obj.message.text.lower() in ['avvio', 'a']:
        rt(f"Ciao {nome} seleziona la categoria di tuo interesse:",
            reply_markup=telegram.ReplyKeyboardMarkup([['Libri', 'Appunti', 'Altro']], one_time_keyboard=True))
        return SELEZIONE
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME

def selezione(update_obj, context):
    nome = update_obj.effective_user.first_name
    testo = update_obj.message.text.lower()
    if testo == 'libri':
        update_obj.message.reply_text("Perfetto! Iniziamo con i libri. Qual è il titolo del libro che vuoi vendere?")
        return TITOLO_LIBRO
    elif testo == 'appunti':
        update_obj.message.reply_text("Iniziamo con gli appunti. Di quale corso sono gli appunti che vuoi vendere?")
        return CORSO_APPUNTI  # Stato ipotetico per gestire gli appunti
    elif testo == 'altro':
        update_obj.message.reply_text("Va bene, altro. Descrivi l'oggetto che vuoi vendere.")
        return DESCRIZIONE_ALTRO  # Stato ipotetico per gestire altro
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME

def titolo_libro(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        titolo = update_obj.message.text
        context.user_data['titolo_libro'] = titolo
        update_obj.message.reply_text("Qual è l'anno di edizione del libro?")
        return ANNO_EDIZIONE
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME

def anno_edizione(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        anno = update_obj.message.text
        context.user_data['anno_edizione'] = anno
        update_obj.message.reply_text("Qual è la materia del libro?")
        return MATERIA
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME

def materia(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        materia = update_obj.message.text
        context.user_data['materia'] = materia
        update_obj.message.reply_text("A quale università è associato questo libro?")
        return UNIVERSITA
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME    

def universita(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        universita = update_obj.message.text
        context.user_data['universita'] = universita
        update_obj.message.reply_text("Qual è il prezzo del libro?")
        return PREZZO
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME    

def prezzo(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        prezzo = update_obj.message.text
        context.user_data['prezzo'] = prezzo
        update_obj.message.reply_text("Carica una foto della copertina del libro.")
        return FOTO_COPERTINA
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME    

def foto_copertina(update_obj, context):
    # Verifica se il messaggio è di testo
    if update_obj.message.text:
        testo = update_obj.message.text.lower()
        if testo == '/cancel':
            update_obj.message.reply_text("Inserimento foto annullato. Torna al menu principale.",
                                          reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
            return WELCOME

    # Gestisce il caso di foto inviata
    elif update_obj.message.photo:
        foto = update_obj.message.photo[-1].file_id
        context.user_data['foto_copertina'] = foto
        # Aggiungi il codice per salvare la foto nella cartella specificata
        photo_file = context.bot.get_file(foto)
        photo_file.download(os.path.join(PHOTO_DIR, "foto.jpg"))
        update_obj.message.reply_text("Come preferisci essere contattato? (telegram/cellulare)",
                                      reply_markup=telegram.ReplyKeyboardMarkup([['telegram', 'cellulare']], one_time_keyboard=True))
        return CONTATTO

    else:
        # Se non è né testo né foto
        update_obj.message.reply_text("Comando non riconosciuto. Per favore, invia una foto della copertina.")
        return FOTO_COPERTINA

def contatto(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        tipo_contatto = update_obj.message.text.lower()
        if tipo_contatto == "telegram":
            update_obj.message.reply_text("Inserisci il tuo ID Telegram.")
        else:  # assumiamo l'altra opzione sia "cellulare"
            update_obj.message.reply_text("Inserisci il tuo numero di cellulare.")
        return RIEPILOGO
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME  

def riepilogo(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        contatto_utente = update_obj.message.text  # Salva il contatto fornito
        context.user_data['contatto'] = contatto_utente
        nome_utente = update_obj.effective_user.first_name  # Ottiene il nome dell'utente
        annuncio = f"Nome: {nome_utente}\n" \
                f"Titolo: {context.user_data.get('titolo_libro')}\n" \
                f"Anno di Edizione: {context.user_data.get('anno_edizione')}\n" \
                f"Materia: {context.user_data.get('materia')}\n" \
                f"Università: {context.user_data.get('universita')}\n" \
                f"Prezzo: {context.user_data.get('prezzo')}\n" \
                f"Contatto: {contatto_utente}\n"
        update_obj.message.reply_text(f"Ecco il riepilogo del tuo annuncio:\n{annuncio}")
        if 'foto_copertina' in context.user_data:
            chat_id = update_obj.message.chat_id
            context.bot.send_photo(chat_id=chat_id, photo=context.user_data['foto_copertina'])
        update_obj.message.reply_text("Se tutto è corretto digita 'conferma', altrimenti 'modifica'.",
                                    reply_markup=telegram.ReplyKeyboardMarkup([['conferma', 'modifica']], one_time_keyboard=True))
        return CONFERMA_MODIFICA
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME  

def conferma_modifica(update_obj, context):
    testo = update_obj.message.text.lower()
    # Controlla se l'utente ha digitato "/cancel"
    if testo not in '/cancel':
        scelta = update_obj.message.text.lower()
        if scelta == "conferma":
            nome_utente = update_obj.effective_user.first_name  # Ottiene il nome dell'utente
            # Prepara il messaggio di riepilogo
            annuncio = f"Nome: {nome_utente}\n" \
                    f"Titolo: {context.user_data.get('titolo_libro')}\n" \
                    f"Anno di Edizione: {context.user_data.get('anno_edizione')}\n" \
                    f"Materia: {context.user_data.get('materia')}\n" \
                    f"Università: {context.user_data.get('universita')}\n" \
                    f"Prezzo: {context.user_data.get('prezzo')}\n" \
                    f"Contatto: {context.user_data.get('contatto')}\n"

            # Definisci il percorso del file della foto
            percorso = r"/home/ema/Scrivania/progetti_lavoro_python/foto_telegram"
            photo_path = os.path.join(percorso, "foto.jpg")

            # Crea un nuovo bot con il secondo token per inviare il messaggio e la foto
            second_bot = Bot(token=SECOND_BOT_TOKEN)
            
            # Crea i due bottoni
            inline_keyboard = [[InlineKeyboardButton("Conferma", callback_data='conferma'), InlineKeyboardButton("Annulla", callback_data='annulla')]]
            reply_markup = InlineKeyboardMarkup(inline_keyboard)

            # Invia il messaggio con la foto, il testo e i bottoni nella seconda chatbot
            second_bot.send_photo(chat_id=SECOND_BOT_CHAT_ID, photo=open(photo_path, 'rb'), caption=annuncio, reply_markup=reply_markup)

            # Invia conferma all'utente che ha creato l'annuncio
            update_obj.message.reply_text("Annuncio confermato e inviato all'amministratore!\nPremi /start per nuova ricerca.\nSarai contattato direttamente appena sarà passato al controllo amministratori")
            return telegram.ext.ConversationHandler.END
        elif scelta == "modifica":
            update_obj.message.reply_text("Ok ricominciamo con il tuo annuncio.", 
                reply_markup=telegram.ReplyKeyboardMarkup([['Libri', 'Appunti', 'Altro']], one_time_keyboard=True))
            return SELEZIONE  # Torna alla selezione iniziale per modificare l'annuncio
    elif testo == '/cancel':
        update_obj.message.reply_text("Va bene, torniamo a capo.",
         reply_markup=telegram.ReplyKeyboardMarkup([['Avvio']], one_time_keyboard=True))
        return WELCOME

def button_callback(update, context):
    print("Callback invocata")  # Aggiungi questo per il debug
    try:
        query = update.callback_query
        print(f"Callback data received: {query.data}")  # Punto 4
        if query.data == 'conferma':
            query.answer("Hai confermato l'annuncio!")  # Messaggio di risposta al clic sul pulsante "Conferma"
            context.bot.send_message(chat_id=query.message.chat_id, text="Grazie per la conferma!")  # Invia un messaggio all'utente
    except Exception as e:
        print(f"Errore nella callback: {e}")  # Punto 6

def cancella(update_obj, context):
    update_obj.message.reply_text(
        "Conversazione terminata. Premi /start per iniziare di nuovo.",
        reply_markup=telegram.ReplyKeyboardRemove())
    return ConversationHandler.END

def reset_conversation(update_obj, context):
    context.user_data.clear()
    print('chiamata alla funzione reset_conversation')  # Conferma l'inizio della funzione
    user_data = context.user_data
    print(f'Dati dell\'utente prima del reset: {user_data}')  # Prima del reset
    user_data.clear()
    print('tutto pulito')  # Conferma il reset
    print(f'Dati dell\'utente dopo del reset: {user_data}')  # Dovrebbe essere vuoto

# Aggiungi un nuovo CommandHandler per il comando "/start" per far ripartire la conversazione da zero
# Assicurati che l'entry point sia configurato correttamente nel ConversationHandler

dispatcher.add_handler(CallbackQueryHandler(button_callback))
category_regex = re.compile(r'^(libri|appunti|altro|telegram|cellulare|si|no|inizia|titolo|corso|descrizione|pubblica|annulla|conferma|modifica|start|/cancel)$', re.IGNORECASE)
start_handler = CommandHandler('start', start)
cancel_handler = CommandHandler('cancella', cancella)
dispatcher.add_handler(cancel_handler)

# Handler per la conversazione
conv_handler = ConversationHandler(
    entry_points=[CommandHandler('start', start)],
    states={
        
        SELEZIONE: [MessageHandler(Filters.regex(category_regex), selezione)],
        TITOLO_LIBRO: [MessageHandler(Filters.text, titolo_libro)],
        ANNO_EDIZIONE: [MessageHandler(Filters.text, anno_edizione)],
        MATERIA: [MessageHandler(Filters.text, materia)],
        UNIVERSITA: [MessageHandler(Filters.text, universita)],
        PREZZO: [MessageHandler(Filters.text, prezzo)],
        FOTO_COPERTINA: [MessageHandler(Filters.text | Filters.photo, foto_copertina)],
        CONTATTO: [MessageHandler(Filters.text, contatto)],
        RIEPILOGO: [MessageHandler(Filters.text, riepilogo)],
        WELCOME: [MessageHandler(Filters.text, welcome)],
        CONFERMA_MODIFICA: [MessageHandler(Filters.regex('^(conferma|modifica)$'), conferma_modifica)],
    },fallbacks=[telegram.ext.CommandHandler('cancella', cancella)],)

# Aggiungi il ConversationHandler al dispatcher
dispatcher.add_handler(conv_handler)

# Aggiungi il CallbackQueryHandler al dispatcher
dispatcher.add_handler(CallbackQueryHandler(button_callback))

# Altri CommandHandler
dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CommandHandler('cancella', cancella))

# Avvia il polling e attiva il bot
print("Bot attivo!!!")
updater.start_polling()
updater.idle()

dispatcher.add_handler(handler)
print("Bot attivo!!!")
updater.start_polling(allowed_updates=Update.ALL_TYPES)
updater.idle()



2 Risposte

  • Re: CallbackQueryHandler telegram-bot

    Non si capisce niente. Modifica il post, seleziona il codice e formattalo col quarto pulsante nella toolbar dell'editor. Nello specifico scegli python dalla tendina dei linguaggi 

  • Re: CallbackQueryHandler telegram-bot

    Grazie a tutti signori ho risolto ho ricontrollato più volte il codice e mi sono accorto che dentro la def che mi dava problemi non avevo specificato bene diversi argomenti grazie ancora

Devi accedere o registrarti per scrivere nel forum
2 risposte