机器人进来,音乐播放几秒钟然后关闭

The bot comes in, the music plays for a few seconds and turns off

提问人:Domi 提问时间:11/16/2023 最后编辑:CowDomi 更新时间:11/17/2023 访问量:38

问:

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.
python-3.x discord.py

评论

3赞 kytpbs1 11/16/2023
伙计,您上传了令牌,请立即删除!并立即更改您的令牌!
0赞 Domi 11/17/2023
我更改了我的令牌

答:

0赞 kytpbs1 11/17/2023 #1

首先,我建议使用而不是因为它已停产,因此您需要这样做。另外,你有 2 个功能,所以我也修复了它。yt_dlpyoutube_dlpip install yt_dlpon_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")

评论

0赞 Domi 11/17/2023
这无济于事
0赞 kytpbs1 11/24/2023
它对我来说似乎工作得很好;尝试了很长时间后,我认为问题是您正在通过 URL 播放,理论上它应该可以正常工作,但这似乎在大多数随机时间会导致错误,我建议在播放之前下载歌曲,而不是 URL;使用视频的路径...如果你想知道,可以工作。(discord.FFmpegPCMAudio(source=PATH