[PYTHON] Migrieren Sie einfach den Discch.py 0.X-Echobot auf 1.X.

Hintergrund

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!

Umgebung

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.

Echobot-Sanierung

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.

Während der Reparatur reparieren

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.

Bonus

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.

Referenzseite

** 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

Migrieren Sie einfach den Discch.py 0.X-Echobot auf 1.X.
Begriffe, die eng mit dem X-Fenstersystem verwandt sind
Excel X Python Die schnellste Arbeitstechnik
[Algorithmus x Python] Verwendung der Liste
Einführung in discord.py (2)
Wie man Kaldi mit JUST Corpus trainiert
Fügen Sie einfach den Treiber mit dem Mixer zum Formschlüssel hinzu
Der Weg nach Pythonista
Der Weg nach Djangoist