[PYTHON] Serverloser LINE-Bot, der in 2 Stunden ausgeführt werden kann (Erfassung der Quellkennung)

Motiviert

――Es ist interessant, die Bilder von der High School und dem College in letzter Zeit zu sehen »Aber es ist ärgerlich, es jeden Tag zu finden

tl;dr Das Ziel ist ** in einem Gruppenraum mit Bot. Wenn ein bestimmtes Wort erscheint, wird ein Bild zufällig aus dem in S3 platzierten Bild erfasst und Bot gibt das Foto zurück **

  1. Feuern Sie Lambda vom LINE-Server ab
  2. Holen Sie sich die URL von RDS
  3. Senden Sie den POST einschließlich der URL an den LINE-Server
  4. Das S3-Bild wird in die App gepostet

Ist es der Fluss?

Darüber hinaus werden wir es implementieren, damit wir auch die "Quellkennung" erhalten können, was ein Engpass bei der Erstellung eines LINE-Bots ist.

Konfigurationsdiagramm (voraussichtlich abgeschlossen)

Untitled Diagram.png

In diesem Artikel möchte ich als ersten Schritt Lambda verwenden, um die Kommunikation zu überprüfen und mit verschiedenen Dingen zu spielen.

Konfigurationsdiagramm (aktueller Status)

Untitled Diagram-2.png

Holen Sie sich ein LINE Bot-Konto

https://business.line.me/ja/

Lassen Sie uns zunächst hier ein Geschäftskonto registrieren.

Sie werden nach der Art des Jobs gefragt, aber es ist im Allgemeinen angemessen und in Ordnung (ich erinnere mich nicht an die Details, weil ich letztes Jahr einen Account erstellt habe ,,,) Der Beruf des Schriftstellers ist Schönheit

Dann gibt es "Erstellen eines Geschäftskontos" am unteren Rand des Bildschirms "Kontoliste". Gehen Sie also hier. スクリーンショット 2017-08-31 0.37.26.png

Dann werden Sie gefragt, welche Art von Service Ihr Konto anbietet. Wählen Sie hier jedoch die kleine "Entwickler-Testversion starten" unten in der ** Messaging-API ** aus.

apapapap.png

Dadurch wird Ihr Kontoplan zu einer Entwickler-Testversion. Der große Unterschied zum allgemeinen kostenlosen Plan ist

developper frei
pushAPI OK NG
Anzahl der Freunde, die hinzugefügt werden können 50 Keine Begrenzung

Entwickler-Test ist genug, wenn Sie es als Hobby machen

Geben Sie den Kontonamen, das Bild, den Jobtyp usw. ein und bewerben Sie sich Danach ist es leicht, diesen Teil zu vergessen, aber bitte gehen Sie zu ** LINE @ MANAGER **

Dann sollten Sie auf diesen Bildschirm stoßen (Kontoeinstellungen> Messaging-API-Einstellungen) スクリーンショット 2017-08-31 0.52.46.png

Fahren wir so fort, wie es ist Jetzt ist es sonnig und die Erstellung des Bot-Kontos ist abgeschlossen

Hier notieren wir uns ** CHANNEL_ACCESS_TOKEN ** für die Verbindung von LINE-Server und Lambda. スクリーンショット 2017-09-01 14.26.12.png

Lambda-Funktionserstellung & Lambda => Verbindungseinstellung zum LINE-Server

Als nächstes möchte ich mit Lambda einen Server ohne Server erstellen und auch die Verbindung zum Lambda => LINE-Server herstellen.

Mit AWS Lambda können Sie Ihren Code ohne Serverbereitstellung oder -verwaltung ausführen. Sie zahlen nur für die tatsächliche Rechenzeit, die Sie verwenden, und Sie zahlen nicht, wenn der Code nicht ausgeführt wird. Mit Lambda können Sie praktisch jede Art von Anwendung oder Backend-Service ausführen, ohne dass eine Verwaltung erforderlich ist. Sobald Sie Ihren Code hochgeladen haben, erledigt Lambda alles, was Sie zum Ausführen und Skalieren Ihres Codes für eine hohe Verfügbarkeit benötigen. Der Code kann so eingestellt werden, dass er automatisch von anderen AWS-Diensten ausgelöst wird, oder er kann so eingestellt werden, dass er direkt aus dem Web oder einer mobilen Anwendung aufgerufen wird.

  1. Wählen Sie in der AWS-Konsole "Lambda" aus
  2. Funktion erstellen
  3. Konstruktionszeichnung: "Von Grund auf neu erstellen"
  4. Auslöser: API Gateway
  5. API-Name: {optional}, Sicherheit: open, zu implementierende Phase: prod
  6. Name: {optional}, Beschreibung: {beliebig}: Laufzeit: python3.6

