[PYTHON] [MS Azure] Slack-Benachrichtigung über Wettbewerbsinformationen mit Azure-Funktionen und der Kaggle-API

Überblick

Wenn Sie Kaggle ausführen, möchten Sie möglicherweise Diskussionen und Notizbuchinformationen so schnell wie möglich abrufen. Ich denke, dass einige Leute Microsft Azure als Wettbewerbs- und Analyseumgebung verwenden. Daher werde ich dieses Mal zusammenfassen, wie Slack of Kaggle-Wettbewerbsinformationen mithilfe von Azure-Funktionen und der Kaggle-API, die FaaS von Microsft Azure sind, benachrichtigt werden. Ich tat. kaggle0.png

Annahme

Verfahren

  1. Slack Fügen Sie die App "Incoming Webhook" in Slack hinzu und legen Sie den Kanal fest, an den Sie Benachrichtigungen senden möchten. (Detaillierte Schritte werden weggelassen.) Speichern Sie nach dem Festlegen die URL für den Webhook. Benachrichtigen Sie diese URL in Azure-Funktionen. image.png

  2. Kaggle(API) Die Kaggle-API enthält detaillierte Spezifikationen auf der Kaggle-Site, wird jedoch normalerweise mit pip → installiert, das über die Befehlszeile ausgegeben wird, also mit Azure-Funktionen Es ist etwas schwierig, schnell zu bedienen. Daher werden wir dieses Mal (obwohl es den Anschein hat, dass es nicht offiziell veröffentlicht wurde) darauf reagieren, indem wir auf die Web-API klicken, die das Kaggle-API-Tool intern direkt über Azure-Funktionen ausführt.

Wenn Sie Quelle lesen, wird die im Tool aufgerufene Zugriffsebene der API von der Client-Funktion zur automatischen Generierung von OpenAPI (Swagger) erstellt. Sie können die Spezifikationen der Web-API überprüfen, indem Sie direkt unter dem Projekt mit Swagger Editor auf KaggleSwagger.yaml verweisen. kaggleapiswagger.png

Wenn Sie auf eine befehlszeilenbasierte API klicken, wird "kaggle.json" von der Kaggle-Site ausgegeben und platziert, aber die Web-API codiert den Schlüssel darin und fügt "Basic **" in den HTTP-Header "Authentication" ein. Es wird verwendet, indem es in das Format " ***" eingebettet wird. Ich werde nicht auf Details eingehen, aber die Implementierung dazu finden Sie in kaggle / configuration.py.

Von den APIs werde ich dieses Mal die API (Kernel / Liste) verwenden, die eine Liste der als Beispiel veröffentlichten Notizbücher erhält. Suchbedingungsparameter werden in der Abfragezeichenfolge angegeben. Überprüfen Sie die Swagger-Spezifikationen für Details. image.png

  1. Azure

Erstellen neuer Azure-Funktionen

Erstellen Sie neue Azure-Funktionen über die Azure-Konsole. In diesem Artikel werden detaillierte Berechtigungseinstellungen weggelassen. Seien Sie daher vorsichtig, wenn Sie sie in einem Unternehmen oder für tatsächliche Dienste verwenden.

Stellen Sie den Funktionsnamen usw. entsprechend dem Eingabeinhalt der Registerkarte ein. Der Funktionsname lautet "kagglenotify". Wählen Sie "Python 3.7" für die Sprache, "Ostasien" für die Region und "Verbrauch (ohne Server)" für den Plan-Typ. Wenn Sie Python als Sprache auswählen, ist das Betriebssystem standardmäßig "Linux". Andere detaillierte Einstellungen werden weggelassen.

Wenn Sie nach dem Bestätigungsbildschirm auf "Erstellen" klicken, werden Azure-Funktionen als Azure-Objekt erstellt. Als nächstes werde ich die Verarbeitung der Funktion konkret schreiben.

Programm

Wählen Sie die erstellte kagglenotify-Funktion und wählen Sie "Funktion" aus dem linken Menü. Mit dem Linux-Pay-as-you-go-Plan scheint es, dass Sie im Moment keinen Code direkt auf die Konsole schreiben können, daher ist es etwas ärgerlich, aber diesmal habe ich ihn lokal entwickelt.

