[PYTHON] Erstellen eines LINE BOT, um zusätzliche AtCoder-Wettbewerbe mit AWS zu benachrichtigen

Haben Sie Benachrichtigungen für andere Apps als LINE deaktiviert? Ich schneide. Ich wollte, dass Sie auf LINE benachrichtigt werden, wenn der Zeitplan für den AtCoder-Wettbewerb hinzugefügt wurde, und habe daher mit Mr JJ einen LINE BOT erstellt.

Was ich geschaffen habe

Wir suchen stündlich um 00:00 Uhr nach Wettbewerben und BOT benachrichtigt Sie, wenn neue Wettbewerbe hinzugefügt werden. image.png

Es gibt auch eine Funktion, die beim Senden einer Nachricht zurückgegeben wird. (Bonus) image.png

Sie können dem erstellten LINE BOT über die Schaltfläche unten Freunde hinzufügen.

Freund hinzufügen

Backend-Konfiguration

LINE_BOT_structure.png Die gesamte Backend-Verarbeitung erfolgt in AWS (Amazon Web Services). Die Operation unter AWS kann in die folgenden zwei unterteilt werden.

Beschreibt die für jeden Abschnitt implementierten Funktionen.

Abschnitt zur Benachrichtigung des Wettbewerbs

Ablauf des Wettbewerbsbenachrichtigungsabschnitts

  1. Lambda-Funktion: ** AtCoder_contest_Search ** durchsucht die AtCoder-Homepage, um eine Liste der geplanten Wettbewerbe zu erhalten.
  2. ** AtCoder_contest_Search ** ruft die JSON-Datei der Benachrichtigungswettbewerbsliste von S3 ab.
  3. Berechnen Sie die Differenzmenge und extrahieren Sie unangekündigte Wettbewerbe. Wenn der unangekündigte Wettbewerb leer ist, endet er.
  4. Senden Sie unangekündigte Wettbewerbsdaten an die Lambda-Funktion: ** LINE_contest_notify **.
  5. Benachrichtigen Sie die von ** LINE_contest_notify ** im Broadcast-Format gesendeten Daten mit line-bot-sdk.
  6. Laden Sie die in [1] erhaltenen Wettbewerbsdaten in S3 hoch

Kratzfunktion

Python3


def get_contests():
    #Daten von URL abrufen
    url = "https://atcoder.jp/home?lang=ja"
    html_data = requests.get(url)

    #HTML-Perspektive
    soup = BeautifulSoup(html_data.text, "html.parser")
    
    tags = ["upcoming", "recent"]
    ret_dic = {}
    for tag in tags:
        div = soup.find("div", id="contest-table-"+tag)
        table = div.find("table")
        times  = table.find_all("time")
        titles = table.find_all("a")

        ret_list = []
        for i in range(len(times)):
            dic = {}
            dic["start"] = times[i].text
            dic["title"] = titles[i*2+1].text
            dic["url"] = "https://atcoder.jp" + titles[i*2+1].get("href")
            ret_list.append(dic)
        ret_dic[tag] = ret_list
    return ret_dic
Dateninhalt
Streit null
Rückgabewert Daten für jeden Wettbewerb(Startzeit / Titel / URL)Liste der Wörterbücher mit

In diesem BOT wird nur * ret_dic ["bevorstehende"] * verwendet.

Holen Sie sich Dateien von S3

Python3


def get_data_s3():
    #Benachrichtigte Contest-JSON-Datei auf S3"contests.json"Wird geladen
    
    client = boto3.client("s3")
    try:
        response = client.get_object(Bucket = "bucket_name", Key = "json_file_name")
    except Exception as e:
        print(e)
    return json.loads(response["Body"].read().decode())
Dateninhalt
Streit null
Rückgabewert Wörterbuchdaten lesen JSON-Datei auf S3

Der Rückgabewert der Methode * get_object * ist ein Wörterbuch, und der Schlüssel "Body" enthält den Inhalt der Datei.

Datei-Upload nach S3

Python3


def put_data_s3(save_dic):
    #S3-Uploader für neue notifizierte Contest-JSON-Dateien
    
    text = json.dumps(save_dic, ensure_ascii = False)
    s3 = boto3.resource("s3")
    s3.Object("bucket_name", "json_file_name").put(Body = text)
Dateninhalt
Streit Zu speichernde Wörterbuchdaten
Rückgabewert null

Wenn beim Konvertieren des Wörterbuchs in JSON-formatierten Text der Wert von * sure_ascii * auf False gesetzt ist, Die Japaner in der JSON-Datei sind leichter zu lesen und die Dateigröße kann reduziert werden.

Senden einer Broadcast-Nachricht

Python3


