Ответы пользователя по тегу Боты
  • Traceback (most recent call last): File 'tbot.py' line 111 in bot.polling()?

    @twistfire92
    Python backend developer
    трейсбеки читайте снизу вверх.
    Ошибка у вас
    File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\random.py", line 378, in choice
        return seq[self._randbelow(len(seq))]
    IndexError: list index out of range

    Значит пытаетесь обратиться по несуществующему индексу. Выясняйте что не так
    Ответ написан
    2 комментария
  • Как записать в отдельную функцию выбор стейта vkbottle?

    @twistfire92
    Python backend developer
    Не работал с vkbottle, но можете попробовать сделать так

    async def set_state(peer_id, lvl):
    	states = {
    		2: func.Data.SecondLvl,
    		3: func.Data.ThirdLvl,
    		4: func.Data.FourthLvl,
    		5: func.Data.FifthLvl,
    		6: func.Data.SixthLvl,
    		7: func.Data.SeventhLvl
    	}
    	await bot.state_dispenser.set(peer_id, states[lvl])
    
    @bot.on.private_message(payload = {"cmd":"yeslvlup"})
    async def yeslvlup(message: Message):
        lvl = 1+base.output_lvl(message.peer_id)
        base.input_lvl(message.peer_id,lvl)
        await set_state(message.peer_id, lvl)
        await message.text(
            "Уровень повышен",
            keyboard = Keyboard(one_time = True)
            .add(Text("Продолжить"), color = KeyboardButtonColor.PRIMARY)
            )
    Ответ написан
    Комментировать
  • Как в боте сделать нажатие кнопки только 1 раз?

    @twistfire92
    Python backend developer
    вы в кнопку заносите чей user_id? Бота? Канала? И у всех пользователей при нажатии один и тот же id (mandm) заносится в базу данных.

    Вам надо при нажатии на кнопку сначала делать запрос в БД, проверять ставил ли этот пользователь (call.from_user.id) лайк или дизлайк этому сообщению (call.message.id). Если такая запись есть, то выводить сообщение о том, что уже были лайки/дизлайки.
    Ответ написан
    Комментировать
  • Как в кнопку передать user_id?

    @twistfire92
    Python backend developer
    callback_data='<ID>|button1'

    потом просто
    user_id, data = call.data.split('|')

    вот и получил из кнопки user_id
    Ответ написан
    3 комментария
  • Как сделать два message_handler для бота на python?

    @twistfire92
    Python backend developer
    Если вам не нравится структура с if, можете раскидать все на отдельные хендлеры.

    @bot.message_handler(func=lambda message: message.text=='Привет')
    def privet(message):
        user_markup = telebot.types.ReplyKeyboardMarkup(True, False)
        user_markup.row('Чат с работами', 'Показать новости')
        user_markup.row('Оставить заявку на выполнение работы')
        bot.send_message(message.from_user.id, "Выбери, что ты хочешь сделать.", reply_markup=user_markup)
    
    @bot.message_handler(func=lambda message: message.text=='Чат с работами')
    def chat_with_works(message):
        markup = types.InlineKeyboardMarkup()
        btn_my_site = types.InlineKeyboardButton(text='Чат с работами', url='https://t.me/AnonChanBot?start=-1001502978392')
        markup.add(btn_my_site)
        bot.send_message(message.chat.id, "Здесь вы можете присылать работы, которые давали вам преподаватели, чтобы облегчить жизнь тем, кому их ещё не давали. Ваши сообщения АНОНИМНЫ.", reply_markup=markup)
    
    # Ну и так далее...


    Если хотите после какого-то конкретного этапа ожидать от пользователя ввода информации текстом и потом использовать этот текст, то вам необходимо использовать register_next_step_handler.
    Пример можно найти тут.
    Ответ написан
    Комментировать
  • Как вызвать функцию ввода текста после обработки callback'a (нажатия на Inline кнопку)?

    @twistfire92
    Python backend developer
    Не совсем понятно в чем проблема, ведь объект call содержит в себе объект message

    bot.register_next_step_handler(call.message, <Твоя функция>)
    Ответ написан
    1 комментарий
  • Telebot. Как отправить сообщение другому пользователю?

    @twistfire92
    Python backend developer
    Вы недавно начали изучать Python. Да и вообще программирование.
    Начните с наименований переменных. Мало того, что у вас глобальные a, z, так вы еще и функции так обозвали. Читаешь и не понимаешь что хотел сказать автор.

    В качестве совета по теме вопроса - При создании Inline (не Inlain) кнопки у пользователя owner, засовывайте в callback_data user_id пользователя от которого пришел заказ.
    button_yes=types.InlineKeyboardButton(text='Принят',callback_data=f'yes|{message.chat.id}')

    А потом
    @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        answer, user = call.data.split('|')
        if answer=='yes':
            bot.send_message(user,'Принято')


    Уберите все global, зачем они вам???
    Отформатируйте код, расставьте пустые строки между функциями, читать же невозможно
    дайте функциям нормальные имена, вместо однобуквенных a z. Через какое-то время захотите подправить код и пару часов потратите на то, чтобы вспомнить что эти a z обозначают.
    Ответ написан
    Комментировать
  • Как в aiogram получить доступ к тому сообщению, к которому привязана inline кнопка?

    @twistfire92
    Python backend developer
    Когда зарегистрируешь метод, который будет запускать цепочку действий для редактирования поста, в этот метод будешь передавать параметр call с типом CallbackQuery. Этот параметр содержит данные, которые ты поместил в кнопку (call.data), а также объект самого сообщения (call.message).

    Но насколько я понял, тебе не особо то и нужно это сообщение. Ты можешь немного видоизменить функцию get_keyboard()

    def get_keyboard(id: str):
        buttons: list = [
            types.InlineKeyboardButton(text='Редактировать', callback_data=f'edit|{id}'),
            types.InlineKeyboardButton(text='Удалить', callback_data=f'del|{id}')
        ]
        keyboard = types.InlineKeyboardMarkup(row_width=2)
        keyboard.add(*buttons)
        return keyboard
    
    .....
    
    async def list_tasks(message: types.Message):
        user_id: int = message.from_user.id
        lt: list = get_list_tasks(user_id)
        if len(lt) == 0:
            await message.answer('Ни одного таска ещё не создано.')
        else:
            for task in lt:
                id = task[-1] # Ну или под каким индексом тут должен скрываться ID записи? Скорректируешь
                await message.answer(f'{task[0]}\n\n{task[1]}\n\nid: {task[-1]}', reply_markup=get_keyboard(id))


    теперь туда передается ID нужной записи и при нажатии на кнопку вы просто парсите команду и ID записи в БД:
    command, id = call.data.split('|')

    а дальше уже думаю понятно
    Ответ написан
  • Как изменить отправляемый текст в кнопке Telegramm?

    @twistfire92
    Python backend developer
    617663ed00a71877528039.png
    Если вы это имеете ввиду, то вам нужно настроить команды бота в BotFather.

    А кнопки у ботов есть либо обычные, либо Inline. Обычные отправляют сообщение с текстом указанным на кнопке. Inline кнопки не отправляют никаких сообщений. Поэтому если вы говорите не о командах бота, то приведите конкретные примеры со скриншотами, названием других ботов, где это реализовано.
    Ответ написан
  • Может ли телеграм бот читать exel файл который я ему отправил?

    @twistfire92
    Python backend developer
    Да, может. Это возможно. Изучай библиотеки работы с exel файлами и с телеграмм ботами.
    Ответ написан
    Комментировать
  • У меня одинаковые названия кнопок, но разные сообщение, как это решить?

    @twistfire92
    Python backend developer
    Бот делает ровно то, что вы и описали.
    elif message.text == 'VK':
                bot.send_message(message.chat.id, 'Держите вашу ссылку: https://vk.com/arizona1phoenix')

    Да, там дальше еще есть варианты с VK, но до них просто уже не дойдет, остановится на первом.
    Для начала советую почитать основы программирования, как работают условные операторы. А по вашему коду видно, что вы не ведаете что творите.

    Как подтянете основы, советую переключиться на Inline клавиатуру. С ней гораздо проще будет решить поставленную вами задачу.
    Ответ написан
  • Как отправить пользователю в телеграмм progress bar с помощью pytelegrambotapi?

    @twistfire92
    Python backend developer
    А что вы понимаете под прогресс баром в телеграмме???

    Можете просто отправить сообщение пользователю, что запрос выполняется, начать выполнять этот запрос (действия), а потом отредактировать это сообщение, вставив туда результат этого запроса.

    Если же вы хотите, чтобы пользователь видел сколько осталось ждать, и чтобы эта величина постоянно менялась со временем, то с pytelegrambotapi вы этого не сделаете (либо придется очень жестко костылить), лучше присмотреться к aiogram и вывести сообщение со статусом этого запроса, которое в дальнейшем будете редактировать и менять статус
    Ответ написан
    Комментировать
  • Как боту отправить сообщение если пользователь ничего не ввел?

    @twistfire92
    Python backend developer
    Стандартными средствами этой библиотеки так не сделать.
    Могу предложить альтернативу:
    При регистрации register_next_step_handler передавать еще один параметр, который будет равен дате сообщения mes.date и в функцию get_data_func передавать этот параметр. В самой get_data_func проверять разницу между датой нового сообщения пользователя и датой предыдущего сообщения. Если больше 10 часов - обрывать текущий скрипт и выдавать новое сообщение.
    ...
        mes = bot.send_message(call.chat.id, text="Введите запрос:")
        bot.register_next_step_handler(mes, get_data_func, mes.date)
    ...
    def get_data_func(message, date):
        if message.date-date > 36000: # 10 часов в секундах
            <тут уже ваши действия>


    Минус такого подхода в том, что если пользователь забьет на бота, никакого сообщения ему не придет.
    Ответ написан
    4 комментария
  • Как настроить функциональность inline кнопок в telegram?

    @twistfire92
    Python backend developer
    Можно в callback data каждой кнопки заносить необходимую информацию, типа какой это уровень меню или какой раздел. Например создать словарь, в который все эти данные запишешь и преобразуешь его к JSON строке. Эту строку и передашь в callback data. И в обработчике нажатия кнопок обратно собираешь словарь из этой JSON строки и уже от этих данных пляшешь.

    Сообщение лучше просто изменять, т.к. удалять сообщения можно только в течение 48 часов.
    Ответ написан
    Комментировать
  • Отправляю в телеграм бота одну картинку, а бот получает 4. В чем дело?

    @twistfire92
    Python backend developer
    Телеграм хранит несколько экземпляров фотографий в разных размерах скорее всего для облегчения отображения их в клиентах. Если фотка большая, а отобразить нужно лишь миниатюру, то лучше взять сразу готовую миниатюру, чем каждый раз ресайзить оригинал.
    Ответ написан
    Комментировать
  • Ошибка: AttributeError("'int' object has no attribute 'chat'"), кто знает где налажал? Не могу создать цепочку последовательных функций.?

    @twistfire92
    Python backend developer
    В register_next_step_handler передается сообщение, а не chat_id.
    bot.register_next_step_handler(call.message.chat.id, caclulate_usd)

    меняйте на
    bot.register_next_step_handler(call.message, caclulate_usd)


    И еще:
    В функции caclulate_usd у вас откуда-то берется обращение к переменной call, которая не определена внутри этой функции, так что там тоже будет косяк. Поэтому если хотите использовать call в этой функции, передавайте его тоже через register_next_step_handler
    .......
                    bot.register_next_step_handler(call.message, caclulate_usd, call)
    .......
    
    def caclulate_usd(message, call):
        num_usd = message.text
        bot.send_message(call.message.chat.id, 'Ваше запрос \"' + message.text +
                             '\" получен. Можете вернуться в главное меню ⤵', reply_markup=keyboard)
    Ответ написан
    1 комментарий
  • Как сделать рассылку в телеграм боте?

    @twistfire92
    Python backend developer
    Во-первых было бы разумнее пользоваться базами данных для таких случаев.
    Во-вторых у вас после записи файл не закрывается (изучите конструкцию with open(...) as...), проблема может быть в этом.

    Ну и скорее всего у вас только в приложенном коде опечатка и одних кавычек не хватает.

    Да и у телеги есть ограничения на отправку сообщений за промежуток времени.
    Ответ написан
    Комментировать
  • Как указать название аудио для отправки в ТГ боте(aiogram)?

    @twistfire92
    Python backend developer
    Очень странный вопрос, ответ на который лежит на поверхности.

    Если такие вещи вызывают трудности, советую откатиться чуть назад в изучении программирования вообще. Почитать книжки, поделать более простенькие задачки. Почему-то все сразу лезут в боты, хотя имеют посредственное представление о базовых понятиях.
    Ответ написан
    Комментировать