Créez une application de gestion automatique des notes pour Tenho Private Room avec le bot LINE et Python Partie 1
Contexte
- En raison de la propagation de l'infection COVID-19, Jakuso a été bloqué et a perdu sa place.Nous avons commencé à jouer au mahjong dans la salle privée de Tenho.
- Au début, j'ai copié et enregistré manuellement le journal dans Google Docs pour la gestion des notes, mais cela devenait de plus en plus gênant lorsque je jouais au mahjong tous les jours.
- Par conséquent, j'ai décidé de créer une application en Python qui télécharge automatiquement les journaux (scrape), les agrège et (et affiche les graphiques) automatiquement.
- De plus, nous avons fait de cet outil un robot LINE afin que tous les participants puissent voir les informations à tout moment.
Over View
Tableau de présentation de l'application
- L'application comprend principalement les deux fonctions suivantes.
- Téléchargez et enregistrez automatiquement le journal Tenho (flèche violette sur la figure)
- Répondre aux informations agrégées en réponse à la demande de l'utilisateur (LINE) (flèche verte sur la figure)
- Cette fois, je vais vous expliquer la première application (programme).
Image complète
- En réponse au mot de réveil (ici, "shukei" ou "gurafu"), le menu de demande (ici, "balance", "ordre d'arrivée", "puce", "aujourd'hui]) s'affiche.
- Si vous sélectionnez "Balance", le score total, le nombre de parties et le nombre total de jetons, qui est la somme de tous les journaux passés, seront affichés.
- À partir du mot de réveil "Gurafu", vous pouvez afficher un graphique des scores passés et des transitions de jetons.
- Bien que non implémenté cette fois, l'équilibre des parties directes et le score moyen peuvent être intéressants.
Langages, outils, services, modules, etc.
Langue utilisée
- Python 3.7.3
- Anaconda est utilisé dans l'environnement de développement local, mais Anaconda n'est pas pertinent car l'application finale est exécutée sur Heroku.
Outils et services utilisés
Cette fois, j'ai créé une application utilisant les services suivants qui peuvent être utilisés gratuitement.
Heroku
- Maison Heroku
- Service pour exécuter des programmes sur le Web
- Cette fois, nous l'utiliserons comme deux environnements d'exécution, l'application d'exécution du bot LINE et le script de scraping de journal.
LINE bot (LINE Messaging API)
- [Site Web officiel de l'API LINE Messaging](https://developers.line.biz/ja/docs/messaging-api/overview/#messaging-api mécanisme)
- Vous pouvez utiliser le bot LINE créé avec Python
- J'ai choisi LINE comme interface utilisateur cette fois.
Dropbox API
- J'ai utilisé DropBox pour stocker le journal.
- L'API vous permet de manipuler des fichiers et des dossiers sur Dropbox avec Python
- Au départ, j'ai créé une application en utilisant l'API de Google Drive (et Google Docs) que j'utilisais à l'origine, mais le fichier de document Google (.gdocs) ne prend pas en charge l'API (je ne l'ai tout simplement pas trouvée). ?) Alors j'ai arrêté. De plus, lorsque j'édite un fichier texte (.txt) avec Google Docs, je suis assez frustré par la spécification mystère qui change en .gdocs, donc je ne pense pas que je vais l'utiliser à nouveau.
- À cet égard, l'API de Dropbox était très simple et facile à comprendre, et même moi, un débutant, pouvions l'utiliser immédiatement. recommandation! !! !!
Stockage AWS S3
- Service cloud Amazon
- Sauvegardez temporairement le graphique écrit en Python en réponse à la demande de LINE, et affichez l'image sur LINE à partir du lien du fichier.
- Vous pourrez peut-être utiliser Dropbox sans utiliser S3 (j'ai utilisé S3 avant de commencer à utiliser Dropbox, j'ai donc confondu plusieurs services). Je suis désolé, c'est difficile à comprendre (transpiration
Module utilisé
- Flask==0.12.2
- line-bot-sdk==1.8.0
- boto3==1.9.4
- pandas==0.24.2
- matplotlib==3.0.3
- numpy==1.16.2
- dropbox==10.1.2
Obtenir le journal de la chambre privée Tenho
Cette fois, je suis au point où je récupère le journal de la salle privée Tenho en grattant.
Je publierai de plus en plus.
Synopsis
- Le journal Tenho a été téléchargé par la méthode décrite dans Tenho Official / Log.
- En particulier,
"https://tenhou.net/sc/raw/dat/sca{yyyymmdd}.log.gz"
Téléchargez le fichier .gz (scrape.gz) à partir de l'URL ({yyyymmdd} est la date du journal à acquérir) en utilisant urllib, développez le contenu et créez-en un fichier .txt (scrape.txt) une fois. __ Le journal de la salle privée est sca__.
- Ensuite, nous voulons pouvoir accéder aux journaux depuis le serveur d'Heroku à l'avenir, afin que nous puissions gérer les journaux avec Dropbox.
- Je vais télécharger le fichier journal enregistré dans Dropbox, ajouter le journal de la journée, puis le télécharger à nouveau sur Dropbox.
- Il n'est pas bon d'exécuter manuellement le script tous les jours, donc j'obtiendrai automatiquement le journal de la veille à 0h30 tous les jours. L'exécution périodique du script peut être définie dans Heroku. Pour la méthode d'exécution périodique, je me suis référé à Exécution périodique de météo Python avec Heroku -Qiita.
Exemple de code
- Tous les modules doivent être inclus par défaut dans l'environnement Anaconda.
- S'il n'y a rien, installez-le avec pip ou conda.
- download4 est un module auto-conçu et est utilisé pour échanger des fichiers avec Dropbox (les détails seront expliqués plus tard).
# scrape_log.py
# coding *-utf-8-*
import os
import pprint
import time
import urllib.error
import urllib.request
import gzip
import shutil
import datetime
from datetime import date,timedelta
import download4
def download_file(url, dst_path):
try:
with urllib.request.urlopen(url) as web_file:
data = web_file.read()
with open(dst_path, mode='wb') as local_file:
local_file.write(data)
except urllib.error.URLError as e:
print(e)
- Partie principale
- Je voudrais obtenir le journal de la veille de l'exécution du script, mais puisque l'heure du serveur de __Heroku (environnement d'exécution) est ici UTC (heure standard mondiale), il est nécessaire de considérer l'effet du décalage horaire de 9 heures. Il y a !! __. 0:30 heure du Japon est 15:30 de __ la veille de __ en UTC, vous devriez donc obtenir un journal du jour où le script est exécuté. (À propos, dans l'environnement de test local, le journal est récupéré un jour avant la date d'exécution, donc dans ce cas, il est décalé d'un jour en utilisant
timedelta``` comme commenté.
- Puisque la règle est définie pour gratter le journal Tenho dans le fichier
.gz, après avoir gratté le fichier `` .gz
, le fichier `` .txt``` Il a été réécrit en.
- Utilisez la méthode
download '' définie sur le module self-made download4 pour télécharger le fichier .txt (ici
logvol1.txt '') qui stocke les journaux passés de Dropbox et grattez-le. Après avoir ajouté le journal de la veille, retéléchargez avec la méthode upload
.
- Nous utilisons `` if``` pour écrire uniquement les logs de notre salle privée (exemple: C1234).
if __name__ == "__main__":
dt_now = datetime.datetime.now()
yyyymmdd = dt_now.strftime('%Y%m%d')
# dt_1day_past = dt_now - timedelta(days=1) #Trouver le journal il y a 1 heure
# yyyymmdd = dt_1day_past.strftime('%Y%m%d')
print(yyyymmdd)
fname = 'sca{}.log.gz'.format(yyyymmdd)
URL = "https://tenhou.net/sc/raw/dat/"+fname
dst_path = 'scrape.gz'
download_file(URL, dst_path)
with gzip.open('scrape.gz', mode='r') as f_in:
with open('scrape.txt', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
with open('scrape.txt') as f:
lines = f.readlines()
download4.download("/logvol1.txt","temp.txt")
with open("temp.txt",'a') as f:
f.write("{}\n".format(yyyymmdd))
for line in lines:
roomid = line.split()[0]
if roomid == "C1234": #ID de la chambre privée
f.write("{}".format(line))
print(line)
download4.upload("temp.txt","/logvol1.txt")
- Contenu du module personnalisé
download4```
- C'est juste une fonction de téléchargement et de téléchargement avec Dropbox.
- Reportez-vous au site ci-dessous pour l'enregistrement de l'utilisation de l'API Dropbox et la création de dossiers d'application.
- Lorsque vous créez une application, un dossier nommé "Apps" sera créé dans le répertoire personnel de Dropbox, et il semble que le dossier de travail se trouvera directement en dessous.
- Lors du téléchargement de l'API Dropbox (``
download_file (self, file_from, file_to '')
), il semble que vous ne pouvez pas télécharger sans
`file_to```, vous devez donc préparer un fichier à l'avance. fait.
- De plus,
`file_from``` devait être préfixé par`
/
, comme
download ('/ logvol1.txt'," log.txt ")
``. .. Vous pouvez maintenant vous référer au dossier de travail (directement sous) du dossier de l'application.
- REFERENCES
- [Télécharger des fichiers du script python vers Dropbox](Télécharger des fichiers depuis https://www.it-swarm.dev/ja/python/python-script vers dropbox / 1047611873 /)
- Manipuler les dossiers Dropbox à l'aide de l'API Dropbox (en cours d'investigation)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dropbox
class TransferData:
def __init__(self, access_token):
self.access_token = access_token
def upload_file(self, file_from, file_to):
"""upload a file to Dropbox using API v2
"""
dbx = dropbox.Dropbox(self.access_token)
with open(file_from, 'rb') as f:
dbx.files_upload(f.read(), file_to,mode=dropbox.files.WriteMode.overwrite)
def download_file(self,file_from,file_to):
"""download a file to Dropbox using API v2
"""
dbx = dropbox.Dropbox(self.access_token)
with open(file_to, 'rb') as f:
dbx.files_download_to_file(file_to, file_from)
def upload(file_from,file_to):
access_token = "Hogehoge" #Jeton d'accès au dossier de l'application
transferData = TransferData(access_token)
# API v2
transferData.upload_file(file_from, file_to)
def download(file_from,file_to):
access_token = "Hogehoge" #Jeton d'accès au dossier de l'application
transferData = TransferData(access_token)
# API v2
transferData.download_file(file_from, file_to)
if __name__ == '__main__':
# upload()
download('/logvol1.txt',"log.txt")
- Après cela, si vous transmettez ces fichiers à Heroku et les exécutez automatiquement à intervalles réguliers, le fichier journal (`` logvol1.txt '') sur Dropbox sera mis à jour chaque jour.
- Reportez-vous ici pour l'utilisation et les paramètres d'Heroku.
- [Pour les débutants] Développement Easy LINE Bot dans l'environnement Heroku en utilisant Python](https://miyabi-lab.space/blog/21)
- Exécution périodique de Python météo sur Heroku -Qiita
en conclusion
- Cette fois, c'était à la merci de Tenho Log.
- Merci à nos ancêtres pour votre référence.
- La prochaine fois, j'écrirai sur la partie réponse du bot LINE.
- Je ne suis pas moi-même une entreprise principale de programmation, donc si vous avez des questions sur l'écriture de styles ou de techniques telles que "Je devrais faire plus!" Ou "Ce n'est pas une bonne sécurité!", Veuillez commenter! !! !! !!
p.s.
- Ceci est mon premier article, mais il est difficile à écrire. .. .. (Je vais le réparer petit à petit lol)
- Mahjong est amusant!
- Bien sûr, Jakuso est amusant, mais l'environnement dans lequel vous pouvez toujours jouer au mahjong avec vos amis dispersés est trop génial!
- Survivons au COVID-19 à Tenho!