python-3.x 机器人进来,音乐播放几秒钟,然后关掉

flvtvl50  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(92)
import discord
from discord.ext import commands
import youtube_dl
import asyncio
import random

intents = discord.Intents.all()
intents.members = True
intents.messages = True

bot = commands.Bot(command_prefix='%', intents=intents)

bot.remove_command('help')

ytdlopts = {
    'format': 'bestaudio/best',
    'outtmpl': 'downloads/%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0',
    'force-ipv4': True,
    'preferredcodec': 'mp3',
    'cachedir': False,
    'extractor': 'youtube',
}

ffmpeg_options = {
    'options': '-vn'
}

ytdl = youtube_dl.YoutubeDL(ytdlopts)

@bot.event
async def on_ready():
    statuses = ['Ну а что поделать?', 'Да да я...', '/help', 'Че смотришь?']
    while True:
        await bot.change_presence(status=discord.Status.dnd)
        await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=random.choice(statuses)))
        await asyncio.sleep(10)

@bot.command(description='Тестовая команда')
async def command(ctx):
    """
    Тестовая команда
    """
    await ctx.message.delete()
    await ctx.send('Я робот')

blocked_words = ['пидор', 'пидорасина', 'негр', 'негритосик', 'хохол', 'русня']  # Список запрещенных слов

@bot.event
async def on_message(message):
    for word in blocked_words:
        if word in message.content.lower():
            await message.delete()  # Удаление сообщения-нарушителя
            await message.channel.send(f'{message.author.mention}, не пиши такие плохие слова. :smiling_face_with_tear:')  # Отправка сообщения с упоминанием нарушителя
            break 
    await bot.process_commands(message)  # Обработка других команд

@bot.command()
async def furry(ctx,description='Узнай насколько ты фурри'):
    """
    Показывает на сколько ты фурри.
    Использование: /furry
    """
    percentage = random.randint(0, 100)  # Генерация случайного числа от 0 до 100
    if percentage < 30:
        await ctx.send(f"Ты фурри на {percentage}%, так держать!")
    else:
        await ctx.send(f"Ты фурри на {percentage}%, фу мерзость!")

@bot.command()
async def help(ctx, description='Список всех комманд'):
    """Все команды бота.
    Использование: /help
    """
    embed = discord.Embed(title="Всевозможные команды", description="Список доступных команд бота:", color=discord.Color.blue())
    
    for command in bot.commands:
        embed.add_field(name=command.name, value=command.help, inline=False)
    
    await ctx.send(embed=embed)

@bot.command()
async def users(ctx, description='Кол-во участников сервера'):
    """
    Показывает кол-во людей и ботов на этом дискорд сервере.
    Использование: /users
    """
    member_count = len(ctx.guild.members)
    await ctx.send(f"На этом сервере сейчас {member_count} участника(ов).")

@bot.event #рандомные реакции
async def on_message(message):
    if random.random() < 0.1:  
        emoji = random.choice(bot.emojis)
        try:
            await message.add_reaction(emoji)
        except discord.errors.HTTPException:
            pass
    await bot.process_commands(message)

@bot.command()
@commands.has_permissions(manage_messages=True)
async def clear(ctx, amount: int, description='Удаление сообщений'):
    """
    Удаляет указанное количество сообщений из текущего канала чата.
    Использование: /clear [количество]
    """
    await ctx.channel.purge(limit=amount+1)
    await ctx.send(f'Удалено {amount} сообщений.')

@bot.command()
async def play(ctx, *, query):
    """
    Включение музыки в голосом канале.
    Использование: /play [название]
    """
    try:
        voice_channel = ctx.author.voice.channel
    except AttributeError:
        return await ctx.send("Нет канала для подключения. Убедитесь, что вы находитесь в голосовом канале.")

    permissions = voice_channel.permissions_for(ctx.me)
    if not permissions.connect or not permissions.speak:
        await ctx.send("У меня нет разрешения подключаться или говорить в этом голосовом канале.")
        return
    
    voice_client = ctx.guild.voice_client
    if not voice_client:
        await voice_channel.connect()
        voice_client = discord.utils.get(bot.voice_clients, guild=ctx.guild)

    loop = asyncio.get_event_loop()
    data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url=query, download=False, extra_info={'verbose': True}))

    title = data.get('title', 'Неизвестное название')
    
    if 'entries' in data:
        data = data['entries'][0]
        song = data.get('url', 'Неизвестный URL')
    else:
        song = data.get('url', 'Неизвестный URL')

    try:
        voice_client.play(discord.FFmpegPCMAudio(source=song, **ffmpeg_options, executable="ffmpeg"), after=lambda e: print('done', e))
    except Exception as e:
        print(e)

    await ctx.send(f'**Сейчас играет:** {title}')

