1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RailsからSlack/GoogleChat/TeamsなどのチャットアプリにDMで通知を送る

Posted at

はじめに

サーバーから直接DMで通知を送りたいことがあると思いますが、Webhookを使うと公開チャンネルへの投稿はできるものの、DMには送信できません。
そこで今回は、各チャットツールでDM送信を実現する方法を比較しながら紹介します。

チャットツール連携の共通的なステップ

1. チャットアプリの作成

各チャットツールで、アプリ名、機能、認証時のリダイレクトURLなどを設定します。
設定はmanifest.jsonや管理画面から行います。

2. アプリのインストール

通常、管理者の承認が必要です。開発時には自分のワークスペースや組織でのみインストール可能です。
他組織へのインストールが必要な場合は、マーケットプレイスへの公開やリンク共有で促します。

3. ユーザー認証ボタンの用意

OAuth認証を行うためのボタンを設置し、スコープなどのパラメータを渡します。認証完了後、アクセストークンが発行されます。

4. サーバーからのDM送信

取得したアクセストークンでメッセージを送信します。
ユーザー認証によって得られたアクセストークンをりようするか、アプリ認証によって新にアクセストークンを取得します

事前知識:認証方法の違い

チャットツールでは、以下2種類の認証方法があり、取得できるスコープや利用できるAPIが異なります。APIリファレンスをよく読み、該当APIがどちらの認証方式で利用できるかを確認する必要があります。

トークン種類 できること
ユーザー認証トークン 認証したユーザーになりすまして振る舞う。そのユーザーができること(のうち、認証時にscopeで認可したもの)が実行できる
アプリ認証トークン チャットボットとして振る舞う。アプリインストール時にscopeで認可したものが実行できる

チャットアプリ作成

チャットアプリで定義すべきものの概要

Slackのmanifest.ymlの内容がほぼ全てで、GoogleChatやTeamsでは、その設定箇所が分岐しているというイメージです

manifest.yml
display_information:
  name: アプリ名
  description: 説明
  background_color: "#e84141"
features:
  app_home:
    home_tab_enabled: false
    messages_tab_enabled: true
    messages_tab_read_only_enabled: true
  bot_user:
    display_name: bot名
    always_online: true
oauth_config:
  redirect_urls:
    - https://xxxx/auth/callback
  scopes:
    user:
      - identity.basic
    bot:
      - channels:history
      - channels:join
      - channels:read
      - chat:write
      - groups:read
      - im:history
      - im:write
      - users:read
      - users:read.email
      - chat:write.customize
settings:
  event_subscriptions:
    request_url: https://xxx/events
    bot_events:
      - message.channels
      - message.im
  interactivity:
    is_enabled: true
    request_url: https://xxx/interactivity
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false
チャットツール 説明
Slack Slack Appの詳細ページで全て完結。 アプリ名や認証に関するタブが存在しており、個別に編集もできるが、App Manifestによって、一括で編集も可能
Google Chat Google Cloud Console内だが、設定が分散している。 アプリ名とevent_subscriptionやinteractivityはGoogle Chat APIの構成タブ。認証のリダイレクトurlなどの設定は認証タブか認証情報のOAuth2.0クライアントIDの作成。ロゴや認可のscope設定はOAuth同意画面
Teams Azureと、Developer Potalに分かれている。 Azureのアプリ登録で、Graph APIを有効化。Developer Portalでチャットアプリとしての表示関連を設定

チャットアプリ作成における比較表

項目名 Slack Google Chat Teams
チャットアプリ名 Slack APP Google Chatアプリ Microsoft Teamsアプリ
チャットアプリ作成 Slack Appsで作成する Google Chat APIでAPIを有効にして、構成タブに色々入れる Azureのアプリの登録TeamsのDeveloper Potal
アプリ名・ロゴの編集 Slack AppのApp Homeページ Google Chat APIの構成タブ Teams Developer Potalの基本情報
OAuthのリダイレクトurlの設定 Slack AppのOAuth&Permissionページ 認証情報のOAuth2.0クライアントID Azureアプリ詳細の認証ページ
scopeの定義 Slack AppのOAuth&Permissionページ GCPのOAuth同意画面 Azureアプリ詳細のAPIのアクセス許可ページ
event subscriptionの設定 Slack Appの Event Subscriptionsページ Google Chat APIの構成タブ Teams Developer Potalのbotページ
interactive api urlの設定 Slack Appの Interactivity & Shortcutsページ 同上 同上
マーケットプレイス名 Slack App Directory Google Workspace Marketplace Teams Store

