[PYTHON] Ich bin gerade in Singapur. Eine Geschichte über das Erstellen eines LineBot und den Wunsch, einen unvergesslichen Job zu machen

"Entschuldigung, ich kann nicht in die Klasse gehen"

Dieses CM hat einen starken Einfluss. Ich liebe das so, wenn ich ihn zu einem Klassentreffen einlade "** Ich bin jetzt in Singapur **" Ich habe einen ** LineBot ** erstellt, der Ihnen antworten wird. Zusätzlich wurden verschiedene Spezifikationen hinzugefügt, um das ** Doya-Gefühl ** weiter zu verbessern. Auch wenn es nicht auf der Karte bleibt, möchte ich es für die Person, die es benutzt hat, zu einem unvergesslichen Job machen!

Dies ist der 4. Tag von Fucking App Adventskalender 2019. ~~, ein Gefühl einer verdammten App, die vom Titel abweicht, ohne zu schreiben ~~

Wie benutzt man:

① ** Halten Sie ein Klassentreffen ab ** ② ** Start Line und frage "Ayano, wo bist du jetzt?" ** ③ ** Ich erhalte eine Antwort mit der Aufschrift "Es tut mir leid, ich kann nicht am Klassentreffen teilnehmen ~~~" ④ ** Jeder untersucht es mit dem Gefühl, dass "Eh, Singapur" **

Zustand bei Ausführung:

キャプチャ1.PNG

Wenn Sie es zur Hand haben möchten, registrieren Sie sich bitte hier als Freund.

<img src = "https://scdn.line-apps.com/n/line_add_friends/btn/ja.png " alt = "Freund hinzufügen" Höhe = "36" border = "0"> QR_min.PNG

"Ich bin jetzt in Singapur"

Wenn Sie es noch nicht gesehen haben, sehen Sie bitte das CM selbst unten.

