Задать вопрос
@IvanOk
Начинаю изучать Python

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

Есть бот с клавиатурой в которой несколько сценариев
В зависимости от сценария пользователь выбирает вариант (в примере "завтрак" -- "легкий" -- "вопрос есть" -- "вопрос")
эту информацию должен получить другой пользователь (формат "пользователь 1" написал ........)
Пользователь 2 выбирает вариант ответа на вопрос (набирает это текстом + 3 варианта в виде клавиатуры), этой части пока в коде нет, тк не понимаю как переслать пользователю вторую клавиатуру вместе с данными (и клавиатура будет отличная от основной)
Далее ответ также переносится в диалог бота с пользователем 1
Еще мини вопрос: как получить id диалога с пользователем 2 чтобы пользователь 1 писал именно ему
Код:
import telebot
from telebot import types
import const

bot = telebot.TeleBot(const.API_TOKEN) #токен в отдельном файле, модно просто заменить 

@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
	bot.reply_to(message, "Привет Что хочешь поесть? \n\n Мануал  ", reply_markup=markup_menu )


markup_menu = types.ReplyKeyboardMarkup (resize_keyboard=True, row_width=1)
btn_zavtrak= types.KeyboardButton ('Хочу позавтракать')    #здесь в дальнейшем будут еще варианты, в зависимости от кнопки информация должна пересылаться разным людям (id чата заранее известны  )
markup_menu.add( btn_zavtrak)


@bot.message_handler(func=lambda message: True)
def echo_all(message):
    if  message.text == "Хочу позавтракать":
        bot.reply_to(message, 'Варианты завтраков', reply_markup=markup_zavtrak )
      #  bot.send_message(chat_id="841260346", text="Хочу позавтракать").  #попытка сделать пересыл информации при нажатии на опресненную кнопку определенному человеку   (такой вариант не сработал )

    if message.text == "Легкий":
        bot.reply_to(message, 'Выбран легкий, есть вопросы?', reply_markup=markup_otvet)
       # bot.send_message(chat_id="841260346", text="Легкий").    #id чата заменяем на свой 

    if message.text == "Вопросов нет":
        bot.reply_to(message, 'Ваш запрос принят, обработка займет не более 5 мин')
       # bot.send_message(chat_id="841260346", text="вопросов нет")
    if message.text == "Есть вопрос":
        bot.reply_to(message, 'Задайте ваш вопрос и нажмите завершить', reply_markup=markup_ok)

    if message.text == "Завершить":

        bot.reply_to(message, 'Ваш запрос принят, обработка займет не более 5 мин')
    else:
         
     msg = "Пользователь {} написал \"{}\".".format(message.from_user.username, message.text)
        bot.send_message('841260346', msg)
# в итоге все свел в else но при таком раскладе получается что вся информация независимо от кнопок будет прилетать одному человеку 



markup_zavtrak = types.ReplyKeyboardMarkup (resize_keyboard=True, row_width=3)
btn_legkii_zavtrak = types.KeyboardButton ('Легкий')
markup_zavtrak.add(btn_legkii_zavtrak)


markup_otvet = types.ReplyKeyboardMarkup()
btn_noq = types.KeyboardButton ('Вопросов нет')
btn_q = types.KeyboardButton ('Есть вопрос')
markup_otvet.add(btn_q,btn_noq )


markup_ok = types.ReplyKeyboardMarkup (resize_keyboard=True, row_width=1)
btn_ok= types.KeyboardButton ('Завершить')
markup_ok.add( btn_ok)

bot.polling()
  • Вопрос задан
  • 3882 просмотра
Подписаться 4 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@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)


Данные необходимо дополнительно сохранять в БД. Иначе после рестарта вся информация будет удалена.
Ответ написан
Комментировать
photozoom
@photozoom
#  bot.send_message(chat_id="841260346", text="Хочу позавтракать").
# bot.send_message(chat_id="841260346", text="Легкий").    #id чата заменяем на свой 
# bot.send_message(chat_id="841260346", text="вопросов нет")

А если раскомментировать эти строки что происходит? Вы заранее знаете кто пользователь 2?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы