Ich betreibe einen inoffiziellen Server für discord.py (obwohl einige Entwickler). Fragen werden auch hier akzeptiert. Sie können auch einen persönlichen Kanal erstellen und dort Unterstützung für ** Personen erhalten, die langfristige Unterstützung ** wünschen. Wenn Sie persönliche Unterstützung erhalten möchten, geben Sie bitte über die unten stehende Einladungs-URL und DM an "@ Sumidora # 8931" ein. https://discord.gg/KPp2Wsu ** Bitte stellen Sie hier auch Fragen zu diesem Artikel **
Dieser Artikel ist eine schrittweise Untersuchung von discord.py. Zuerst lernen Sie die grundlegende Schreibmethode und dann den fortgeschrittenen Inhalt. 【Serie】
Einführung in discord.py (1) Einführung in discord.py (2) Einführung in discord.py (3)
** Dieser Artikel ist für Leute, die sogar ein wenig Python können. ** ** ** Sie können es jedoch nur durch Kopieren verwenden. Danach können Sie es jedoch nicht mehr schreiben. Wenn Sie also mehr individuelle Funktionen erstellen möchten, Es wird empfohlen, mit Büchern, Paiza-Lernen, Punktinstallation, Progate, Lehrbuch der Universität Kyoto zu lernen. Ich werde. Das Buch, das ich empfehle, ist Shingo Tsujis [Python Startbook](https://www.amazon.co.jp/Python Startbook-Augmented Revised Edition-Tsuji-Shingo / dp / 4774196436 /).
Python 3.8.3 Mac OS Catalina 10.15.5 discord.py-1.4.1
In diesem Artikel wird es sich um einen Artikel handeln, der der Verwendung in der richtigen Reihenfolge folgt, nicht dem System wie bei jeder bisherigen Einführung.
Bisher haben Sie mit pip install discord.py
installiert, die Bibliothek für Audio wird jedoch nicht installiert. Daher müssen Sie die Bibliothek auch für Sprache installieren.
pip install discord.py[voice]
Schreiben Sie abschließend "[voice]", um auch die Sprachbibliothek zu installieren.
Wenn Sie es bereits installiert haben, deinstallieren Sie es bitte zuerst mit pip uninstall discord.py
.
Schreiben wir zunächst den Code, der die Verbindung zur Stimme herstellt.
Dieses Mal erstellen wir eine Funktion zum Verbinden durch Drücken von "! Join" und zum Trennen durch Trennen von "! Leave".
Wenn der Absender der Nachricht nicht mit einem Sprachkanal verbunden ist, wissen Sie nicht, mit welchem Sprachkanal eine Verbindung hergestellt werden soll.
Zuerst müssen wir feststellen, ob der Absender der Nachricht mit dem Sprachkanal verbunden ist.
Hier verwenden wir die Variable discord.Member.voice
. Diese Variable gibt eine "discord.VoiceState" -Instanz zurück, wenn sie mit einem Sprachkanal verbunden war, und "None", wenn dies nicht der Fall war.
# in on_message
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
return
...
Nach der Beurteilung im obigen Abschnitt besteht der nächste Schritt darin, eine Verbindung zum Sprachkanal herzustellen. Sie können eine Verbindung mit der Collout-Funktion "discord.VoiceChannel.connect" herstellen, aber zuerst müssen Sie die Instanz "discord.VoiceChannel" abrufen.
Sie können dies auch mit der Funktion "discord.Client.get_channel" abrufen, aber Sie können auch die Variable "discord.VoiceState.channel" verwenden, da es sich auch um eine "VoiceChannel" -Instanz handelt.
# in on_message
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
return
#Verbindung zum Sprachkanal herstellen
await message.author.voice.channel.connect()
await message.channel.send("In Verbindung gebracht.")
Jetzt können Sie sich mit Ihrem Sprachkanal verbinden!
Trennen Sie anschließend die Verbindung zum Sprachkanal. Dies erfordert eine etwas spezielle Methode.
Um die Verbindung zum Sprachkanal zu trennen, müssen Sie zuerst die Collout-Funktion "discord.VoiceClient.disconnect" ausführen, aber Sie müssen diese "discord.VoiceClient" -Instanz von "discord.Guild" abrufen.
voice_client = message.guild.voice_client
Dieser Wert ist "discord.VoiceClient", wenn eine Verbindung besteht, "None", wenn keine Verbindung besteht.
Mit diesem,
import discord
client = discord.Client()
@client.event
async def on_message(message: discord.Message):
#Ignorieren Sie, wenn der Absender der Nachricht Bot ist
if message.author.bot:
return
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
return
#Verbindung zum Sprachkanal herstellen
await message.author.voice.channel.connect()
await message.channel.send("In Verbindung gebracht.")
elif message.content == "!leave":
if message.guild.voice_client is None:
await message.channel.send("Nicht verbunden.")
return
#Trennen
await message.guild.voice_client.disconnect()
await message.channel.send("Ich habe die Verbindung getrennt.")
Sie können so schreiben.
Verwenden Sie die Collout-Funktion discord.VoiceClient.move_to
. Übergeben Sie eine Instanz eines neuen Audiokanals an move_to.
#Gehen Sie zu dem Sprachkanal, in dem sich der Benutzer befindet, der die Nachricht gesendet hat
message.guild.voice_client.move_to(message.author.voice.channel)
Lassen Sie uns nach dem Herstellen einer Verbindung zum Sprachkanal die Stimme abspielen. Hier nehmen wir an, dass Sie eine Datei namens "example.mp3" haben.
Sie benötigen auch etwas namens ffmpeg, fügen Sie es also bitte hinzu (suchen Sie danach und Sie werden viele Möglichkeiten finden, es einzugeben).
Versuchen Sie es zu spielen, indem Sie "! Play" eingeben.
if message.content == "!play":
if message.guild.voice_client is None:
await message.channel.send("Nicht verbunden.")
return
message.guild.voice_client.play(discord.FFmpegPCMAudio("example.mp3"))
Sie können damit spielen! Überraschenderweise ist die Wiedergabefunktion keine Collout-Funktion.
Sie können mit der Funktion discord.VoiceClient.pause
pausieren.
Sie können auch mit der Funktion discord.VoiceClient.stop
anhalten (nicht fortsetzen).
Die Wiedergabe kann mit der Funktion discord.VoiceClient.resume
fortgesetzt werden.
Sie kann mit discord.PCMVolumeTransformer
geändert werden.
source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio("example.mp3"), volume=0.5)
message.guild.voice_client.play(source)
Sie können das Volumen für das Volumen angeben. Das ursprüngliche Volumen ist 1 und das niedrigste ist 0. (Die Hälfte bei 0,5)
** Der Inhalt von hier an kann mit den Nutzungsbedingungen von Youtube in Konflikt stehen. Bitte tun Sie dies auf eigenes Risiko. Hier wird nur ein Beispiel gezeigt. ** ** **
Sie können auf [hier] verweisen (https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py), aber dieser Inhalt ist fortgeschritten (schwer selbst zu schreiben), daher ist es einfach. Ich werde vorstellen, was ich getan habe.
Führen Sie zuerst pip install youtube_dl
in der Shell aus, um die Bibliothek youtube_dl
zu installieren.
Dann schreiben Sie dies am Anfang der Datei:
import asyncio
import discord
import youtube_dl
# Suppress noise about console usage from errors
youtube_dl.utils.bug_reports_message = lambda: ''
ytdl_format_options = {
'format': 'bestaudio/best',
'outtmpl': '%(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' # bind to ipv4 since ipv6 addresses cause issues sometimes
}
ffmpeg_options = {
'options': '-vn'
}
ytdl = youtube_dl.YoutubeDL(ytdl_format_options)
class YTDLSource(discord.PCMVolumeTransformer):
def __init__(self, source, *, data, volume=0.5):
super().__init__(source, volume)
self.data = data
self.title = data.get('title')
self.url = data.get('url')
@classmethod
async def from_url(cls, url, *, loop=None, stream=False):
loop = loop or asyncio.get_event_loop()
data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))
if 'entries' in data:
# take first item from a playlist
data = data['entries'][0]
filename = data['url'] if stream else ytdl.prepare_filename(data)
return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)
Dies ist unter https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py.
Verwenden Sie es dann, um Musik auf Youtube abzuspielen.
import asyncio
import discord
import youtube_dl
# Suppress noise about console usage from errors
youtube_dl.utils.bug_reports_message = lambda: ''
ytdl_format_options = {
'format': 'bestaudio/best',
'outtmpl': '%(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' # bind to ipv4 since ipv6 addresses cause issues sometimes
}
ffmpeg_options = {
'options': '-vn'
}
ytdl = youtube_dl.YoutubeDL(ytdl_format_options)
class YTDLSource(discord.PCMVolumeTransformer):
def __init__(self, source, *, data, volume=0.5):
super().__init__(source, volume)
self.data = data
self.title = data.get('title')
self.url = data.get('url')
@classmethod
async def from_url(cls, url, *, loop=None, stream=False):
loop = loop or asyncio.get_event_loop()
data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))
if 'entries' in data:
# take first item from a playlist
data = data['entries'][0]
filename = data['url'] if stream else ytdl.prepare_filename(data)
return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)
client = discord.Client()
@client.event
async def on_message(message: discord.Message):
#Ignorieren Sie, wenn der Absender der Nachricht Bot ist
if message.author.bot:
return
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
return
#Verbindung zum Sprachkanal herstellen
await message.author.voice.channel.connect()
await message.channel.send("In Verbindung gebracht.")
elif message.content == "!leave":
if message.guild.voice_client is None:
await message.channel.send("Nicht verbunden.")
return
#Trennen
await message.guild.voice_client.disconnect()
await message.channel.send("Ich habe die Verbindung getrennt.")
elif message.content.startswith("!play "):
if message.guild.voice_client is None:
await message.channel.send("Nicht verbunden.")
return
#Spielen Sie nicht, wenn Sie spielen
if message.guild.voice_client.is_playing():
await message.channel.send("Spielen.")
return
url = message.content[6:]
#Laden Sie Musik von YouTube herunter
player = await YTDLSource.from_url(url, loop=client.loop)
#Reproduzieren
await message.guild.voice_client.play(player)
await message.channel.send('{}Spielen.'.format(player.title))
elif message.content == "!stop":
if message.guild.voice_client is None:
await message.channel.send("Nicht verbunden.")
return
#Laufen Sie nicht, wenn Sie nicht spielen
if not message.guild.voice_client.is_playing():
await message.channel.send("Nicht spielen.")
return
message.guild.voice_client.stop()
await message.channel.send("Es hat aufgehört.")
Wie war das. Ich erklärte, wie man Sprache benutzt. Wenn Sie weitere Punkte haben, die wir Ihnen erläutern sollen, hinterlassen Sie diese bitte in den Kommentaren oder auf dem Server.
Im nächsten Artikel möchte ich das Befehls-Framework erläutern.
Na dann.
Recommended Posts