@bot.command()
async def skip(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client:
        voice_client.stop()
        await ctx.send("Песня пропущена.")
    else:
        await ctx.send("Я не нахожусь в голосовом канале.")

@bot.command()
async def pause(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client.is_playing():
        voice_client.pause()
        await ctx.send("Песня поставлена на паузу.")
    else:
        await ctx.send("На данный момент ничего не играет.")

@bot.command()
async def resume(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client.is_paused():
        voice_client.resume()
        await ctx.send("Продолжаю воспроизведение песни.")
    else:
        await ctx.send("Песня уже играет или не поставлена на паузу.")

@bot.command()
async def stop(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client:
        await voice_client.disconnect()
        await ctx.send("Отключаюсь от голосового канала.")
    else:
        await ctx.send("Я не нахожусь в голосовом канале.")

@bot.command(name="ban",usage="ban <@user> <reason=None>")
@commands.has_permissions(ban_members=True)
async def ban(ctx, member: discord.Member, *, reason=None):
    """
    Забанить пользователя на сервере.
    Использование: /ban <@user> <reason=None>
    """
    await member.send(f"You was banned on server") # Отправить личное сообщение пользователю
    await ctx.send(f"Member {member.mention} was banned on this server")
    await member.ban(reason=reason)

@bot.command(name="unban", usage="unban <user_id>")
@commands.has_permissions(ban_members=True)
async def unban(ctx, user_id: int):
    """
    Разбанить пользователя на сервере.
    Использование: /unban <user_id>
    """
    user = await bot.fetch_user(user_id)
    await ctx.guild.unban(user)

bot.run('MTA3ODU4ODI5NjkxOTI1MzA4Mw.GIPwYX.bTTc7dohvj7Pd9R9bEd6-tgXiZea56ixKWlsOw')

字符串
输出量:

PS C:\Users\comp\Desktop\137077897> py music.py
2023-11-16 15:41:58 INFO     discord.client logging in using static token
2023-11-16 15:42:00 INFO     discord.gateway Shard ID None has connected to Gateway (Session ID: 0520516b54d46113b8d93267ed392825).
2023-11-16 15:42:03 INFO     discord.voice_client Connecting to voice...
2023-11-16 15:42:03 INFO     discord.voice_client Starting voice handshake... (connection attempt 1)
2023-11-16 15:42:03 INFO     discord.voice_client Voice handshake complete. Endpoint found stockholm9000.discord.media
done None
2023-11-16 15:42:35 INFO     discord.player ffmpeg process 10132 successfully terminated with return code of 0.

fumotvh3

fumotvh31#

首先,我建议使用yt_dlp而不是youtube_dl,因为它已经停产了,所以你需要做pip install yt_dlp。另外,你有2个on_message()函数,所以我也修复了它。
而不是打电话

loop = asyncio.get_event_loop()
data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url=query, download=False, extra_info={'verbose': True}))

字符串
你可以只做ytdl.extract_info(url=query, download=False, extra_info={'verbose': True})
下面是代码的最终修复版本:

import discord
from discord.ext import commands
import yt_dlp as youtube_dl
import asyncio
import random

intents = discord.Intents.all()
intents.members = True
intents.messages = True

bot = commands.Bot(command_prefix='%', intents=intents)

bot.remove_command('help')

ytdlopts = {
    'format': 'bestaudio/best',
    'outtmpl': 'downloads/%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0',
    'force-ipv4': True,
    'preferredcodec': 'mp3',
    'cachedir': False,
    'extractor': 'youtube',
}

ffmpeg_options = {
    'options': '-vn'
}

ytdl = youtube_dl.YoutubeDL(ytdlopts)

@bot.event
async def on_ready():
    statuses = ['Ну а что поделать?', 'Да да я...', '/help', 'Че смотришь?']
    while True:
        await bot.change_presence(status=discord.Status.dnd)
        await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=random.choice(statuses)))
        await asyncio.sleep(10)

@bot.command(description='Тестовая команда')
async def command(ctx):
    """
    Тестовая команда
    """
    await ctx.message.delete()
    await ctx.send('Я робот')

blocked_words = ['пидор', 'пидорасина', 'негр', 'негритосик', 'хохол', 'русня']  # Список запрещенных слов

@bot.event
async def on_message(message):
    if random.random() < 0.1:  
        emoji = random.choice(bot.emojis)
        try:
            await message.add_reaction(emoji)
        except discord.errors.HTTPException:
            pass
    for word in blocked_words:
        if word in message.content.lower():
            await message.delete()  # Удаление сообщения-нарушителя
            await message.channel.send(f'{message.author.mention}, не пиши такие плохие слова. :smiling_face_with_tear:')  # Отправка сообщения с упоминанием нарушителя
            break 
    await bot.process_commands(message)  # Обработка других команд

