Задать вопрос
Ответы пользователя по тегу Python
  • Как обработать последовательность inline клавиатур (python)?

    @twistfire92
    Python backend developer
    Если кратко, то один из вариантов:
    В callback_data передавать данные в json формате, по которым можно будет отследить на какой "стадии" сейчас находится пользователь в выборе ответов.
    В вашем случае данные в json формате могут выглядеть, к примеру, следующим образом:
    '{"animal_type": "Dolphin",
    "temptemperature_type": "Normal",
    "is_volmit: true"}
    '

    Json строка собирается из словаря и разбирается в словарь с помощью библиотеки json, методами dumps() и loads()

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

    Можно также воспользоваться методом register_next_step_handler, но не уверен, что этот метод работает с inline кнопками
    Ответ написан
    5 комментариев
  • Существуют ли более приятные конструкции чем if elif else где на каждое значение нужно проводить разное действие?

    @twistfire92
    Python backend developer
    Во-первых код надо оборачивать в соответствующий тег.

    По вашему вопросу. В питоне как такового нет оператора case, как во многих других языках. Но из-за того, что все в питоне является объектами, даже функции, то можно провернуть все через словарь

    # прописываем соответсвие значений кубика и действий через словарь
    actions = {1: self.pass_day,
    			2: self.eat_food,
    			3: self.work_day,
    			4: self.have_fun,
    			5: self.go_shopping,
    			6: self.sleep}
    
    action = actions[dice] # получаем нужную функцию
    
    action() # Выполняем нужную функцию


    Заметьте, что в словаре прописываем имена функций без (), т.к. мы не выполняем их, а только ссылаемся на сами объекты.

    P.S. Код не проверялся, возможно где-то есть небольшие неточности, но примерно такую же конструкцию сам использовал как-то.
    Ответ написан
    Комментировать
  • Как получить список чисел без их первой и последней цифры?

    @twistfire92
    Python backend developer
    Самое первое, что приходит на ум - преобразовать в строку, а затем пользоваться срезами. Что такое срезы знает гугл
    Ответ написан
    Комментировать
  • Как передавать аргументу функции класс через двоеточие?

    @twistfire92
    Python backend developer
    Это не присваивание типов. Это аннотации. И на работу они не влияют.
    Вы сами передали строку вместо числа. Запись c1:int в параметрах функции не преобразовывает строку в число, она лишь говорит о том, что тут функция ожидает видеть число, с числом тут все будет ок.

    Короче. Гуглите аннотации.
    Ответ написан
    Комментировать
  • Бот для телеги, ошибка преобразования типов, как исправить?

    @twistfire92
    Python backend developer
    Прежде чем делать ботов, разберитесь с основами языка да и вообще программирования в целом. Вы должны понимать что такое типы данных. Что есть строки и есть числа. Что 18 и "18" - это разные вещи и сравнивать их нельзя.
    Ответ написан
  • Как скрыть кнопку ReplyKeyboardMarkup после нажатия на неё?

    @twistfire92
    Python backend developer
    после того, как вы получили контактные данные от пользователя, отправляйте ему сообщение, в параметрах указывайте reply_markup=types.ReplyKeyboardRemove()
    Ответ написан
    Комментировать
  • Как реализовать ожидание ответа пользователя боту в ТГ?

    @twistfire92
    Python backend developer
    Если пользуетесь библиотекой pyTelegramBotAPI (telebot), то используйте register_next_step_handler
    Примеры использования отлично гуглятся, в том числе на этом ресурсе много информации
    Ответ написан
    1 комментарий
  • Как сделать многоуравневую клавиатуру в Telegram bot?

    @twistfire92
    Python backend developer
    На эту строку не ругается?
    bot.send_photo(message.chat.id, st)

    Просто переменная message скорее всего не определена, так что попробуйте
    bot.send_photo(call.message.chat.id, st)
    Ответ написан
    Комментировать
  • Вылезают ошибки при запуске?

    @twistfire92
    Python backend developer
    if name == n :
        break
    if name == y :
        p =()
        ......


    Вы с чем сравниваете name? Со строкой или с переменной? Кавычки ставьте.
    Ответ написан
    Комментировать
  • Как используя данную функцию с модуля telebot применить ее в исходном коде?

    @twistfire92
    Python backend developer
    Вы ошиблись с методом.
    register_next_step_handler используется для того, чтобы бот ожидал конкретного сообщения от пользователя, например можно ожидать следующим сообщением имя пользователя или дату рождения. Подробнее описано там же на гитхабе, откуда вы взяли эту функцию
    Ходить сюда

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

    Прямо в чат с ботом техподдержка не от имени бота не сможет ответить. Личные чаты - это личные чаты. Там только 2 пользователя. Пользователь и бот. В прошлом вашем вопросе я уже говорил, что если вы хотите в том же чате подключать оператора, то можно попробовать превратить бота в так называемого посредника. И оператор поддержки и пользователь будут писать сообщения боту, а тот в свою очередь перенаправлять их собеседнику.
    Ответ написан
  • Как реализовать подключения оператора в телеграмм бот?

    @twistfire92
    Python backend developer
    Как можно в телеграмм боте при нажатии кнопки подключить оператора? Нужно чтобы всем операторам пришло уведомление

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

    за тем закрепляется чат с пользователем

    Далее уже либо личная беседа оператора и пользователя, либо как-то организовать общение через самого бота. Бот дублирует сообщение, которое ему отправил оператор и отправляет пользователю. И наоборот. Но это уже слишком заморочно и не совсем правильно что-ли. Хотя так сходу не скажу как еще это организовать средствами телеги, да так, чтобы бот мог все это организовать.

    Если пользователь в течение 15 минут ничего не ответил, отключить оператора от чата.

    Тут уже использовать библиотеку scheduler или подобное.
    Ответ написан
    Комментировать
  • Как сохранять сообщения c пометкой изменено в telegram боте?

    @twistfire92
    Python backend developer
    Используйте @bot.edited_message_handler чтобы отловить момент с измененным сообщением.
    Главная проблема будет состоять в том, что вам надо будет понять что за сообщение поменялось. Первой версии сообщения вы уже не получите. Вы можете хранить ID сообщения где пользователь ввел имя, ID где фамилию, телефон и т.д. И уже по этим ID понимать что было изменено.

    И это легко реализовать уже после записи данных в БД. А вот вклиниться посреди работы схемы из множества register_next_step_handler уже будет сложнее. Или нет, не пробовал. Но вы поэкспериментируйте!
    Ответ написан
    Комментировать
  • Как расположить inline кнопки в pytelegrambotapi?

    @twistfire92
    Python backend developer
    Row_width не обязательно указывать вообще. По умолчанию значение равно 3.
    Т.е. если просто в объект InlineKeyboardMarkup добавлять кнопки поочередно, они будут выстраиваться линиями по 3 кнопки в ряд.

    Вам надо использовать метод row(), передавая туда список объектов InlineKeyboardButton

    Т.е. если ориентироваться на ваш скрин, то располагать кнопки следует следующим образом:
    start_markup = telebot.types.InlineKeyboardMarkup()
    
    # первый ряд (две кнопки)
    btn1= telebot.types.InlineKeyboardButton('действие 1', callback_data='1')
    btn2= telebot.types.InlineKeyboardButton('действие 2', callback_data='2')
    start_markup.row(btn1, btn2)
    
    # второй ряд (одна кнопка)
    btn3= telebot.types.InlineKeyboardButton('действие 3', callback_data='3')
    start_markup.row(btn3)
    
    # третий ряд (две кнопки)
    btn4= telebot.types.InlineKeyboardButton('действие 4', callback_data='4')
    btn5= telebot.types.InlineKeyboardButton('действие 5', callback_data='5')
    start_markup.row(btn4, btn5)
    
    # четвертый ряд (две кнопки)
    btn6= telebot.types.InlineKeyboardButton('действие 6', callback_data='6')
    btn7= telebot.types.InlineKeyboardButton('действие 7', callback_data='7')
    start_markup.row(btn6, btn7)
    
    # пятый ряд (одна кнопка)
    btn8= telebot.types.InlineKeyboardButton('действие 8', callback_data='8')
    start_markup.row(btn8)
    Ответ написан
    Комментировать
  • Как через бота телеграм отправлять ссылку с приглашением в группу?

    @twistfire92
    Python backend developer
    Ссылка приглашение генерируется методом exportChatInviteLink. Если вы пользуетесь библиотекой telebot, то пользуйтесь методом export_chat_invite_link.
    Этот метод генерирует новую ссылку приглашение. Старая в этом случае теряет свою работоспособность.
    Получить текущую ссылку можно через команду GetChat. Этот метод возвращает объект Chat в котором есть поле invite_link.

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

    А вообще вся вышеуказанная информация написана в документации к Telegram Bot API. Ищите сначала там.
    Ответ написан
    Комментировать
  • Как заменить фото бота в телеграм?

    @twistfire92
    Python backend developer
    Вот поиграйтесь с этим кодом.
    найдите картинки соответствующие и просмотрите как все это работает в примере ниже

    import telebot
    from telebot import types
    
    token = '' 
    
    bot = telebot.TeleBot(token)
    
    @bot.message_handler(commands=['start'])
    def send_welcome(message):
    	photo = open('racoon.jpg', 'rb')
    	markup = create_markup()
    	bot.send_photo(message.chat.id, photo, caption='Енот', reply_markup=markup)
    
    @bot.callback_query_handler(func=lambda c: True)
    def change_photo(call):
    	markup = create_markup()
    	chat_id=call.message.chat.id
    	message_id=call.message.message_id
    	if call.data == 'racoon':
    		photo = open('racoon.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Енот')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    	elif call.data == 'fox':
    		photo = open('fox.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Лиса')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    	elif call.data == 'rabbit':
    		photo = open('rabbit.jpg', 'rb')
    		media = types.InputMediaPhoto(photo, caption='Заяц')
    		bot.edit_message_media(media=media, chat_id=chat_id, message_id=message_id, reply_markup=markup)
    		
    
    def create_markup():
    	markup = types.InlineKeyboardMarkup()
    	button1 = types.InlineKeyboardButton(text='Енот', callback_data='racoon')
    	button2 = types.InlineKeyboardButton(text='Лиса', callback_data='fox')
    	button3 = types.InlineKeyboardButton(text='Заяц', callback_data='rabbit')
    	markup.row(button1, button2, button3)
    	return markup
    
    bot.polling()


    Результат этого кода (Все это - одно сообщение, в котором перерисовывалась картинка):

    5f72cdac977d9702675906.png
    5f72cdc24d779354601542.png
    5f72cddaf2294374777349.png

    Единственный момент - это если будете менять зайца на зайца например, то код упадет в ошибку.
    Но это уже другая проблема))
    Ответ написан
    Комментировать
  • Как реализовать tet-a-tet чат между пользователями в телеграмм боте?

    @twistfire92
    Python backend developer
    Бот не может создавать групповые чаты. Его туда можно только добавить.
    Ответ написан
    Комментировать
  • Как сделать отмену с помощью Inline клавиатуры?

    @twistfire92
    Python backend developer
    в раздел Игры добавляете кнопку "Отмена" и точно так же как и в остальных случаях через edit_message_text создаете главное меню. Весь код у вас уже готов, просто копируйте из функции send_welcome, только там вместо send_message вызываете edit_message_text
    Ответ написан
    Комментировать