[PYTHON] [MS Azure] Notification Slack des informations de compétition avec Azure Functions et l'API Kaggle

Aperçu

Lorsque vous faites Kaggle, vous voudrez peut-être attraper les discussions et les informations du cahier le plus rapidement possible. Je pense que certaines personnes utilisent Microsft Azure comme environnement de compétition et d'analyse, donc cette fois je vais résumer comment notifier Slack des informations de concurrence Kaggle à l'aide d'Azure Functions et de l'API Kaggle qui sont FaaS de Microsft Azure. J'ai fait. kaggle0.png

supposition

procédure

  1. Slack Ajoutez l'application ʻIncoming Webhook` dans Slack et définissez le canal auquel vous souhaitez envoyer des notifications. (Les étapes détaillées sont omises.) Une fois définie, souvenez-vous de l'URL du webhook. Notifiez cette URL dans Azure Functions. image.png

  2. Kaggle(API) L'API Kaggle a des spécifications détaillées sur le site Kaggle, mais elle est généralement installée avec pip → émis à partir de la ligne de commande, donc avec Azure Functions C'est un peu difficile à utiliser rapidement. Par conséquent, cette fois (bien qu'il semble qu'il ne soit pas officiellement publié), nous répondrons en cliquant sur l'API Web que l'outil API Kaggle frappe en interne directement à partir d'Azure Functions.

Si vous lisez Source, la couche d'accès de l'API appelée dans l'outil est créée par la fonction de génération automatique du client d'OpenAPI (Swagger). Vous pouvez vérifier les spécifications de l'API Web en vous référant à KaggleSwagger.yaml directement sous le projet avec Swagger Editor. kaggleapiswagger.png

Lorsque vous appuyez sur l'API basée sur la ligne de commande, kaggle.json est émis à partir du site Kaggle et placé, mais l'API Web code la clé et place" Basic *** dans l'en-tête HTTP ʻAuthentication. Il est utilisé en l'incorporant au format "* ***". Je n'entrerai pas dans les détails, mais l'implémentation autour de cela peut être trouvée dans kaggle / configuration.py`.

À partir des API, cette fois, j'utiliserai l'API (kernels / list) qui obtient une liste de notebooks publiée comme exemple. Les paramètres de condition de recherche sont donnés dans la chaîne de requête. Consultez les spécifications Swagger pour plus de détails. image.png

  1. Azure

Créer de nouvelles fonctions Azure

Créez de nouvelles fonctions Azure à partir de la console Azure. Cet article omet les paramètres d'autorisation détaillés, donc soyez prudent lorsque vous l'utilisez dans une entreprise ou pour des services réels.

Réglez le nom de la fonction, etc. en fonction du contenu d'entrée de l'onglet. Le nom de la fonction est "kagglenotify". Sélectionnez «Python 3.7» comme langue, «Asie de l'Est» comme région et «Consommation (sans serveur)» comme type de plan. De plus, si vous sélectionnez Python comme langage, le système d'exploitation sera Linux par défaut? Les autres paramètres détaillés sont omis.

Si vous appuyez sur «Créer» après l'écran de confirmation, Azure Functions en tant qu'objet Azure sera créé. Ensuite, j'écrirai le traitement de la fonction concrètement.

programme

Sélectionnez la fonction kagglenotify créée et sélectionnez "Fonction" dans le menu de gauche. Avec le plan Linux pay-as-you-go, il semble que vous ne pouvez pas écrire de code directement sur la console pour le moment, donc c'est un peu ennuyeux, mais cette fois je l'ai développé localement.

Pour le développement local, le plug-in VS Code + Azure semble être une norme, donc [Procédure officielle](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-function-vs- Suivez le code? Pivots = programmation-language-python) pour installer les outils requis sur votre PC.

Continuez à suivre la Procédure officielle localement Créez de nouveaux projets et fonctions. Je l'ai fait "kaggle-notify-function". Si vous sélectionnez Time Triger comme déclencheur, un code source de modèle auquel le modèle de la fonction d'activation de temps est appliqué sera généré.

Écrivez le processus dans la fonction principale de __init __. Py. Cette fois, en utilisant le package urllib.request, (1) a acquis les informations du noyau de la compétition où l'API Kaggle a été touchée, et (2) a implémenté le traitement de la notification Slack. Veuillez noter que l'URL du webhook Slack et le jeton d'accès à l'API Kaggle dans l'exemple de code sont les vôtres. Dans l'exemple, Liste des cahiers du concours appelé OSIC Pulmonary Fibrosis Progression devrait être créée et 20 nouveaux devraient être acquis. Et informez Slack du créateur et du titre du carnet.

__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 = '★★ URL du webhook Slack ★★'
    kaggle_base_url = 'https://www.kaggle.com/api/v1'
    kaggle_kernellist_path = '/kernels/list'
    kaggle_basic_auth_token = 'Token de base ★★ pour son propre accès à l'API Kaggle ★★'

    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)

Les paramètres de la minuterie sont décrits dans function.json. Voici le réglage pour démarrer la fonction toutes les heures à 0 minute.

function.json


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

Déployez la dernière fonction que vous avez créée à partir du plug-in Azure vers Azure Functions. Pour la destination du déploiement, spécifiez le "kaggle notify" créé précédemment.

Une fois le déploiement terminé, vous pouvez cocher «kaggle-notify-function» à partir de la console Azure. Il s'exécute à 0 minute toutes les heures, mais si vous souhaitez le déplacer immédiatement et le vérifier, vous pouvez exécuter le test à partir du menu code et test. kaggle6.png

résultat

Si tout se passe bien, le canal Slack sera informé des informations Notebook récupérées par l'API Kaggle. image.png

Résumé et impressions

C'est un échantillon qui acquiert simplement les 20 derniers cas à chaque fois, mais en enregistrant les résultats d'acquisition dans CosmosDB etc. et en extrayant de nouvelles différences à chaque fois, un mécanisme pour notifier Slack uniquement lorsqu'il y a une mise à jour peut être créé. Je pense que c'est possible. De plus, cette fois, j'ai essayé Azure Functions pour la première fois. Je n'ai pas fait de comparaison exhaustive, mais je n'ai pas pensé que c'était trop difficile à développer par rapport à l'AWS Lambda que j'utilise habituellement. Si vous utilisez généralement Azure comme environnement cloud, j'ai pensé qu'il serait parfaitement possible d'utiliser Azure Functions pour un tel mécanisme léger.

Recommended Posts

[MS Azure] Notification Slack des informations de compétition avec Azure Functions et l'API Kaggle
Notification Slack des informations météorologiques avec Open Whisk
Utilisez l'API Spotify pour obtenir toutes les chansons des informations sur les chansons d'Arashi et vérifier l'index
[Azure] Essayez d'utiliser Azure Functions
Informations de raclage Web sur les programmes de rire et notification en ligne
Obtenez des données à l'aide de l'API du ministère des Affaires intérieures et des Communications
Rationalisez la collecte d'informations avec l'API Twitter et les robots Slack
Automatisation d'une recherche sur des informations géographiques telles que le réseau de magasins à l'aide de Python et de l'API Web
[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
Collectez des informations sur les produits et traitez les données à l'aide de l'API de recherche de produits Rakuten [Python]
[Ruby on Rails] Affichage et épinglage de GoolgeMAP à l'aide de l'API Google