[PYTHON] J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié

Je suis un nouveau diplômé en 2020 et travaille dans l'informatique. Puisqu'il s'agit de mon premier article sur Qiita, je pense que certains points ne peuvent être atteints, mais merci.

Objectif

J'étais accro à la création de bots en utilisant discordApi, alors j'ai essayé de faire un bot comme un titre pour m'entraîner au scraping.

Environnement d'exécution

Windows

VPS

procédure

Construisez sur Windows et vérifiez le fonctionnement du bot

J'omettrai l'acquisition de token de bot car il est beaucoup écrit dans d'autres articles. Installez la bibliothèque utilisée par la commande suivante pip install beautifulsoup4 pip install requests pip install discord Le site ciblé pour le grattage cette fois est Nouveau site de contrôle des infections à virus Corona à Tokyo. Tout d'abord, vérifions si vous pouvez obtenir les données souhaitées avec Beautiful Soup. Le code source est le suivant.

soup.py



import requests
from bs4 import BeautifulSoup

#Obtenez des données en vous connectant à l'URL avec get
res= requests.get("https://stopcovid19.metro.tokyo.lg.jp/cards/number-of-confirmed-cases/")

#Objet de magasin
soup = BeautifulSoup(res.text,"html.parser")

#Filtrez par l'étiquette et la classe de la pièce que vous voulez, supprimez la pièce qui n'utilise pas d'extrait
con = soup.find("span",class_="DataView-DataInfo-summary")
con=soup.find("small",class_="DataView-DataInfo-summary-unit").extract()

text=con.get_text()

text= text.strip()


print(text+"Est une personne")

Quand j'essaye de faire ça image.png J'ai pu l'obtenir fermement et j'ai pu effacer les blancs.

Ensuite, nous intégrerons cela dans le programme de bot discord. En utilisant la fonction de boucle incluse dans discord.py, j'ai créé un programme qui effectue une boucle toutes les 60 secondes, puis gratte et publie sur le canal de texte à l'heure spécifiée. La source est la suivante.

bot.py


#coding:UTF-8
import discord
from discord.ext import tasks
from datetime import datetime
import requests
from bs4 import BeautifulSoup

TOKEN = "hoge" #jeton
CHANNEL_ID = hoge #Identifiant de la chaine

#Générer les objets nécessaires à la connexion
client = discord.Client()

#Boucle une fois toutes les 60 secondes
@tasks.loop(seconds=60)
async def loop():    
    now = datetime.now().strftime('%H:%M')
    
    if now == '20:05':
        await client.wait_until_ready()
        channel = client.get_channel(CHANNEL_ID)
        #Le code précédent(soup.py)
        res= requests.get("https://stopcovid19.metro.tokyo.lg.jp/cards/number-of-confirmed-cases/")
        soup = BeautifulSoup(res.text,"html.parser")
        con = soup.find("span",class_="DataView-DataInfo-summary")
        con=soup.find("small",class_="DataView-DataInfo-summary-unit").extract()
        text=con.get_text()
        text= text.strip() 

        await channel.send("Le nombre de personnes infectées à Tokyo aujourd'hui"+text+"Est une personne") 

 #Partie bonus. Possibilité de renvoyer des commentaires en réponse à un mot spécifié
@client.event
async def on_message(message):
    #Ignorer si l'expéditeur du message est Bot
    if message.author.bot:
        return
    #Si vous dites "Shinjuku", "Dense" sera retourné
    if message.content == 'Shinjuku':
        await message.channel.send('Dense')
    
    if message.content == 'Quartier Edogawa':
        await message.channel.send('Dense')

#Exécution du traitement en boucle
loop.start()
#Lancement du bot
client.run(TOKEN)

L'heure est fixée à 20h05 car on estime que le nombre de personnes infectées sur le site utilisé cette fois-ci sera mis à jour à 20h00. Résultat d'exécution image.png

Transport vers Docker

