furikaeruという、1日の振り返りを簡単に楽しくできるSlack botを作りました。こちらがその記事です。
この中で、メッセージに対してLambda(Node.js)を利用して、botで絵文字のリアクションをするという実装をしたのですが、シンプルそうなのにで、あまりサンプルコードにありつけず、ちょいと手こずってしまったのでメモを。
ランタイム: Node.js 14.x
Slack APIのreactions.add
を使います。
必須パラメータはtoken, channel, name, timestamp。
index.js
const AWS = require('aws-sdk');
exports.handler = async (event) => {
const eventBody = JSON.parse(event.body);
const text = eventBody.event.text;
const channel = eventBody.event.channel;
const ts = eventBody.event.ts;
const teamId = eventBody.team_id; // そのコミュニティの絵文字を使いたい場合のみ後々必要
// いつ絵文字を付けたいかは仕様によると思うのでどうぞよしなに
await addEmoji(channel, ts, teamId);
}
// 指定したtextに絵文字を付ける
async function addEmoji(channel, ts, teamId) {
let emoji = selectEmoji(teamId); // selectEmoji()は絵文字をランダムにしたい場合のみ
let url = `https://slack.com/api/reactions.add`;
const data = {
'channel': channel,
'timestamp': ts,
'name': emoji
};
// 必須パラメータの一つであるtokenはheadersで渡す
const headers = {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + process.env['SLACK_BOT_USER_OAUTH_TOKEN']
};
await sendHttpRequest(url, 'POST', headers, JSON.stringify(data));
}
// 絵文字のバリエーションを増やしたい場合
function selectEmoji(teamId) {
const fusicTeamId = process.env['TEAM_ID_FUSIC'];
// ビルトインの絵文字たち
let names = ["relaxed", "blush", "thumbsup", "sparkles", "sparkling_heart"];
// コミュニティオリジナルの絵文字たち
const namesFusic = ["tensaida", "sasuga", "sugoi", "emo", "subara"];
// 指定したコミュニティからのリクエストであれば、そのコミュニティオリジナルの絵文字たちを入れる
if (teamId === fusicTeamId) names = names.concat(namesFusic);
const nameIndex = Math.floor( Math.random() * names.length);
return names[nameIndex];
}
// Httpリクエストを送信する。
async function sendHttpRequest(url, method, headers, bodyData) {
const https = require('https');
const options = {
method: method,
headers: headers
};
return new Promise((resolve, reject) => {
let req = https.request(url, options, (res) => {
res.setEncoding('utf8');
let body = '';
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', () => {
resolve(body);
});
}).on('error', (e) => {
reject(e);
});
req.write(bodyData);
req.end();
});
}
最後に
終わってしまえばやはりシンプルで、なんでハマってたのかも分からないくらい...。
以下、参考にしたもの。
- Slack APIドキュメントの横にあるこのテスト、役立ちました。
- クラメソさんの記事。ここにあるJSコードは使いこなせなかった。。