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()