Profilo di frisby

Nome frisby
Indirizzo email claudio@pietrapiana.it
Website URLhttp://www.reggelloambiente.it
AvatarAvatar utenti
Messaggi3
  • Re: BOT Telegram con Keyboard, problema nel richiamare funzioni
    Forum >> Principianti
    Dopo mesi l'ho risolto...

    Non si può richiamare direttamente una funzione dal menu, ma va creata una condizione IF




    CODICE DEL SOTTOMENU:




    def amelia_keyboard():
    keyboard = [[InlineKeyboardButton("SISMO V", callback_data='asv'), .................







    SI CREA UNA "IF" all'interno del Comando BUTTON





    def button(bot, update):
    query = update.callback_query
    bot.send_message(text="%s" % query.data, chat_id=query.message.chat_id, message_id=query.message.message_id) <--- Scrive il comando prima della risposta, in questo caso "asv"




    if query.data == "asv": bot.send_photo(query.message.chat_id,'/amelia_sismo_v') <--- IF che richiama la funzione

  • Re: BOT Telegram con Keyboard, problema nel richiamare funzioni
    Forum >> Principianti
    Forse non è così banale come sembra :dont-know:
  • BOT Telegram con Keyboard, problema nel richiamare funzioni
    Forum >> Principianti
    Buongiorno,

    sono 3 giorni che impazzisco, dopo aver scritto oltre 1500 linee di codice da 0, per far "rispondere" il BOT lanciando una funzione anzichè un semplice testo. Intanto allego un estratto del codice che già attivo sulla pagina del BOT @earthqquakebot , lanciando /start

    Il BOT sarà operativo all'interno di una chat amatoriale di appassionati di sismologia della quale faccio parte e servirà per richiamare i sismogrammi delle stazioni che partecipano alla rete sismica (attualmente 20 stazioni italiane)

    In pratica ho 2 PULSANTI:

    SISMO V richiama la funzione (definita precedentemente) amelia_sismo_v che però restituisce l'errore:
    WARNING - Update "{........}" caused error "Message is not modified"

    WF V, lancia /amelia_wf_v (con la / davanti) che il software interpreta come stringa e la scrive pari pari come risposta. Ovviamente, essendo un comando, viene scritto in BLU da Telegram ed è cliccabile. Cliccandoci sopra viene eseguito correttamente.

    Ecco, io in fondo vorrei solo evitare alla fine di dover premere sul comando per visualizzare l'immagine.
    Dall'allegato si capisce molto meglio quello che dico.

    Grazie a tutti ed a chi riuscirà ad aiutarmi


    Claudio

    -------------------------------------
    PS: Se può essere utile a qualcuno, ho trovato questo sistema per far ricaricare ogni volta le immagini a Telegram ed evitare che le prenda dalla cache. Avevo questa necessità perchè le immagini che richiamo col BOT si auto-aggiornano ogni 3 minuti.

    bot.send_photo(update.message.chat_id,'http://www.energialternativa.info/Public/NewForum/ImpiantiRT/SismogrammaEmiro/Sismogramma.png'+'?v='+
    time.strftime("%M-%S", time.gmtime())
    ,'Sismogramma Amelia (TR)
    Verticale')

    ----------------------------------------

    CODICE BOT:

    #!/usr/bin/env python
    
    import telepot
    import logging
    from telegram import InlineKeyboardButton, InlineKeyboardMarkup
    from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
    import time
    import datetime
    
    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
    logger = logging.getLogger(__name__)
    
    TOKEN="TOKEN-TELEGRAM" # earthqquakebot
    
    # TOKEN eventualmente va cambiato anchein fondo nell updater.
    
    bot = telepot.Bot(TOKEN)
    
    ############################### MENU ############################################
    def start(bot, update):
    # update.message.reply_text(main_menu_message(), reply_markup=main_menu_keyboard())
      query = update.callback_query
      bot.sendMessage(chat_id=update.message.chat_id, text='STAZIONI EArthQQuake', reply_markup=main_menu_keyboard())
    
    def main_menu(bot, update):
      query = update.callback_query
      bot.edit_message_text(chat_id=query.message.chat_id,
                            message_id=query.message.message_id,
                            text='STAZIONI EArthQQuake',
                            reply_markup=main_menu_keyboard())
    
    def amelia(bot, update):
      query = update.callback_query
      bot.edit_message_text(chat_id=query.message.chat_id,
                            message_id=query.message.message_id,
                            text='AMELIA (TR) - Emiro',
                            reply_markup=amelia_keyboard())
    
    ############################ Keyboards #######################################
    def main_menu_keyboard():
      keyboard = [[InlineKeyboardButton('AMELIA (TR)', callback_data='amelia')]]
      return InlineKeyboardMarkup(keyboard)
    
    def button(bot, update):
         query = update.callback_query
         #NON CANCELLA LA TASTIERA DOPO L INVIO DEL COMANDO
         bot.send_message(text="%s" % query.data, chat_id=query.message.chat_id, message_id=query.message.message_id)
         # CANCELLA LA TASTIERA DOPO L INVIO DEL COMANDO
         #bot.editMessageText(text="%s" % query.data, chat_id=query.message.chat_id, message_id=query.message.message_id)
    
    def help(bot, update):
        update.message.reply_text("Usa /start per aprire il menu principale.")
    
    def error(bot, update, error):
         logging.warning('Update "%s" caused error "%s"' % (update, error))
    
    def amelia_keyboard():
      keyboard = [[InlineKeyboardButton("SISMO V", callback_data= 'amelia_sismo_v'),
                   InlineKeyboardButton('WF V', callback_data='/amelia_wf_v')],
                  [InlineKeyboardButton('Indietro', callback_data='main')]]
      return InlineKeyboardMarkup(keyboard)
    
    ############################# FINE MENU ##########################
    
    ##################################################################
    ########################## AMELIA (TR) ###########################
    ##################################################################
    
    def amelia_sismo_v(bot, update):
       query = update.callback_query
       bot.send_photo(update.message.chat_id,
           'http://www.energialternativa.info/Public/NewForum/ImpiantiRT/SismogrammaEmiro/Sismogramma.png'
           + '?v='+ time.strftime("%M-%S", time.gmtime()),'Sismogramma Amelia (TR) Verticale')
    
    def amelia_wf_v(bot, update):
       query = update.callback_query
       bot.send_photo(update.message.chat_id,
          'http://www.energialternativa.info/Public/NewForum/ImpiantiRT/SismogrammaEmiro/WaterFall.png'
          + '?v='+ time.strftime("%M-%S", time.gmtime()),'Waterfall Amelia (TR) Verticale')
    
    def main():
        # Create the Updater and pass it your bot's token.
        updater = Updater("TOKEN-TELEGRAM")
    ############################  MENU  ###################################
        updater.dispatcher.add_handler(CommandHandler('start', start))
        updater.dispatcher.add_handler(CommandHandler('help', help))
        updater.dispatcher.add_error_handler(error)
        updater.dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='main'))
        updater.dispatcher.add_handler(CallbackQueryHandler(amelia, pattern='amelia'))
        updater.dispatcher.add_handler(CallbackQueryHandler(button))
    ########################################################################
        updater.dispatcher.add_handler(CommandHandler('amelia_sismo_v', amelia_sismo_v))
        updater.dispatcher.add_handler(CommandHandler('amelia_wf_v', amelia_wf_v)) 
    
        # Start the Bot
        updater.start_polling()
    
        # Run the bot until the user presses Ctrl-C or the process receives SIGINT,
        # SIGTERM or SIGABRT
        updater.idle()
    
    if __name__ == '__main__':main()
    



    --- Ultima modifica di ㎝ in data 2018-11-07 23:09:23 ---