Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Logic AppsでTeamsのチームIDとチャネルIDを取得する

この記事はオルターブース Advent Calendar 2021の12日目の記事です。

adventar.org

Teamsをプログラムから操作する際、何かと必要になるチームIDをチャネルIDをLogic Appsで取得してみます。 このブログでご紹介するLogic Appsの全景は次ようになります。

f:id:hawa9:20211210164026p:plain

Logic Apps作成

チーム名とチャネル名をLogic Appsに渡したら、チームIDとチャネルIDが返ってくるLogic Appsを作成します。

  1. Logic AppsのHTTP要求の受信時トリガーを利用します。

    HTTPポストでチーム名とチャネル名を受け取ります。

    f:id:hawa9:20211210164047p:plain

    スキーマは次のようになります。

     {
         "properties": {
             "channelName": {
                 "type": "string"
             },
             "teamName": {
                 "type": "string"
             }
         },
         "type": "object"
     }
    
  2. 変数を初期化するアクションで変数を用意します。後ほど取得したチームIDとチャネルIDを格納します。

    f:id:hawa9:20211210164102p:plain

  3. チームの一覧表示アクションでチーム一覧を取得します。

    f:id:hawa9:20211210164144p:plain

  4. チームの一覧表示アクションの結果をJSONの解析アクションで解析します。

    f:id:hawa9:20211210164315p:plain

    スキーマは次のようになります。

     {
         "items": {
             "properties": {
                 "classification": {},
                 "description": {
                     "type": "string"
                 },
                 "discoverySettings": {},
                 "displayName": {
                     "type": "string"
                 },
                 "funSettings": {},
                 "guestSettings": {},
                 "id": {
                     "type": "string"
                 },
                 "internalId": {},
                 "isArchived": {
                     "type": "boolean"
                 },
                 "memberSettings": {},
                 "messagingSettings": {},
                 "specialization": {},
                 "visibility": {},
                 "webUrl": {}
             },
             "required": [
                 "id",
                 "displayName",
                 "description",
                 "internalId",
                 "classification",
                 "specialization",
                 "visibility",
                 "webUrl",
                 "isArchived",
                 "memberSettings",
                 "guestSettings",
                 "messagingSettings",
                 "funSettings",
                 "discoverySettings"
             ],
             "type": "object"
         },
         "type": "array"
     }
    

    取得したチーム一覧をJSON解析した結果は次のようになります。各チーム情報がbodyリストに存在します。チーム情報にチームIDもidとして存在します。

     {
         "body": [
             {
                 "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                 "createdDateTime": null,
                 "displayName": "チーム名",
                 "description": "チームの説明",
                 "internalId": null,
                 "classification": null,
                 "specialization": null,
                 "visibility": null,
                 "webUrl": null,
                 "isArchived": false,
                 "isMembershipLimitedToOwners": null,
                 "memberSettings": null,
                 "guestSettings": null,
                 "messagingSettings": null,
                 "funSettings": null,
                 "discoverySettings": null
             },
    
  5. bodyリストをFor Eachアクションでループします。

    bodyリストからチーム名と一致するチームIDを取り出すためにループします。

    f:id:hawa9:20211210164346p:plain

    ループは逐次処理となるように設定します。

    • コンカレンシー制御 有効
    • 並列処理の次数 1

    f:id:hawa9:20211210164402p:plain

  6. 条件アクションでIF判定をおこないます。

    チーム情報のdisplayNameとHTTPポストのteamNameが一致するか判定します。

    f:id:hawa9:20211210164422p:plain

    • 条件アクションの結果がTrueの場合

      チーム名が一致するため処理続行します。

    • 条件アクションの結果がFalseの場合

      一致するチーム名が存在しないため処理終了です。

  7. 条件アクションの結果がTrueの場合

    1. チーム情報のidからチャネルの一覧アクションでチャネル一覧を取得します。

      f:id:hawa9:20211210164446p:plain

    2. 取得したチャネル一覧をJSONの解析アクションで解析します。

      f:id:hawa9:20211210164458p:plain

      スキーマは次のようになります。

       {
           "items": {
               "properties": {
                   "displayName": {
                       "type": "string"
                   },
                   "email": {
                       "type": "string"
                   },
                   "id": {
                       "type": "string"
                   },
                   "webUrl": {
                       "type": "string"
                   }
               },
               "required": [
                   "id",
                   "displayName",
                   "email",
                   "webUrl"
               ],
               "type": "object"
           },
           "type": "array"
       }
      

      取得したチャネル一覧をJSON解析した結果は次のようになります。各チャネル情報がbodyリストに存在します。チャネル情報にチャネルIDもidとして存在します。

       {
           "body": [
               {
                   "id": "xx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@thread.skype",
                   "createdDateTime": "2019-07-08T03:17:49.353Z",
                   "displayName": "チャンネル名",
                   "description": "チャネルの説明",
                   "isFavoriteByDefault": null,
                   "email": "",
                   "webUrl": "https://teams.microsoft.com/l/channel/xxx",
                   "membershipType": "standard"
               },
       ...
      
    3. bodyリストをFor Eachアクションでループします。

      bodyリストからチャネル名と一致するチャネルIDを取り出すためにループします。

      f:id:hawa9:20211210164524p:plain

      ループは逐次処理となるように設定します。

      • コンカレンシー制御 有効
      • 並列処理の次数 1

      f:id:hawa9:20211210164540p:plain

    4. 条件アクションでIF判定をおこないます。

      チャネル情報のdisplayNameとHTTPポストのchannelNameが一致するか判定します。

      f:id:hawa9:20211210164552p:plain

      • 条件アクションの結果がTrueの場合

        チャネル名が一致するため処理続行します。

      • 条件アクションの結果がFalseの場合

        一致するチャネル名が存在しないため処理終了です。

    5. 条件アクションの結果がTrueの場合

      チームIDとチャネルIDを特定できたので、取得したチームIDとチャネルIDを格納します。

      f:id:hawa9:20211210164703p:plain

  8. HTTPレスポンスアクションでチームIDとチャネルIDをHTTPポストのレスポンスとして返します。

    f:id:hawa9:20211210164754p:plain

  9. Logic Appsを保存します。

動作確認

Logic Appsを保存するとHTTP要求の受信時アクションHTTP POST の URLが発行します。このURLにチーム名とチャネル名をリクエストとしてHTTP POSTすればチームIDとチャネルIDを取得できます。

f:id:hawa9:20211210164806p:plain

Logic Appsを残しておけば、必要な時にLogic AppsへHTTP POSTすればいつでもチームIDとチャネルIDを取得できます。もし、チームIDとチャネルIDが取得できないときは、そのチームのメンバーではない可能性あります。チーム所有者に依頼してチームメンバーに入れてもらいましょう。