2017-09-13 1 views
0

Je crée un robot Telegram qui peut accéder à la base de données pour répondre à la requête des utilisateurs. Le bot doit répondre à une demande spécifique de certaines données dans la base de données. J'ai été capable de résoudre quand les utilisateurs demandent toutes les données, mais je suis coincé avec des données individuelles. J'utilise telegram.ext du paquet telegram en python. Voici ce que j'ai fait jusqu'ici.Le télégramme Bot répond à une commande spécifique dans la liste Python

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters 
import MySQLdb 

currr = [] # global list var ~don't bash me for using global in python please, I'm a newbie 

# request for all data in database 
def request2(bot, update): 
    db = MySQLdb.connect(host = "local", user = "root", passwd = "pwd", db = "mydb") 
    cur = db.cursor() 
    cur.execute("select ID from table") 
    ID = cur.fetchall() 

    cur.execute("SELECT ID, temp FROM table2 order by indexs desc") 
    each_rows = cur.fetchall() 
    for IDs in ID: 
     for each_row in each_rows: 
      if str(each_row[0])[0:4]==str(ID)[2:6]: 
       update.message.reply_text('reply all related data here') 
       break 

# request for single data 
def individualreq(bot, update): 
    db = pymysql.connect(host = "localhost", user = "root", passwd = "pwd", db = "mydb") 
    update.message.reply_text('reply individual data to users here') 

def main(): 
    updater = Updater("TOKEN") 
    dp = updater.dispatcher 

    global currr 
    # get all ID form database 
    db = MySQLdb.connect(host = "localhost", user = "root", passwd = "pwd", db = "mydb") 
    cur = db.cursor() 
    cur.execute("select ID from table") 
    curr_ID = cur.fetchall() 

    # example ID = 'F01', 'F02', 'F03' 
    for curr_IDs in curr_ID: 
     currr.append(curr_IDs[0]) 

    # request all data 
    dp.add_handler(CommandHandler("all", request2)) 

    # request individual data 
    dp.add_handler(CommandHandler(currr, individualreq)) # list command in currr[] 

if __name__ == '__main__': 
    main() 

Je cherche un moyen de passer la commande en cours, qui est également l'ID dans la base de données qui demande de l'utilisateur dans la liste currr[] à la fonction individualreq(bot, update) afin que seules les données de l'ID appelé est en train de répondre. Les utilisateurs choisiront parmi une liste d'ID dans le télégramme et le gestionnaire de commande peut transmettre l'ID sélectionné à la fonction. Je n'ai pas trouvé un moyen de transmettre l'identifiant à la fonction. Quelqu'un pourrait m'aider à résoudre cela s'il vous plaît. Merci

Répondre

1

je trouve une solution pour ma question de la réponse fournie par Oluwafemi Sule. CommandHandler peut transmettre les arguments de la commande à la fonction en ajoutant pass_args=True dans le CommandHandler.

dp.add_handler(CommandHandler(currr, individualreq, pass_args=True)) 

Pour imprimer les arguments dans la fonction, la fonction doit recevoir les arguments.

def individualreq(bot, update, args): 
    # id store the args value 
    id = update.message.text 
    print(id[1:]) # [1:] is to get rid of the/in id 
0

Vous pouvez carrément faire une fermeture individualreq.

CommandHandler prend une commande ou une liste de commande à écouter et une liste d'autres options. There is a pass_user_data option qui permet de transmettre les données utilisateur au rappel.

dp.add_handler(CommandHandler(currr, individualreq, pass_user_data=True)) 

La signature pour individualreq rappel sera mis à jour pour prendre le user_data

def individualreq(bot, update, user_data=None): 
    #user_data is a dict 
    print(user_data) 
+0

J'ai essayé ceci mais la sortie est seulement une parenthèse vide []. J'ai aussi essayé 'pass_args = True' mais la sortie est la même. –

+0

Est-ce que vous interrogez le répartiteur et testez avec un compte d'utilisateur? –

+0

Oui Je suis en train d'interroger et de tester avec un compte d'utilisateur. Le robot peut également répondre au groupe Telegram. –