はじめに
インターンの運営とかで社員のユーザとインターン生のユーザごとにグループ作成して招待するっていうのをやろうとなった時に、GUIでポチポチするの面倒ですよね。
そこで、今回は、node-slack-sdkというNode.jsのパッケージを使用してSlackのグループ作成などを自動化してみました。
Slack API
SlackBotなどを作ったことがある人は馴染みあると思いますが、SlackにはRestAPIが用意されています。これらを使用すれば、Channel,Group(プライベートチャンネル)などの作成、取得、アーカイブなどの処理をやらせることができます。SlackAPIのURLは以下になります。
node-slack-sdk
このSlackAPIをNodejsで使いやすくしたものがnode-slack-sdkになります。GitHubのリポジトリは以下になります。
導入
- node-slack-sdkを使える状態にしていきます。まず何かしらのディレクトリを新規作成します。(例としてslack-utilsというディレクトリを作成しています)
- npm installでnode-slack-sdkを入れます。
- ソースファイルを作成(index.js)
$ mkdir slack-utils
$ cd slack-utils
$ npm install @slack/client --save
$ touch index.js
SlackのTokenの取得
node-slack-sdkを使用する上で、SlackにアクセスするためのTokenが必要になります。これはアカウントごとに異なるTokenが発行されます。発行の仕方は以下のページを参照してください。
取得したTokenは環境変数に設定しておきましょう。以下をbash_profileに記述。
export SLACK_TOKEN="取得したToken"
Groupの作成
では、早速Slackのグループを作成していきます。
node-slack-sdkはPromiseに対応しているので、Promiseの形式で書きました。
const WebClient = require('@slack/client').WebClient;
const token = process.env.SLACK_TOKEN;
const web = new WebClient(token);
const groupName = "hogeGroup"; //作成するグループ名
//グループの作成
web.groups.create(groupName)
.then(val => {
console.log(val);
})
.catch(err => {
console.log(err);
});
書いたら以下のコマンドでスクリプトを実行
$ node groupCreate.js
Groupの取得
グループを作成したら作成したグループを取得します。ここで面倒なのが、SlackAPIが用意している検索キーはグループのIDのみです。したがって、特定のグループを取得したい時は全グループの情報を取得してから該当するグループ名が含まれるかで判定する必要があります。
実際に使う際は、CSVかなんかで取得したい複数のグループ名を読み込む形になると思います。
slack-utilsディレクトリに新たにgroupGet.jsというファイルを作成しました。
const WebClient = require('@slack/client').WebClient;
const token = process.env.SLACK_TOKEN;
const web = new WebClient(token);
let name = "group1"; //探したいグループ名
web.groups.list()
.then(value => {
for(let group of value.groups){
if(name === group.name){
//何らかの処理
}
}
})
.catch(err => {
console.log(err);
});
Groupに招待
Groupの情報が取得できたら、チームにいるユーザを招待してみましょう。今回は、チームにいるユーザ全員に作成したグループを送るという形で実装していきます。
const WebClient = require('@slack/client').WebClient;
const token = process.env.SLACK_TOKEN;
const web = new WebClient(token);
let groupName = "group1"; //招待したいグループ名
let userIds = [];
Promise.all([web.users.list(), web.groups.list()])
.then(values => {
let users = values[0].members;
let groups = values[1].groups;
let groupId;
//groupのID取得
for(let group of groups){
if(group.name === groupName){
groupId = group.id;
}
}
//groupに招待
for(let user of users){
web.groups.invite(groupId, user.id)
.then(res => {
//console.log(res);
})
.catch(err => {
//console.log(err);
});
}
})
.catch(err => {
console.log(err);
});
まとめ
node-slack-sdkを使うと退屈な事務的な作業も自動化できてしまいます。色々カスタマイズして使うこともできるので、各々の用途にあった使い方をしてみてください。
ps. jsまだまだ初心者ですので、お見苦しい点あったら恐縮です。