[PYTHON] Ich habe einen Linebot erstellt, der mich über nahegelegene Evakuierungsstellen auf AWS informiert

Einführung

Dieser Artikel ist "Programmieren, um Sie vom Sterben abzuhalten", Und ich wollte fast dasselbe System mit AWS als Backend erstellen. Den detaillierten Inhalt des Systems entnehmen Sie bitte dem Originalartikel.

Ich möchte auch ein System schaffen, das bei Gegenmaßnahmen gegen Katastrophen und bei der Evakuierungsanleitung hilft, und ich plane, Artikel zu den Themen "Evakuierungsberatungssystem mit Drohnen" und "Evakuierungsberatungssystem mit intelligenten Lautsprechern" zu veröffentlichen. Ich hoffe du kannst es auch sehen.

Zielgruppe

Produktion

友だち追加

Am Ende habe ich darüber nachgedacht, ein Drohnen-System zu bauen. Machen Sie sich also keine Sorgen, dass das Symbol eine Drohne ist. Wenn Sie die Standortinformationen senden, werden die umliegenden Evakuierungsstellen zurückgegeben. (Ab dem 13. November 2019 werden nur noch Evakuierungsstellen in Ostjapan unterstützt.)

Evakuierungsortdaten

Daten zu Evakuierungsstellen im ganzen Land werden von hier übernommen. Bitte im JSON-Format herunterladen. (https://www.geospatial.jp/ckan/dataset/hinanbasho/resource/5fe3d23c-03fb-49ee-8a65-4f7495a8ea40) Konvertieren Sie es anschließend in eine CSV-Datei, indem Sie auf den Originalartikel verweisen. Dies erleichtert die spätere Verarbeitung mit Pandas in Python.

Informationen zur Backend-Konfiguration

Ein einfaches Konfigurationsdiagramm dieses LINE-Bots ist unten dargestellt. スクリーンショット 2019-11-13 0.18.48.png

Für diejenigen, die AWS noch nicht kennen, sind hier einige wichtige Services aufgeführt, die häufig in AWS verwendet werden. Amazon API Gateway Auf diese Weise können externe Services mit AWS verknüpft werden. Hier erhalten wir Anforderungsdaten, die von der LINE-Talkroom-Aktion mit einem Webhook versehen wurden Amazon S3 Speicher, in dem Daten gespeichert werden. So etwas wie Google Drive. Erinnerungen in menschlichen Begriffen. Hier werden die zuvor erstellten CSV-Daten der Evakuierungsstelle eingegeben. AWS lambda Ein Ort, der Anforderungsdaten verarbeitet. Server. In menschlicher Hinsicht ist es das Gehirn. Der Ausführungszeitpunkt von Lambda kann festgelegt und ausgelöst werden, wenn eine Anforderung an das API-Gateway gesendet wird oder wenn Daten zu S3 hinzugefügt werden. Hier werden die Standortinformationen, die von LINE stammen, zurückgegeben, damit nahe gelegene Evakuierungsstellen auf LINE angezeigt werden können.

Alles was Sie wissen müssen, sind diese drei.

Implementierung

Zuerst müssen Sie den LINE-Bot einrichten, Lambda erstellen und Gateway erstellen. Voraussetzung ist, dass das LINE-Entwicklerkonto und das AWS-Konto im Voraus erstellt werden. Der folgende Artikel ist sehr hilfreich, und ich verwende auch AWS und Python für das Back-End. Daher halte ich es für eine gute Idee, etwas zu erstellen, das zuerst funktioniert. https://xp-cloud.jp/blog/2019/06/24/5560/

Mit Bezug auf diesen Artikel habe ich den Lambda-Code wie folgt implementiert.

import json
import boto3
import urllib
import pyproj
import pandas as pd
import re
import os

#Entfernungsberechnung zwischen zwei Punkten
def calc_distance(ido1, kdo1, ido2, kdo2):
    g = pyproj.Geod(ellps='WGS84')
    result = g.inv(kdo1, ido1, kdo2, ido2)
    distance = result[2]
    return round(distance)
 
def lambda_handler(event, context):
    url = "https://api.line.me/v2/bot/message/reply"
    method = "POST"
    headers = {
        'Authorization': 'Bearer ' + os.environ['CHANNEL_ACCESS_TOKEN'],
        'Content-Type': 'application/json'
    }
    if event['events'][0]['message']['type'] == 'location':
        s3 = boto3.client('s3')
        bucket_name = 'japan-shelter-all'
        file_name = 'east.csv' 
        response = s3.get_object(Bucket=bucket_name, Key=file_name)
        df = pd.read_csv(response['Body'])
        
        #Zielen Sie auf Evakuierungsstellen in der Nähe Ihres aktuellen Standorts
        ido_from = event['events'][0]['message']['latitude'] - 0.05
        ido_to = event['events'][0]['message']['latitude'] + 0.05
        kdo_from = event['events'][0]['message']['longitude'] - 0.05
        kdo_to = event['events'][0]['message']['longitude'] + 0.05
        df_near = df.query(
            f'ido > {ido_from} and ido < {ido_to} and kdo > {kdo_from} and kdo < {kdo_to}'
        )
        
        #Identifizieren Sie den nächstgelegenen Evakuierungsort von Ihrem aktuellen Standort aus
        min_distance = None
        min_row = None
        for index, row in df_near.iterrows():
            hinan_ido = row['ido']
            hinan_kdo = row['kdo']
            distance = calc_distance(
                event['events'][0]['message']['latitude'], event['events'][0]['message']['longitude'], hinan_ido, hinan_kdo
            )
            if min_distance is None or distance < min_distance:
                min_distance = distance
                min_row = row
        
        if min_distance != None:
            message = [
                {
                    "type": "text",
                    "text": f"{min_row['name']}Lassen Sie uns evakuieren"
                },
                {
                    "type": "location",
                    "title": f"Zum Evakuierungsort{min_distance}m",
                    "address": f"{min_row['addr']}",
                    "latitude": f"{min_row['ido']}",
                    "longitude": f"{min_row['kdo']}"
                }
            ]
        else:
            message = [
                {
                    "type": "text",
                    "text": "Kein Unterschlupf in der Nähe gefunden"
                }
            ]
    
    
        params = {
            "replyToken": event['events'][0]['replyToken'],
            "messages": message
        }
        request = urllib.request.Request(url, json.dumps(params).encode("utf-8"), method=method, headers=headers)
        with urllib.request.urlopen(request) as res:
            body = res.read()
    return 0

Selbst wenn Sie versuchen, Lambda so auszuführen, wie es ist, tritt ein Fehler auf, wenn die externen Bibliotheken von pandas und pyproj nicht geladen werden können. Die Lösung besteht darin, diese zusätzlichen Bibliotheken im Layer-Format in Lambda importieren zu lassen. Installieren Sie diese Bibliotheken auf EC2 (AWS Virtual Machine), laden Sie sie in S3 hoch und fügen Sie sie dann zur Ebene hinzu. (Wenn Sie andere Methoden zusammen sehen möchten, lesen Sie [AWS / Lambda] Python-Methode zum Laden externer Bibliotheken) Informationen zum Verfahren finden Sie im folgenden Youtube-Video. Dies ist ein Video aus Übersee, aber es ist sehr leicht zu verstehen. Vergessen Sie nicht, sowohl pyproj als auch pandas zu installieren. https://www.youtube.com/watch?v=zrrH9nbSPhQ

スクリーンショット 2019-11-13 13.29.30.png

Wenn Sie danach verschiedene Bibliotheken sicher importieren können, ist dies erfolgreich.

Zusammenfassung

Ich habe eine einfache Anleitung von LINEbot auf AWS unter Bezugnahme auf andere Artikel zusammengefasst. Normalerweise berühre ich AWS nicht selbst. Bitte teilen Sie mir mit, ob Sie die CSV-Datei in DB verwalten sollen. Die App selbst war nach Bestätigung der Kommunikation zufrieden, daher werde ich sie nicht verbessern. Als Folge planen wir die Veröffentlichung von "Disaster Evacuation Advisory System mit Drohne" und "Evacuation Advisory System mit Smart Speaker". Schauen Sie also bitte mal rein. Wenn Sie diesen Artikel hilfreich finden oder eine Fortsetzung erwarten, geben Sie ihm bitte eine hohe Bewertung ^^

Recommended Posts

Ich habe einen Linebot erstellt, der mich über nahegelegene Evakuierungsstellen auf AWS informiert
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe einen SlackBot erstellt, der mich jede Woche über Informationen zum AtCoder-Wettbewerb informiert
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Ich habe einen neuronalen Netzwerkgenerator erstellt, der auf FPGA läuft
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen neuen AWS S3-Eimer hergestellt
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
[Python] Ich habe einen Bot erstellt, der mir die aktuelle Temperatur anzeigt, wenn ich einen Ortsnamen in LINE eingebe
Ich habe eine Chrome-Erweiterung erstellt, die ein Diagramm auf der Amedas-Seite anzeigt
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt
Erstellt einen Slack-Bot, der AWS Lambda über das Ablaufdatum eines SSL-Zertifikats bestätigt und benachrichtigt
[Bot dekodieren] Ich habe versucht, einen Bot zu erstellen, der mir den Rassenwert von Pokemon angibt
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe eine Twitter-App erstellt, die das Bild eines bestimmten Charakters auf der Twitter-Timeline durch Pytorch-Transfer-Lernen identifiziert und speichert
Ich habe ein Schwellenwertänderungsfeld für Peppers Dialog erstellt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
〇✕ Ich habe ein Spiel gemacht
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
[Python] Erstellen Sie einen Linebot, der ein beliebiges Datum auf ein Foto zeichnet
unixtime ← → Ich habe versucht, eine Klasse zu erstellen, die die Datums- / Uhrzeitkonvertierung problemlos durchführt
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe eine verdammte App gemacht, mit der du nicht überspringen kannst
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)
Ich habe ein Anomalieerkennungsmodell erstellt, das unter iOS funktioniert
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
[Python3] Liste der Websites, auf die ich beim Starten von Python verwiesen habe
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Eine Geschichte, bei der es mir schwer fiel, Grafiken mit matplotlib anzuzeigen
Ich habe mit Heroku + Flask + PostgreSQL (Heroku Postgres) einen LINE-Bot erstellt, der mir den Typ und die Stärke von Pokemon in der Garal-Region angibt.