@bot.command()
async def furry(ctx,description='Узнай насколько ты фурри'):
    """
    Показывает на сколько ты фурри.
    Использование: /furry
    """
    percentage = random.randint(0, 100)  # Генерация случайного числа от 0 до 100
    if percentage < 30:
        await ctx.send(f"Ты фурри на {percentage}%, так держать!")
    else:
        await ctx.send(f"Ты фурри на {percentage}%, фу мерзость!")

@bot.command()
async def help(ctx, description='Список всех комманд'):
    """Все команды бота.
    Использование: /help
    """
    embed = discord.Embed(title="Всевозможные команды", description="Список доступных команд бота:", color=discord.Color.blue())
    
    for command in bot.commands:
        embed.add_field(name=command.name, value=command.help, inline=False)
    
    await ctx.send(embed=embed)

@bot.command()
async def users(ctx, description='Кол-во участников сервера'):
    """
    Показывает кол-во людей и ботов на этом дискорд сервере.
    Использование: /users
    """
    member_count = len(ctx.guild.members)
    await ctx.send(f"На этом сервере сейчас {member_count} участника(ов).")

@bot.command()
@commands.has_permissions(manage_messages=True)
async def clear(ctx, amount: int, description='Удаление сообщений'):
    """
    Удаляет указанное количество сообщений из текущего канала чата.
    Использование: /clear [количество]
    """
    await ctx.channel.purge(limit=amount+1)
    await ctx.send(f'Удалено {amount} сообщений.')

@bot.command()
async def play(ctx, *, query):
    """
    Включение музыки в голосом канале.
    Использование: /play [название]
    """
    try:
        voice_channel = ctx.author.voice.channel
    except AttributeError:
        return await ctx.send("Нет канала для подключения. Убедитесь, что вы находитесь в голосовом канале.")

    permissions = voice_channel.permissions_for(ctx.me)
    if not permissions.connect or not permissions.speak:
        await ctx.send("У меня нет разрешения подключаться или говорить в этом голосовом канале.")
        return
    
    voice_client: discord.VoiceClient = ctx.guild.voice_client
    if not voice_client:
        voice_client = await voice_channel.connect()

    data = ytdl.extract_info(url=query, download=False, extra_info={'verbose': True})
    
    if data is None:
        await ctx.send("Не удалось получить данные о видео.")
        return

    title = data.get('title', 'Неизвестное название')
    
    if 'entries' in data:
        data = data['entries'][0]
        song = data.get('url', 'Неизвестный URL')
    else:
        song = data.get('url', 'Неизвестный URL')

    
    voice_client.play(discord.FFmpegPCMAudio(source=song, options=ffmpeg_options['options']), after=lambda e: print('done', e))
    

    await ctx.send(f'**Сейчас играет:** {title}')

@bot.command()
async def skip(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client:
        voice_client.stop()
        await ctx.send("Песня пропущена.")
    else:
        await ctx.send("Я не нахожусь в голосовом канале.")

@bot.command()
async def pause(ctx):
    voice_client = ctx.guild.voice_client
    if not voice_client:
        await ctx.send("Я не нахожусь в голосовом канале.")
        return
    if voice_client.is_playing():
        voice_client.pause()
        await ctx.send("Песня поставлена на паузу.")
    else:
        await ctx.send("На данный момент ничего не играет.")

@bot.command()
async def resume(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client.is_paused():
        voice_client.resume()
        await ctx.send("Продолжаю воспроизведение песни.")
    else:
        await ctx.send("Песня уже играет или не поставлена на паузу.")

@bot.command()
async def stop(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client:
        await voice_client.disconnect()
        await ctx.send("Отключаюсь от голосового канала.")
    else:
        await ctx.send("Я не нахожусь в голосовом канале.")

@bot.command(name="ban",usage="ban <@user> <reason=None>")
@commands.has_permissions(ban_members=True)
async def ban(ctx, member: discord.Member, *, reason=None):
    """
    Забанить пользователя на сервере.
    Использование: /ban <@user> <reason=None>
    """
    await member.send(f"You was banned on server") # Отправить личное сообщение пользователю
    await ctx.send(f"Member {member.mention} was banned on this server")
    await member.ban(reason=reason)

@bot.command(name="unban", usage="unban <user_id>")
@commands.has_permissions(ban_members=True)
async def unban(ctx, user_id: int):
    """
    Разбанить пользователя на сервере.
    Использование: /unban <user_id>
    """
    user = await bot.fetch_user(user_id)
    await ctx.guild.unban(user)

bot.run("TOKEN")

相关问题