top of page
  • ccf代表

Wrikeのoutgoing-webhookからAzure Fnctionsでデータを受け取る

弊社がタスク/チケット管理として利用しているWrikeは非常に便利なのですが、お客様とやり取りするうえでメールというインターフェイスも重要になります。

そこで、Wrikeのoutgoing-webhookを有効にし、指定されたフォルダ配下のチケットの変更を簡単なWeb APIインターフェイスを作れるAzure Functionsを利用して、WrikeからPOSTされたデータを受け取りたいと思います。


Azure FunctionsにAPIを作成

Azure Funtions(関数アプリ)を開き、「作成」します。

今回はPython3.11で開発する予定なので、「ランタイム スタック」に「Python」を、「バージョン」に「3.11」を指定します。

関数アプリは全世界で固有の必要があるので、注意してください。今回は以下のようにします。

関数アプリ名:https://xxxxxxxx.azurewebsites.net/


コード(アプリ)をデプロイ

vscodeでプロジェクトを作る

コードのデプロイにはいろいろな方法があるようですが、私はvscodeのAzure Funcitonsモジュールを使用します。既にモジュールがインストールされている前提で進めます。

まず、プロジェクトを作成します。

Azureのタブから、「WORKSPACE」にある「Azure Functions」アイコンをクリックし、「Create New Project」をクリックします。


いくつか質問がありますが、今回はHTTPを受けて発動するAPIを想定しているので、「HTTP triger」を選択し、認証を必要としないので匿名(ANONYMOUS)で作成します。

サンプルコードも含めて作成されるので、今回は単純に受け取ったリクエストデータをログに出力するだけにします。下記のコードでは”get_postData”でデータを受けるようにしたいので、URLは以下のようになります。

https://xxxxxxxx.azurewebsites.net/api/get_postData

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="get_postData")
def get_postData(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    try:
        req_body = req.get_json()
        logging.info(f"Request body: {req_body}")
        return func.HttpResponse(f"Hello!! This HTTP triggered function executed successfully.", status_code=200)

    except Exception as e:
        return func.HttpResponse(f"Error: {e}", status_code=500)

コードをデプロイする

作ったコードをAzureへデプロイするために、以下のように操作します。

Azureのタブから、「WORKSPACE」にある「Azure Functions」アイコンをクリックし、「Deploy to Functions App」をクリックします。



outgoing-webhookの作成

まずは、WrikeのAPIコンソールへアクセスし、任意のAPIアプリを作成します。APIアプリはテストで使用するものなので、名前等は事由ですが、今回はテストなので、永久トークンを使用します。

本番運用する際には、都度リフレッシュトークンから、アクセストークンを取得するようにします。

https://www.wrike.com/frontend/apps/index.htm


取得されたデータは以下の通りだと仮定します。

永久トークン:ABCDEFGHIJKLMNOPQRSTUVWXYZ


指定フォルダのフォルダIDを取得する

Web画面からフォルダIDを探せなかったので、APIを使って取得します。


curl -g -X GET -H 'Authorization: bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'https://www.wrike.com/api/v4/folders'
    {
      "id": "IE・・・・・・・Z",
      "title": "フォルダ名",
      "childIds": [],
      "scope": "WsFolder",
      "project": {
        "authorId": "・・・・・",
        "ownerIds": [
          "KUA・・・・・",
          "KUA・・・・・",
          "KUA・・・・・",
          "KUA・・・・・"
        ],
        "status": "Completed",
        "customStatusId": "・・・・・",
        "createdDate": "2019-07-19T09:28:42Z",
        "completedDate": "2021-07-20T05:33:21Z"
      }
    }

フォルダIDをは、"id"です。ここでは”IEZ”としておきます。


対象フォルダを対象にwebhookを作成する

先ほど作成したAzure FunctionsのURLを使って、webhookを作成します。

curl -g -X POST -H 'Authorization: bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ' -d 'hookUrl=https://xxxxxxxx.azurewebsites.net/api/get_postData' 'https://www.wrike.com/api/v4/folders/IEZ/webhooks'

webhookを確認する

webhookの一覧を取得します。

curl -g -X GET -H 'Authorization: bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'https://www.wrike.com/api/v4/webhooks'
{
  "kind": "webhooks",
  "data": [
    {
      "id": "・・・・・",
      "accountId": "・・・・・",
      "folderId": "IEZ",
      "hookUrl": "https://xxxxxxxx.azurewebsites.net/api/get_postData",
      "recursive": false,
      "status": "Active"
    }
  ]
}% 

ローカルテスト

ローカルから任意のデータをPOST/GETする

vscodeに「.http」の拡張子のファイルを作成し、以下のような内容とします。

GET https://xxxxxxxx.azurewebsites.net/api/get_postData
Content-Type: application/json

{
    "name": "てすと"
}

このファイルを開くと、上段に小さく「Send Request」が表示されるので、こちらをクリックします。


Azureでログを見る

関数アプリから対象のアプリの概要を視ると、右下に「モニター」が表示されているので「呼び出しのトレース」から、ログをクリックします。予定通り、GET時に送った「name:てすと」が表示されていることを確認します。



Wrikeからのテスト

対象フォルダ内にあるチケットを有効から完了、完了から有効へと状態を変化させます。先ほどと同じようにWrikeから送信されたログが表示されていることを確認します。



閲覧数:3回0件のコメント

最新記事

すべて表示

Pythonにハマった件

ここ数年流行っているPythonですが、僕もご多分に漏れず4年ほど前からハマりました!! それまではインフラエンジニアらしく、AzureやMicrosoft 365向けにはPowerShell、データ解析にはbash/zshなどを使ってきました。しかし、5年前からはデータ解析にはほぼPythonで、ここ2年ぐらいはAzureでもPythonになりました。 今回はなぜ、PowerShellやBash

Comentários


bottom of page