• Почему bot.register_next_step_handler не работает?

    @twistfire92
    bot.register_next_step_handler(message, proc_c(call, a1))


    вы при вызове register_next_step_handler вызываете еще и функцию proc_c, а вам необходимо не вызывать ее, а передавать в качестве параметра.

    Параметры, с которыми должна вызываться передаваемая функция, должны идти отдельными параметрами вслед за этой же функцией

    bot.register_next_step_handler(message, proc_c, call, a1)
    Ответ написан
  • Бот крашится при написании команды, что делать?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Проще всего будет доработать декоратор, добавив ^ и $, чтобы ограничить строку
    @bot.message_handler(regexp=r"^/\w\d+$")
    Ответ написан
  • Как разобрать команду на данные?

    @o5a
    @bot.message_handler(regexp=r"/\w\d+")
    def get_info(message):
        user_type = message.text[1:2]
        user_num = int(message.text[2:])
        print(user_type, user_num)
        bot.send_message(message.chat.id, f'ты запросил {user_type} - {user_num}')

    Только этот хендлер надо помещать ДО хендлера общего текста (message_handler(content_types=['text'])
    Ответ написан
  • Как разобрать команду на данные?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    есть 2 таблицы в которых введены разные данные у одной таблице тип c, а у другой таблицы тип e.

    В вопросе одна таблица, так что по скуле не подскажу,

    import re
    
    @bot.message_handler(regexp=r'/[ec]\d+')
    def get_data(message):
        type_, id_ = re.findall(r'/([ec])(\d+)', message.text)[0]
    Ответ написан
  • Как сделать чтобы информация в бд не повторялась sql telebot?

    LaRN
    @LaRN
    Senior Developer
    Можно наложить на поле уникальный индекс, тогда при попытке сделать дубль будет sql error, который можно перехватить и обработать так как вам нужно, например попросить изменить выбранный тэг.

    Если sql error вам не подходит, то можно попробовать перед вставкой/изменением тэга выполнять проверку на существование таго значения в бд, например так:
    select 1 from table where tag = 'New tag'

    Если запрос вернул 1 значит данный тег уже есть в БД и нужно придумать другой.
    Ответ написан
  • Как убрать курсив в python telebot?

    @GeneD88
    QA
    bot.edit_message_text(f' *Добро* пожаловать в @anan\\_as\n Наш *бот*: @anan\\_as', parse_mode='Markdown')

    ?
    Ответ написан
  • Как сделать обновление сообщения в telebot?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Создать отдельный поток, в нем просто в бесконечном цикле каждые 15 секунд обновлять сообщение.

    import threading
    import time
    
    def update_time(chat_id, message_id):
    
        while True:
            time.sleep(15)
            bot.edit_message_text('новый текст', chat_id, message_id)
    
    
    @bot.message_handler(commands=['start'])
    def send_start(message):
        sent = bot.send_message(message.chat.id, 'Сейчас 18:33:33')
        threading.Thread(target=update_time, args=(message.chat.id, sent.id)).start()


    Лимит редактирования - 48 часов.
    Ответ написан
  • Бот не меняет сообщение Telebot, как решить?

    SoreMix
    @SoreMix
    yellow
    у админа все работает прекрасно сообщение меняется, но у саппорта ничего не меняется и выдается ошибка


    У вас два метода,которые изменяют сообщение. Первый для сапорта, второй для администратора. В чате у одного нет сообщения второго и наоборот

    Логично было бы заменить
    bot.edit_message_text(chat_id=admin, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")
    bot.edit_message_text(chat_id=support, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")

    на
    bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")


    Так же хотелось бы узнать что делать чтобы вместо @{str(call.message.chat.username)} писался username человека которого приняли, а то там пишется username того кто принял

    Тут тоже все логично, обращаетесь к чату, из которого пришло нажатие, и получаете данные из этого же чата. Если хотите упоминать пользователя - сразу передавайте его имя либо в сообщении, к которому прикреплена кнопка, либо в callback_data поместите. Я так понял callback_data никак не занята, так что это лучший вариант

    Но можно и вызвать метод getChat, передать в него id чата и получить из него имя пользователя. Но зачем, если можно имя сразу передать через inline кнопку

    upd: а, ну я понял, что подразумевалось при использовании двух методов. Нужно во всех чатах обновить информацию. Здесь ошибка появляется из-за того, что ID сообщений не совпадает в двух чатах. Можно пофиксить как нибудь через добавление ID сообщений в кнопку через редактирование, но способ странный конечно. Сейчас напишу что нибудь.

    Окей, допустим у нас есть два id чата - admin и support, занесем их в список. И создадим еще список, где будем хранить наши id сообщений. Главная идея в том, чтобы добавить в callback_data наши ID чата и ID поддержки вместе с их уникальными ID сообщений. Дальше я просто выложу код и прокоментирую.
    @bot.message_handler(commands=['start'])
    def send_start(message):
    
        # начальная клавиатура
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Принять пользователя', callback_data='dummy'))
    
        # два списка, один с ID чатов сапорта и админа, второй для ID сообщений
        chats = [admin, support]
        message_ids = []
    
        # Для каждого из наших старших юзеров отправляем сообщение, в котором есть имя человека для одобрения и наша клавиатура.
        # во время отправки сообщений мы сохраняем их ID и добавляем в наш список message_ids
        for chat in chats:
            msg = bot.send_message(chat, 'Пользователь: 1234', reply_markup=markup)
            message_ids.append(msg.message_id)
    
        # здесь склеиваем наш chat_id и message_id и формируем из них строку вида "chatid_messageid:chatid2_messageid2"
        # у меня cb_data получается "XXXXXXX_1264:YYYYYYYY_1265", где 1264 & 1265 - id сообщений, а XXXX & YYY - ID чатов людей из списка chats
        cb_data = ':'.join(f'{chat_id}_{message_id}' for chat_id, message_id in zip(chats, message_ids))
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Принять пользователя', callback_data=cb_data))
    
        # еще раз склеиваем наши списки, и редактируем в них клавиатуру
        for chat_id, message_id in zip(chats, message_ids):
            bot.edit_message_text('test', chat_id, message_id, reply_markup=markup)


    После таких манипуляций и у сапорта и у админа появляется одинаковое сообщение, с просьбой принять пользователя и кнопкой для принятия. В эту кнопку зашиты ID сообщений и ID чатов, где лежит точно такое же сообщение.

    Дальше все просто, в функции с обработкой заявок разбиваем нашу колбек дату на ид чатов и ид сообщений, и в цикле их редактируем.

    @bot.callback_query_handler(func= lambda call: True)
    def accept(call):
    
        messages_info = call.data.split(':')
        for message_info in messages_info:
            chat_id, message_id = message_info.split('_')
            bot.edit_message_text(chat_id=chat_id, message_id=message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")


    Не тестил, но думаю работать будет. Надеюсь понятно что я имел ввиду
    Ответ написан