generalistからspecialistへ

一点集中化計画

特に詰まった箇所:slack api系

関連記事


通信制

  • 同時に複数のapi通信をすると、その通信結果が保証されない場合がある。
  • 例えばメッセージを送信する場合は1秒に1回だと保証される。(公式
  • なので実装する場合、一気に通信しないように工夫する必要がある
  • この制限のドキュメントを後から見つけて、仕様を結構変更した。

メッセージに画像を含める

apiを使ってslackで画像を含めるメッセージを送るには、様々なメソッドがあるが、、

  • 画像は送れるがテキストは送れないメソッド
  • 画像は送れるしテキストも送れるが、テキストは一行しか送れないメソッド(改行を認識しない)

  • 画像URLをテキストとして記述すると展開されるが、画像に実体はなく(ダウンロードできない)引用っぽくなるメソッド

  • webhookを使っても送れるが、それだとchannelが新規にワークスペース上にできる度に、webhook APIで専用のURLを発行し、ユーザーに承認をクリックしてもらわないといけない。

  • テキストと画像は別で送るという方法もあるが、あまりスマートでは無い。

  • 画像専用で送るメソッドに、オプションでテキストも添付できるというのもある。が、それだと予約送信はできない。

  • なので、slack de stepでは最も基本的なメソッドchat.postMessageにオプションを付けて実装した。

f:id:sdk-quadra:20210112144854p:plain

  • 具体的なコード例は以下(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 apiの権限設定で、登録しても 「何かがおかしい」 とだけ表示されて登録できない時がある
  • 原因はchromeが日本語に訳しているから。英語表記にしたら登録できる場合がある。

f:id:sdk-quadra:20210112145046p:plain

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を考えていた。

f:id:sdk-quadra:20210112145140p:plain

  • だが、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のチャンネルをアーカイブしようとした時に表示される説明である。
  • チャンネルを復元する事ができるが、メンバーは削除されたままだと書かれてある。

f:id:sdk-quadra:20210118173355p:plain

  • しかしチャンネルを復元すると、きっちり5分後にメンバーも復活する。デバグにかなりの時間が掛かった。
  • というように、slackのapiには事実と違う内容が書かれている場合があるので注意が必要。
  • 多分ドキュメントの更新が追いついていないのでは