docker run -it --name hoge python /bin/bash Créez un environnement python avec docker exec -it hoge bash Je suis entré et j'ai commencé à travailler. Tout d'abord, installez les bibliothèques nécessaires avec pip. pip install beautifulsoup4 pip install requests pip install discord Je ne peux pas éditer sans vim apt-get update apt-get install vim Je vais le mettre. Parce que le fuseau horaire par défaut est UTC ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime Utilisez cette commande pour modifier le fuseau horaire. Après cela, créez un dossier approprié, créez bot.py dedans et copiez et collez la source. Ceci termine. Si vous le démarrez avec python bot.py, le bot démarrera sur la discorde et rapportera le nombre de personnes infectées par Corona aujourd'hui à Tokyo à l'heure spécifiée!

Points d'amélioration

Cette fois, nous supposons que le site sera mis à jour à 20h00 et prendrons une décision définitive, mais la forme idéale est que le site sera mis à jour et le scraping sera effectué et le bot le rapportera. Dans la boucle, j'ai pensé qu'il serait possible d'écrire un programme qui compare les données acquises dans cette boucle avec les données acquises la dernière fois, le met à jour si cela correspond, et le bot le signale, donc s'il s'améliore, un autre article Je publierai tout ensemble.

Recommended Posts

J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
[Concept] bot qui publie une notification du début de la diffusion en direct de Nico Nico en direct sur Discord sur discord.py
Créez un BOT qui raccourcit l'URL Discord
Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord
Exécutons la commande à temps avec le bot discord
Obtenir des commentaires sur Nico Nico Live Broadcast
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Retour sur l'histoire des expressions qui renvoient somme de carré à Pythonic
J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
Créez un BOT qui raccourcit l'URL Discord
Publié le nombre de nouveaux positifs corona à Tokyo sur Slack (déployés sur Heroku)
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord
Exécutons la commande à temps avec le bot discord
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.
Une fonction qui mesure le temps de traitement d'une méthode en python
J'ai fait un bot mou qui m'informe de la température
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Depuis que j'ai commencé à travailler à des moments différents, j'ai créé un Bot qui me dit l'heure de quitter le travail
Comptez le nombre de fois que deux valeurs apparaissent simultanément dans un élément de type itérateur Python 3
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai essayé de mesurer le temps d'attente de la file d'attente d'exécution d'un processus sous Linux
Obtenez une instance datetime à tout moment de la journée en Python
J'ai créé un script pour vérifier si l'anglais est entré dans la position spécifiée du fichier JSON en Python.
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
J'ai essayé de prédire le nombre de personnes infectées par le virus corona en tenant compte de l'effet de s'abstenir de sortir
Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Un programme qui envoie une quantité fixe de courrier à un moment spécifié par Python
Au moment de la mise à jour de python avec ubuntu
Un script python qui obtient le nombre de travaux pour une condition spécifiée sur Indeed.com
[Exemple d'amélioration de Python] Apprentissage des bases de Python sur un site gratuit en 2 semaines
Un modèle personnellement utilisé pour créer Discord BOT en Python (Notes)
[Python] Un programme qui trouve le nombre d'étapes le plus court dans un jeu qui traverse les nuages
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
J'ai créé un programme en Python qui change les données de 1 minute de FX en une heure arbitraire (1 heure, etc.)
J'ai dessiné un graphique Python en utilisant des données publiques sur le nombre de nouveaux patients positifs au coronavirus (COVID-19) à Tokyo + avec un lien vers la version nationale des données de pratique
Exécuter la capture de paquets à l'heure spécifiée sur CentOS7
[Python] Un programme qui compte le nombre de vallées
J'ai essayé de trouver la tendance du nombre de navires dans la baie de Tokyo à partir d'images satellites.
[Concept] bot qui publie une notification du début de la diffusion en direct de Nico Nico en direct sur Discord sur discord.py
J'ai essayé de créer un script qui retrace les tweets d'un utilisateur spécifique sur Twitter et enregistre l'image publiée à la fois