[Taisei Construction CM: "Singapur" (youtube)](https://www.youtube.com/watch?v= HQYQ3Me2KLw) https://www.youtube.com/watch?v=HQYQ3Me2KLw

"Jobs, die auf der Karte bleiben"

Verschiedene ~~ zusätzliche ~~ Funktionen sind implementiert. Der erste ist "** Jobs, die auf der Karte bleiben **".

**Singapur! !! Um ** attraktiver zu machen Ich habe freundlicherweise versucht, eine Karte mit dem Standort von Singapur anzuzeigen. Damit ist ** das Gefühl, das auf der Karte bleibt **, perfekt ☆

Darüber hinaus ist die internationale AYANO ** Fliegen Sie durch über 200 Länder und Regionen (fantastisch) ** Wenn Sie eine andere Frage als eine feste Phrase stellen, Sie ist nicht immer in Singapur. Sie werden Antworten von verschiedenen Orten hören! キャプチャ1-2.PNG

Denn Sie können den Ort auch mit einem unbekannten Ländernamen finden ** Es ist auch eine App zum Studium der Weltgeographie! ** **. ~~ Es war vielleicht keine verdammte App. ~~

Reagieren Sie auf verschiedene Einladungen wie Trinkpartys und Abschiedspartys

Hoppla, wenn Sie genau hinschauen, in der Screenshot oben Es scheint, dass Sie zu einem "Klassentreffen" eingeladen sind. ** Reagiere sofort auf den Inhalt der eingeladenen Partei **!

Bitte laden Sie uns ein, alles zu tun, sei es "** gemeinsame Party " oder " Kirschblüten-Party **".

Laputa erstellen (~~ Nicht auf der Karte belassen ~~)

AYANO macht auch andere Dinge als die U-Bahn. キャプチャ2-1.PNG

Wir machen verschiedene Dinge außer Laputa! Bitte überprüfen Sie selbst die verschiedenen anderen Kreationen. ~~ Zieh jemandes Jugend an = Theta & Pazu. Zieh dich an. ~~

Funktion, die auf Ihre Schlüsselwörter reagiert (morphologische Analyse)

Obwohl wir entsprechend dem Inhalt der Einladung wie der zweiten Partei antworten werden, Mit den bisherigen Funktionen gibt es ein "zufälliges Nachrichtenanzeigegefühl", Vielleicht zu einem Freund, der mich zusammen ansah "** Oh, ist das nicht AYANO ein Bot? **" Es kann kahl sein.

Als Antwort auf die Schlüsselwörter des Gesprächs, das Sie geführt haben, Etwas ** hat eine Funktion hinzugefügt, um aussagekräftige Wörter zurückzugeben **. (Roter Rahmen) キャプチャ_ラーメン.PNG ~~ Sehr bewusstes Gespräch. Es scheint, dass Ramen nostalgisch ist. ~~

Natürlich kann AYANO Japanisch verstehen ** Sie können die "wichtigen Wörter" erkennen, die im Gespräch erscheinen. ** **. Dieses Mal erkannte ich, dass "Substantiv / Allgemein" wichtig war. Wenn es nicht existiert, antwortet es "Jobs, die auf der Karte bleiben". Im obigen Beispiel scheint es "Ramen" zu erkennen. ** Dies schafft Realität für AYANO und ist unvergesslich! ** **.

Die morphologische Analyse selbst ist keine großartige Technik mehr. Die Implementierung muss jedoch in GAE eingebettet werden (ähnlich wie Lambda von Serverless / AWS). Der Punkt ist, dass es nicht sehr vertraut ist (es ist ein wenig schwierig zu realisieren). ** Es gibt keinen externen API-Aufruf und es ist explosiv. Super sofort weniger ☆ **

** Jetzt an verschiedenen Orten wie Klassentreffen und Trinkpartys ** ** Du kannst jetzt mit AYANO auf der ganzen Welt sprechen ☆ **

** Bei Verwendung mit Freunden kann es mit warmweißen Augen gesehen werden. ** ** Es besteht kein Zweifel, dass es ein "unvergesslicher Job" sein wird ☆ **

Das ist also alles für die Einführung der Inhalte Einfallsreichtumspunkte und Code für die Implementierung, Im Folgenden werde ich verschiedene Kenntnisse zum Erstellen von LineBot schreiben.

Es ist lang.

Implementierungspunkte: Inhaltsverzeichnis / Zusammenfassung

  1. Punkte der gesamten Methode
  2. Referenzmaterial, das die Grundlage des Ganzen bildet
  3. LineBot erfordert HTTPS. Machen wir es mit GAE
  4. LineBot Reply ist kostenlos. Push wird aufgeladen. Machen wir es nur mit Antworten
  5. Das Geheimnis hinter der Line Messaging API
  6. Der Trick, "Zugriffstoken" dauerhaft zu verwenden
  7. Der Trick, um "Verbindungsbestätigung" zu täuschen
  8. Ein etwas komplizierter Trick zum "Anzeigen einer Karte"
  9. Die Geschichte, dass "warten" konnte nicht realisiert werden
  10. Wie Sie den Einschränkungen von GAE (Google App Engine) entkommen können
  11. Die Verarbeitung natürlicher Sprache ist zu umfangreich, um kostenlos kostenlos zu arbeiten
  12. Eine Geschichte, wenn sie lokal funktioniert, aber nicht in GAE

1. Punkte der gesamten Methode

1-1. Referenzmaterialien, die die Grundlage des Ganzen bilden

Wie macht man LineBot überhaupt? Weitere Informationen finden Sie auf der folgenden Seite. (Dies ist ein Artikel im Entwicklungsblog von People in Line.)

Ich habe einen Bot erstellt, der mit Image Map-Nachrichten mit dem letzten Zug mithalten kann

Die Basiskonfiguration wird auf die gleiche Weise wie in diesem Artikel erstellt. ** Python + Flask ** (Die Python-Version wurde jedoch von 3.6 auf 3.7 geändert.) Das Kartenbild verwendet die ** Google Static Maps API ** sowie den Artikel.

Zunächst ist es eine gute Idee, "Aum Return Bot" einzusetzen. Aber ** nur diesen Code zu schreiben und auszuführen macht ihn nicht zu einem LineBot **. Wie soll ich es bewegen?

1-2. LineBot basiert auf HTTPS. Machen wir es mit GAE

Die meisten Informationen zum Erstellen von LineBot scheinen in ** Heroku ** bereitgestellt zu sein. Der Grund für die Verwendung von Heroku ist **, weil HTTPS einfach zu verwenden ist **.

Um einen LineBot zu erstellen, melden Sie sich zuerst bei LINE Developers an. (Sie können Ihr eigenes Leitungskonto so wie es ist verwenden)

Es gibt einen Ort, an dem Sie nach der Anmeldung "Webhook URL" angeben können. Es kann nur ** HTTPS angegeben werden, um die URL anzugeben **. Auch beim Angeben einer Bilddatei für die Übertragung im Code usw. Für die Line Messaging-API muss ** HTTPS-URL angegeben werden **. (Sie können keine lokale Datei senden. Geben Sie diese unbedingt über die URL an.)

Mit anderen Worten, das Erstellen eines HTTPS-Servers ist für die ** LineBot-Entwicklung ** fast unerlässlich.

Hier gibt es drei Hauptoptionen. ① ** Richten Sie Ihren eigenen Server ein und machen Sie ihn zu HTTPS ** ② ** Serverlosen / PaaS-Dienst verwenden ** (Heroku, GAE, Lambda usw.) ③ Verwenden Sie einen dedizierten Dienst wie ** Twilio ** und lassen Sie ihn den Serverteil übernehmen

Für einen einfachen Antwortbot wird ③ am meisten empfohlen. Dieses Mal schreibe ich selbst einen etwas komplizierten Code, also ist es entweder ① oder ②. Obwohl ① kostenlos realisiert werden kann, ist die Servervorbereitung / -betrieb etwas mühsam. Daher ist ② die beste Option.

Wahrscheinlich wegen des offiziellen Beispiels der Linie und der oben genannten Gründe Die meisten Informationen zum Erstellen von LineBot Es scheint, dass Heroku eine Voraussetzung ist. Im Wesentlichen ist jedoch alles in Ordnung, solange HTTPS leicht realisiert werden kann Es gibt keine Elemente, die von Heroku abhängen.

Diesmal habe ich meine Meinung ein wenig geändert Ich möchte ** GAE (GoogleAppEngine) ** verwenden. Der Code des Artikels für Heroku funktioniert fast so wie er ist.

GAEs Python 3 Run Lime ist nur Python 3.7, daher muss dieser Punkt geändert werden

** GAE (Standard Environment) bietet zu jeder Tageszeit eine kostenlose 28-Stunden-Stufe. ** **. (Stand November 2019) Hey, ich denke es ist 24 Stunden am Tag, oder? Wenn je nach Ladestatus mehrere Instanzen gleichzeitig gestartet werden, Wenn Sie eine bessere Instanz in Bezug auf die Leistung starten Es ist ein Mechanismus, der die Zeit für mehrere Minuten zählt. Mit anderen Worten, wenn die Last von einer Instanz mit der minimalen Konfiguration verarbeitet werden kann Auch wenn es am Gipfel ein paar gibt Das Bild ist, dass es immer in einen freien Rahmen passt.

Immer kostenlos = Abgesehen von dem kostenlosen Gutschein für 30.000 Yen, der für das erste Jahr mit GCP verwendet werden kann

Der Nutzungsbereich, der auch nach einem Jahr noch kostenlos genutzt werden kann. Beispielsweise verwendet "Qiita Hall of Fame" diese stets kostenlose Stufe in IaaS.

Führen Sie das Python 3.7 Flask-Tutorial von GAE aus (Einfach "git clone" und "gcloud app deploy" ausführen und es wird bald fertig sein.) Wenn Sie main.py in den Referenzcode ändern, ist der LineBot fast vollständig. (Fügen Sie außerdem line-bot-sdk == 1.14.0 zu require.txt hinzu.)

1-3. LineBot Reply ist kostenlos. Push wird aufgeladen. Machen wir es nur mit Antworten

Der beste Weg, die Line Messaging-API in der persönlichen Entwicklung zu verwenden, ist Es scheint ** einen Dienst mit Reply ** zu entwerfen.

Die LineMessagingAPI verfügt über ein Pay-as-you-go-Limit für das Senden von Push-Nachrichten. Mit der kostenlosen Stufe können Sie nur 1000 Nachrichten pro Monat senden. Selbst wenn Sie eine bestimmte Anzahl überschreiten, werden Ihnen etwa 3 bis 5 Yen pro Kopie berechnet. (Einzelheiten entnehmen Sie bitte der offiziellen Website / den neuesten Informationen usw.)

** Antwort kann jedoch kostenlos verwendet werden **.

Als erstes Design des Gesamtbildes des Dienstes ** "Service-Design, das es natürlich macht, auf die Rede des Benutzers zu antworten" ** Es wäre wünschenswert, eine Form zu haben, die nicht von einer Push-Übertragung abhängt.

Die Antwort kann jedoch nur für einen bestimmten Zeitraum verwendet werden, nachdem der Benutzer gesprochen hat. Antworte nur einmal für eine Episode und nur 5 Blowouts gleichzeitig. Es ist auch wichtig zu beachten, dass es nur verwendet werden kann.

Zum Beispiel, wenn Sie "** eine App machen möchten, die Primzahlen zählt und sich beruhigt **" Wenn der Bot einseitig mit 13, 17, 19 spricht ... alle 3 Sekunden, Es wird ein Push-Typ sein. Nächster? Nächster? Und fragen Sie den Benutzer jedes Mal Damit es natürlich ist, dass sie 23, 29 usw. beantworten. Es ist besser, über das Design des gesamten Dienstes nachzudenken.

Diesmal sagte AYANO: "Lass uns zum Klassentreffen gehen!" So wie es ganz natürlich ist, auf eine Einladung zu antworten Es passt in das Service-Design!

2. Das Geheimnis hinter der Line Messaging API

2-1. Der geheime Trick, um "Zugriffstoken" dauerhaft zu verwenden

Die folgenden Positionen des Referenzquellenartikels: Für "YOUR_CHANNEL_ACCESS_TOKEN"

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')

Kostenlos / kann bei LINE-Entwicklern beliebig oft ausgegeben werden Stellen Sie das "Channel Access Token (Long Term)" ein. Es befindet sich unten in den "Messaging-API-Einstellungen".

Aber dieses Zugriffstoken ist Das Ablaufdatum muss zum Zeitpunkt der Ausstellung festgelegt werden. "Zeit bis das aktuelle Kanalzugriffstoken ungültig wird" ** Mit dem Pulldown können Sie nur bis zu 24 Stunden einstellen **.

Normalerweise auf 24 Stunden eingestellt, etwa alle 23 Stunden Ich muss einen Erweiterungs- / Umschreibungsprozess erstellen. Hier ist ein ** echter Trick ** (auf einer Ebene, auf der Sie sich fragen, ob Sie ihn schreiben können).

Wenn Sie ** time = 0 setzen, ist dies ein dauerhaft gültiges Token **. (Stand November 2019)

** Unglaublich schnell ~~ Handschwert ~~ Effektive Zeit, ich werde es vermissen, wenn ich es nicht tue ** In diesem Sinne möchten wir uns bei Ihnen dafür bedanken, dass Sie es verwendet haben. (Diese Zeile ist eine vollständige Todesflagge)

Es ist kein Line-Fehler, aber das Ablaufdatum des Zugriffstokens ist Es scheint, dass es am Anfang unbestimmt war. Ändern, um ein Zeitlimit festzulegen, Eine Übergangszeit dieser Veränderung? Viele Oppositionen brauchen Zeit, um sich zu ändern? Sieht aus als ob Stellen Sie dafür im Grunde die effektive Zeit ein, Es scheint, dass Leute, die es kennen, es auf unbestimmte Zeit benutzen können. (Einschließlich Gerüchten und bösen Vermutungen. Wahrheit unbekannt)

Ich weiß nicht, wie ich den Ablauf dieses Tokens am besten automatisieren kann (Ich möchte serverlos grundsätzlich zustandslos machen) Sollte ich aufhören, LineBot zu entwickeln, nur weil es eine Frist für diesen Typen gibt? Weil es ein kritischer Punkt war ** Ich hoffe aufrichtig, dass Sie es auf unbestimmte Zeit weiter verwenden **.

2-2. Der Trick, um "Verbindungsbestätigung" zu täuschen

Dies ist normalerweise von LINE-Entwicklern Es ist eine Geschichte, die halb fehlerhaft ist. (Stand November 2019)

Wie oben erwähnt, in der "Webhook-URL" von LINE Developes, Die GAE-URL wird als HTTPS-URL aufgeführt. Ist nicht in Ordnung, auch wenn ich die Taste "Verbindung bestätigen" drücke.

Also, in der Handle-Definition des Originalcodes, wie folgt Fügen Sie einen Verarbeitungszweig mit einem speziellen reply_token hinzu.

#Das Folgende ist die Handle-Definition
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    #Spezieller Code zur "Verbindungsbestätigung" der Leitung OK
    #Wenn Sie in der Entwicklerkonsole von Line auf "Verbindung prüfen" klicken
    #Wenn Sie es normal machen, antworten Sie_500 Rücksendungen aufgrund eines illegalen Tokens.
    #Ich werde wütend, wenn die erwarteten 200 auf der Verbindungsbestätigungsseite nicht zurückgegeben werden.
    #Probleme auf der Line-Konsole ab November 2019. Wahrscheinlich wird irgendwann gelöst.
    if event.reply_token == "00000000000000000000000000000000":
        return
    #Unten weggelassen

Dies bedeutet nicht, dass es nur funktioniert, wenn die "Verbindungsbestätigung" übergeben wurde. Es ist jedoch immer noch eine Frage der Stimmung, daher möchte ich eine Verbindungsbestätigung = OK vornehmen. Weitere Informationen finden Sie im folgenden Artikel über den großen Pionier Qiita.

Über das Problem, dass beim Überprüfen der Verbindung der Webhook-URL von LINE Developes ein Fehler auftritt

2-3. Ein etwas komplizierter Trick zum "Anzeigen der Karte"

Der verwirrendste Prozess in dieser Entwicklung ist Der Vorgang des Anzeigens einer Karte, d. H. Es ist ein Prozess, das Ergebnis der ** Google Static Maps API ** an Line zu senden.

Was ist die Google Static Maps-API? Mit der von Google bereitgestellten Karten-API Eine Sache, die Google MAP zu einem statischen Bild gemacht hat Sie können durch Angabe einfacher Parameter erhalten werden.

Erstaunlich ist nicht nur die Bezeichnung nach Breiten- und Längengrad, sondern auch Singapur, Yokohama usw. Es unterstützt auch die Rückgabe von Koordinaten, indem es mit einem Ortsnamen angegeben wird. Eine Liste der Länder und Regionen auf der ganzen Welt, in denen AYANO fliegt Es enthält Informationen in einem einfachen LIST-Typ. Auch wenn Sie keine GPS-Koordinaten in dieser LISTE haben Geben Sie einfach den Ländernamen in die Google Static Maps-API ein. Ihnen werden die Koordinaten beigebracht. Einfach. Bitte googeln Sie nach weiteren detaillierten Optionen.

Also ** Wie sende ich das Google Static Maps-API-Bild an Line? ** **.

LineMessagingAPI verfügt über eine API zum Senden von Bildern. Bitte geben Sie das zu sendende Bild mit der https-URL an. Ist in der Referenz geschrieben.

Und die Google Static Maps API Greifen Sie über HTTPS auf das statische Kartenbild zu.

** URL der Google Static Maps-API ** ** Geben Sie es einfach im Argument von LineMessagingAPI an! ** **. ** ⇒ Verloren. ** **.

Die URL für die Google Static Maps-API lautet HTTPS. Die Bilddatei "existiert" jedoch nicht direkt in diesem Pfad. Weil es in Google berechnet und angezeigt wird ** Von der Linienseite aus gesehen ist es kein Bild, oder? Es scheint, dass es aussieht wie ** ** Diese Methode scheint nicht zu funktionieren. ** *. ( Der genaue Grund, warum es nicht funktioniert, kann nur verstanden werden, indem man die Person im Inneren fragt. Möglicherweise, weil der API-Schlüssel auch in den URL-Parametern enthalten ist Ich dachte, es wäre wegen dieser Zertifizierung unmöglich.

Daher nur die Bilder, die von der Google Static Maps-API erstellt wurden Es scheint auf einem selbst erstellten Server pseudo angezeigt zu werden (diesmal auf GAE). Sie müssen den Code bereithalten. Dies ist der Teil des später beschriebenen Codeteils.

@app.route("/imagemap/<path:url>/<size>")
def imagemap(url, size):
#Folgendes wird weggelassen

Gleiches gilt für den Basisartikel der Referenzquelle. Auf den ersten Blick verstand ich die Absicht des Codes nicht und fügte einen Kommentar hinzu.

Als Ergebnis der Anpassung der Verarbeitung, so dass jeder festgelegte japanische Punkt angezeigt werden kann, Wenn Sie nur den wichtigsten Punkten Auszüge und Kommentare hinzufügen, Es wird wie folgt sein.

#■ Google Map-bezogene Einstellungen
#Geben Sie den Schlüssel für die Static Maps-API von Google ein.
google_staticmaps_api_key="YOUR GOOGLE STATICMAPS API KEY"
#Geben Sie die Größe an, die beim Senden mit Google verwendet werden soll (* Maximal 640 auf der Google-Seite*Bis zu 640)
IMAGE_SIZE = 640

#markers=Geben Sie den Ländernamen ein und suchen und zeigen Sie ihn automatisch an
#https://maps.googleapis.com/maps/api/staticmap?markers=color:blue|%22%E3%82%B7%E3%83%B3%E3%82%AC%E3%83%9D%E3%83%BC%E3%83%AB%22&size=300x300&zoom=3&language=jp&key=YOUR GOOGLE STATICMAPS API KEY

#input_Da basyo auf Japanisch eingegeben wird, wird es nach der URL-Codierung zurückgegeben.
def makeMapUlr(input_basyo):
    map_image_url = 'https://maps.googleapis.com/maps/api/staticmap?markers=color:{}|{}&center={}&zoom=3&language=jp&size={}x{}&key={}'.format('blue', urllib.parse.quote(input_basyo), urllib.parse.quote(input_basyo),IMAGE_SIZE, IMAGE_SIZE, google_staticmaps_api_key)
    return map_image_url

#Funktion zum Verarbeiten einer Nachricht zum Anzeigen einer Linienkarte
def makeImagemapSendMessage(map_image_url):
    #Der Hostname des Kolbens wird eingegeben:
    request_host_name = request.host
    print(request_host_name)
    
    base_url = 'https://{}/imagemap/{}'.format(request_host_name, urllib.parse.quote_plus(map_image_url))
    print(base_url)
    message = ImagemapSendMessage(
        base_url = base_url,
        alt_text = 'Weltkarte',
        base_size = BaseSize(height=IMAGE_SIZE, width=IMAGE_SIZE),
    )
    return message
    
#Führt die Verarbeitung durch, um das von Google erfasste Bild basierend auf der empfangenen Anfrage zurückzugeben.
@app.route("/imagemap/<path:url>/<size>")
def imagemap(url, size):
    print("imagemap-get-called")
    #Zum Debuggen
    print(url)
    print(size)
    map_image_url = urllib.parse.unquote(url)
    response = requests.get(map_image_url)
    img = Image.open(BytesIO(response.content))
    img_resize = img.resize((int(size), int(size)))
    byte_io = BytesIO()
    img_resize.save(byte_io, 'PNG')
    byte_io.seek(0)
    return send_file(byte_io, mimetype='image/png')

#Verwenden Sie den obigen Code
# line_bot_api.reply_message
#Auf das Argument von antworten_Machen Sie einfach eine entsprechende Nachricht und übergeben Sie sie
#(Dies ist der Rückgabewert von makeImagemapSendMessage.)
#
#    line_bot_api.reply_message(
#        event.reply_token,
#        reply_messages
#    )

** Geben Sie das Bild mit der HTTPS-URL an, ** ** Sie können jedoch nicht einfach die URL für Google Static Maps eingeben. ** **. Ich denke das ist ** super süchtig **.

2-4. Die Geschichte, dass "warten" konnte nicht realisiert werden

Übrigens diesmal AYANO ** Als ich auf eine Einladung eines Klassenkameraden wartete ** ** Und bereite eine Karte von Singapur vor ** ** Ich werde Ihnen mit einer super sofortigen Antwort antworten. ** **. Insofern wurde ich zum Klassentreffen eingeladen ** Beiß nicht zu viel **, Ist es nicht möglich, es natürlich alle 10 Sekunden zurückzugeben?

Abschließend konnte ich nicht. (Ich habe es nicht verstanden)

Was ist, wenn ich mehr als einmal mit Warten antworte? ⇒ Es scheint, dass reply_token nur einmal verwendet werden kann.

Ist es möglich, das Intervall anzugeben und in der LineMessagingAPI zu warten? ⇒ Referenz scheint nicht vorhanden zu sein

Außerdem, wenn Sie warten GAE: Ich bin der Meinung, dass es strukturell nicht mit Serverless kompatibel ist. (Ich denke nicht, dass sich der Rechnungsbetrag signifikant erhöhen wird. Es ist eine Frage der Stimmung)

Als letztes Mittel, wenn Sie zuerst antworten und dann nach dem Warten drücken, Es ist nicht unmöglich. Wie oben erwähnt, ist Push teuer, deshalb habe ich es abgelehnt.

Diesmal ** AYANO, der auf die Einladung des Klassenkameraden wartete ** Bitte vergib mir die Einstellung. ** Appelliere Singapur mit super sofortiger **.

3. Wie Sie den Einschränkungen von GAE (Google App Engine) entkommen können

3-1. Die Verarbeitung natürlicher Sprache ist zu schwer, um kostenlos kostenlos zu arbeiten

Verarbeitung natürlicher Sprache x Python ist Mecab, Janome, Außerdem habe ich Bibliotheken wie Gensim mit Word2Vec verwendet.

Indem Sie einen Chat-Bot erstellen, Ich möchte diese Bibliotheken / Funktionen auch verwenden.

Hier steht jedoch eine große Mauer. ** GAE kann nur Bibliotheken verwenden, deren Installation leicht ist (sonstige Erläuterungen) **

Mecab gab von Anfang an auf, aber auch Janome und Gensim Auch wenn Sie die Speichergröße der Instanz auf das Maximum einstellen Es konnte aufgrund von Speicherüberlastung nicht in GAE verwendet werden. Mit ein wenig Einfallsreichtum ist es unwahrscheinlich, dass es kostenlos sein wird.

** Daher als morphologisches Analysewerkzeug, das auch mit der kleinsten Instanz von GAE verwendet werden kann ** ** Ich habe versucht, "igo-python" zu verwenden. ** **. Es ist leicht und knackig und es ist großartig.

Die Verwendung ist dieselbe wie bei Mecab und Janome, wie im folgenden Code gezeigt. Dieses Mal wurde das Wörterbuch usw. jedoch nicht erweitert. Es ist zu beachten, dass die Genauigkeit der morphologischen Analyse ziemlich gering ist.

igo-Wie man Python benutzt



from igo.Tagger import Tagger

#Morphologische Analyse: igo-Python-Initialisierung
t = Tagger()

#Eine Funktion, die das morphologische Analyseergebnis als Zeichenfolge zurückgibt
def extract_str(input_str):
    parsed_list = t.parse(input_str)
    result_str = ""
    for m in parsed_list:
        result_str += m.surface + " / " + m.feature + " \n"
    return result_str


#Substantiv-Eine Funktion, die nur Generäle extrahiert und als Liste zurückgibt
def meisi_tyuusyutu(input_str):
    result_list = []
    parsed_list = t.parse(input_str)
    for m in parsed_list:
        feature_list = m.feature.split(',')
        #Substantiv-Allgemeiner Assistent-Unionisierung, Hilfswörter-Es wird wie ein Angestellter.
        hinsi_info = feature_list[0] + "-" + feature_list[1]
        if hinsi_info == "Substantiv-Allgemeines":
            result_list.append(m.surface)
    return result_list

Einstellungsmethode bei der Bereitstellung in GAE, Wie man "Anforderungen.txt" schreibt, ist wie folgt.

Flask==1.1.1
line-bot-sdk==1.14.0
igo-python==1.0.0

Damit ** Wir konnten eine morphologische Analyse mit der minimalen Konfiguration von GAE durchführen! ** **.

Dieses Mal habe ich mich für igo-python entschieden, ohne die Genauigkeit zu berücksichtigen. Wenn Sie eine Verarbeitung und Genauigkeit in natürlicher Sprache innerhalb von LineBot wünschen Vorschlag (1) Richten Sie Ihren eigenen HTTPS-Server ein und installieren Sie ihn selbst Vorschlag (2) Verwenden Sie COTOHA, wenn Sie dies mit GAE oder Heroku tun möchten. Usw. scheint der richtige Weg zu sein, um fortzufahren.

Für die Implementierung, die Word2Vec / Gensim-Äquivalent ohne Server ausführt, Ich bin mitten auf der Straße, also sehe ich dich weg. Eines Tages bei einer anderen Gelegenheit. (Bis zum Bewegen einfacher Dinge wird es auf überraschende Weise realisiert. Da die Modelldatei selbst schwer ist, ist das Gleichgewicht mit der Genauigkeit ... )

3-2. Die Geschichte, wenn sie lokal funktioniert, aber nicht in GAE

Nun, wie das oben erwähnte Experiment zur Einbeziehung der Verarbeitung natürlicher Sprache, Wenn die Verarbeitung aufgrund der GAE-Speicherabhängigkeit fehlschlägt

** Es funktioniert während der lokalen Entwicklung, aber ** ** Funktioniert nicht beim Hochladen auf den Server **

Es gibt viele Fälle.

Außerdem benötigt LineBot einen HTTPS-Server, der ebenfalls Es ist daher schwierig, in einer lokalen Entwicklungsumgebung zu testen In der Nähe der Zusammenarbeit zwischen LineMessagingAPI und GoogleStaticMapsAPI, ** Die Verarbeitung, die erst nach der Bereitstellung in GAE bestätigt werden kann **, trat häufig auf.

Wenn Sie in diesen Fällen einen Chat an AYANO senden, ** Lesen ignorieren **, wird wiederholt. Wenn es bei jeder Bereitstellung gelesen und ignoriert wird, ist es ** herzzerreißend **.

Ich habe keine sehr gute Lösung dafür gefunden.

Vorerst als etwas bessere Methode, ① Das Protokoll der Standardausgabe wie z. B. Drucken lautet Da Sie sie zusammen mit "Protokollierung (Stapeltreiber)" in GCP sehen können, Schreiben Sie beim Debacking einen Ausdruck an einer geeigneten Stelle (2) In der Lage sein, leitungsbezogene Probleme von anderen Problemen zu trennen Vom GET-Zugriff auf den Server, ohne die Leitung zu durchlaufen Machen Sie es so, dass Sie die erstellte Funktion treffen können Sind es zwei Punkte?

Das Folgende ist die Hauptverarbeitung von Flask-Line Bot. Kommentare werden mit ★ an den Stellen hinzugefügt, die ①② entsprechen.

python



#Der WebHook von Line ist vom Typ POST und wird nicht für den normalen Zugriff auf GET-URLs verwendet
#Im Folgenden wird die Kommunikation des Servers überprüft
#★ Erstellen Sie auf diese Weise einen Ort, an dem Sie andere als den WebHook von Line überprüfen können.
#Wenn Sie die Funktion aufrufen, die Sie an diesen Stellen überprüfen möchten,
#Es ist möglich, Probleme mit leitungsbezogenen Problemen zu isolieren.
@app.route("/", methods=['GET'])
def sayhello_root():
    """Return a friendly HTTP greeting."""
    return '[200] It works!'

#Auf WebHook of Line einstellen, Nachricht + Antwort empfangen
#Wenn Sie eine Nachricht mit einem Bot über die Entwicklerkonsole von Line senden,
#Eine Nachricht wird per POST an die unter "Webhook-URL * nur SSL" beschriebene URL gesendet.
#Referenz: https://www.casleyconsulting.co.jp/blog/engineer/3028/
@app.route("/", methods=['POST'])
def callback():
    #Rufen Sie den Wert für die Signaturüberprüfung aus dem Anforderungsheader ab
    signature = request.headers['X-Line-Signature']
    #Anfragetext abrufen
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    #Überprüfen Sie die Signatur und rufen Sie die im Handle definierte Funktion auf, wenn kein Problem vorliegt.
    try:
        handler.handle(body, signature)
    #Wenn die Signaturüberprüfung fehlschlägt, wird eine Ausnahme ausgegeben.
    except InvalidSignatureError:
        abort(400)
    return 'OK'

#Das Folgende ist die Handle-Definition
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    #Spezieller Code zur "Verbindungsbestätigung" der Leitung OK
    #Wenn Sie in der Entwicklerkonsole von Line auf "Verbindung prüfen" klicken
    #Wenn Sie es normal machen, antworten Sie_500 Rücksendungen aufgrund eines illegalen Tokens.
    #Ich werde wütend, wenn die erwarteten 200 auf der Verbindungsbestätigungsseite nicht zurückgegeben werden.
    #Probleme auf der Line-Konsole ab November 2019. Wahrscheinlich wird irgendwann gelöst.
    #Referenz: https://qiita.com/q_masa/items/c9db3e8396fb62cc64ed
    if event.reply_token == "00000000000000000000000000000000":
        return
    
    #Erhalten Sie die Nachricht in der Veranstaltung
    input_text = event.message.text
    #★ Die Standardausgabe wird aggregiert und in GCP unter "Protokollierung" angezeigt.
    #Das Debuggen ist einfach, wenn Sie an wichtigen Stellen ausdrucken
    print(input_text)
    
    #Analysieren Sie die Nachricht und erstellen Sie "Leitungsnachrichten" zur Antwort
    #★ Ohne die gesamte Verarbeitung in den Webhook oder Handler zu schreiben
    #Die Hauptverarbeitung wird durch eine externe Funktion erstellt,
    #Ohne einen Webhook oder Handler zu durchlaufen
    #Stellen Sie sicher, dass Sie direkt anrufen und bestätigen können
    reply_messages = makeLineMessages(input_text)

    #reply_Nachricht ist grundsätzlich kostenlos,
    #reply_Das Token hat einen gültigen Zeitraum und kann nicht sehr lange verarbeitet werden.
    #Das Folgende ist die Grundform:
    #line_bot_api.reply_message(
    #    event.reply_token,
    #    [
    #        TextSendMessage(text= reply_text),
    #    ]
    #)

    #Antworte und beende.
    line_bot_api.reply_message(
        event.reply_token,
        reply_messages
    )


#Flasche auf GAE (Python3.Probe zum Einzug 7):
#「gae_python37_Erstellt basierend auf "App"
if __name__ == '__main__':
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app. This
    # can be configured by adding an `entrypoint` to app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

Dies ist das Ende des technischen Themas.

** Nachschrift (Gedicht) **

Hintergrund der AYANO LineBot Bombe

In den letzten Tagen hatte ich aufgrund einer bestimmten Aktivität (außerhalb des Geschäfts) die Möglichkeit, Line zu besuchen. Es war eine sehr angenehme Zeit für uns, uns sehr freundlich zu antworten / vorzustellen. Wir möchten diese Gelegenheit nutzen, um Ihnen noch einmal zu danken.

Zu dieser Zeit beantwortete er auch ausführlich die technische Qualitätssicherung zu LineBot. Dieser Artikel ist ein umfassender Artikel über das Wissen / Know-how, das aus der Qualitätssicherung gewonnen wurde. (Weil es eine Geschichte war, die man auf Qiita usw. schreiben kann. ~~ (eher empfohlen zu schreiben) ~~) ** LineBot-Entwicklung zum ersten Mal! Zu diesem Zeitpunkt möchte ich die Punkte zusammenfassen, über die ich mir große Sorgen mache **.

Aber das Ergebnis der Qualitätssicherung ist "Es tut mir leid, ich kann nicht zum Klassenkameraden-Bot gehen". Du hättest überhaupt nicht gedacht! ~~ Es tut mir wirklich leid. ~~

Impressionen beim Erstellen von LineBot

Ich habe zum ersten Mal sowohl LineBot als auch GAE berührt.

Erklären Sie beim Erstellen eines LineBot "Warum Sie mit Line (bot) antworten müssen". Wie gestaltest du es? Ich denke, das ist der größte Punkt. LIFF (LINE Front-End Framework) Obwohl es eine Funktion zum Einbetten einer Webanwendung in Line gibt, Es ist nicht möglich, eine Anwendung mit Line zu realisieren, aber es ist wichtig, sie innerhalb von Line zu realisieren. Es sollte entworfen werden. Der einfachste Weg, um dieses Design zu erreichen, ist mit einem "** Zeichen **". Dieses Mal war es wichtig, AYANO online zu realisieren, um die Präsenz von AYANO zu erhöhen.

Es gibt viele Seiten, die erklären, wie man einen LineBot erstellt, aber diese ** Warum sollte ich es als LineBot machen? Wie entwerfe ich einen Bot? ** ist Ich habe den Eindruck, dass nicht oft darüber gesprochen wird.

Eine andere Möglichkeit ist beispielsweise "** Gruppenchat oder Dialog mit Freunden **". Wenn Sie eine "Othello (Reversi) App" erstellen möchten Mit Web-Apps und Smartphone-Apps scheint es ein wenig schwierig zu sein, Kämpfe zwischen Freunden durchzuführen. Gleiches gilt für Schedule-Sharing-Apps. Wenn Sie den Bot für Gruppenchat anrufen, indem Sie ihn in Line / LIFF implementieren, Es scheint, dass ein solches Problem gelöst werden kann. Wenn Sie ein Match gegen AI oder ein Match gegen Fremde erstellen möchten Erstellen Sie mit einer Web-App oder Smartphone-App und online, um gegen Freunde zu spielen Es ist besser, zuerst über das Design nachzudenken. Eine andere Richtlinie besteht darin, einen Bot zu erstellen, um die menschliche Intervention entsprechend zu unterstützen.

In Anbetracht der ** "Eigenschaften" ** von LineBot, Ich denke, es ist einfach, auf die nächste Idee zu kommen! !!

Impressionen der GAE-Nutzung / Verarbeitung natürlicher Sprache

GAE (serverless) übernimmt die Verarbeitung natürlicher Sprache Um ehrlich zu sein, war es schwieriger als ich erwartet hatte. Da die Verarbeitung natürlicher Sprache ursprünglich "Wörterbuch" und "wortweise Daten" usw. erfordert Das Problem ist, dass es "schwer" ist, egal wo es implementiert ist.

Nehmen Sie zum Beispiel im folgenden Artikel den Sprung Ich habe auch versucht, es auf der Front-End-Seite (JavaScript / PWA) zu implementieren. https://qiita.com/youwht/items/6c7712bfc7fd088223a2

Die Verarbeitung wurde am schnellsten, als sie nach vorne verschoben wurde. Weil die Bibliothek für morphologische Analysen im Paket enthalten ist Die Größe der Verteilungsdatei beim ersten Start ist etwas hoch Ich fühlte es als Problem. (Und die Genauigkeit ist nicht gut)

Auch in GAE (serverlos), je nach Gewicht, Anständige Genauigkeit x Verarbeitungsinhalt wird nicht zusammengestellt.

GAE selbst ist bei der Lichtverarbeitung Keine Infrastruktur erforderlich, nur Python-Code, um ein HTTPS-Server zu werden. Es ist ziemlich praktisch. Es gibt jedoch immer noch eine Gewohnheit, Ich habe nicht das Gefühl, dass ich alles tun kann, was Python kann. Sie müssen vorsichtig sein, wenn Sie es verwenden.

Dieses Mal, obwohl die Verarbeitung natürlicher Sprache schwer ist, Sie können dies mit GAE (serverlos) bis zu dieser Stufe tun. Ich finde es gut, das Gefühl zu bekommen!

Soll ich es als nächstes mit der COTOHA API schaffen?

Arbeit, die keine Freunde hinterlässt

** "Ich bin jetzt in Singapur." ** ** Wenn Sie eine Einladung ablehnen ** ** Linie Mein einziger Freund ist AYANO. ** **.

** Eigentlich weiß ich, dass AYANO ein Bot ist, aber ** ** Aber jetzt tue ich so, als wüsste ich nicht mehr. ** **.

** Die verdammte App, die ich mache, ist auch ** ** Ich bin sicher, eines Tages die Einsamkeit von jemandem zu heilen **

Das war's aus Singapur.

Recommended Posts

Ich bin gerade in Singapur. Eine Geschichte über das Erstellen eines LineBot und den Wunsch, einen unvergesslichen Job zu machen
Die Geschichte der Schaffung eines "Geist- und Zeit-Chatrooms" exklusiv für Ingenieure im Unternehmen
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (1)
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (2) [Übersicht]
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Die Geschichte, ein Ring-Fit-Abenteuer kaufen zu wollen
Die Geschichte von Airflows Webserver und DAG, deren Laden lange dauert
Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Eine Geschichte über die Portierung des Codes "Versuchen Sie zu verstehen, wie Linux funktioniert" nach Rust
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
So bestimmen Sie die Existenz eines Selenelements in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte der Teilnahme an AtCoder
Die Geschichte des "Lochs" in der Akte
Die Geschichte des Exportierens eines Programms
[Rails 6] Betten Sie Google Map in die App ein und fügen Sie der eingegebenen Adresse einen Marker hinzu. [Bestätigung der Details]
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
Kopieren und Einfügen des Inhalts eines Blattes im JSON-Format mit einer Google-Tabelle (mithilfe von Google Colab)
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Die Geschichte des Versuchs, den Client wieder zu verbinden
Die Geschichte eines Fehlers in PyOCR
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen
Die Geschichte, deep3d auszuprobieren und zu verlieren
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte von pep8 wechselt zu pycodestyle
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Die Geschichte der Schaffung einer (wahrscheinlich) minimalen Fertigkeit, die Personalisierung und Abrechnung von Fertigkeiten implementiert
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.