import asyncio
import discord
from discord.ext import commands
from discord.utils import get
import youtube_dl
import os
TOKEN = '****'
BOT_PREFIX = '-'
bot = commands.Bot(command_prefix=BOT_PREFIX)
@bot.event
async def on_ready():
print('Logged in as {}'.format(bot.user.name))
bot.loop.create_task(status_task())
async def status_task():
while True:
await bot.change_presence(activity=discord.Game('just vibing'), status=discord.Status.online)
await asyncio.sleep(3)
await bot.change_presence(activity=discord.Game('just a bot being a bot'), status=discord.Status.online)
await asyncio.sleep(3)
@bot.command(pass_context=True, aliases=['j', 'come',])
async def join(ctx):
global voice
channel = ctx.message.author.voice.channel
voice = get(bot.voice_clients, guild=ctx.guild)
if voice and voice.is_connected():
await voice.move_to(channel)
else:
voice = await channel.connect()
await voice.disconnect
if voice and voice.is_connected():
await voice.move_to(channel)
else:
voice = await channel.connect()
print(f"The bot has connect to {channel}\n")
await ctx.send(f"Joined{channel}")
@bot.command(pass_context=True, aliases=['l', 'piss',])
async def leave(ctx):
channel = ctx.message.author.voice.channel
voice = get(bot.voice_clients, guild=ctx.guild)
if voice and voice.is_connected():
await voice.disconnect()
print(f"The bot has left {channel}")
await ctx.send(f"Left {channel}")
else:
print("Bot was told to leave voice channel, but was not in one")
await ctx.send("Don't thin I am in a voice channel")
@bot.command(pass_context=True, aliases=['p', 'pla'])
async def play(ctx, url: str):
song_there = os.path.isfile("song.mp3")
try:
if song_there:
os.remove("song.mp3")
print("Removed old song file")
except PermissionError:
print("Trying to delete song file, but it's being played")
await ctx.send("ERROR: Music playing")
return
await ctx.send("Getting everything ready now")
voice = get(bot.voice_clients, guild=ctx.guild)
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
print("Downloading audio now\n")
ydl.download([url])
for file in os.listdir("./"):
if file.endswith(".mp3"):
name = file
print(f"Renamed File: {file}\n")
os.rename(file, "song.mp3")
voice.play(discord.FFmpegPCMAudio("song.mp3"), after=lambda e: print("Song done!"))
voice.source = discord.PCMVolumeTransformer(voice.source)
voice.source.volume = 0.07
nname = name.rsplit("-", 2)
await ctx.send(f"Playing: {nname[0]}")
print("playing\n")
bot.run(TOKEN)
我用python 3.6.10在树莓派上制作了一个discord机器人,但play命令不起作用。 join和leave命令工作正常。我也尝试了一个新的python版本,但是它也不起作用。这是带有Raspbian OS Lite的RaspberryPi 2B。我想-play youtubeurl ,然后应该将youtubevideo下载为mp3文件并将其重命名为song.mp3。我认为这有效。但是,当它应该播放mp3文件时,就会出现很多错误,而且我不知道如何解决。 错误:
Ignoring exception in command play:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "bot.py", line 99, in play
voice.play(discord.FFmpegPCMAudio("song.mp3"), after=lambda e: print("Song done!"))
AttributeError: 'NoneType' object has no attribute 'play'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "/usr/local/lib/python3.6/site-packages/discord/ext/commands/core.py", line 859, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "/usr/local/lib/python3.6/site-packages/discord/ext/commands/core.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'NoneType' object has no attribute 'play'