Ответы пользователя по тегу Telegram
  • Мой бот перестаёт отвечать, из-за повторного @bot.callback_query_handler(func = lambda call: True). что нужно изменить во 2-ом @, чтобы бот заработал?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Нормально разделить функции, либо объединить в одну

    @bot.callback_query_handler(func = lambda call: True)
    def callback_inline(call):
        global first
        first = ["Well done! Now I have to define your name.", "ikki"]
        if call.data == 'eng':
            first = str(first[0])
            main(call)
    
        elif call.data == 'ru':
            first = str(first[1])
            main(call)
    
        elif call.data == 'yes':
            bot.edit_message_text('Отлично', call.message.chat.id, call.message.message_id)
            body()
        
        else:
            bot.edit_message_text('Плохо', call.message.chat.id, call.message.message_id)
            body()
    Ответ написан
    1 комментарий
  • В чем ошибка данного кода?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Чтобы понять, почему возращает None, нужно убрать эту потрясающую конструкцию с try ... except. Произошла ошибка? Да и ладно.
    try:
            chat = await client(ResolveUsernameRequest(username))
            result = {
                'chat_id': chat.peer.channel_id,
                'access_hash': chat.chats[0].access_hash,
                'title': chat.chats[0].title,
                'username': username
            }
        except Exception as e:
            result = None


    ResolveUsernameRequest не резолвит id из joinchat ссылки.

    from telethon.tl.functions.messages import CheckChatInviteRequest
    chat = client(CheckChatInviteRequest('XXXXXXXXXXXX'))
    Ответ написан
    Комментировать
  • Бот не меняет сообщение 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")


    Не тестил, но думаю работать будет. Надеюсь понятно что я имел ввиду
    Ответ написан
    Комментировать
  • Проблема с bot.register_next_step_handler?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Хендлеры не привязаны ни к чему.

    sent = bot.send_message(message.chat.id, 'Напиши ОДНО любое сообщение') #Пришлось добавить чтоб человек понимал
    bot.register_next_step_handler(sent, func_but1)
    Ответ написан
  • Как сделать так, чтобы бот телеграм не прекращал работу после ошибки?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    def func_1(message):
        if message.text.isdigit():
            i = int(message.text)
            b = i * i
            bot.send_message(message.chat.id, str(i)+' + '+str(i)+' = '+str(b))
        else:
            bot.send_message(message.chat.id, "число")


    Ну и в else нужно добавить next step handler на эту же функцию, или как там реализовано это все
    Ответ написан
    1 комментарий
  • Как сделать мультизадачный(multi threading bot)?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Библиотеки используются, или самопис? Во всех либах есть поддержки мультипотока. Если программа "начинает тупить" при нажатии кнопки /start, проблема явно в самом коде
    Ответ написан
    Комментировать
  • Здравствуйте пишу своего бота, бот отправляет сообщение только тем у кого есть username, у кого нет его тому они не доходят.?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Потому что вы буквально проверяете наличие юзернейма (if message.chat.username:) и выполняете код только если он есть

    Ну и для команд есть специальный декоратор. Чтобы не делать if '/start' == message.text: есть @bot.message_handler(commands=["start"])
    Ответ написан
  • Как вывести имя пользователя и бота в Python?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    message.from_user.last_name
    message.from_user.first_name


    bot.get_me().first_name
    Ответ написан
    2 комментария
  • PyTelegrambotApi меню из инлайн кнопок, как реализовать?

    SoreMix
    @SoreMix
    yellow
    Просто выбор элементов по индексу

    import telebot
    from telebot import types
    import re
    
    items = ['A el', 'B el', 'C el', 'D el']
    
    def generate_markup(pages_count, current_page=0):
    
        markup = types.InlineKeyboardMarkup()
    
        for i in range(pages_count):
            markup.add(types.InlineKeyboardButton(i+1, callback_data='page_{}'.format(i)))
    
        btn_back = types.InlineKeyboardButton('Назад', callback_data='page_{}'.format(current_page-1))
        btn_forward = types.InlineKeyboardButton('Вперед', callback_data='page_{}'.format(current_page+1))
    
        if current_page == pages_count-1:
            markup.add(btn_back)
    
        elif current_page == 0:
            markup.add(btn_forward)
    
        else:
            markup.row(btn_back, btn_forward)
    
        return markup
    
    
    @bot.message_handler(commands=['start'])
    def send_start(message):
    
        bot.send_message(message.chat.id, items[0], reply_markup=generate_markup(len(items)))
    
    
    @bot.callback_query_handler(func = lambda call: re.match(r'page_\d+$', call.data))
    def callback_query(call):
    
        page = int(re.match(r'page_(\d+)$', call.data).group(1))
    
        bot.edit_message_text(items[page], call.message.chat.id, call.message.message_id, reply_markup=generate_markup(len(items), page))
    Ответ написан
    2 комментария
  • Как заставить бота через питон выполнять определенные действия в телеграмм?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Можно,

    1. Создаете бота через клиентский API (telethon/pyrogram)
    2. Добавляете нужные функции
    3. Отправляете репорт (https://core.telegram.org/method/account.reportPeer), реализацию этого метода в выбранной библиотеке можно найти в доках по ней
    Ответ написан
  • Как отправить видео, чтобы оно само включалось?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Никак, вы не заставите других людей насильно выкачивать ваши видео.
    Это настраивается только на клиенте
    Ответ написан
    Комментировать
  • Почему не работает import telebot?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Во-первых, полный трейсбек, если он есть
    Во-вторых, не нужно называть файл одинаково с названием модуля
    Ответ написан
    1 комментарий
  • Простой бот в телеграмм. Ошибка с pytelegrambotapi, не понимаю, в чем проблема?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В том, что переменная не определена. Сначала использовали ее, только потом объявили.
    608856de446ad693076586.jpeg

    Блок с созданием переменной выше поднимите, чем отправка сообщения
    Ответ написан
    4 комментария
  • Как получить полную информацию по каналу через Telegram Bot API на Python?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    официальном Telegram Bot API я нашёл нужный мне метод

    Это документация по клиентскому API, а не API ботов. Бот API не поддерживает получения списка участников, только их количество

    Для клиентского API есть telethon, pyrogram итд
    Ответ написан
  • Как передать полученные с POST запроса данные в телеграм бота?

    SoreMix
    @SoreMix
    yellow
    при таком раскладе не получается отправить полученные данные пользователю в телеграме

    Почему? Получайте тело запроса и отправляйте спокойно
    Ответ написан
  • Как сделать перенос инлайн кнопок?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    ничего не работает

    Потому что кнопки в итоге добавляете через метод row, который игнорирует параметр row_width
    row() добавляет именно строку, сколько передали параметров - столько и будет кнопок в строке (ну, без превышения лимитов телеги конечно)
    add() добавляет кнопки, разбивая их на несколько строк по длине row_width

    Так что заменяйте на
    def  test():
        return types.InlineKeyboardMarkup(row_width = 2).add(
            types.InlineKeyboardButton('test', callback_data=ge_cb.new(action='test1')),
            types.InlineKeyboardButton('test' , callback_data=ge_cb.new(action='test2')),
            types.InlineKeyboardButton('test', callback_data=ge_cb.new(action='test3')),
            types.InlineKeyboardButton('test', callback_data=ge_cb.new(action='test4')))
    Ответ написан
    Комментировать
  • Не получается сделать кликабельный номер в телеграм. Что не так?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Приложение на телефоне само должно сделать номер кликабельным, на пк нельзя
    Ответ написан
    Комментировать
  • Как обновлять текст?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Можно, вызываете метод edit_message_reply_markup у бота, передав нужные параметры.

    edit_message_reply_markup(chat_id=None, message_id=None, inline_message_id=None, reply_markup=None):
    """
    Use this method to edit only the reply markup of messages.
    :param chat_id:
    :param message_id:
    :param inline_message_id:
    :param reply_markup:
    :return:
    """
    Ответ написан
    Комментировать
  • В чем отличие message_handler от callback_query_handler?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    message_handler обрабатывает обычные сообщения (события)
    callback_query_handler обрабатывает нажатия на inline кнопки
    Ответ написан
    Комментировать