• Функция для телеграм бота на python?

    @twistfire92
    Python backend developer
    Вам надо познакомиться с register_next_step_handler, это упростит немного жизнь в вашей задаче. Если я правильно понимаю, то загвоздка в том, что обе справки требуют ИНН и вам надо как-то запомнить для какой именно справки сейчас ожидается ИНН от пользователя. register_next_step_handler вам поможет. Ищите примеры, пробуйте. Если что-то не будет получаться - скидывайте код сюда, будем смотреть.

    Так же советую изучить работу с Inline кнопками, с ними больше возможностей откроется.
    Ответ написан
    7 комментариев
  • Почему не отправляется сообщение с клавиатурой по id?

    @twistfire92
    Python backend developer
    2 часа - это мало)

    у вас функция qweqw входит в состав функции vipros6? если так, то она вообще как-либо отрабатывает при отправке сообщения боту? Насколько я понимаю, не должна.

    А если вы опечатались при составлении вопроса, то переменная gg просто не определена в этой функции. Храните значение в state.

    Попробуйте двигаться в этом направлении:

    @dp.message_handler(state=oprosnik.Q7, content_types=ContentTypes.TEXT)
    async def vopros6(message: Message, state: FSMContext):
        kted = message.text
        if message.text.lower() not in kted:
            return
    
        await state.update_data(gg=message.from_user.id)
        await bot.send_message(chat_id=ADMIN, text=f'Опыт в сфере игр: {italic(kted)} ({gg}\n)',
                               parse_mode=ParseMode.MARKDOWN, reply_markup=item_all)
    
        await message.answer('✨Вы заполнили анкету, ждите ответа от модерации✨')
        await oprosnik.Q8.set()
    
    @dp.message_handler(state=oprosnik.Q8)
    async def qweqw(message: Message, state: FSMContext):
        user_data = await state.get_data()
        gg = user_data['gg']
        if 'Принять заявку✅' in message.text:
            await message.bot.send_message(chat_id=gg, text='Вы приняты ✅', reply_markup=all_accept)
        elif 'Отклонить заявку' in message.text:
            await message.answer('Вам отклонили заявку')
            await oprosnik.Q9
    Ответ написан
    Комментировать
  • Как добавить в бота обратный отсчет?

    @twistfire92
    Python backend developer
    По-хорошему вам надо запоминать дату последнего сообщения (message.date). Использовать для этого можно какую-либо базу данных.
    Но в самом aiogram есть такая штука, как Finite state machine. Если вкратце, то это способ "запомнить" какие-либо состояния/данные для каждого пользователя.

    неплохо об этом рассказано тут, но оттуда вам нужны только методы state.update_data() и state.get_data()

    Разбирайтесь
    Ответ написан
    7 комментариев
  • Как сделать сменяемый текст с inline кнопками?

    @twistfire92
    Python backend developer
    Если markup - новая разметка кнопок, тогда так:
    bot.edit_message_text(text='Новый текст', chat_id=message.chat.id, message_id=message.id, reply_markup=markup)


    Если пользуетесь этой библиотекой, то запоминать то, что ответил пользователь лучше самому, через какую-либо БД.
    В сами кнопки пихаете callback_data не просто "+"/"-", а что-то посложнее, чтобы там был еще и номер вопроса. Например "4|+" - положительный ответ на 4-й вопрос. Так при нажатии на очередную кнопку вы сможете распарсить из call.data номер вопроса и ответ с помощью метода split("|"). После того как получили ответ - создаете новую клавиатуру с новыми кнопками, у которых callback_data будут "5|+" и "5|-".

    Есть вариант сделать запоминалку ответов на предыдущие вопросы в самих кнопках.
    Ответ написан
    2 комментария
  • Ошибка IndentationError: unexpected unindent, что делать?

    @twistfire92
    Python backend developer
    Что-то вы намудрили с расположением декораторов. Поучите сначала основы языка.

    import telebot
    bot = telebot.TeleBot('####')
    
    @bot.message_handler(content_types=['text'])
    def get_text_messages(message): 
        if message.text == "Привет":
            bot.send_message(message.from_user.id, "Привет, чем я могу тебе помочь?")
        elif message.text == "/help":
            bot.send_message(message.from_user.id, "Напиши привет")
        else:
            bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")
    
    bot.polling(none_stop=True, interval=0)
    Ответ написан
    Комментировать
  • Не получив число после команды бот должен отправить сообщение?

    @twistfire92
    Python backend developer
    Я подозреваю, что number принимает значение None, тогда на него можно будет завязаться.
    Попробуй так, может получится
    @dp.message_handler(commands=['number'])
    async def number(message: types.Message):
        number = message.get_args()
        if number is None:
            await message.reply(f"Твое число {number}")
        else:
            await message.reply("Введите число")
    Ответ написан
    4 комментария
  • Есть ли встроенная функция, которая может округляться, как показано ниже?

    @twistfire92
    Python backend developer
    Округляем число x до числа кратного a (в вашем случае 5)
    def custom_round(x, a):
        div, mod = divmod(x, a)
        if mod:
            return a*(div+1)
        else:
            return x
    Ответ написан
    Комментировать
  • Как сделать так чтобы из callback_query_handler выполнялась другая функция?

    @twistfire92
    Python backend developer
    Какая другая функция? Что у вас сейчас не получается? После того, как вопрос задали, прочитайте его и подумайте, понятно ли все в этом вопросе.

    Если вы хотите вызывать функцию rol, не надо оборачивать ее в декоратор.
    Ответ написан
    Комментировать
  • Как сделать проверку на подписку канала в Telegram боте?

    @twistfire92
    Python backend developer
    Как в декоратор передать значение message(telebot)?

    Вот тут решался похожий вопрос
    Ответ написан
    Комментировать
  • Как изменить размер кнопок в python-telegram-bot?

    @twistfire92
    Python backend developer
    У вас параметр keyboard - это список рядов кнопок. Каждый ряд - это тоже список. Сделайте список из двух рядов

    keyboard=[
                [
                    KeyboardButton(text=view),
                    KeyboardButton(text=usd)
                ],
                [
                    KeyboardButton(text=analytics),
                    KeyboardButton(text=payment)
                ],
            ]
    Ответ написан
  • Хочу чтобы бот заменял фото групы но появляется ошибка AttributeError: 'NoneType' object has no attribute 'photo', что нужно поменять в коде?

    @twistfire92
    Python backend developer
    Вам надо почитать про машину состояний, или конечный автомат. В aiogram все это очень хорошо реализовано.
    Так вы сможете описать процесс замены фото в чате.
    Ответ написан
    Комментировать
  • Написал первого бота, а он выдает ошибки, поможете?

    @twistfire92
    Python backend developer
    А вы хотя бы пытались прочитать что в ошибках написано?
    bot.reply_to(message.from_chat.id, answer)
    AttributeError: 'Message' object has no attribute 'from_chat'


    В объекте message нет атрибута from_chat.

    Пробуйте так:
    bot.reply_to(message.chat.id, answer)
    Ответ написан
  • Почему в telebot функция срабатывает дважды?

    @twistfire92
    Python backend developer
    Судя по-всему ситуация такая:

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

    @client.message_handler(commands = ['start'], func=check)
    
    @client.message_handler(content_type= ['text'], func=check)


    и т.д.
    Пользователь присылает сообщение. Срабатывает проверка в первом хендлере. Во время этой проверке выясняется, что пользователь не состоит в чате, ему отправляется сообщение и возвращается False.
    Из-за того, что первый хендлер не сработал, срабатывает проверка в следующем. И ситуация повторяется.

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

    def check(message):
        if client.get_chat_member(channel_chat_id,  message.chat.id).status in need_status:
            return False
        else:
            return True
    
    @client.message_handler(content_types=['text'], func=check)
    def access_denied(message):
        client.send_message(message.chat.id, subscribe_error_msg)


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

    Думаю, суть понятна.
    Ответ написан
    2 комментария
  • Почему chat not found?

    @twistfire92
    Python backend developer
    Либо несуществующий chat_id передаёте, либо бот в этом чате (который передаете) не запущен. Если вы хотите отправить кому-то сообщение, кто знать не знает ничего про бота - ничего не выйдет. Первым общение начинает пользователь.
    Ответ написан
    Комментировать
  • Как создать бота для не популярного мессенджера на python?

    @twistfire92
    Python backend developer
    ну если нет никаких готовых библиотек для работы с этим месседжером, то надо искать документацию по API этого продукта. Если разработчики вообще API предоставляли какое-либо. И тогда уже через HTTP запросы/ответы работать.
    Ответ написан
    3 комментария
  • Как добавить в бота обратный отсчет?

    @twistfire92
    Python backend developer
    Можно использовать машину состояний самой библиотеки aiogram. Материала учебного много. Вопрос в том, где эти состояния хранить. Есть самый простой способ - в оперативной памяти, но при перезапуске бота все сотрется.

    Если не хочется сильно заморачиваться, то ИМХО самый простой способ - база данных. Время в UNIX формате приходит в самом объекте message, на него и завязывайтесь.
    Ответ написан
    Комментировать
  • Как в декоратор передать значение message(telebot)?

    @twistfire92
    Python backend developer
    объявляете функцию, которая принимает на вход объект message и возвращает True/False
    def check(message):
        return client.get_chat_member(channel_chat_id, message.chat.id).status in need_status


    передаете эту функцию (не результат вызова, а объект) в параметр func в основном хэндлере
    @client.message_handler(commands = ['start'], func=check)


    Либо через лямбды:
    @client.message_handler(commands = ['start'], func=lambda m: client.get_chat_member(channel_chat_id, m.chat.id).status in need_status)


    А вообще вам вроде ничего не мешает уже внутри функции делать эту проверку. Если проверку не прошел - соответствующее сообщение.
    Ответ написан
  • Как сделать в Telebot переменную?

    @twistfire92
    Python backend developer
    Как-то не совсем понятно что вы хотите в результате получить. Прочитайте сами что написали, поправьте чтобы было понятнее (например, расставив запятые) и покажите что получаете сейчас.

    Если правильно понял вопрос (в чем сомневаюсь), вам нужно запомнить введенное пользователем имя, чтобы при дальнейшем использовании команды /name бот прислал имя пользователя.
    В этом случае вам нужно использовать базу данных. Туда будете сохранять соответствие ID пользователей и их имен, которые они введут
    Ответ написан
    Комментировать
  • Как сделать чтобы при нажатии на кнопки появлялись другие кнопки в боте на питоне?

    @twistfire92
    Python backend developer
    Если будешь использовать обычные клавиатурные кнопки, то тут 2 варианта:
    1. Тебе надо будет либо навесить отдельных хэндлеров под каждую кнопку
    @bot.message_handler(func=lambda message: message.text == 'ПОЛУЧИТЬ ДЕНЬГИ')
    def take_money(message):
        # Тут уже описываешь новые кнопки и отправляешь новое сообщение с этими кнопками
    
    @bot.message_handler(func=lambda message: message.text == 'КАНАЛ')
    def channel(message):
        # Аналогично предыдущей функции

    ВАЖНЫЙ МОМЕНТ! Эти хэндлеры в коде должны быть выше твоего основного, иначе все твои нажатия будут в этот основной попадать

    2. в этой же функции обрабатывать различные значения в message.text
    @bot.message_handler(content_types = ['text'])
    def start(message):
        if message.text == 'ПОЛУЧИТЬ ДЕНЬГИ':
           # Тут создаешь кнопки и отправляешь сообщение
    
        elif message.text == 'КАНАЛ':
            # Аналогично
    
        # elif <Условие>:
            # А это если у тебя еще какие-то кнопки надо будет обработать.
        # elif <Условие>:
        else:
            # Это если приходит какое-то любое сообщение
    
            markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
            butt1 = types.KeyboardButton('ПОЛУЧИТЬ ДЕНЬГИ')
            butt2 = types.KeyboardButton('‍КАНАЛ')


    А вы по сути одну и ту же разметку в каждое сообщение вставляете. Делайте новые кнопки и отправляйте с новым сообщением.
    Ответ написан