Dans [Article précédent] 1, nous avons introduit un bot qui publie [Nombre de personnes positives pour le nouveau virus corona à Tokyo] 2 sur Slack.
Cet article est la suite de cela.
Comme indiqué ci-dessous, il a été automatiquement publié après la mise à jour des données d'aujourd'hui.
[Page où Tokyo publie des données] J'ai vérifié les données csv obtenues à partir de 2 et je les ai implémentées de sorte que s'il y a une différence, je les posterai.
[Dernière fois] 1 Appelons la méthode créée pour publier sur Slack fdap.main ()
.
Ensuite, préparez fdap.main ()
comme run2.py
comme code source à exécuter après la mise à jour de [Tokyo data] 2.
Le contenu de run2.py
.
run2.py
import run as fdap
import post
import plot
import time
import datetime
def check_data(last_no):
csv_tail_no = plot.fetch_csv().iat[-1,0] # "No"Récupère la dernière ligne d'une colonne
if int(last_no) == 0:
return False, csv_tail_no # initialize
elif int(csv_tail_no) > int(last_no):
return True, csv_tail_no
else:
return False, csv_tail_no
def main():
while True:
if "csv_tail_no" in locals(): #Après la deuxième boucle
updated, csv_tail_no = check_data(csv_tail_no)
else: #1ère boucle
updated, csv_tail_no = check_data(0)
if updated:
fdap.main() #Publier sur Slack
time.sleep(60*5) #5 minutes
if __name__ == "__main__":
main()
Dans check_data (last_no)
, vérifiez la colonne No
dans la dernière ligne de [Tokyo data] 2, et s'il y a une différence avec la confirmation précédente, décrivez le processus pour qu'il soit publié sur Slack. Faire.
En ce qui concerne la méthode de jugement de différence, cette fois, nous utilisons cette méthode dans un souci de facilité de mise en œuvre, mais il peut être plus intelligent de gratter la date et l'heure de modification du fichier. Cependant, j'ai vu [la page où les données de Tokyo sont publiées] 2 plusieurs fois, mais il semblait que la date et l'heure de la dernière mise à jour ne correspondaient pas à la date et l'heure de mise à jour des données, alors j'ai gratté la date et l'heure de mise à jour. J'ai senti que j'avais besoin de prendre d'autres mesures.
Le jugement des données est décrit pour être exécuté à intervalles réguliers. Afin de ne pas accéder aux données plus que nécessaire, je mets un sommeil de 5 minutes cette fois.
Puisque python3 run2.py
est toujours exécuté, préparez l'environnement d'exécution avec Heroku.
Préparez runtime.txt
, requirements.txt
, Procfile
.
Dans runtime.txt
, décrivez la version lors du déploiement avec Heroku.
runtime.txt
python-3.6.10
Décrivez les modules requis dans requirements.txt
.
Créé avec pip freeze> requirements.txt
.
(J'ai supprimé manuellement les modules qui semblaient inutiles, mais ils sont peut-être toujours là ...)
requirements.txt
jsonpatch==1.10
jsonpointer==1.9
python-dotenv==0.12.0
requests==2.9.1
slackbot==0.5.6
matplotlib==3.0.3
numpy==1.18.1
pandas==0.24.2
scipy==1.4.1
Procfile
décrit le nom du processus et la commande que vous souhaitez exécuter.
Procfile
c19bot: python3 run2.py
Créez un compte Heroku à l'avance.
Connectez-vous à Heroku à partir de votre navigateur et créez une nouvelle application avec un nom d'application approprié (sélectionnez Nouveau-> Créer une nouvelle application en haut à droite de l'écran).
Dans l'onglet Paramètres, sous Build packs, sélectionnez Python. Saisissez également les variables d'environnement requises (Slack Token, nom du canal, etc.) dans Config Vars.
Le reste du travail est effectué dans la CLI Heroku.
Après vous être connecté avec Heroku login
et refléter le code source à distance, le déploiement est terminé avec heroku scale [nom du processus] = 1
.
Lors du développement local, les variables d'environnement sont implémentées pour être lues à partir du fichier .env
.
Voici un exemple du code source.
from dotenv import load_dotenv
load_dotenv(dotenv_path=".env") # load local .env
import os
SLACK_TOKEN = os.environ["SLACK_TOKEN"]
USER_NAME = os.environ["USER_NAME"]
SLACK_CHANNEL = os.environ["SLACK_CHANNEL"]
CHANNEL_ID = os.environ["CHANNEL_ID"]
PNG = os.environ["PNG"]
PNG_FILE = PNG+".png "
Cette fois, vous devez enregistrer l'image (graphique du nombre de personnes positives) publiée sur Slack en tant que fichier temporaire.
Si le nom de l'image est hist.png
, vous pouvez l'enregistrer dans le répertoire courant comme PNG =" ./hist "
lors du développement local, mais lors du déploiement avec Heroku, nommez le fichier . Le paramétrer sur "/ tmp / hist"
(enregistrez-le sous / tmp
) fonctionne très bien.
Par conséquent, lors du développement local, le nom de fichier de l'image est également ajouté à l'avance à la variable d'environnement et le nom de fichier est spécifié séparément dans Heroku.
Le processus de Heroku semble être redémarré automatiquement sur une base régulière.
Référence: https://jp.heroku.com/dynos/lifecycle (cycle de vie de Heroku Dyno)
Au départ, j'ai écrit un programme pour publier les dernières informations sur Slack une fois au démarrage de python3 run2.py
.
Cependant, environ un jour après le déploiement avec Heroku, il y avait un bogue qui, d'une manière ou d'une autre, [Tokyo data] 2 était posté sur Slack même s'il n'était pas mis à jour.
Après avoir enquêté, j'ai remarqué que le processus Heroku avait peut-être été redémarré automatiquement et j'ai corrigé le programme.
Actuellement, la spécification est que lorsque python3 run2.py
est démarré, il ne sera pas publié sur Slack, mais sera publié sur Slack pour la première fois lorsque les données à Tokyo seront mises à jour après son démarrage.
[Article précédent] Dans la continuité de 1, nous avons automatisé le bot qui affiche le nombre de nouveaux positifs de virus corona à Tokyo dans Slack et l'avons déployé sur Heroku (résident).
Les informations publiées sur Slack doivent être considérées comme des informations supplémentaires uniquement, et je voudrais essayer de vérifier [Les dernières tendances en matière d'infection à Tokyo publiées sur le site officiel de Tokyo] 3 une fois par jour. Je vais.
c'est tout.
Recommended Posts