Dieses Mal werde ich python3.6 verwenden (w weil es mir kürzlich gefällt)

Wenn Sie versuchen, mithilfe der Messagein-API von LINE etwas für einen bestimmten Benutzergruppenraum zu tun, erhalten Sie eine Zielkennung. das ist,

Sie können die Quellbenutzer-, Gruppen- und Gesprächsraumkennungen für Webhook-Ereignisse als Zielkennungen angeben. Sie können die in der LINE-App verwendete LINE-ID nicht angeben.

Es scheint, dass. Selbst wenn der Benutzer, der den Bot entwickelt, seine eigene Zielkennung in LINE Developers geschrieben hat, kennt er die Kennungen anderer Benutzergruppenräume überhaupt nicht.

Zuallererst gibt der in Lambda implementierte Code ** die Zielkennung des Gruppenbenutzers zurück, der an Bot gesendet hat **.

Unten ist der Beispielcode, den ich gemacht habe


import urllib.request, json, os, ast

def lambda_handler(event, context):

    #Vorbereitung für den LINE-Server
    url = "https://api.line.me/v2/bot/message/push"
    method = "POST"
    headers = {
        'Authorization': os.getenv("CHANNEL_ACCESS_TOKEN"),
        'Content-Type': 'application/json'
    }

    #Analysieren Sie die Zeichenfolge, um den Typ zu diktieren
    apiParam = ast.literal_eval(event['body'])
    source = apiParam['events'][0]['source']

    sourceList = []
    for key, value in source.items():
        sourceList.append({"type": "text", "text": key + "#" + value})

    obj = {
        #Anfragen aus dem Raum werden an den Raum zurückgeschickt. Andere kehren zum Anrufer zurück.
        "to": source["roomId"] if "roomId" in source else source["userId"],
        "messages": sourceList
    }
    json_data = json.dumps(obj).encode("utf-8")

    #Bereiten Sie die http-Anfrage und den POST vor
    request = urllib.request.Request(url, data=json_data, method=method, headers=headers)
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
    return 0

Handler: index.lambda_handler Rolle: Erstellen Sie eine benutzerdefinierte Rolle => Fügen Sie nun der Richtlinienvorlage "Nur-Lese-Zugriff für S3-Objekte" hinzu. Lassen Sie uns die anderen angemessen machen.

Stellen Sie außerdem Folgendes im Teil der Umgebungsvariablen ein

CHANNEL_ACCESSS_TOKEN:{KANAL, den ich zuvor auf dem LINE-Bildschirm notiert habe_ACCESS_TOKEN}

Fügen Sie dies ein und lassen Sie uns "speichern"

LINE Server => Verbindungseinstellungen zu Lambda

Schließlich werden wir die Verbindung vom LINE-Server zu Lambda herstellen.

Aus dem zuvor erstellten Lambda-Triggerelement (siehe Abbildung unten)

スクリーンショット 2017-09-02 22.17.31.png

Ich werde die URL abholen, ich bin Methode: AMY. Wenn Sie diese URL also mit GET oder POST treffen, wird der in Lambda geschriebene Code ausgeführt.

Legen Sie nun die URL für dieses Auslösen auf dem LINE-Server fest.

Melden Sie sich bei LINE Developers an und setzen Sie es auf "Webhook URL"

スクリーンショット 2017-09-02 22.22.58.png

Stellen Sie zu diesem Zeitpunkt sicher, dass Sie die Portnummer 443 hinzufügen. Scheint gespielt zu werden (nicht ausprobiert)

Damit ist der LINE Bot an einem sonnigen Tag fertig.

