Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part 1
Hintergrund
- Aufgrund der Ausbreitung der COVID-19-Infektion wurde Jakuso blockiert und verlor seinen Platz. Wir begannen in Tenhos Privatraum Set Mahjong zu spielen.
- Zuerst habe ich die Protokolle manuell in Google Text & Tabellen für die Notenverwaltung kopiert und gespeichert, aber es wurde immer schwieriger, wenn ich jeden Tag Mahjong spielte.
- Daher habe ich beschlossen, eine Anwendung in Python zu erstellen, die Protokolle automatisch herunterlädt (scrape), aggregiert und (und Diagramme anzeigt) automatisch.
- Außerdem haben wir dieses Tool zu einem LINE-Bot gemacht, damit alle Teilnehmer die Informationen jederzeit sehen können.
Over View
App-Übersichtstabelle
- Die App besteht hauptsächlich aus den folgenden zwei Funktionen.
- Laden Sie das Tenho-Protokoll automatisch herunter und speichern Sie es (lila Pfeil in der Abbildung).
- Antworten Sie auf aggregierte Informationen als Antwort auf eine Benutzeranforderung (LINE) (grüner Pfeil in der Abbildung).
- Dieses Mal werde ich die erste Anwendung (Programm) erklären.
Vollständiges Bild
- Als Antwort auf das Weckwort (hier "shukei" oder "gurafu") wird das Anforderungsmenü (hier "Kontostand", "Ankunftsreihenfolge", "Chip", "heute]) angezeigt.
- Wenn Sie "Balance" auswählen, werden die Gesamtpunktzahl, die Anzahl der Spiele und die Gesamtzahl der Chips angezeigt, dh die Summe aller vergangenen Protokolle.
- Aus dem Weckwort "Gurafu" können Sie eine grafische Darstellung vergangener Ergebnisse und Chipübergänge anzeigen.
- Obwohl diesmal nicht implementiert, kann das Gleichgewicht zwischen direkten Spielen und der durchschnittlichen Punktzahl interessant sein.
Sprachen, Tools, Dienste, Module usw.
Verwendete Sprache
- Python 3.7.3
- Anaconda wird in der lokalen Entwicklungsumgebung verwendet, Anaconda ist jedoch irrelevant, da die endgültige Anwendung auf Heroku ausgeführt wird.
Verwendete Tools und Services
Dieses Mal habe ich eine Anwendung mit den folgenden Diensten erstellt, die kostenlos verwendet werden können.
Heroku
- Heroku Home
- Dienst zum Ausführen von Programmen im Web
- Dieses Mal verwenden wir es als zwei Ausführungsumgebungen, die LINE-Bot-Ausführungsanwendung und das Protokoll-Scraping-Skript.
LINE bot (LINE Messaging API)
- [Offizielle Website der LINE Messaging API](https://developers.line.biz/ja/docs/messaging-api/overview/#messaging-api Mechanismus)
- Sie können den erstellten LINE-Bot mit Python bedienen
- Diesmal habe ich LINE als Benutzeroberfläche gewählt.
Dropbox API
- Ich habe DropBox verwendet, um das Protokoll zu speichern.
- Mit der API können Sie Dateien und Ordner in Dropbox mit Python bearbeiten
- Anfangs habe ich eine App mit der API von Google Drive (und Google Docs) erstellt, die ich ursprünglich verwendet habe, aber die Google Document-Datei (.gdocs) unterstützt die API nicht (ich konnte sie einfach nicht finden). ?) Also habe ich aufgehört. Wenn ich eine Textdatei (.txt) mit Google Text & Tabellen bearbeite, bin ich ziemlich frustriert über die mysteriöse Spezifikation, die sich in .gdocs ändert, sodass ich nicht glaube, dass ich sie wieder verwenden werde.
- In dieser Hinsicht war die Dropbox-API sehr einfach und leicht zu verstehen, und selbst ich, ein Anfänger, konnte sie sofort verwenden. Empfehlung! !! !!
AWS S3-Speicher
- Amazon Cloud Service
- Speichern Sie das in Python als Antwort auf die Anforderung von LINE geschriebene Diagramm vorübergehend und zeigen Sie das Bild über den Link der Datei in LINE an.
- Möglicherweise können Sie Dropbox ohne S3 verwenden (ich habe S3 verwendet, bevor ich Dropbox verwendet habe, sodass mehrere Dienste verwirrt waren). Es tut mir leid, dass es schwer zu verstehen ist (Schweiß
Modul verwendet
- 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
Holen Sie sich das Protokoll von Tenho Privatzimmer
Dieses Mal bin ich bis zu dem Punkt gekommen, an dem ich das Protokoll des Tenho-Privatzimmers durch Schaben erhalte.
Ich werde immer mehr posten.
Zusammenfassung
- Die Methode zum Herunterladen des Tenho-Protokolls war wie in Tenho Official / Log beschrieben.
- Speziell,
"https://tenhou.net/sc/raw/dat/sca{yyyymmdd}.log.gz"
Laden Sie die .gz-Datei (scrape.gz) mit urllib von der URL herunter ({yyyymmdd} ist das Datum des zu erfassenden Protokolls), erweitern Sie den Inhalt und machen Sie sie einmal zu einer .txt-Datei (scrape.txt). __ Das Protokoll des privaten Raums ist sca__.
- Als nächstes möchten wir in Zukunft vom Heroku-Server aus auf die Protokolle zugreifen können, damit wir die Protokolle mit Dropbox verwalten können.
- Ich werde die in Dropbox gespeicherte Protokolldatei herunterladen, das Protokoll des Tages hinzufügen und es dann erneut in Dropbox hochladen.
- Es ist nicht gut, das Skript jeden Tag manuell auszuführen, daher erhalte ich jeden Tag um 0:30 Uhr automatisch das Protokoll für den vorherigen Tag. Die regelmäßige Ausführung des Skripts kann in Heroku festgelegt werden. Für die Methode der periodischen Ausführung habe ich auf [Periodische Ausführung von Wetterpython mit Heroku-Qiita] verwiesen (https://qiita.com/seigo-pon/items/ca9951dac0b7fa29cce0).
Codebeispiel
- Alle Module sollten standardmäßig in der Anaconda-Umgebung enthalten sein.
- Wenn es nichts gibt, installieren Sie es mit pip oder conda.
- download4 ist ein selbst erstelltes Modul und wird zum Austausch von Dateien mit Dropbox verwendet (Details werden später erklärt).
# 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)
- Hauptteil
- Ich möchte das Protokoll des Tages vor der Ausführung des Skripts abrufen, aber da die Serverzeit von __Heroku (Ausführungsumgebung) hier UTC (Weltstandardzeit) ist, muss der Effekt der Zeitdifferenz von 9 Stunden berücksichtigt werden. Es gibt !! __. 0:30 Japanische Zeit ist 15:30 von __ am Tag vor __ in UTC, daher sollten Sie ein Protokoll des Tages erhalten, an dem das Skript ausgeführt wird. (Übrigens wird in der lokalen Testumgebung das Protokoll einen Tag vor dem Ausführungsdatum abgerufen. In diesem Fall wird es um einen Tag verschoben, wobei `` `timedelta``` wie auskommentiert wird.
- Da die Regel so eingestellt ist, dass das Tenho-Protokoll in der
`.gz```-Datei nach dem Scraping als` `.gz```-Datei die`
.txt```-Datei gelöscht wird Es wurde umgeschrieben.
- Verwenden Sie die im selbst erstellten Modul download4 definierte
`download``` -Methode, um die TXT-Datei (hier`
logvol1.txt) herunterzuladen, in der die vergangenen Protokolle von Dropbox gespeichert und gelöscht werden. Nachdem Sie das Protokoll für den vorherigen Tag hinzugefügt haben, laden Sie es erneut mit der Methode `` `upload
hoch.
- Wir verwenden `` `if```, um nur die Protokolle für unseren privaten Raum zu schreiben (Beispiel: C1234).
if __name__ == "__main__":
dt_now = datetime.datetime.now()
yyyymmdd = dt_now.strftime('%Y%m%d')
# dt_1day_past = dt_now - timedelta(days=1) #Finde das Protokoll vor 1 Stunde
# 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": #Privatzimmerausweis
f.write("{}".format(line))
print(line)
download4.upload("temp.txt","/logvol1.txt")
- Inhalt des selbst erstellten Moduls `` `download4```
- Es ist nur eine Funktion zum Herunterladen und Hochladen mit Dropbox.
- Informationen zur Registrierung der Dropbox-API-Verwendung und zum Erstellen von Anwendungsordnern finden Sie auf der folgenden Website.
- Wenn Sie eine Anwendung erstellen, wird ein Ordner mit dem Namen "Apps" im Ausgangsverzeichnis von Dropbox erstellt, und es scheint, dass sich der Arbeitsordner direkt darunter befindet.
- Wenn Sie die Dropbox-API herunterladen (
`download_file (self, file_from, file_to)`
), können Sie anscheinend nicht ohne `file_to
herunterladen, daher müssen Sie im Voraus eine Datei vorbereiten. tat.
- Außerdem musste
`file_from``` mit dem Präfix`
/ `versehen werden, wie`
download ('/ logvol1.txt', "log.txt") `` `. .. Jetzt können Sie auf den Arbeitsordner (direkt unter) des Anwendungsordners verweisen.
- REFERENCES
- [Dateien vom Python-Skript in die Dropbox hochladen](Dateien von https://www.it-swarm.dev/ja/python/python-script in die Dropbox / 1047611873 / hochladen)
- Bearbeiten von Dropbox-Ordnern mithilfe der Dropbox-API (wird derzeit untersucht)
#!/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" #Zugriffstoken auf den Anwendungsordner
transferData = TransferData(access_token)
# API v2
transferData.upload_file(file_from, file_to)
def download(file_from,file_to):
access_token = "Hogehoge" #Zugriffstoken auf den Anwendungsordner
transferData = TransferData(access_token)
# API v2
transferData.download_file(file_from, file_to)
if __name__ == '__main__':
# upload()
download('/logvol1.txt',"log.txt")
- Wenn Sie diese Dateien danach an Heroku senden und sie regelmäßig automatisch ausführen, wird die Protokolldatei (`` `logvol1.txt```) auf Dropbox jeden Tag aktualisiert.
- Informationen zur Verwendung und zu den Einstellungen von Heroku finden Sie hier.
- [Für Anfänger] Einfache LINE Bot-Entwicklung in der Heroku-Umgebung mit Python](https://miyabi-lab.space/blog/21)
- Regelmäßige Ausführung von Wetter-Python auf Heroku-Qiita
abschließend
- Diesmal lag es an Tenho Log.
- Vielen Dank an unsere Vorfahren für Ihre Referenz.
- Nächstes Mal werde ich über den Antwortteil des LINE-Bots schreiben.
- Ich selbst bin kein Hauptgeschäftsbereich der Programmierung. Wenn Sie also Fragen zu Schreibstilen oder -techniken wie "Ich sollte das mehr tun!" Oder "Dies ist keine gute Sicherheit!" Haben, kommentieren Sie bitte! !! !! !!
p.s.
- Dies ist mein erster Beitrag, aber es ist schwierig zu schreiben. .. .. (Ich werde es Stück für Stück reparieren lol)
- Mahjong macht Spaß!
- Natürlich macht Jakuso Spaß, aber die Umgebung, in der Sie immer mit Ihren verstreuten Freunden Mahjong spielen können, ist zu großartig!
- Lass uns COVID-19 in Tenho überleben!