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.
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.
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.
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)
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.
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)
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.
[^ 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