[PYTHON] Création d'un bot Discord pour vous informer des mises à jour pour devenir romancier

introduction

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.

environnement

Préparation

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.

créer

De base

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.

boucle

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)

Traitement API

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.

Renforcement du processus de démarrage

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)

prime

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.

référence

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

Création d'un bot Discord pour vous informer des mises à jour pour devenir romancier
Création d'un LINE BOT pour notifier d'autres concours AtCoder à l'aide d'AWS
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Comment notifier les canaux Discord en Python
Si vous voulez créer un bot discord avec python, utilisons un framework
Création d'un module pour surveiller les mises à jour des fichiers et des URL
Créez un BOT qui raccourcit l'URL Discord
Faisons un robot Discord.
J'ai fait un robot discord
Si vous souhaitez devenir data scientist, commencez par Kaggle
Création d'un service qui vous permet de rechercher des données J-League
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Comment créer un bot slack
Comment envoyer une image visualisée des données créées en Python à Typetalk
Créez un Discord Bot qui peut rechercher et coller des images
[Python] Si vous souhaitez dessiner un diagramme de dispersion de plusieurs clusters
J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent