[PYTHON] Erstellt einen Discord-Bot, um Sie über Aktualisierungen zu informieren und Romanautor zu werden

Einführung

Gibt es nicht Schriftsteller werden? Häufig morphologische Analyse oder Scraping Berechnen Sie die durchschnittliche Anzahl der Zeichen im Titel Das mache ich. Mein Favorit "Shangri-La Frontier" ist ein unregelmäßiges Update, daher lade ich die Tabelle alle zwei Minuten neu, da ich nicht weiß, wann sie aktualisiert wird. Sie müssen nach Updates suchen. Das ist sehr ärgerlich, deshalb habe ich beschlossen, einen Bot zu erstellen, der mich wissen lässt, ob Discord geöffnet ist.

Umgebung

Vorbereitung

Gehen Sie zu hier und erhalten Sie ein Token von Bot-> Build-A-Bot in einer neuen Anwendung, überprüfen Sie den Bot in OAuth2 und überprüfen Sie den Bot in der Basis-Zwietracht Zum Server einladen.

erstellen

Basic

Ich werde vorerst den grundlegenden Teil machen

DiscordBot.py


import discord
TOKEN = '****************'
CHANNEL_ID = ***************** #Geben Sie die ID des Heimatkanals ein
client = discord.Client()

@client.event
async def on_ready():
    await channel.send("on ready")

client.run(TOKEN)

Ich habe einen einfachen Bot, der beim Start nur "on ready" sagt.

Schleife

Als nächstes machen wir den Loop-Teil. Schleife mit task.loop und drücke die API mit ~~ aiohttp einmal alle 10 Sekunden ~~ Anfragen. [^ 1]

DiscordBot.py


import discord
from discord.ext import tasks
import aiohttp
TOKEN = '****************'
CHANNEL_ID = ***************** #Geben Sie die ID des Heimatkanals ein
client = discord.Client()

@client.event
async def on_ready():
    loop.start()
    await channel.send("on ready")

@tasks.loop(seconds=10)
async def loop():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:

client.run(TOKEN)

API-Verarbeitung

Vergleichen Sie das "letzte Veröffentlichungsdatum der zurückgegebenen API" mit dem "letzten Veröffentlichungsdatum der API, die Sie getroffen haben (vor 10 Sekunden)". Wenn sie unterschiedlich sind, beurteilen Sie, dass sie aktualisiert wurde, und senden Sie eine Nachricht an den Kanal.

DiscordBot.py


import discord
from discord.ext import tasks
import aiohttp
import yaml
TOKEN = '****************'
CHANNEL_ID = ***************** #Geben Sie die ID des Heimatkanals ein
client = discord.Client()
lastup = "null"

@client.event
async def on_ready():
    loop.start()
    await channel.send("on ready")

@tasks.loop(seconds=10)
async def loop():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:
            new_lastup = yaml.safe_load(await r.text())[1]["general_lastup"]
            channel = client.get_channel(CHANNEL_ID)
            global lastup
            if lastup != new_lastup:
                lastup = new_lastup
                await channel.send('Shanflo Update kam')
client.run(TOKEN)

Derzeit haben wir einen Bot, der uns benachrichtigt, wenn er aktualisiert wird. Das Problem dabei ist jedoch, dass "** die Variable ** lastup ** beim Start auf null gesetzt wird, sodass Sie die Illusion erhalten, dass "ein Update angekommen ist" in der ersten Runde der Schleife unmittelbar nach dem Start ** ". es gibt.

Verstärkung der Inbetriebnahme

Sie können es also lösen, indem Sie beim Start einmal auf die API klicken und sie "lastup" zuweisen.

DiscordBot.py


import discord
from discord.ext import tasks
import aiohttp
import yaml
import datetime
TOKEN = '****************'
CHANNEL_ID = ***************** #Geben Sie die ID des Heimatkanals ein
client = discord.Client()
lastup = "null"

@client.event
async def on_ready():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:
            global lastup
            lastup = yaml.safe_load(await r.text())[1]["general_lastup"]
    loop.start()
    channel = client.get_channel(CHANNEL_ID)
    await channel.send("on ready")
    await channel.send("Zuletzt aktualisiert:" + str(lastup)) #Übrigens habe ich das Datum und die Uhrzeit des letzten Updates beim Start angegeben

@tasks.loop(seconds=10)
async def loop():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:
            new_lastup = yaml.safe_load(await r.text())[1]["general_lastup"]
            channel = client.get_channel(CHANNEL_ID)
            global lastup
            if lastup != new_lastup:
                lastup = new_lastup
                await channel.send('Shanflo Update kam')
client.run(TOKEN)

Bonus

Man kann sagen, dass dies vollständig ist, aber obwohl es sich um einen Chatbot handelt, hat er nur eine Funktion zum Übermitteln von Informationen in eine Richtung, und es gibt keinen Befehl, der von hier aus gesendet werden kann. Daher werde ich einen Befehl hinzufügen. [Wie lange ist es her seit dem letzten Update? ] Ich werde mit einem Timedelta-Objekt antworten.

DiscordBot.py


import discord
from discord.ext import tasks
import aiohttp
import yaml
import datetime
TOKEN = '****************'
CHANNEL_ID = ***************** #Geben Sie die ID des Heimatkanals ein
client = discord.Client()
lastup = "null"

@client.event
async def on_ready():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:
            global lastup
            lastup = yaml.safe_load(await r.text())[1]["general_lastup"]
    loop.start()
    channel = client.get_channel(CHANNEL_ID)
    await channel.send("on ready")
    await channel.send("Zuletzt aktualisiert:" + str(lastup)) #Übrigens habe ich das Datum und die Uhrzeit des letzten Updates beim Start angegeben

@client.event
async def on_message(message):
    if message.author.bot:
        return
    if message.content == '[Wie lange ist es her seit dem letzten Update?]':
        dif = datetime.datetime.now() - lastup
        await message.channel.send(dif)

@tasks.loop(seconds=10)
async def loop():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://api.syosetu.com/novelapi/api/?ncode=n6169dz&of=gl') as r:
            new_lastup = yaml.safe_load(await r.text())[1]["general_lastup"]
            channel = client.get_channel(CHANNEL_ID)
            global lastup
            if lastup != new_lastup:
                lastup = new_lastup
                await channel.send('Shanflo Update kam')
client.run(TOKEN)

Dies ist abgeschlossen.

Referenz

[^ 1]: ~~ Es scheint, dass Aiohttp, das asynchron verarbeitet werden kann, besser ist, aber ich bin mir nicht sicher und dachte, dass eine kleine Verzögerung akzeptabel wäre, also habe ich Anfragen gestellt ~~ Ich habe Aiohttp verwendet .. Es ist fast eine vollständige Kopie des Discord.py-Dokuments.

Recommended Posts

Erstellt einen Discord-Bot, um Sie über Aktualisierungen zu informieren und Romanautor zu werden
Erstellen eines LINE BOT, um zusätzliche AtCoder-Wettbewerbe mit AWS zu benachrichtigen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
So benachrichtigen Sie Discord-Kanäle in Python
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Erstellt ein Modul zur Überwachung von Datei- und URL-Aktualisierungen
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Machen wir einen Discord Bot.
Ich habe einen Zwietrachtbot gemacht
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Erstellt einen Dienst, mit dem Sie J-League-Daten durchsuchen können
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Wie man einen lockeren Bot macht
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
Erstellen Sie einen Discord Bot, der Bilder suchen und einfügen kann
[Python] Wenn Sie ein Streudiagramm mehrerer Cluster zeichnen möchten
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen