Je lance un serveur non officiel pour discord.py (bien que certains développeurs). Les questions sont également acceptées ici. Vous pouvez également créer une chaîne personnelle et obtenir une assistance pour ** les personnes qui souhaitent une assistance à long terme **. Si vous souhaitez recevoir une assistance personnalisée, veuillez entrer à partir de l'url d'invitation ci-dessous et DM à «@ Sumidora # 8931». https://discord.gg/KPp2Wsu ** Veuillez également poser des questions sur cet article ici **
Cet article est une étude étape par étape de discord.py. Vous apprendrez d'abord la méthode d'écriture de base, puis vous apprendrez le contenu avancé. 【séries】
Présentation de discord.py (1) Présentation de discord.py (2) Présentation de discord.py (3)
** Cet article est destiné aux personnes qui peuvent même faire un peu de Python. ** ** Cependant, vous pouvez l'utiliser simplement en le copiant, mais vous ne pourrez plus l'écrire après cela, donc si vous souhaitez créer plus de fonctions individuelles, Il est recommandé d'étudier en utilisant des livres, l'apprentissage de paiza, l'installation de points, Progate et Manuel de l'Université de Kyoto. Je vais. Le livre que je recommande est le [Python Startbook] de Shingo Tsuji (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
Dans cet article, ce sera un article qui suivra l'utilisation dans l'ordre, pas le système comme chaque introduction jusqu'à présent.
Jusqu'à présent, vous avez installé pip install discord.py
, mais cela n'installe pas la bibliothèque pour l'audio. Par conséquent, vous devez également installer la bibliothèque pour la voix.
pip install discord.py[voice]
Enfin, écrivez [voice]
pour installer également la bibliothèque vocale.
Si vous l'avez déjà installé, veuillez le désinstaller d'abord avec pip uninstall discord.py
.
Tout d'abord, écrivons le code qui se connecte à la voix.
Cette fois, nous allons créer une fonction pour se connecter en appuyant sur ! Join
et nous déconnecter en appuyant sur! Quitter
.
Si l'expéditeur du message n'est pas connecté à un canal vocal, vous ne saurez pas à quel canal vocal vous connecter.
Nous devons donc d'abord déterminer si l'expéditeur du message est connecté au canal vocal.
Ici, nous utilisons la variable discord.Member.voice
. Cette variable renvoie une instance discord.VoiceState
si elle était connectée à un canal vocal, et" None "si ce n'était pas le cas.
# in on_message
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
return
...
Après avoir jugé dans la section ci-dessus, l'étape suivante consiste à se connecter au canal vocal. Vous pouvez vous connecter avec la fonction de collout discord.VoiceChannel.connect
, mais vous devez d'abord obtenir l'instance discord.VoiceChannel
.
Vous pouvez également l'obtenir avec la fonction discord.Client.get_channel
, mais vous pouvez utiliser la variable discord.VoiceState.channel
car c'est aussi une instance de VoiceChannel
.
# in on_message
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
return
#Connectez-vous au canal vocal
await message.author.voice.channel.connect()
await message.channel.send("Connecté.")
Vous pouvez maintenant vous connecter à votre canal vocal!
Ensuite, déconnectez-vous du canal vocal. Cela nécessite une méthode légèrement spéciale.
Tout d'abord, pour vous déconnecter du canal vocal, vous devez exécuter la fonction de collout discord.VoiceClient.disconnect
, mais vous devez obtenir cette instance discord.VoiceClient
de discord.Guild
.
voice_client = message.guild.voice_client
Cette valeur sera discord.VoiceClient
si connecté, None
si non connecté.
Avec ça,
import discord
client = discord.Client()
@client.event
async def on_message(message: discord.Message):
#Ignorer si l'expéditeur du message est un bot
if message.author.bot:
return
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
return
#Connectez-vous au canal vocal
await message.author.voice.channel.connect()
await message.channel.send("Connecté.")
elif message.content == "!leave":
if message.guild.voice_client is None:
await message.channel.send("Pas connecté.")
return
#Déconnecter
await message.guild.voice_client.disconnect()
await message.channel.send("Je me suis déconnecté.")
Vous pouvez écrire comme ça.
Utilisez la fonction de collout discord.VoiceClient.move_to
. Passez une instance d'un nouveau canal audio à move_to.
#Accédez au canal vocal où se trouve l'utilisateur qui a envoyé le message
message.guild.voice_client.move_to(message.author.voice.channel)
Après vous être connecté au canal vocal, jouons la voix. Ici, nous supposons que vous avez un fichier appelé «exemple.mp3».
Vous aurez également besoin de quelque chose appelé ffmpeg, veuillez donc l'inclure (recherchez-le et vous trouverez de nombreuses façons de le saisir).
Essayez de le lire en tapant «! Play».
if message.content == "!play":
if message.guild.voice_client is None:
await message.channel.send("Pas connecté.")
return
message.guild.voice_client.play(discord.FFmpegPCMAudio("example.mp3"))
Vous pouvez jouer avec ça! Étonnamment, la fonction de lecture n'est pas une fonction collout.
Vous pouvez faire une pause avec la fonction discord.VoiceClient.pause
.
Vous pouvez également arrêter (ne peut pas reprendre) avec la fonction discord.VoiceClient.stop
.
La lecture peut être reprise avec la fonction discord.VoiceClient.resume
.
Il peut être modifié en utilisant discord.PCMVolumeTransformer
.
source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio("example.mp3"), volume=0.5)
message.guild.voice_client.play(source)
Vous pouvez spécifier le volume pour le volume. Le volume d'origine est 1 et le plus bas est 0. (La moitié à 0,5)
** Le contenu à partir d'ici peut entrer en conflit avec les conditions d'utilisation de Youtube, veuillez donc le faire à vos propres risques. Seul un exemple est montré ici. ** **
Vous pouvez vous référer à ici, mais ce contenu est avancé (difficile à écrire par vous-même), donc c'est facile. Je vais vous présenter ce que j'ai fait.
Tout d'abord, lancez pip install youtube_dl
dans le shell pour installer la bibliothèque youtube_dl
.
Puis écrivez ceci au début du fichier:
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)
C'est à l'adresse https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py.
Ensuite, utilisez-le pour lire de la musique sur youtube.
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):
#Ignorer si l'expéditeur du message est un bot
if message.author.bot:
return
if message.content == "!join":
if message.author.voice is None:
await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
return
#Connectez-vous au canal vocal
await message.author.voice.channel.connect()
await message.channel.send("Connecté.")
elif message.content == "!leave":
if message.guild.voice_client is None:
await message.channel.send("Pas connecté.")
return
#Déconnecter
await message.guild.voice_client.disconnect()
await message.channel.send("Je me suis déconnecté.")
elif message.content.startswith("!play "):
if message.guild.voice_client is None:
await message.channel.send("Pas connecté.")
return
#Ne jouez pas si vous jouez
if message.guild.voice_client.is_playing():
await message.channel.send("En jouant.")
return
url = message.content[6:]
#Télécharger de la musique sur YouTube
player = await YTDLSource.from_url(url, loop=client.loop)
#Reproduire
await message.guild.voice_client.play(player)
await message.channel.send('{}Jouer.'.format(player.title))
elif message.content == "!stop":
if message.guild.voice_client is None:
await message.channel.send("Pas connecté.")
return
#Ne courez pas si vous ne jouez pas
if not message.guild.voice_client.is_playing():
await message.channel.send("Ne joue pas.")
return
message.guild.voice_client.stop()
await message.channel.send("Cela s'est arrêté.")
Comment était-ce. J'ai expliqué comment utiliser la voix. Si vous avez d'autres points que vous souhaiteriez que nous expliquions, veuillez les laisser dans les commentaires ou sur le serveur.
Dans le prochain article, j'espère expliquer le cadre des commandes.
Eh bien.