Das Programm, mit dem Voiceroid Discord-Nachrichten mit Python 3.6 lesen konnte, war nach Python 3.7 nicht mehr verwendbar. (Von vor einem Jahr) Außerdem war die Version von Discord.py so alt, dass ich sie aktualisieren wollte. (Es wurde festgestellt, dass es nach dem Update nicht funktioniert hat)
Ich wollte Python zum ersten Mal seit langer Zeit wieder verwenden, also lasst es uns beheben!
Die diesmal angenommene Umgebung ist wie folgt. ・ Python 3.7.4 ・ Discord.py 1.2.4 ・ Windows10
Weitere Informationen zu den Einstellungen für die Python-Umgebung finden Sie auf anderen Seiten. Bitte benutzen Sie Ihren Lieblingseditor usw.
Ich möchte einen einfachen Echo-Bot machen. Ich habe es das letzte Mal mit Discord.py 0.x gemacht, also konnte ich es jetzt nicht verwenden.
EchoBot.py
# Discord.py 0.x
import discord
client = discord.Client()
@client.event
async def on_ready():
print("-"*35)
print("user name:", client.user.name)
print("user id:", client.user.id)
print("-"*35)
@client.event
async def on_message(message):
#Reagiere nicht auf deine eigene Nachricht
if client.user != message.author:
#Eine Nachricht schreiben
m= message.author.name +"Die Nachricht gesendet von"+message.content+"ist"
#Senden Sie eine Nachricht an den Kanal, an den die Nachricht gesendet wurde
await client.send_message(message.channel, m)
client.run("BOT-Token")
Es ist so einfach wie das Zurücksenden einer Nachricht von einer anderen Person als dem Bot. Wir werden dies so ändern, dass es mit 1.X übereinstimmt. Diejenige, die dieses Mal geändert werden muss, befindet sich in "on_message".
EchoBot_after.py
@client.event
async def on_message(message):
if message.author.bot: #Ignorieren Sie, wenn der Absender der Nachricht Bot ist
return
#An geposteten Kanal senden
await message.channel.send(f"{message.author.name}Nachricht von{message.content}ist")
Da es sich um einen Echo-Bot handelt, ist diese Art der Modifikation ausreichend, scheint jedoch für eine multifunktionale Anwendung schwierig zu sein.
Hier gibt es viele Umschreibungen
EchoBot.py
import discord
import re
client = discord.Client()
CHANNEL_ID = "ID des Hauptkanals"
@client.event
async def on_ready(): #ID und Name auf der Startkonsole anzeigen
print("-"*50)
print(client.user.name) # User Name
print(str(client.user.id)) # User ID
print(""*50)
print("Bot-Einladungs-URL")
strURL = "https://discordapp.com/oauth2/authorize?&client_id="
strURL += str(client.user.id) + "&scope=bot&permissions=0"
print(strURL)
print("-"*50)
print(f"client : {client}")
print(f"client.user : {client.user}")
print("-"*50)
channel = client.get_channel(CHANNEL_ID)
await channel.send("Es hat begonnen.") #Benachrichtigen, wenn gestartet
@client.event
async def on_message(message): #Verarbeitung, die beim Empfang einer Nachricht ausgeführt wird
if message.author.bot: #Ignorieren Sie, wenn der Absender der Nachricht Bot ist
return
if client.user in message.mentions: #Ich werde antworten, wenn eine Antwort kommt
await message.channel.send( f"{message.author.mention}namens?") #Senden Sie eine Antwortnachricht
return
Msg = message.content
if re.search(r"http(.*)", Msg):
Msg = re.sub(r"http(.*)", ", URL unten", Msg) #URL weggelassen
await message.channel.send(f"{message.author.name}Nachricht von{Msg}ist")
client.run("BOT-Token")
Dies vervollständigt den Echo-Bot. Wenn du den Teil "message.author.name" in "message.author.nick" änderst, kannst du den Spitznamen der Person in der Gilde erhalten.
Dies ist eine Auswahl von Client-Funktionen (Funktionen, von denen ich glaube, dass ich sie persönlich verwenden werde), die ich erstellt habe, um verschiedene Dinge während der Aktualisierung zu überprüfen.
DiscordTest.py
import discord
import re
import datetime
import sys
from inspect import currentframe
client = discord.Client()
CHANNEL_ID = "Kanal ID"
@client.event
async def on_ready(): #ID und Name auf der Startkonsole anzeigen
now = datetime.datetime.now()
print(now.strftime('%Y/%m/%d %H:%M:%S'))
print("-"*50)
print(client.user.name) # User Name
print(str(client.user.id)) # User ID
print(""*50)
print("Bot-Einladungs-URL")
strURL = "https://discordapp.com/oauth2/authorize?&client_id="
strURL += str(client.user.id) + "&scope=bot&permissions=0"
print(strURL)
print("-"*50)
print(f"client : {client}")
print(f"client.user : {client.user}")
print("-"*50)
channel = client.get_channel(CHANNEL_ID)
await channel.send("Es hat begonnen.") #Benachrichtigen, wenn gestartet
@client.event
async def on_typing(channel, user, when): #Jemand versucht eine Nachricht zu schreiben
printDate(sys._getframe().f_code.co_name, channel, user, when)
@client.event
async def on_message(message): #Verarbeitung, die beim Empfang einer Nachricht ausgeführt wird
printDate(sys._getframe().f_code.co_name, message)
if message.author.bot: #Ignorieren Sie, wenn der Absender der Nachricht Bot ist
return
if client.user in message.mentions: #Ich werde antworten, wenn eine Antwort kommt
reply = f"{message.author.mention}namens?" #Inhalt antworten
await message.channel.send(reply) #Senden Sie eine Antwortnachricht
return
if re.search(r"Schneidbrett", message.content): #Stellen Sie fest, ob der Befehl enthalten ist
e = discord.Embed(title='KOROSUZO☆')
await message.channel.send('Hast du etwas gesagt?', embed=e) #
return
Msg = message.content
if re.search(r"http(.*)", Msg):
Msg = re.sub(r"http(.*)", ", URL unten", Msg) #URL weggelassen
await message.channel.send(f"{message.author.nick}Nachricht von{Msg}ist")
@client.event
async def on_guild_role_create(role): #Was passiert, wenn eine Gildenregel erstellt wird?
printDate(sys._getframe().f_code.co_name, role)
channel = client.get_channel(CHANNEL_ID)
await channel.send(f"{role}Wurde erstellt")
@client.event
async def on_user_update(before, after):
printDate(sys._getframe().f_code.co_name, before, after)
@client.event
async def on_member_update(before, after): #Verarbeitung, die ausgeführt werden soll, wenn sich die Mitgliedsinformationen ändern
printDate(sys._getframe().f_code.co_name, before, after)
@client.event
async def on_guild_role_delete(role):
printDate(sys._getframe().f_code.co_name, role)
channel = client.get_channel(CHANNEL_ID)
await channel.send(f"{role}Wurde gelöscht")
@client.event
async def on_voice_state_update(member, before, after):
channel = client.get_channel(CHANNEL_ID)
printDate(sys._getframe().f_code.co_name, member, before, after)
#Verlasse den Sprachkanal
if after.channel is None:
await channel.send(f"{member}Aber{before.channel.name}Ich verließ den Raum von")
return
#Treten Sie dem Sprachkanal bei
if before.channel is None and after.channel is not None:
await channel.send(f"{member}Aber{after.channel.name}Ich nahm teil an")
return
#Sprachkanal verschieben
if before.channel != after.channel:
await channel.send(f"{member}Aber{after.channel.name}Umgezogen nach")
return
@client.event
async def on_guild_update(before, after): #Was tun, wenn die Gilde aktualisiert wird?
channel = client.get_channel(CHANNEL_ID)
printDate(sys._getframe().f_code.co_name, before, after)
await channel.send(f" {before}Aber{after}Gewechselt zu")
@client.event
async def on_guild_channel_delete(channel): #Wenn ein Kanal gelöscht wird
printDate(sys._getframe().f_code.co_name, channel)
@client.event
async def on_guild_channel_create(channel): #Der Kanal wurde erstellt
printDate(sys._getframe().f_code.co_name, channel)
@client.event
async def on_guild_channel_pins_update(channel, lastPin): #Wenn eine Nachricht fixiert oder nicht fixiert ist
print(sys._getframe().f_code.co_name)
chkprint(channel, lastPin)
if lastPin is not None:
print(f"lastPin +9h : {lastPin + datetime.timedelta(hours=9)}") #Nach japanischer Zeit korrigiert
print("-"*50)
def printDate(name, *args):
print(name)
now = datetime.datetime.now()
print(now.strftime('%Y/%m/%d %H:%M:%S'))
chkprint(*args)
print("-"*50)
def chkprint(*args):
names = {id(v): k for k, v in currentframe().f_back.f_locals.items()}
print(', '.join(names.get(id(arg), '???') + ' = ' + repr(arg) for arg in args))
client.run('BOT-Token')
Es gab eine Funktion, um den eigenen Status zu ändern, den Namen und die Regeln der Gilde zu ändern und auf verschiedene Arten zu reagieren, aber ich sammelte die Teile, die ich verwenden konnte.
** So erhalten Sie den Namen einer Funktion aus einer [Python] -Funktion ** https://qiita.com/abeken0713/items/77420c8c05e53628199a
** Ideal für das Debuggen von Drucken! Eine Funktion wurde implementiert, die Variablennamen gleichzeitig mit den darin enthaltenen Werten als Zeichenfolgen druckt. ** https://qiita.com/AnchorBlues/items/f7725ba87ce349cb0382
Discord.py https://discordpy.readthedocs.io/ja/latest/migrating.html#
Recommended Posts