Microsoft Teams連携機能を実装する

f:id:takuyawww1101:20200924200806j:plain

目次

  • はじめに
  • 「Incoming Webhook」を使用したMicrosoft Teams (以下、Teams) 側の設定
  • Railsアプリケーションの実装
  • おわりに

はじめに

こんにちは、スタメンでエンジニアをしているワカゾノです。

TUNAGでは、タイムラインへの投稿が作成される際に、Teamsへ同様の内容のメッセージカードが作成、投稿される「Teams連携機能」を実装しています。

Teamsとは

Teamsは、Microsoft社が提供しているビジネスユーザー向けのグループウェアです。

Office製品との連携をスムーズに行うことが可能で、コロナ禍におけるリモートワーク需要の増加に伴い、更にシェアが拡大傾向にあります。

そのため、TUNAGでもTeamsとの連携機能を実装することとなりました。

Teamsでは、例えばプロジェクト毎に「チーム」を作成し、その中で「チャネル」を作成することでチャット機能を利用することが出来ます。

また、Teamsには「Incoming Webhook」という機能があり、Microsoftのドキュメントには下記のように記載されています。

適切に書式設定された JSON に対応し、そのチャネルにメッセージを挿入する HTTPS エンドポイントを公開する

このエンドポイントに対してHTTPリクエストをPOSTすることで「チャネル」にメッセージを送信することが可能です。

今回はこの「Incoming Webhook」を利用し、連携機能を実装しましたので、そちらについて説明していこうと思います。

「Incoming Webhook」を使用したTeams側の設定

事前準備

①Microsoftアカウントを作成します。

こちらからTeams無料版にサインアップし、Teamsアプリをダウンロードします。

③ その後、連携機能を実装したい「チャネル」を作成しておきます。

Incoming Webhookを使用したTeams側での設定

①「アプリ」を選択します。

②「Incoming Webhook」と検索、そちらをクリックした後、「チームに追加」をクリックします。

③連携したい先のチャネル名を選択し、「コネクタを追加」をクリックします。

④必要に応じて名前と画像を選択、「作成」をクリックします。

⑤表示されたURLをコピー、アプリケーション実装時に必要となる為保管しておきます。

f:id:takuyawww1101:20200923161414p:plain

f:id:takuyawww1101:20200923161513p:plain

f:id:takuyawww1101:20200923161520p:plain

f:id:takuyawww1101:20200923161938p:plain

以上でTeams側の準備は完了です。

Railsアプリケーションの実装

先ほどコピーしたURLに対して、HTTPリクエストをPOSTします。

下記の記事を参考に実装しました。

https://docs.microsoft.com/ja-jp/outlook/actionable-messages/send-via-connectors

https://docs.microsoft.com/ja-jp/outlook/actionable-messages/message-card-reference

記事を参照すると分かるように、送信するフィールド項目の種類をカスタマイズすることで、ある程度デザインを選択することが出来ます。(組み合わせにより必須のフィード項目が存在するため注意が必要です。)

今回はPOSTするデータを下記のような構造にしました。

それぞれの値はメソッド内で、TUNAGのタイムラインへ投稿が作成される際にデータを取得しています。

# 先ほどコピーしたURL
WEBHOOK_URL = https://outlook.office.com/webhook・・・・・

def request_body
  {
    "@type": TYPE,
    "@context": CONTEXT,
    "themeColor": COLOR,
    "summary": summary,
    "sections": [{
      "activityTitle": activity_title,
      "activitySubtitle": activity_subtitle,
      "activityImage": icon,
      "title": title,
      "text": text,
      "markdown": true,
      "images": images
    }]
  }
end

# HTTPリクエストでPOSTする
def post_message
  uri = URI.parse(WEBHOOK_URL)
  request = Net::HTTP::Post.new(uri.request_uri, { 'Content-Type' => 'application/json' })
  request.body = request_body

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  response = http.start { |h| h.request(request) }
end

private

def activity_title
  # 投稿に紐付いた内容を取得
end
・
・
・

以上のような実装を行うことで画像のようにTeamsへ投稿されます。

f:id:takuyawww1101:20200923162019p:plain

まとめ

「Incoming Webhook」を使用することで、スムーズにTeamsとの連携機能を実装することが出来ました。

自社のプロダクトに同様の機能を検討中の場合は、是非参考にして頂ければと思います。

スタメンでは一緒にプロダクト開発を進めてくれる仲間を募集しています!

興味を持っていただいた方は、是非下記の募集ページを御覧ください。

Webアプリケーションエンジニア募集ページ