質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1814閲覧

【Slack Events API】リアルタイムに取得したSlackメッセージ情報を、DBのユーザー情報と紐づけて格納したい【Firestore】

goki

総合スコア13

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/10/23 03:53

##前提
現在、各ユーザーごとに、そのユーザー宛のSlackメッセージを表示する機能を持つmacOSアプリ(以下、単にアプリとします)を作成しています。
その中で、アプリユーザー宛のメンションがついた全てのSlackメッセージ(ユーザーが連携したワークスペースでのメッセージです)を、SlackのEventAPIによってリアルタイムで取得し、DB[Firebase Firestore]に格納したいと考えています。

Slack Events APIからのレスポンス例↓

JSON

1{ 2 "type": "message", 3 "channel": "C2147483705", 4 "user": "U2147483697", 5 "text": "Hello world", 6 "ts": "1355517523.000005" 7}

詳細: https://api.slack.com/events/message

アプリの構成は以下の図です。
※構成におかしなところがあったりAPPサーバーなどの用語を誤用している場合、ご指摘いただけると嬉しいです。
簡単な構成図

また、DBの構成(一部)は以下です。
イメージ説明

##疑問・知りたいこと
APPサーバー内に配置するNode.jsのコードでSlackメッセージをEventAPIによってリアルタイムで取得することはできそうなのですが、そのメッセージをどうやってアプリ内のユーザーと紐付けるのが良いかがはっきりわからない状況です。

つまり、どのように特定のuserドキュメント配下のMessagesサブコレクション内に、APIで受け取ったメッセージ情報を格納するかを教えて頂きたいです。

一つ稚拙ながら思い浮かぶのは、
EventsAPIのレスポンスに含まれる *ユーザーID("user") をあらかじめDBに保管しておき、そのIDと照合して紐付ける
といった方法です。
このやり方が良いのか悪いのかなど全くわからないため、教えてくださるご親切な方がいらっしゃれば幸いです。
よろしくお願いいたします!


*同一ユーザでもワークスペースによってSlackユーザーIDは異なるようです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すでにご存知かもしれませんが Slack アプリのインストールは OAuth フローの実行です。user token scope を取得する OAuth の場合、管理の方法は Google や Facebook のアカウントに紐づけるといったことと同様に考えるのがよいかと思います。

その macOS アプリにログインユーザーという概念があるのではないかと思いますので、そのユーザー情報にその人自身が各ワークスペースで Slack アプリを有効にしたときに発行されるユーザートークン(xoxp- からはじまるもの)を 1:n の関係で管理しておけば Slack でのユーザー ID の値がワークスペースごとで異なることが紐付けの障害にはならないと思います。

どうしてもユニバーサルなキーが欲しい場合、Slack アカウントのメールアドレスを取得することができます。users:read:email という scope を取得するようにしておけば users.info API の応答にメールアドレスも含まれるようになります。

最初に OAuth と書きましたが、現時点ではその Slack アプリのインストールはブラウザを使って行う必要がありますので、その macOS アプリだけでなくブラウザでもログインできる何らかの方法によるアカウントの管理はいずれにせよ必要になるかと思います。

投稿2021/10/23 10:24

seratch

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goki

2021/11/02 02:05

お返事遅くなりすみません。 ご回答大変ありがとうございます! >1:n の関係で管理しておけば Slack でのユーザー ID の値がワークスペースごとで異なることが紐付けの障害にはならないと思います。 こちらに関しましてご教授ありがとうございました! 私の質問の仕方がよくなかったですが、こちらについてが一番の知りたいポイントとなっておりますm(__)m >どのように特定のuserドキュメント配下のMessagesサブコレクション内に、APIで受け取ったメッセージ情報を格納するか ご存じでしたら是非よろしくお願いいたします。
seratch

2021/11/02 02:25

はい、その辺は書いてあるデータ構造で基本的には問題ないように見えますが、名前がちょっと紛らわしいように思うので、こんな感じにされるとよいかもしれません。 table: goki_accounts (goki さんのサービスでのアカウント) * id (has n slack_accounts) table: slack_accounts * id * goki_account_id -> goki_accounts.id (n:1) * team_id * user_id * user_token (has n slack_messages) table: slack_messages * slack_account_id -> slack_accounts.id (n:1) * message_ts * message_body
goki

2021/11/03 04:44

いつもご丁寧に本当にありがとうございます! こちら参考にして挑戦してみます。 重ねてにはなりますがありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問