Задать вопрос
@loftyk

Как отправлять фото через Inline кнопки?

import telebot
from telebot import types
import yt_dlp
import os
import logging

bot = telebot.TeleBot('TOKEN')

user_gender = {}
user_states = {}

logging.basicConfig(level=logging.INFO)

STATE_NONE = 'none'
STATE_ASKED_GENDER = 'asked_gender'
STATE_ASKED_DAY = 'asked_day'
STATE_BACK = 'back'
STATE_ASKED_FOR_TRAINING = 'asked_for_training'
STATE_ASKED_FOR_GUIDE = 'asked_for_guide'


def update_user_state(user_id, state):
    user_states[user_id] = state
    logging.info(f"User state updated to {state} for user {user_id}")


def get_user_state(user_id):
    return user_states.get(user_id, STATE_NONE)


@bot.message_handler(commands=['start'])
def start(message):
    markup = main_menu_markup()  # Используем функцию для создания разметки
    bot.send_message(message.chat.id,
                     'Привет, {0.first_name}! Я бот БезВреда, чем могу быть обязан?'.format(message.from_user),
                     reply_markup=markup)
    update_user_state(message.from_user.id, STATE_NONE)


def main_menu_markup():
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton('Наши соцсети и сайт')
    item2 = types.KeyboardButton('Гайд по питанию и тренировкам')
    item3 = types.KeyboardButton('Написать в поддержку')
    item4 = types.KeyboardButton('Получить тренировки')
    markup.row(item1)
    markup.row(item2)
    markup.row(item3)
    markup.row(item4)
    return markup
    pass


photosm = []

photosw = []


video_links = {
    'Женщина': {
        '1 день': [],
        '2 день': [],
        '3 день': []
    },
    'Мужчина': {
        '1 день': [],
        '2 день': [],
        '3 день': []
    }
}


def send_youtube_video(chat_id, video_url):
    try:
        ydl_opts = {
            'format': 'best',
            'outtmpl': 'downloaded_video.%(ext)s',
        }
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            info_dict = ydl.extract_info(video_url, download=True)
            video_path = ydl.prepare_filename(info_dict)

        with open(video_path, 'rb') as video_file:
            bot.send_video(chat_id, video_file, supports_streaming=True, caption=info_dict.get('title'))

        os.remove(video_path)
    except Exception as e:
        bot.send_message(chat_id, f"Ошибка при отправке видео: {e}")


def handle_back(message):
    start(message)
    update_user_state(message.from_user.id, STATE_NONE)


