特に詰まった箇所:slack api系
関連記事
通信制限
- 同時に複数のapi通信をすると、その通信結果が保証されない場合がある。
- 例えばメッセージを送信する場合は1秒に1回だと保証される。(公式)
- なので実装する場合、一気に通信しないように工夫する必要がある
- この制限のドキュメントを後から見つけて、仕様を結構変更した。
メッセージに画像を含める
apiを使ってslackで画像を含めるメッセージを送るには、様々なメソッドがあるが、、
- 画像は送れるがテキストは送れないメソッド
画像は送れるしテキストも送れるが、テキストは一行しか送れないメソッド(改行を認識しない)
画像URLをテキストとして記述すると展開されるが、画像に実体はなく(ダウンロードできない)引用っぽくなるメソッド
webhookを使っても送れるが、それだとchannelが新規にワークスペース上にできる度に、webhook APIで専用のURLを発行し、ユーザーに承認をクリックしてもらわないといけない。
テキストと画像は別で送るという方法もあるが、あまりスマートでは無い。
画像専用で送るメソッドに、オプションでテキストも添付できるというのもある。が、それだと予約送信はできない。
なので、slack de stepでは最も基本的なメソッド
chat.postMessage
にオプションを付けて実装した。
- 具体的なコード例は以下(curlコマンド)
{"type": "mrkdwn", "text": "これはテスト"}
のmrkdwn
は、plain_text
でもOK。ただしmrkdwn
にしておけば、テキストのURLが受信したslackでURLリンクになる。もちろんmrkdwn
なので記述がmarkdownに対応するという意味
$ curl -X POST 'https://slack.com/api/chat.postMessage' \ -d 'token=xoxb-xxxx-xxxx....' \ -d 'channel=U010B...' \ -d 'blocks=[{"block_id": "test_message", "type": "section","text": {"type": "mrkdwn", "text": "これはテスト"}}, {"type": "image", "title": {"type": "plain_text","text": "pitcure"}, "image_url": "https://画像URL", "block_id": "test_image","alt_text": "pitcure here"}]'
ログイン機能の注意点
- 開発するアプリに、slackでのログイン機能を付けたくて、gemのomniauth-slackを使おうとするかも知れない。
- 本家のslack api公式でもこの方法を紹介しているので、大丈夫だと思って使うと危険。このomniauth-slack、開発がかなり前に終わっている。
- しかし、本家slack apiの方はどんどんバージョンアップしているので、omniauth-slackでは新しいメソッドが使えないという事が起こる。
- その時によく保守されている方法(本家の「sign in with slack」など)を使うといい。
権限設定の注意点
slack app「公開」の意味
- 現段階まで開発したアプリが、他人のslackではどう動くのかを確認したい時がある
- しかし他のワークスペース(開発アカウント以外)で自分が作ったアプリを入れようとすると、「公開していないとできない」とエラーが出る
- この「公開」の意味をslack app directoryに公開する = productionとしてリリースする、と思っていたが違った。「公開」には「身内にだけ(リンクを知っている人だけ)公開」と、slack app directoryに公開(slack 全userの目に触れる)の2種類あると、だいぶ経ってから分かった。
userのslack情報にアクセスする
- slackのアプリを作る時、userのslack情報にアクセスしたい場合は「sign in with slack」を使えばできる。
- 自分は当初、利用者に自分でslackのtokenを作って、そのtokenを送ってもらってアプリを使えるようにする、以下のようなUIを考えていた。
- だが、userにsign in with slackで発行したURLを踏んでもらうと、そのuser専用のslack tokenが自動で発行される。なので、上記のようなUIの画面は必要なかった。apiの仕様が分かってくるほど、作るアプリの仕様も変更した。
権限更新時の注意点
- 他のワークスペースに自分が作ったアプリがすでにinstallされている状態で、こちら側で権限スコープを変更すると
- =>権限を追加する分には、再度連携のアナウンスがされて、権限が更新される
- =>権限を削除する分には、反映されない。
- 参考資料
ので、注意が必要。
ワークスペースへのアプリのインストール後に開発者がアプリのスコープを変更した場合、アプリ管理者が新しいスコープを確認できるよう、メンバーはアプリを再度リクエストする必要があります。アプリ管理者がアプリの新しいスコープを制限した場合、メンバーはそのアプリの既存のバージョンを引き続き使用できますが、更新バージョンのインストールや使用はできません。
- では、すでにinstallしているユーザーに対して権限を削除(制限)したい場合はどうするのか。
- =>一旦アプリをuninstall後、再度installしてもらうしかなさそう。(注意:これをするとtokenが再発行される = 以前のtokenは無効化する)
botを動かす時の注意点
- botとuserという2つの存在をしっかり押さえておく必要がある。
- userとは、普通にuserの事。slack上にいる同僚のAさんとかがそう。Aさんはslackをやってて、他人からメッセージが来たら「アラート」が鳴って、自分が所属しているチャンネルにBさんが参加してきたら、「Bさんが参加しました」とメッセージが表示される。要するに、userはslack上で発生する「イベント」を自動で検知する
- しかし、これがbotの場合はそうでなくなる。
- 例えば、ワークスペース上に新しいchannelができて、そこにuserが参加したとすると、そのchannelにどのuserが所属しているかどうかをbotが検知するには、botがそのchannelに所属してないといけない
- botはdefaultでチャンネルに所属していない。
- もし、userが新規でチャンネルをslack上で作り、そのチャンネルで起こったイベントをbotで検知したければ、そのチャンネルにbotを仕込む必要がある
- もし、新しくチャンネルが作られて、同時にそのチャンネルに参加したuserをbotで把握したければ、userがチャンネルに参加するより先に、botがチャンネルに入り込まないといけないので、タイミングが重要。
不正確な説明内容
- slack自身の説明が事実と違う場合がある。
- 以下はmacのslackアプリで、slackのチャンネルをアーカイブしようとした時に表示される説明である。
チャンネルを復元する事ができるが、メンバーは削除されたまま
だと書かれてある。
- しかしチャンネルを復元すると、きっちり5分後にメンバーも復活する。デバグにかなりの時間が掛かった。
- というように、slackのapiには事実と違う内容が書かれている場合があるので注意が必要。
- 多分ドキュメントの更新が追いついていないのでは