📂

Slack APIで画像ファイルは送れないのか~Node.js編~

2021/11/22に公開

概要

残念ながらSlack webhook APIで画像ファイルをそのまま送ることは出来ません。
JSON形式しか対応していないからです。

「AWSなど使わず、無料で済ませたい!」
という場合は下記の手順が有効であることを発見しました。
図らずも人類初の偉業を達成してしまったようです。

1.画像ファイルをbase64にエンコードする
2.imagekit上にアップロードする
3.attachmentsとして添付する

コード

imagekitでAPIキーを取得し.envに登録しましょう。

require('dotenv').config();
const fs = require('fs');
const ImageKit = require("imagekit");
const { IncomingWebhook } = require("@slack/webhook");

(async () => {
  const imageFile = fs.readFileSync('./画像ファイル.png');
  const encoded = Buffer.from(imageFile).toString('base64');

  //環境変数を読み込む
  const imagekit = new ImageKit({
    publicKey: process.env.PUBLIC_KEY,
    privateKey: process.env.PRIVATE_KEY,
    urlEndpoint: process.env.URL_ENDPOINT
  });

  imagekit.upload({
    file: encoded,
    fileName: "my_file_name.jpg",
  }).then(response => {
    const webhook = new IncomingWebhook(process.env.SLACK_HOOK_URL);
    webhook.send({
      text: '表示するテキスト',
      username: '通知ユーザー名',
      icon_url: 'https://表示したいアイコン.png',
      "attachments": [{
        "image_url": response.url
      }]
    });
  }).catch((error) => {
    console.error('Error:', error);
  });
})();

用途としては、Herokuにデプロイ、schedulerを設定し、Puppeteerで撮ったスクショを定期的にSlackへ送信する際に使用しています。

以上です。

実装したリポジトリ

https://github.com/Akihide-Tsue/node.js-slack-weather

Discussion