Für die lokale Entwicklung scheint das VS Code + Azure-Plug-In ein Standard zu sein, daher [Offizielles Verfahren](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-vs- Folgen Sie dem Code (Pivots = Programmiersprache-Python), um die erforderlichen Tools auf Ihrem PC zu installieren.

Befolgen Sie weiterhin das offizielle Verfahren lokal Erstellen Sie neue Projekte und Funktionen. Ich habe es "kaggle-notify-function" gemacht. Wenn Sie "Time Triger" als Auslöser auswählen, wird ein Vorlagenquellcode generiert, auf den die Vorlage der Zeitaktivierungsfunktion angewendet wird.

Schreiben Sie den Prozess in die Hauptfunktion von __init __. Py. Dieses Mal hat (1) mithilfe des urllib.request-Pakets (1) die Kernel-Informationen des Wettbewerbs erfasst, der die Kaggle-API getroffen hat, und (2) die Verarbeitung der Slack-Benachrichtigung implementiert. Bitte beachten Sie, dass die Slack-Webhook-URL und das Kaggle-API-Zugriffstoken im Beispielcode Ihre eigenen sind. In der Stichprobe sollte Liste der Notizbücher des Wettbewerbs mit dem Namen OSIC Pulmonary Fibrosis Progression erstellt und anschließend 20 neue erworben werden. Und informiert Slack über den Ersteller und den Titel des Notizbuchs.

__init__.py


import datetime
import logging
import json
import urllib.request
import urllib.parse
import azure.functions as func

def main(mytimer: func.TimerRequest) -> None:

    slack_webhook_url = '★★ Slack Webhook URL ★★'
    kaggle_base_url = 'https://www.kaggle.com/api/v1'
    kaggle_kernellist_path = '/kernels/list'
    kaggle_basic_auth_token = 'Grundlegendes ★★ Token für den eigenen Kaggle-API-Zugriff ★★'

    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    kernellist_params = {
        'page':1,
        'pageSize':20,
        'search':'',
        'group':'everyone',
        'user': '',
        'language':'all',
        'kernelType':'all',
        'outputType':'all',
        'sortBy':'Recently Created',
        'dataset':'',
        'competition':'osic-pulmonary-fibrosis-progression',
        'parentKernel':''

    }
    request = urllib.request.Request(
        url = kaggle_base_url + kaggle_kernellist_path + '?' + urllib.parse.urlencode(kernellist_params), 
        method='GET',
        headers={ 
            'Accept': 'application/json',
            'Authorization': kaggle_basic_auth_token
         } 
    )
    text = "\n"
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
        response_body_json = json.loads(response_body)
        for i in range(len(response_body_json)):
            text += response_body_json[i]["author"] + "  " + response_body_json[i]["title"] + "\n"

    request = urllib.request.Request(
        url=slack_webhook_url, 
        data=json.dumps({
            'text':text
        }).encode("utf-8"), 
        method='POST',
        headers={ 'Content-Type': 'application/json; charset=utf-8' } 
    )
    urllib.request.urlopen(request)

Die Timer-Einstellungen sind in function.json beschrieben. Das Folgende ist die Einstellung, um die Funktion jede Stunde um 0 Minuten zu starten.

function.json


{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 0 */1 * * *"
    }
  ]
}

Stellen Sie die zuletzt vom Azure-Plugin erstellte Funktion für Azure-Funktionen bereit. Geben Sie für das Bereitstellungsziel die zuvor erstellte "Kaggle-Benachrichtigung" an.

Wenn die Bereitstellung abgeschlossen ist, können Sie die Funktion "Kaggle-Benachrichtigung" in der Azure-Konsole überprüfen. Es wird stündlich mit 0 Minuten ausgeführt. Wenn Sie es jedoch sofort verschieben und überprüfen möchten, können Sie den Test über das Code- und Testmenü ausführen. kaggle6.png

Ergebnis

Wenn alles gut geht, wird der Slack-Kanal über die von der Kaggle-API abgerufenen Notebook-Informationen informiert. image.png

Zusammenfassung und Eindrücke

Es handelt sich um ein Beispiel, bei dem einfach jedes Mal die letzten 20 Fälle erfasst werden. Indem jedoch das Erfassungsergebnis in CosmosDB usw. gespeichert und jedes Mal ein neuer Unterschied extrahiert wird, kann ein Mechanismus erstellt werden, mit dem Slack nur benachrichtigt wird, wenn ein Update vorliegt. Ich denke es ist möglich. Außerdem habe ich diesmal zum ersten Mal Azure-Funktionen ausprobiert. Ich habe keinen erschöpfenden Vergleich gemacht, aber ich fand es nicht schwierig, mich im Vergleich zu dem AWS Lambda zu entwickeln, den ich normalerweise benutze. Wenn Sie Azure normalerweise als Cloud-Umgebung verwenden, dachte ich, dass es durchaus möglich wäre, Azure-Funktionen für einen solchen Lichtmechanismus zu verwenden.

Recommended Posts

[MS Azure] Slack-Benachrichtigung über Wettbewerbsinformationen mit Azure-Funktionen und der Kaggle-API
Schlaffe Benachrichtigung über Wetterinformationen mit Open Whisk
Verwenden Sie die Spotify-API, um alle Songs von Arashis Songinformationen abzurufen und den Index zu überprüfen
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Web-Scraping-Informationen zu Lachprogrammen und Benachrichtigungen über LINE
Erhalten Sie Daten mithilfe der API des Ministeriums für innere Angelegenheiten und Kommunikation
Optimieren Sie das Sammeln von Informationen mit Twitter API und Slack Bots
Automatisierung einer Recherche zu geografischen Informationen wie dem Speichernetzwerk mithilfe von Python und Web-API
[Python] LINE-Benachrichtigung über die neuesten Informationen mithilfe der automatischen Suche von Twitter
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
[Ruby on Rails] Anzeigen und Fixieren von GoolgeMAP mithilfe der Google-API