※項目名は自分で勝手につけた名前です。一般名称と異なる可能性があります。より良い名前があれば、提案をお願いします

補足:認証手順とAPI利用

チャットツール 説明 ユーザー認証 アプリ認証 その他操作のための認証
Slack ユーザーがOAuth認証を行い、ユーザーとしてもアプリとしても動作可能 OAuth OAuth なし
Google Chat OAuthでユーザー認証。認証情報のサービスアカウントでアプリ認証 OAuth サービスアカウントのjsonを使って認証 なし
Teams OAuthでユーザー認証。client_idとsecretでbot/Graph APIの認証 OAuth client_secretでbot API認証 client_secretでgraph API認証

API開発における対応表

項目名 Slack Google Chat Teams
ruby gem slack-ruby-client google apps chat msgraph-sdk-rubybotframework-ruby。net/httpやjsonで頑張っても良い
API リファレンス Slack API Reference (gemが充実してるのでみなくていい) エンドポイント:REST APIリファレンス。リクエストオブジェクト:RPCリファレンス graph APIリファレンスbot APIリファレンス
rate limit Slackのrate limit Google Chat rate limit Graph API rate limit
メッセージ・カードビルダー Block Kit Builder Card Builder AdaptiveCard Designer
DMを投稿する対象のオブジェクト名 user space conversation
投稿する対象のid形式 UXXXXXXXXXX(Uから始まる9桁の英数字) spaces/XXXXXXXXXXX(spaces/11桁の英数字) 19:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@unq.gbl.spaces(数字2桁:xxxxで表現したハイフンで繋いだ英数字@nq.gbl.spaces)
ユーザー認可の呼称 userスコープ ユーザー認証スコープ(OAuth認証スコープ) Delegated認証スコープ
アプリ認可の呼称 botスコープ アプリ認証スコープ(サービスアカウント認証スコープ) Application認証スコープ

アクセストークンを取得してから、DMを送るまでのステップ

管理ユーザーだけが認証

管理ユーザーだけが認証して、他ユーザーにDMを送る流れは、大まかには以下

  1. DMを送りたいユーザーのidを取得する
  2. 対象ユーザーとbotのDMスペースを作成し、そのidを取得
  3. スペースのidにメッセージを送る

※ google chatについては、管理者だけが認証をして他のユーザーにDMを送る方法が見つかっていないので、誰か知ってたら教えてください

ステップ Slack Google Chat Teams
DMを送りたいユーザーのidを取得する bot scopeのusers.listで取得 - graph api Applicationのusers
ユーザーとbotのDMスペースを作成し、そのidを取得 user_idに対して送れるので不要 - graph api DelegatedのinstalledApps
スペースのidにメッセージを送る bot scopeのchat.postMessage - bot apiのsend to conversation

利用ユーザーがそれぞれ認証

利用ユーザーがそれぞれ認証して、DMを送る流れは以下

  1. 認証ユーザーとbotのDMスペースを作成し、そのidを取得
  2. スペースのidにメッセージを送る
ステップ Slack Google Chat Teams
ユーザーとbotのDMスペースを作成し、そのidを取得 user scopeのusers.info ユーザー認証スコープでspaces.setup ※まだ試してない
スペースのidにメッセージを送る bot scopeのchat.postMessage アプリ認証スコープでspaces.messages.create ※まだ試してない

最後に

初期段階でわかってないことも多いため、今後も加筆していく予定です。
すでに間違いや、加筆の提案があればぜひお願いします。
この記事によって、少しでも日本のサービスの利便性が上がりますように><

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?