2
0

More than 1 year has passed since last update.

Slack APIでLambda(Node.js)でランダムで絵文字のリアクションをする(reactions.add)

Posted at

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コードは使いこなせなかった。。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0