記事を書いた理由
- Slackアプリのホームタブで、ボタンをクリックしたらアプリとしてでなく「自分」として特定のチャンネルに書き込みする機能を実装したかった。
- ググっても情報が微妙に古かった(引数にas_userを使うものしか見つからなかった)。
だいたいの環境
- Bolt for JavaScript (3.11.0)
- 日本語のチュートリアルは一通りやった
- AWS Lambda
- デプロイ方法は↑のチュートリアルにある。dotenvを使えるようにserverless.yamlのトップレベル?にuseDotenv:trueを追加すると便利。
chat.postMessage関数のas_user属性は最近のSlackアプリでは使えない
特定チャンネルへの投稿にはWebClientインスタンスのpostMessageメソッドを使うが、アプリとしてでなく操作しているユーザーとして投稿したいときに使うであろうas_user属性は古いSlackアプリでは使えない。
令和最新版としては、
// Webクライアント初期化
const web = new WebClient('TOKEN')
// 書き込み
const result = await web.chat.postMessage({
text: '書き込み内容',
channnel: '書き込むチャンネルのID/ DMを送るユーザーのID',
username: 'ユーザー名',
icon_url: 'プロフィール画像のURL',
icon_emoji: ':smile:' // icon_urlの代わり
})
as_userを使う場合必要だったchat:write.customizeなトークンのスコープは不要。
理由は実態としてはユーザー名とプロフィール画像を差し替えたアプリが書き込んでいるため。
ちなみにユーザー名やプロフィール画像を取得したければ先ほどのweb変数を使って
// ユーザーオブジェクトの取得
// https://api.slack.com/methods/users.info#examples
const { user } = await web.users.info({ user: 'ユーザーID' })
// ユーザー名と画像。画像サイズ(_48)は適当
const { display_name, image_48 } = user?.profile
最後に
Node.js初心者なのもあるが,チュートリアル後にモジュール分割するのに割と詰まったので別に記事を書きたい。参考にした本の読書記録になるかもしれない。