def ask_for_gender(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.row('Женщина')
    markup.row('Мужчина')
    markup.row('Назад')
    bot.send_message(message.chat.id, 'Пожалуйста, выберите ваш пол:', reply_markup=markup)
    update_user_state(message.from_user.id, STATE_ASKED_GENDER)


@bot.message_handler(func=lambda message: get_user_state(message.from_user.id) == STATE_ASKED_GENDER)
def set_gender(message):
    user_id = message.from_user.id
    if message.text == 'Назад':
        handle_back(message)  # Обработка кнопки "Назад"
    elif message.text in ['Женщина', 'Мужчина']:
        user_gender[user_id] = message.text
        bot.send_message(message.chat.id,
                         f'Отлично! Ваш пол установлен как {message.text}.')
        ask_for_day(message)  # Обновляем состояние после выбора пола
        update_user_state(user_id, STATE_ASKED_DAY)  # Отправляем фотографии
    else:
        bot.send_message(message.chat.id, 'Пожалуйста, выберите ваш пол.')
    logging.info(f"set_gender called for user {message.from_user.id} with text: {message.text}")


def ask_for_day(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.row('1 день')
    markup.row('2 день')
    markup.row('3 день')
    markup.row('Назад')
    bot.send_message(message.chat.id, 'Выберите день тренировки:', reply_markup=markup)
    update_user_state(message.from_user.id, STATE_ASKED_DAY)


@bot.message_handler(func=lambda message: get_user_state(message.from_user.id) == STATE_NONE)
def handle_message(message):
    if message.text == 'Получить тренировки':
        ask_for_gender(message)
    elif message.text == 'Наши соцсети и сайт':
        # Обработка запроса на соцсети и сайт
        send_socials_and_website(message)
    elif message.text == 'Написать в поддержку':
        # Обработка запроса на поддержку
        write_to_support(message)
    elif message.text == 'Гайд по питанию и тренировкам':
        send_photos(message)


@bot.message_handler(func=lambda message: get_user_state(message.from_user.id) == STATE_ASKED_DAY)
def send_training_video(message):
    user_id = message.from_user.id
    if message.text == 'Назад':
        # Возвращаем пользователя к выбору пола
        ask_for_gender(message)
        update_user_state(user_id, STATE_ASKED_GENDER)
    elif message.text in ['1 день', '2 день', '3 день']:
        gender = user_gender.get(user_id)
        if gender:
            # Получаем список видео для выбранного дня и пола
            video_urls = video_links[gender][message.text]
            bot.send_message(message.chat.id, f'Начинаем загрузку видео. Ожидайте')
            # Отправляем каждое видео из списка
            for video_url in video_urls:
                send_youtube_video(message.chat.id, video_url)
            # Обновляем состояние пользователя на STATE_NONE после отправки видео
            update_user_state(user_id, STATE_ASKED_DAY)
        else:
            bot.send_message(message.chat.id, 'Пожалуйста, сначала укажите ваш пол.')
    else:
        bot.send_message(message.chat.id, 'Пожалуйста, выберите день тренировки.')
    pass


def send_socials_and_website(message):
    keyboard = types.InlineKeyboardMarkup()
    url_btn = types.InlineKeyboardButton(text='Наш сайт', url='https://bezvreda.shop/')
    url_btn1 = types.InlineKeyboardButton(text='Ozon',
                                          url='https://www.ozon.ru/category/varene-31561/bezvreda-101005855/')
    url_btn2 = types.InlineKeyboardButton(text='Wildberries',
                                          url='https://www.wildberries.ru/brands/310609804-bezvreda')
    url_btn3 = types.InlineKeyboardButton(text='Instagram',
                                          url='https://www.instagram.com/bezvreda.shop?igsh=OHhmYzFlbm5uMHp1')
    url_btn4 = types.InlineKeyboardButton(text='Яндекс Маркет',
                                          url='https://market.yandex.ru/business--otel-park-krestovskii-restoran/110479582')
    url_btn5 = types.InlineKeyboardButton(text='ВКонтакте', url='https://vk.com/bezvreda.shop')
    keyboard.row(url_btn)
    keyboard.row(url_btn1)
    keyboard.row(url_btn2)
    keyboard.row(url_btn3)
    keyboard.row(url_btn4)
    keyboard.row(url_btn5)

    bot.send_message(message.chat.id, 'Пожалуйста, мы много где есть', reply_markup=keyboard)

    pass


def write_to_support(message):
    keyboard = types.InlineKeyboardMarkup()
    whatsapp_url = f"https://wa.me/+79623456710"
    whatsapp_button = types.InlineKeyboardButton(text='Написать в WhatsApp', url=whatsapp_url)
    keyboard.add(whatsapp_button)
    bot.send_message(message.chat.id, 'Если у вас есть вопросы, вы можете написать нам в WhatsApp.',
                     reply_markup=keyboard)
    pass


def send_photos(message):
    keyboard = types.InlineKeyboardMarkup()
    btn1 = types.InlineKeyboardButton(text='женщины', callback_data='btn1')
    btn2 = types.InlineKeyboardButton(text='мужчины', callback_data='btn2')
    keyboard.row(btn1)
    keyboard.row(btn2)
    bot.send_message(message.chat.id, f'Выберите для какого пола вы хотите получить гайд по питанию и тренировкам', reply_markup=keyboard)


def send_gender_photos(chat_id, gender):
    if gender == 'женщины':
        for photo in photosw:
            bot.send_photo(chat_id, photo)
    elif gender == 'мужчины':
        for photo in photosm:
            bot.send_photo(chat_id, photo)

    pass


bot.polling(none_stop=True)

Как сделать так, чтобы при нажатии на инлайн кнопку с каким либо полом пользователю через функцию send_photos или еще как то отправлялись фотографии? Новичок в программировании, пишу на питоне
  • Вопрос задан
  • 33 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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