N'y a-t-il pas Devenir romancier? Fréquemment analyse morphologique ou grattage calculer le nombre moyen de caractères dans le titre C'est ce que je fais. Mon préféré "Shangri-La Frontier" est une mise à jour irrégulière, donc je recharge le tableau une fois toutes les deux minutes car je ne sais pas quand il sera mis à jour. Vous devez vérifier les mises à jour. C'est très ennuyeux, alors j'ai décidé de créer un bot qui me ferait savoir si Discord était ouvert.
Allez sur ici et obtenez un jeton par Bot-> Build-A-Bot dans une nouvelle application, vérifiez le bot dans OAuth2 et vérifiez le bot dans la base Discord Invitez sur le serveur.
Je vais faire la partie de base pour le moment
DiscordBot.py
import discord
TOKEN = '****************'
CHANNEL_ID = ***************** #Entrez l'ID du canal d'accueil
client = discord.Client()
@client.event
async def on_ready():
await channel.send("on ready")
client.run(TOKEN)
J'ai un robot simple qui dit juste «prêt» quand il démarre.
Ensuite, faisons la partie boucle. Bouclez avec tasks.loop
et appuyez sur l'API avec ~~ aiohttp une fois toutes les 10 secondes ~~ requêtes. [^ 1]
DiscordBot.py
import discord
from discord.ext import tasks
import aiohttp
TOKEN = '****************'
CHANNEL_ID = ***************** #Entrez l'ID du canal d'accueil
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)
Comparez la "dernière date de publication de l'API renvoyée" avec la "dernière date de publication de l'API que vous avez consultée (il y a 10 secondes)", et si elles sont différentes, jugez qu'elle a été mise à jour et envoyez un message au canal.
DiscordBot.py
import discord
from discord.ext import tasks
import aiohttp
import yaml
TOKEN = '****************'
CHANNEL_ID = ***************** #Entrez l'ID du canal d'accueil
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('La mise à jour Shanflo est arrivée')
client.run(TOKEN)
Pour le moment, nous avons un bot qui nous avertit de sa mise à jour.
Cependant, dans ce cas, le problème est que "** la variable ** lastup
** est définie sur null au démarrage, donc le premier tour de boucle immédiatement après le démarrage donne l'illusion qu'une mise à jour est arrivée ** ". il y a.
Ainsi, vous pouvez le résoudre en appuyant une fois sur l'API au démarrage et en l'attribuant à lastup
.
DiscordBot.py
import discord
from discord.ext import tasks
import aiohttp
import yaml
import datetime
TOKEN = '****************'
CHANNEL_ID = ***************** #Entrez l'ID du canal d'accueil
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("Dernière mise à jour:" + str(lastup)) #Au fait, je lui ai fait indiquer la date et l'heure de la dernière mise à jour au démarrage
@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('La mise à jour Shanflo est arrivée')
client.run(TOKEN)
On peut dire que c'est complet, mais même s'il s'agit d'un chatbot, il n'a qu'une fonction pour transmettre des informations dans un sens, et il n'y a pas de commande qui peut être envoyée à partir d'ici, donc j'ajouterai une commande. `[Combien de temps s'est écoulé depuis la dernière mise à jour? ] ʻJe répondrai avec un objet timedelta.
DiscordBot.py
import discord
from discord.ext import tasks
import aiohttp
import yaml
import datetime
TOKEN = '****************'
CHANNEL_ID = ***************** #Entrez l'ID du canal d'accueil
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("Dernière mise à jour:" + str(lastup)) #Au fait, je lui ai fait indiquer la date et l'heure de la dernière mise à jour au démarrage
@client.event
async def on_message(message):
if message.author.bot:
return
if message.content == '[Depuis la dernière mise à jour depuis combien de temps?]':
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('La mise à jour Shanflo est arrivée')
client.run(TOKEN)
C'est tout ce qu'on peut en dire.
[^ 1]: ~~ Il semble que aiohttp qui peut traiter de manière asynchrone soit meilleur, mais je ne suis pas sûr et j'ai pensé qu'un petit retard serait acceptable, alors j'ai fait des demandes ~~ J'ai changé pour utiliser aiohttp .. C'est presque une copie complète du document Discord.py.
Recommended Posts