Registrieren Sie sich als Freund aus dem QR-Code von LINE Developers und senden Sie etwas in den entsprechenden Raum 1to1 Es sollte so aussehen Dies sind die Zielkennungen. In diesem Fall werden meine eigene Kennung und die Kennung des Raums angezeigt, an den ich gesendet habe

スクリーンショット 2017-09-02 22.56.19.png

Tipps1 Kann ich eine externe Bibliothek verwenden?

In Lambda können Sie nur Code schreiben und darauf zugreifen, sodass Sie im Ausgangszustand nur Basisbibliotheken verwenden können. Als ich die API von Lambda aufgerufen habe, konnte ich urllib2 nicht verwenden und habe urllib durch Drücken verwendet. Wenn Sie die Postleitzahl und die Bibliotheken hochladen, können Sie die Bibliothek verwenden, aber ich werde sie beim nächsten Mal vorstellen

tips2 Warum analysierst du wieder?

Ein kurzer Überblick über die LINE API-Referenz Die Webhook-Anfrage wurde wie folgt geschrieben.

{
  "events": [
      {
        "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
        "type": "message",
        "timestamp": 1462629479859,
        "source": {
             "type": "user",
             "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
         },
         "message": {
             "id": "325708",
             "type": "text",
             "text": "Hello, world"
          }
      }
  ]
}

Andererseits sind die Argumente von Lambda wie folgt

def lambda_handler(event, context):

Sie sind im Argument "Ereignis" enthalten.

{
    ~~~~~Abkürzung~~~~~~~
    "body": "{"events":[{"type":"message","replyToken":"cd8477b1e2844fb7ac535ba8cfb7e604","source":{"userId":"Ue49159d045ba254087865fb1c09ce0e7","type":"user"},"timestamp":1504100774524,"message":{"type":"text","id":"6623088374597","text":"fewgvlkwgw"}}]}"
    ~~~~~Abkürzung~~~~~~~
}

Es ist als Zeichenkette gespeichert ... Ich dachte, es wäre ein "Dikt" -Typ, und ich war süchtig danach ...

Damit

apiParam = ast.literal_eval(event['body'])

So analysiere ich

Impressionen

――Weil es serverlos ist, gibt es nur wenige süchtig machende Elemente ――Ich habe die Push-API nicht verwendet, obwohl ich sie mit meinem LINE-Entwicklerkonto verwenden kann. ――Das Gefühl, dass die Verschwendung von Python entfernt wurde - ||AberorOder in PHParray_key_exist()Aber in PythonA in BKann von gefühlt werden

Vorschau beim nächsten Mal

nächstes Mal ** RDS & S3 Interlocking Edition ** Wenn Sie also "Bitte" senden, erstellen wir etwas, das auf zufällige Fotos von RDS (S3) reagiert.

Recommended Posts

Serverloser LINE-Bot, der in 2 Stunden ausgeführt werden kann (Erfassung der Quellkennung)
Textanalyse, die in 5 Minuten durchgeführt werden kann [Word Cloud]
Eine Geschichte, die Heroku, die in 5 Minuten gemacht werden kann, tatsächlich 3 Tage dauerte
Funktionen, die in der for-Anweisung verwendet werden können
Erstellen von Sphinx, das mit Markdown geschrieben werden kann
Morphologische Analyse und tfidf (mit Testcode), die in ca. 1 Minute durchgeführt werden können
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann
Grundlegende Algorithmen, die bei Wettkampfprofis eingesetzt werden können
ANTs Bildregistrierung, die in 5 Minuten verwendet werden kann
Es scheint, dass Skeleton Tracking mit RealSense durchgeführt werden kann
Goroutine (parallele Steuerung), die im Feld eingesetzt werden kann
Goroutine, die im Feld verwendet werden kann (errgroup.Group Edition)
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Bewertungsindex, der für GridSearchCV von sklearn angegeben werden kann
Ein Datensatz, den GAMEBOY mit Python nicht erstellen konnte. (PYBOY)
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
Umgang mit Zeichenketten in der JSON-Kommunikation
Zusammenfassung der Standardeingabe von Python, die in Competition Pro verwendet werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Python-Standardmodul, das in der Befehlszeile verwendet werden kann