Обратная связь телеграм бот
Как сделать в боте телеграм обратную связь? У меня есть бот в котором юзер скидывает фото боту, бот пересылает это фото мне, под фото есть inline markup с надписями "Да" и "Нет", и вот как так сделать что бы когда я нажимал на кнопку "Да" под фото, бот писал "Привет", а если нажимаю "Нет" то бот пишет юзеру "Пока" именно тому юзеру, который отправил это фото. Библиотека telebot
def process_number(message):
try:
if message.content_type != 'photo':
raise ValueError
process_chat_id(message, message.photo[-1].file_id)
except ValueError:
bot.send_message(message.chat.id, "Ошибка")
except OverflowError:
bot.send_message(message.chat.id, 'Ошибка')
def process_chat_id(message, file_id):
try:
chat_id = message.chat.id
user_link = f"<a href='tg://user?id={chat_id}'>Пользователь</a>"
bot.send_photo(519299127, file_id, caption=f'{user_link}, отправил фото', parse_mode='HTML')
bot.send_message(message.chat.id, "Фото было успешно отправлено!")
# bot.register_next_step_handler(message, hello)
except ValueError:
bot.send_message(message.chat.id, "Ошибка")
except Exception as e:
bot.send_message(message.chat.id, " Ошибка: {}".format(e))
if message.text=="Фото":
bot.send_message(message.chat.id, "Хорошо, присылай свое фото сюда")
bot.register_next_step_handler(message, process_number)
Ответы (1 шт):
Если обходиться без использования баз данных то можно вот так
Код создания кнопки во время получения фото от пользователя:
sender_id = message.chat.id
reply_kb = types.InlineKeyboardMarkup(row_width=1).add(
types.InlineKeyboardButton(text="✅Да", callback_data=f"1 {sender_id}" ),
types.InlineKeyboardButton(text="❌Нет", callback_data=f"0 {sender_id}" )
)
Обработка колбека и отправка сообщения:
@bot.callback_query_handler(func=lambda call: True)
data_list = list(map(int,call.data.split()))
if call.message.chat.id in admins_list:
sender_id = data_list[1]
if data_list[0]==0:
bot.send_message(sender_id ,"Пока")
else:
bot.send_message(sender_id ,"Привет")
Объяснение работы:
В call.data можно передавать строку с параметрами разделенные, например пробелом. В данном случаем передаем два параметра первый это id кнопки 0-нет 1-да, вторым передали id юзера который прислал фото. Далее в callback_query_handler парсим строку и заполняем data_list параметрами кнопки которая была нажата. Соответственно data_list[0] это id кнопки которая была нажата, datalist[1] - id юзера который прислал фото. Далее в соответствии с нажатой кнопкой отправляем сообщение.
Так как callback можно подделать добавил проверку на наличие пользователя нажавшего кнопку в списке администраторов. А так же обратите внимание на описанное в документации ограничение количества данных передаваемых в callback.data.