ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

SlackのInteractionCallbackに含まれるMessageからもとのURLを復元する

10月何もしていない...(会社のブログはギリギリ書いた記憶がある)。

何もしなすぎてるので極小ネタを。

SlackのAppにはUser Interactionという機能があり、例えばSlackの入力画面からのショートカット実行結果を受け取り、フォームを返したりさらに入力を受け取ったりなんやかんやできる。

api.slack.com

qiita.com

この辺にまとまってる通りなのだけど、メッセージに紐づくショートカット(メッセージ右上のメニューから実行できるやつ)には、元のメッセージの情報がInteractionCallbackとして含まれている。例えばGoのコードならこういう感じで取れる。

payload := new(slack.InteractionCallback)
err := json.Unmarshal(getPayloadFormValue()), payload)
if err != nil { ... }

fmt.Printf("%v\n", payload.Message)

ところで、このMessageには元メッセージのURLがそのものズバリでは含まれていない模様。

例えばショートカットがAcceptされた通知として、元のメッセージのURLを含むポストをする(そうすると元メッセージも引用されるし)などをしたい場合、以下のようなコードを書くしかない。

workspace := "myworkspace"
chanId := payload.Channel.ID
slug := "p" + strings.ReplaceAll(payload.Message.Timestamp, ".", "")

url := fmt.Sprintf("https://%s.slack.com/archives/%s/%s", workspace, chanId, slug)

メッセージのURLにはタイムスタンプの情報が含まれている模様(今はそういう仕様なだけ?)。

なおスレッドのパーマリンクの場合、また別のタイムスタンプ Message.ThreadTimestamp がある。

やりたいことに対し情報がなかったので残しとく。