Forum >> Principianti >> BOT Telegram con Keyboard, problema nel richiamare funzioni

Pagina: 1

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 ---
Allegati
Forse non è così banale come sembra :dont-know:
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



Pagina: 1



Esegui il login per scrivere una risposta.