Erstellen Sie mit LINE Bot und Python Part 2 eine automatische Klassenverwaltungs-App für Tenho Private Room

Einführung

Was du machen willst

スクリーンショット 2020-06-07 1.06.59.png

Erstellen einer Aggregations-App

Diagrammerstellungsprogramm

# 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)

graph.png

Antwort anfordern (LINE Bot API)

Präambelteil


# -*- 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

Instanz erstellen


# 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')

Antwortverarbeitungsteil anfordern




'''
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'

#

Antwort auf Nachrichtenereignis

@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()
        

Antwort auf das Postback-Ereignis.

  1. Laden Sie die Protokolldatei mit `download4.download (" /logvol2.txt "," log.txt ")` von Dropbox herunter.
  2. Zeichnen Sie das Diagramm mit `graph.graph_plot (tip = True)`.
  3. Laden Sie die Grafikdatei mit `buck.upload_file (" test.png "," test.png ")` nach S3 hoch.
  4. `s3_image_url ... (unten weggelassen) Ruft die URL der mit` hochgeladenen Datei ab.
  5. Verwenden Sie abschließend ImageSendMessage (), um das Diagrammbild an den Benutzer zurückzugeben.



@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)

Auf einmal in Heroku bereitstellen

abschließend

p.s.

Recommended Posts

Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part 1
Erstellen Sie mit LINE Bot und Python Part 2 eine automatische Klassenverwaltungs-App für Tenho Private Room
Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part ③
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine englische Wort-App mit Python
Erstellen Sie eine App, die Schüler mit Python errät
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part1 durchsuchen kann
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part2 durchsuchen kann
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Erstellen Sie eine App für maschinelles Lernen mit ABEJA Platform + LINE Bot
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Automatisches FX-Handelssystem mit Python und genetischem Algorithmus Teil 1
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
FM-Modulation und Demodulation mit Python Part 3
Python-Installation und Paketverwaltung mit pip
Erstellen Sie schnell eine Excel-Datei mit Python #python
Erstellen und entschlüsseln Sie Caesar-Code mit Python
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
FM-Modulation und Demodulation mit Python Part 2
[Python] Erstellen Sie schnell eine API mit Flask
[LINE WORKS-Version Trello Bot] So erstellen Sie einen privaten Gesprächsraum mit einem Gesprächsbot