Ответы пользователя по тегу Боты
  • Как пересылать информацию отправленную боту другому пользователю?

    @SwitcherN
    Начинаю изучать python
    Очень много вопросов, которые можно заменить одним - "Сможете написать код за меня?".

    Немного помогу, натолкнув на варианты решения. Это не панацея, но я бы решал задачу этими методами.

    1. Этот код я бы заменил на такой формат:
    bot.reply_to(message, "Привет Что хочешь поесть? \n\n Мануал  ", reply_markup=markup_menu )

    на такой:
    bor.send_message(message.chat.id, "Привет Что хочешь поесть? \n\n Мануал  ", reply_markup=markup_menu )

    Будет выглядеть как просто сообщение, а не ответ с постоянным цитированием предыдущего сообщения.

    2. Можно сделать отдельную функцию генерации клавиатуры. Например:
    def generate_keyboard (*answer):
        keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
        for item in answer:
            keyboard.add(item)
        return keyboard

    Тогда генерация любой клавиатуры с последующим отправлением её пользователю выглядит так:
    msg = 'Тут будет твое сообщение.' # Сообщение, которое будем отправлять
    keyboard = generate_keyboard('Кнопка 1', 'Кнопка 2', 'Кнопка 3') #Генерируем клавиатуру
    bot.send_message(message.chat.id, msg, reply_markup=keyboard) #Отправляем сообщение и клавиатуру


    3. Для того, чтобы собрать информацию от пользователя и отправить сотруднику можно использовать словарь. Например, словарь может выглядеть следующим образом:
    users_orders = {user_chat_id:{eating:breakfast, question:"Что тут происходит вообще?"}}

    И тогда запись информации будет происходить при получении ответа. Пример:
    if  message.text == "Хочу позавтракать":
        users_orders[message.chat.id][eating] = breakfast
        keyboard = generate_keyboard('Вариант 1', 'Вариант 2', 'Вариант 3')
        bot.send_message(message.chat.id, 'Выберите завтрак', reply_markup=keyboard )


    4. Когда всю информацию получил - отправляем сотруднику ответ на основании сформированного словаря и удалим клавиатуру:
    if message.text == "Завершить":
        hide_keyboard = types.ReplyKeyboardRemove()
        bot.send_message(message.chat.id, 'Ваш запрос принят, обработка займет не более 5 мин', reply_markup=hide_keyboard)
        msg = " От клиента {} поступил заказ:\n{}.\nИ вопрос:\n" \
        "{}".format(message.chat.id, users_orders[message.chat.id][eating], users_orders[message.chat.id][question])
        bot.send_message('841260346', msg)


    Данные необходимо дополнительно сохранять в БД. Иначе после рестарта вся информация будет удалена.
    Ответ написан
    Комментировать
  • Как пересылать сообщения пользователя отправленные боту другому пользователю?

    @SwitcherN
    Начинаю изучать python
    Небольшой пример:

    bot = telebot.TeleBot('Тут должен быть твой токен')
    
    
    @bot.message_handler(content_types=["text"]) # Тут ловим все текстовые сообщения от пользователя
    def some_funtion(message): #Название функции неважно
        bot.send_message('ID чата пользователя, которому необходимо сообщение переслать', message.text)


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

    ...
    msg = "Пользователь {} написал \"{}\".".format(message.from_user.username, message.text)
    bot.send_message('ID чата пользователя, которому необходимо сообщение переслать', msg)
    ...


    На выходе получим сообщение вида: Пользователь Someone написал "Привет! Как дела?".

    ID чата можно получить с помочью небольшой функции, которая присылает сообщение:

    @bot.message_handler(commands=["id"]) # Получить ID чата при отправке сообщения /id
    def chat_id(message):
        my_chat_id = int(message.chat.id)
        bot.send_message(message.chat.id, my_chat_id)


    P.S. Но вообще - начни хотя бы отсюда: https://groosha.gitbooks.io/telegram-bot-lessons/.
    Ответ написан
    3 комментария
  • Как обновить кастомную клавиатуру в телеграм?

    @SwitcherN
    Начинаю изучать python
    При отправке любого сообщения можно обновить клавиатуру.

    bot = telebot.TeleBot(token)
    
    keyboard = types.ReplyKeyboardMarkup()
    bot.send_message(message.chat.id, 'Сообщение', reply_markup=keyboard)


    Остается отправить всем пользователям сообщение с новой клавиатурой. Например, собрать все chat_id текущих пользователей в список users_list и:

    @bot.message_handler(commands=["new_keyboard_for_all_users"])
    def send_new_keyboard (message):
        keyboard = types.ReplyKeyboardMarkup() # Новая клавиатура
        for user in users_list:
            bot.send_message(user, 'Произвольное сообщение', reply_markup=keyboard)
    Ответ написан
    1 комментарий
  • Как при нажатии кнопки НАЗАД выполнить определенную команду?

    @SwitcherN
    Начинаю изучать python
    bot = telebot.TeleBot(config.token)
    
    ...
    
    @bot.message_handler(content_types=["text"]) # Обрабатываем все сообщения типа "текст". Нажатие кнопки == отправка сообщения с тектом кнопки.
    def check_text_message(message): # Имя функции может быть любое
        if message.text == "Назад": # Эмоджи со стрелкой вставить не даёт, но надо чтобы проверяемое сообщение в точности было равно надписи на кнопке
            do_something (message) # Аргумент передаем, если надо что-либо сделать с сообщением, например, отправить ответ
    Ответ написан
    Комментировать
  • Как узнать username пользователя по его ID в телеграм-боте?

    @SwitcherN
    Начинаю изучать python
    При получении message:

    message.from_user.id
    message.from_user.first_name
    message.from_user.last_name
    message.from_user.username
    Ответ написан
    Комментировать
  • Как передать список городов в bot.send_message?

    @SwitcherN
    Начинаю изучать python
    Как вариант:

    city_list = [1, 2, 3 ...]
    
    for city in city_list:
        city_list_to_string += city + '\n'
    
    msg = 'Вас приветствует магазин\n'
    u'Хороших покупок.\n'
    u'➖➖➖➖➖➖➖➖➖➖\n\n'
    u'Для получения помощи нажмите ? /help\n'
     u'Выберите город из списка:\n'
     u'➖➖➖➖➖➖➖➖➖➖\n'
    u' Здесь надо вывести список городов\n'
    u'[ Нажмите  {} ]\n'
     u'➖➖➖➖➖➖➖➖➖➖\n' .format(city_list_to_string)
    bot.send_message (message.chat.id, msg)
    Ответ написан
    Комментировать
  • Как вытянуть ответ пользователя телеграмм боту и добавить его в переменную типа string?

    @SwitcherN
    Начинаю изучать python
    Добавь обработчик поступающих текстовых сообщений:

    @bot.message_handler(content_types=["text"])
    def i_read_your_message (message): #название функции не имеет значение
        if message.text == "Голосіївський":
            #do_something
        elif message.text == "Дарницький":
            #do_something_else


    Можно делать клавиатуру в виде InlineKeyboard (то есть выводится не вместо родной клавиатуру, а прямо под сообщением в окне чата). Там обратка несколько другая. Если надо - напишу пример.

    Есть еще вариант регистрировать введеный текст, а нажатие кнопки == вводу просто текста, который написан на кнопке, через метод
    .register_next_step_handler ("сообщение на которое реагируем", "функция, которая обрабатывает ответ").

    Но у меня "не заводится". Вопрос задал тут, но пока ответа нет.
    Ответ написан
    Комментировать