def DatetimeToString(date):
    if not isinstance(date, datetime.datetime):
        date = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S%z")
    week_list = "Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag und Sonntag"
    return f"{date.strftime('%m/%d')}({week_list[date.weekday()]}){date.strftime('%H:%M')}"

def MakeMessageText(event):
    text = DatetimeToString(event["start"]) + "\n" + event["title"] + "wird gehalten!\n" + event["url"]
    return text

def main(event, context):    
    line_bot_api = LineBotApi("channel_access_token")
    message = MakeMessageText(event)
    line_bot_api.broadcast(TextSendMessage(text=message))

    # ***Verarbeitung zum Beenden der Hauptfunktion***

Erstellen Sie mit der Funktion * DatetimeToString * ein Nachrichtenformat für die Startzeit des Wettbewerbs Erstellt ein Format für Nachrichten, die von der Funktion * MakeMessageText * benachrichtigt werden sollen.

Sie können alle Ihre BOT-Freunde benachrichtigen, indem Sie einfach die * LineBotApi * -Klasse * Broadcast * -Methode von line-bot-sdk aufrufen. ..

LINE-Antwortabschnitt

Konfigurationsdiagramm dieses Systems ![LINE_BOT_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308399/d98a570f-3c81-a5e4-b71e-8ac8182c1a31.png)

Fluss des LINE-Antwortabschnitts

  1. Wenn LINE BOT eine LINE-Nachricht empfängt, verwendet es einen Webhook, um den Nachrichteninhalt an API Gateway zu senden.
  2. POST to API Gateway löst die Lambda-Funktion aus: ** LINE_reply_message ** wird ausgeführt.
  3. ** LINE_reply_message ** sendet eine LINE-Antwortnachricht mit line-bot-sdk.

Antwortnachricht senden

Python3


def main(event, context):
    handler = WebhookHandler("channel_secret")
    line_bot_api = LineBotApi("channel_access_token")
    body = event["body"]

    #Antwortfunktion zum Handler hinzugefügt
    @handler.add(MessageEvent)
    def SendReply(line_event):
        message = MakeReplyMessage(line_event.message.text)
        line_bot_api.reply_message(line_event.reply_token, TextSendMessage(text=message))

    try:
        handler.handle(body, event["headers"]["X-Line-Signature"])
    except #Fehlerbehandlung

    # ***Verarbeitung zum Beenden der Hauptfunktion***

Die Funktion * MakeReplyMessage * gibt eine Antwortnachricht als Zeichenfolge entsprechend dem von BOT empfangenen Nachrichteninhalt zurück. Wir empfehlen insbesondere, die line-bot-sdk-Dokumentation für diesen Teil zu lesen.

Am Ende

Wir haben die Hauptfunktionen vorgestellt, die wir erstellt haben. Line-bot-sdk, das die Bedienung von BOT vereinfacht, ist sehr praktisch. Ich habe wenig Wissen über AWS und das Design ist ziemlich rau, aber wenn ich Lust dazu habe, werde ich in Zukunft Funktionen hinzufügen und verbessern. (vielleicht)

Recommended Posts

Erstellen eines LINE BOT, um zusätzliche AtCoder-Wettbewerbe mit AWS zu benachrichtigen
Erstellt einen Discord-Bot, um Sie über Aktualisierungen zu informieren und Romanautor zu werden
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
Erstellen eines LINE-Bots ~ Erstellen, Bereitstellen und Starten von ~
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (2) [Übersicht]
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Verwenden Sie AWS Lambda + LINE Benachrichtigen, um LINE zu benachrichtigen, dass Sie Ihren Regenschirm nicht vergessen, wenn Sie nach Hause kommen
Die weltweit am einfachsten zu verstehende Erklärung zur Herstellung von LINE BOT (1) [Kontoerstellung]
Lassen Sie einen Papagei LINE Bot mit AWS Cloud9 zurückgeben
[Python] Verwenden der Linien-API [1. Erstellung des Beauty-Bots]
LINE Bot, der Sie über die interessierenden Aktien informiert
Spielen Sie, um Slack mithilfe von AWS PaaS über Raspberry Pi3 über Umgebungsdaten von SensorTag zu informieren
So erstellen Sie einen interaktiven LINE BOT 004 (beantworten Sie den Stichtag eines börsennotierten Unternehmens)
[LINE Notify API, AWS] Senden Sie regelmäßig summende Tweets an die Gruppe LINE
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
Ich möchte eine Nachricht von Python an LINE Bot senden
AWS Lambda Layers Eine kurze Erklärung von der Erstellung bis zur Verknüpfung
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Lassen Sie uns einen LINE-Bot mit verschiedenen Diensten erstellen [ngrok edition]
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
[Python] Lassen Sie sich täglich von LINE über das Ranking der Suchergebnisse auf Ihrer Website informieren.