Музыкальный телеграм Бот (как получить \ отправить случайную песню в группу телеграм)

Короче, это полный писец, как круто - в любую секунду ты можешь запросто заслать случайную песенку в свой любимый телега-чатик с ребятами. Никакой ботвы, одни только качественные треки для душевной тусы! 🎶 Ставить этого монстра - целый за пять копеек. Пара строчек в терминале и бот твой, делай с ним что хочешь!

import os  #импорт библиотеки для взаимодействия с операционной системой
import random  #импорт библиотеки для генерации случайных чисел
#импорт нескольких классов из библиотеки aiogram
from aiogram import Bot, Dispatcher, types
#импорт класса InputFile из библиотеки aiogram
from aiogram.types import InputFile
#импорт функции executor из библиотеки aiogram
from aiogram import executor
#импорт переменной TOKEN из файла config
from config import TOKEN
#импорт библиотеки для организации асинхронного программирования
import asyncio

# Укажите путь к папке с песнями
songs_folder = 'oMRandom2017'
#создание экземпляра класса Bot с аргументом token=TOKEN
bot = Bot(token=TOKEN)
#создание экземпляра класса Dispatcher с аргументом bot
dp = Dispatcher(bot)
#создание пустого словаря button_clicks
button_clicks = {}

#декоратор для обработчика команды /start
@dp.message_handler(commands=['start'])
#асинхронная функция start с аргументом message
async def start(message: types.Message):
    #создание клавиатуры с двумя кнопками
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
    #создание кнопки "Получить кат"
    button = types.KeyboardButton("Полyчить кат")
    #создание кнопки "Отправить песню"
    button2 = types.KeyboardButton("Отправить песню")
    #присваивание переменной userid значения id пользователя
    userid = int(message.from_user.id)
    #присваивание переменной username значения имени пользователя
    username = str(message.from_user.username)
    #вывод сообщения о подключении пользователя к боту
    print(f"ID {userid} с ником {username} авторизовался в Боте")
    #добавление кнопок на клавиатуру
    keyboard.add(button, button2)
    #отправка сообщения пользователю
    await message.answer("Привет! Нажми на кнопку, чтобы получить случaйный кат.", reply_markup=keyboard)
#определение асинхронной функции is_user_member с аргументами chat_id и user_id и возвращаемым значением bool
async def is_user_member(chat_id: int, user_id: int) -> bool:
    #присваивание переменной chat_member значения результата выполнения метода get_chat_member
    #с аргументами chat_id и user_id
    chat_member = await bot.get_chat_member(chat_id, user_id)
    #возврат результата проверки статуса пользователя
    return chat_member.status in (types.ChatMemberStatus.CREATOR, types.ChatMemberStatus.ADMINISTRATOR, types.ChatMemberStatus.MEMBER)

@dp.message_handler(lambda message: message.text == "Полyчить кат")
async def send_random_song(message: types.Message):
    userid = int(message.from_user.id)
    #проверка на членство - вызов ф-ции прописаной выше
    if await is_user_member('@YMBAND', message.from_user.id):
        #если пользователь не нажимал кнопку то присвается одно нажатие
        if userid not in button_clicks:
            button_clicks[userid] = 1
            await message.answer("Вам достyпно 5 катов в день")
        else: # если нажимал прибавляется +1 нажатие
            button_clicks[userid] += 1
        if button_clicks[userid] <= 5: # кат отправляется только пять раз
           song_file = random.choice([f for f in os.listdir(songs_folder) if f.endswith('.mp3')])
           with open(os.path.join(songs_folder, song_file), 'rb') as audio:
               await bot.send_audio(message.chat.id, audio, title=song_file)
    #если нажатие кнопки не участника сообщества то кат отправялется только один раз
    else:
        if userid not in button_clicks:
            button_clicks[userid] = 1
        else:
            button_clicks[userid] += 1
        if button_clicks[userid] <= 1:
           song_file = random.choice([f for f in os.listdir(songs_folder) if f.endswith('.mp3')])
           await message.answer("Для тех кто не встyпил в грyппy @YMBAND достyпен только 1 кат в день")
           with open(os.path.join(songs_folder, song_file), 'rb') as audio:
               await bot.send_audio(message.chat.id, audio, title=song_file)

@dp.message_handler(lambda message: message.text == "Отправить песню")
async def save_file(message: types.Message):
    await message.answer("Пожалуйста, отправьте песню.")
@dp.message_handler(content_types=["audio"])
async def download(message: types.Message):
    file_id = message.audio.file_id
    file_info = await bot.get_file(file_id)
    file_path = file_info.file_path
    # если нужно указать нужную директорию для загружаемых песен в данном случае это oMRandom2017 
    #file_name = "oMRandom2017/" + message.audio.file_name  
    file_name = message.audio.file_name
    await bot.download_file(file_path, file_name)


    await message.answer("Песня отправленна!!!")

# Функция для обнуления счетчика каждые 12 часов
async def reset_button_clicks():
    while True:
        await asyncio.sleep(43200)  # Подождать 12 часов
        button_clicks.clear()  # Обнулить счетчик


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(reset_button_clicks())
    executor.start_polling(dp, skip_updates=True)
На главную YouTube Telegram Предыдущая страница Следующая страница