Im vorherigen Artikel konnte ich eine App erstellen, die automatisch die Protokolldatei von Tenho aufzeichnet (Format wie unten gezeigt), sodass ich die aggregierten Informationen zu diesem __log __ erhalten möchte.
Aggregierte Informationen sind beispielsweise die gesammelten Punkte, angesammelten Chips und Punkteänderungen jedes Spielers.
In Tenho gibt es ein offizielles Aggregation Tool, aber es ist mühsam, das Protokoll für eine häufige Aggregation zu kopieren und einzufügen, daher werde ich es programmieren. Ich möchte es machen und es automatisch summieren.
Sie müssen das Programm nur jedes Mal ausführen, wenn Sie es selbst ausführen. Da Mahjong-Freunde jedoch grundsätzlich nicht programmieren können, möchte ich es mit einer vertrauten Oberfläche ausführen, damit jeder die aggregierten Informationen jederzeit sehen kann __.
Aus den oben genannten Motiven habe ich beschlossen, ein Aggregationstool mit Python zu erstellen und die Schnittstelle LINE zu erstellen.
# coding:utf-8
import numpy as np
#import pandas as pd
import re
import matplotlib.pyplot as plt
def graph_plot(tip):
f = open('log.txt')
lines = f.readlines() #Lesen Sie alles bis zum Ende der Datei Zeile für Zeile(Enthält Zeilenvorschubzeichen)
f.close()
pointsA = [0] #Herr A.
pointsB = [0] #Herr B.
pointsC = [0] #Herr C.
pointsD = [0] #Herr D.
pointSumA = [0] #
pointSumB = [0] #
pointSumC = [0] #
pointSumD = [0] #
tipA = [0] #
tipB = [0] #
tipC = [0] #
tipD = [0] #
tipSumA = [0] #
tipSumB = [0] #
tipSumC = [0] #
tipSumD = [0] #
LIST = []
for line in lines[1:]:
if len(line) > 10: #Überspringen Sie seltsame Zeilen
roomid = line.split("|")[0]
time = line.split("|")[1]
rools = line.split("|")[2]
players = line.split("|")[3]
#Ohne Glückwünsche
if tip == False:
l = re.split('[ ()]', players)
LIST.append([l[1],float(l[2].replace("+",""))])
LIST.append([l[4],float(l[5].replace("+",""))])
LIST.append([l[7],float(l[8].replace("+",""))])
#Wenn es eine Feier gibt
if tip == True:
l = re.split('[ (,)]', players)
print(l)
LIST.append([l[1],float(l[2].replace("+","")),float(l[3].replace("+","").replace("Blatt",""))])
LIST.append([l[5],float(l[6].replace("+","")),float(l[7].replace("+","").replace("Blatt",""))])
LIST.append([l[9],float(l[10].replace("+","")),float(l[11].replace("+","").replace("Blatt",""))])
# print(LIST)
for i,data in enumerate(LIST):
player = data[0]
point = data[1]
if tip == True:
tips = data[2]
if player == "Herr A.":
pointsA.append(point)
pointSumA.append(pointSumA[-1]+point)
if tip == True:
tipA.append(tips)
tipSumA.append(tipSumA[-1]+tips)
elif player == "Herr B.":
pointsB.append(point)
pointSumB.append(pointSumB[-1]+point)
if tip == True:
tipB.append(tips)
tipSumB.append(tipSumB[-1]+tips)
elif player == "Herr C.":
pointsC.append(point)
pointSumC.append(pointSumC[-1]+point)
if tip == True:
tipC.append(tips)
tipSumC.append(tipSumC[-1]+tips)
elif player == "Herr D.":
pointsD.append(point)
pointSumD.append(pointSumD[-1]+point)
if tip == True:
tipD.append(tips)
tipSumD.append(tipSumD[-1]+tips)
xA = [i for i in range(len(pointsA))]
xB = [i for i in range(len(pointsB))]
xC = [i for i in range(len(pointsC))]
xD = [i for i in range(len(pointsD))]
plt.clf()
plt.plot(xA,pointSumA,label="Herr A.")
plt.plot(xB,pointSumB,label="Herr B.")
plt.plot(xC,pointSumC,label="Herr C.")
plt.plot(xD,pointSumD,label="Herr D.")
plt.legend()
plt.savefig("graph_1.png ")
plt.clf()
plt.plot(xA,tipSumA,label="Herr A.")
plt.plot(xB,tipSumB,label="Herr B.")
plt.plot(xC,tipSumC,label="Herr C.")
plt.plot(xD,tipSumD,label="Herr D.")
plt.legend()
plt.savefig("graph_2.png ")
if __name__ == "__main__":
graph_plot(tip=True)
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
'''
## references
1. Line Bot API
* [offiziell-python](https://github.com/line/line-bot-sdk-python/blob/master/README.rst_)
* https://keinumata.hatenablog.com/entry/2018/05/08/122348
* [bottun](https://qiita.com/shimayu22/items/c599a94dfa39c6466dfa)
* [](https://dev.classmethod.jp/etc/line-messaging-api-action-object/)
* [Evakuierungsstelle LINE bot](https://qiita.com/lovemysoul/items/5ad818220d65b74351a5)
Diese Seite ist wirklich leicht zu verstehen. Gott.
2. DB,SQL
* https://baku1101.hatenablog.com/entry/2019/04/15/185003
* https://qiita.com/jacob_327/items/ec7d2223010ad4a0dd38
3. Python x S3(AWS)
* https://www.casleyconsulting.co.jp/blog/engineer/2861/
4. Heroku
* [Umgebungsvariablen einstellen](https://qiita.com/colorrabbit/items/18db3c97734f32ebdfde)
* [Heroku x Linebot API](https://miyabi-lab.space/blog/21)
'''
# system
import os
import sys
import datetime
from argparse import ArgumentParser
# Web FlameWork
from flask import Flask, request, abort
# Line API
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent,
PostbackEvent,
TextMessage,
TextSendMessage,
ButtonsTemplate,
URIAction,
PostbackAction,
MessageAction,
ImageSendMessage,
ConfirmTemplate,
TemplateSendMessage,
QuickReply,
QuickReplyButton
)
# DF,Graph,etc
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import re #Reguläre Ausdrücke
import pprint
#Ich brauche Google Drive nicht, weil ich es nicht benutze
# Google Drive API
# import os
# import pprint
# AWS
import boto3
`LINE_CHANNEL_SECRET``` und`
LINE_CHANNEL_ACCESS_TOKENregistriert sind, von
os.getenv``` gelesen. Ich habe auch auf die obige Seite für die Kanalerstellung des LINE-Bots verwiesen. Wenn Sie dies tun, müssen Sie keine Informationen wie Geheimnisse direkt in den Code schreiben, sodass dies für die Sicherheit gut zu sein scheint.
# Flask Web App Instance
app = Flask(__name__)
# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
print('Specify LINE_CHANNEL_SECRET as environment variable.')
sys.exit(1)
if channel_access_token is None:
print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
sys.exit(1)
# PREPARE LINE messaging API Instance
line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)
# AWS Instance
aws_s3_bucket = os.environ['AWS_BUCKET']
s3 = boto3.resource("s3")
bucket = s3.Bucket(aws_s3_bucket)
s3_client = boto3.client('s3')
'''
Antwortverarbeitung während der folgenden Aktionen
'''
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
#
`@ handler.add (MessageEvent, message = TextMessage)`
wie folgt definiert. Ich werde.`data =" request_point "`
usw.), das Sie definiert haben, dass eines von beiden ausgewählt wird.@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
'''
Verarbeitung, wenn eine Textnachricht gesendet wird
'''
try:
message = event.message.text
if message.count("Aragaki Yui") != 0:
text = "plotting...\n"
line_bot_api.reply_message(
event.reply_token,
ImageSendMessage(
original_content_url = "https://orionfdn.org/wp-content/uploads/2018/12/WS000011-69.jpg ",
preview_image_url = "https://orionfdn.org/wp-content/uploads/2018/12/WS000011-69.jpg "
)
)
# Graph Plot
elif message.count("Graph") != 0:
# import download4
# import graph
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(
text="Was würdest du tun??",
quick_reply=QuickReply(
items=[
QuickReplyButton(
action=PostbackAction(
label="Punkt", #Zeichen, die auf der Schaltfläche angezeigt werden sollen
text="Zeigen Sie den Punkteübergang an", #Zeichen, die als Text gesendet werden sollen
data="request_point" # Postback
)
),
QuickReplyButton(
action=PostbackAction(
label="Chip",
text="Zeigen Sie den Chipübergang",
data="request_tip"
)
)
]
)
)
)
# Summary
elif message.count("Shukei") != 0:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(
text="Was würdest du tun??",
quick_reply=QuickReply(
items=[
QuickReplyButton(
action=PostbackAction(
label="Einnahmen und Ausgaben", #Zeichen, die auf der Schaltfläche angezeigt werden sollen
text="Zeigen Sie die Waage", #Zeichen, die als Text gesendet werden sollen
data="request_sum" # Postback
)
),
QuickReplyButton(
action=PostbackAction(
label="Reihenfolge der Ankunft",
text="Zeigen Sie die Reihenfolge der Ankunft",
data="request_rank"
)
),
QuickReplyButton(
action=PostbackAction(
label="Mannschaft",
text="Zeigen Sie Ihre Teamergebnisse",
data="request_team"
)
),
QuickReplyButton(
action=PostbackAction(
label="Today",
text="Zeigen Sie die heutigen Ergebnisse",
data="request_today"
)
)
]
)
)
)
#Bonus
elif message.count("Moge") != 0:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = "Jonga")
)
elif message.count("Daa") != 0:
line_bot_api.reply_message(
event.reply_token,
ImageSendMessage(
original_content_url = "http://attrip.jp/wp-content/uploads/2013/07/20130716-130424.jpg ",
preview_image_url = "http://attrip.jp/wp-content/uploads/2013/07/20130716-130424.jpg "
)
)
elif message.count("Großbritannien") != 0:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = "Ist es England?")
)
except:
import traceback
print("errrrrrrrrrror")
traceback.print_exc()
`download4``` (vorheriger Artikel),`
summary, `` `graph
der selbst erstellten Module` `` import```.`Zusammenfassung``` wird nicht geschrieben, weil es lang sein wird, aber im Grunde hat es die gleiche Konfiguration wie`
graph``` und ist ein Modul zur Berechnung der Auftragsverteilung und der Gesamtpunktzahl.`" request_point "`
ist, wird erklärt.`download4.download (" /logvol2.txt "," log.txt ")`
von Dropbox herunter.`graph.graph_plot (tip = True)`
.`buck.upload_file (" test.png "," test.png ")`
nach S3 hoch.`s3_image_url ... (unten weggelassen) Ruft die URL der mit`
hochgeladenen Datei ab.`TextSendMessage ()`
, um Zeichen anstelle von Bildern zu senden.
@handler.add(PostbackEvent)
def handle_postback(event):
'''
Was passiert, wenn es eine PostBack-Aktion gibt?
'''
import download4
import summary
import graph
postbackdata = event.postback.data
if postbackdata == "request_point":
download4.download("/logvol2.txt","log.txt")
graph.graph_plot(tip=True)
bucket.upload_file("test.png ", "test.png ")
s3_image_url = s3_client.generate_presigned_url(
ClientMethod = 'get_object',
Params = {'Bucket': aws_s3_bucket, 'Key': "test.png "},
ExpiresIn = 600,
HttpMethod = 'GET'
)
line_bot_api.reply_message(
event.reply_token,
ImageSendMessage(
original_content_url = s3_image_url,
preview_image_url = s3_image_url,
)
)
download4.upload("test.png ","/graph.png ")
if postbackdata == "request_tip":
download4.download("/logvol2.txt","log.txt")
graph.graph_plot(tip=True)
bucket.upload_file("test2.png ", "test2.png ")
s3_image_url = s3_client.generate_presigned_url(
ClientMethod = 'get_object',
Params = {'Bucket': aws_s3_bucket, 'Key': "test2.png "},
ExpiresIn = 600,
HttpMethod = 'GET'
)
line_bot_api.reply_message(
event.reply_token,
ImageSendMessage(
original_content_url = s3_image_url,
preview_image_url = s3_image_url,
)
)
download4.upload("test2.png ","/graph2.png ")
elif postbackdata == "request_sum":
import download4
import summary
download4.download("/logvol2.txt","log.txt")
summary.sumup(tip=True)
with open('summary.txt') as f:
lines = f.readlines()
text = ""
for line in lines:
text += "{}\n".format(line)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = text)
)
download4.upload("summary.txt","/summary.txt")
elif postbackdata == "request_today":
import download4
import summary
download4.download("/todays_score.txt","todays_log.txt")
summary.today(tip=True)
with open('todays_summary.txt') as f:
lines = f.readlines()
text = ""
for line in lines:
text += "{}\n".format(line)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = text)
)
download4.upload("todays_summary.txt","/todays_summary.txt")
elif postbackdata == "request_rank":
import download4
import summary
download4.download("/logvol2.txt","log.txt")
summary.sumup(tip=True)
with open('rank.txt') as f:
lines = f.readlines()
text = ""
for line in lines:
text += "{}\n".format(line)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = text)
)
download4.upload("rank.txt","/rank.txt")
elif postbackdata == "request_team":
import download4
import summary
download4.download("/logvol2.txt","log.txt")
summary.sumup(tip=True)
with open('team.txt') as f:
lines = f.readlines()
text = ""
for line in lines:
text += "{}\n".format(line)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text = text)
)
download4.upload("team.txt","/team.txt")
if __name__ == "__main__":
print("hello")
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
`graph.py``` für die Graphenerstellung (die erste im Artikel),`
summary.py für die Aggregationsberechnung (ich habe diesmal nicht über den Inhalt geschrieben), LINE bot Antwort Alles was Sie tun müssen, ist den Teil `` `tenhoulinebot.py
(sagen wir mal) für Heroku bereitzustellen.p.s.
Recommended Posts