dabudi
@dabudi
познаю python, балуюсь ботами

Как очистить переменную message, чтобы бот не зацикливался?

Здравствуйте! Я делаю бота, который будет выводить данные из базы данных по rowid в порядке очереди и преобразовать их в анкетный вид типа картинка и ниже текст.

При нажатии на кнопку «Искать анкеты» - бот скидывает первую анкеты из базы и прибавляет к counts +1, тем самым я по этому значению выбираю id из листа и снова подбираю нужные данные для пользователя.

При нажатии на кнопку «Еще» - бот зацикливается и передаёт message со словом «Ещё» в функцию sendannk и начинается перебор анкет до самого конца, потом анкеты кончаются и бот переходит в главное меню.

Проблема в том, что мне нужно, чтобы при каждом нажатии на кнопку «еще» - бот показывал следующую анкету и ждал, когда юзер нажмёт «Ещё» (при необходимости)

Как мне все это сделать?

Я пробовал bot.register_next_step_handler(message,count, sendannk) , но я не могу передать count в качестве аргумента, выдаёт ошибку TypeError: 'NoneType' object is not callable

Помогите, может быть можно по другому принципу сделать то, что нужно

def search(message):

    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(*[types.KeyboardButton(name) for name in ['Еще', 'Остановить']])
    bot.send_message(message.chat.id, "Сейчас поищем!", reply_markup=keyboard)
    count = 0
    sendannk(message,count)



def sendannk(message,count):
    try:
        ids = '12345678'
        with sq.connect('DATABASE.db') as con:
            cur = con.cursor() 
            cur.execute('''SELECT city FROM users WHERE userid = ?''', (ids,))
            datacit = cur.fetchall()
            datacit = datacit[0][0] ##город  юзера
            cur.execute('''SELECT rowid FROM users WHERE city = ? ''', (datacit,))
            usersrowid = cur.fetchall()
            
        lst = [] #rowid анкет по городу 
        
        for s in usersrowid:
            sstr = str(s)
            sssr = sstr.replace(')','').replace('(','').replace(',','')
            lst.append(sssr)
            
        cont = len(lst)
        rowidus = lst[count] 
        
        with sq.connect('DATABASE.db') as con:
            cur = con.cursor() 
            cur.execute('''SELECT name,old,city,photo,descr,cont FROM users WHERE rowid = ? ''',(rowidus,))
            data = cur.fetchall()

        dbdata = data[0]
        usercity = dbdata[0]   
        username = dbdata[1]
        userold = dbdata[2]
        userphoto = dbdata[3]   
        userdescr = dbdata[4]
        usercont = dbdata[5]
        caption = username + ', ' + userold + ', ' + usercity + '\n' + userdescr + '\n' + usercont
        
        
        bot.send_photo(message.chat.id, userphoto, caption)
        if message.text == 'Еще':
            count += 1
            sendannk(message,count)

    except:
        bot.send_message(message.chat.id, 'Анкеты кончились')
        start_message(message)
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
SoreMix
@SoreMix
yellow
Не использовать подобные вызовы функции, тем более, контент в переменной message никак не меняется.
if message.text == 'Еще':

Используйте register_next_step_handler
https://github.com/eternnoir/pyTelegramBotAPI/blob...

Допустим, так

@bot.message_handler(commands=['search'])
def start_search(message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(*[types.KeyboardButton(name) for name in ['Еще', 'Остановить']])
    bot.send_message(message.chat.id, "Сейчас поищем!", reply_markup=keyboard)
    sendannk(message, 0)

def sendannk(message, count):
    if message.text == 'Остановить':
        print('stop')
    elif message.text == 'Еще' or count == 0: # Вместо count == 0 можно указать начальное сообщение, чтоб первый раз функция выполнилась, а не по колбэку, в этом случае было бы message.text == '/search', не увидил ничего криминального в каунт = 0 поэтому пусть будет
        try:
            ids = '12345678'
            with sq.connect('DATABASE.db') as con:
                cur = con.cursor() 
                cur.execute('''SELECT city FROM users WHERE userid = ?''', (ids,))
                datacit = cur.fetchall()
                datacit = datacit[0][0] ##город  юзера
                cur.execute('''SELECT rowid FROM users WHERE city = ? ''', (datacit,))
                usersrowid = cur.fetchall()
                
            lst = [] #rowid анкет по городу 
            
            for s in usersrowid:
                sstr = str(s)
                sssr = sstr.replace(')','').replace('(','').replace(',','')
                lst.append(sssr)
                
            cont = len(lst)
            rowidus = lst[count] 
            
            with sq.connect('DATABASE.db') as con:
                cur = con.cursor() 
                cur.execute('''SELECT name,old,city,photo,descr,cont FROM users WHERE rowid = ? ''',(rowidus,))
                data = cur.fetchall()

            dbdata = data[0]
            usercity = dbdata[0]   
            username = dbdata[1]
            userold = dbdata[2]
            userphoto = dbdata[3]   
            userdescr = dbdata[4]
            usercont = dbdata[5]
            caption = username + ', ' + userold + ', ' + usercity + '\n' + userdescr + '\n' + usercont
            
            
            bot.send_photo(message.chat.id, userphoto, caption)
            
            count += 1
            msg = bot.send_message(message.chat.id, "Искать еще?")
            bot.register_next_step_handler(msg, sendannk, count)

        except:
            bot.send_message(message.chat.id, 'Анкеты кончились')
            start_message(message)


через доп функцию, чтоб не трогать if в sendannk

@bot.message_handler(commands=['search'])
def start_search(message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(*[types.KeyboardButton(name) for name in ['Еще', 'Остановить']])
    bot.send_message(message.chat.id, "Сейчас поищем!", reply_markup=keyboard)
    sendannk(message, 0)


def step_handler(message, count=0):
    if message.text == 'Еще':
        sendannk(message, count)
    elif message.text == 'Остановить':
        print('stop')


def sendannk(message, count):
    try:
        
        ids = '12345678'
        with sq.connect('DATABASE.db') as con:
            cur = con.cursor() 
            cur.execute('''SELECT city FROM users WHERE userid = ?''', (ids,))
            datacit = cur.fetchall()
            datacit = datacit[0][0] ##город  юзера
            cur.execute('''SELECT rowid FROM users WHERE city = ? ''', (datacit,))
            usersrowid = cur.fetchall()
            
        lst = [] #rowid анкет по городу 
        
        for s in usersrowid:
            sstr = str(s)
            sssr = sstr.replace(')','').replace('(','').replace(',','')
            lst.append(sssr)
            
        cont = len(lst)
        rowidus = lst[count] 
        
        with sq.connect('DATABASE.db') as con:
            cur = con.cursor() 
            cur.execute('''SELECT name,old,city,photo,descr,cont FROM users WHERE rowid = ? ''',(rowidus,))
            data = cur.fetchall()

        dbdata = data[0]
        usercity = dbdata[0]   
        username = dbdata[1]
        userold = dbdata[2]
        userphoto = dbdata[3]   
        userdescr = dbdata[4]
        usercont = dbdata[5]
        caption = username + ', ' + userold + ', ' + usercity + '\n' + userdescr + '\n' + usercont
        
        
        bot.send_photo(message.chat.id, userphoto, caption)

        count += 1
        msg = bot.send_message(message.chat.id, "Искать еще?")
        bot.register_next_step_handler(msg, step_handler, count)

    except:
        bot.send_message(message.chat.id, 'Анкеты кончились')
        start_message(message)

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы