JavaScriptNode.jsemojiSlackslack-api

Slack emoji を export する

はじめに

Slack の Workspace は気軽に作成できる反面、個人用、家族用、....等様々存在する誤家庭も少なくないと思います。 それぞれの設定はもちろん大変ですが、今回挙げる emoji が特に面倒です。 Import は Google Chrome の拡張に任せればすぐ終わりますが、 export はそうも行きません。 また過去書かれた記事は、仕様変更等で動かなくなってしまったものも多く、記事にまとめることにしました。

Slack emoji を export する

今回実施する内容は以下です

  • 準備
    • Slack app 作成
    • Node.js の実行環境用意
  • 実行

準備

Slack app を作成する

今回 emoji 情報の取得のみ行うことができる Slack app を作成します。 必要は権限は emoji:read のみです。 面倒な方は ⇩ JSON をコピーして Slack app を作成してください

{
  "display_information": {
    "name": "Emoji export"
  },
  "features": {
    "bot_user": {
      "display_name": "Emoji export",
      "always_online": false
    }
  },
  "oauth_config": {
    "scopes": {
      "bot": ["emoji:read"]
    }
  },
  "settings": {
    "org_deploy_enabled": false,
    "socket_mode_enabled": false,
    "token_rotation_enabled": false
  }
}

後のステップで API_TOKEN を利用します。 Token を発行し安全な場所に控えておいてください。

Node.js の実行環境用意

今回は Node.js で export する定義を書きました。 実行環境に Node.js を install している、 yarn の実行も可能である前提で記載します。設定が終わってない方は設定してください。

cd path/to/emoji-export && cd path/to/emoji-expor
npm init -y

今回依存する npm package を install します。

yarn add image-downloader dotenv @slack/web-api

.evn ファイルに先ほど作成した Slack app の API_TOKEN を記載します

API_TOKEN=xoxb-xxxx-xxxx-xxxx

index.js に Slack emoji を export するコード記載します。

今回は path/to/emoji-expor/images 以下に emoji ファイルを書き出します。また、 alias として登録されている emoji は無視しています。

"use strict"

require("dotenv").config()

const { WebClient } = require("@slack/web-api")
const download = require("image-downloader")

const apiToken = process.env.API_TOKEN
const web = new WebClient(apiToken)

web.emoji.list().then((res) => {
  // Response sample
  //
  // {
  //  ok: true,
  //  emoji: {
  //    sample: 'https://emoji.slack-edge.com/xxx/sample/f3ec6f2bb0.png',
  //    'サンプル': 'alias:sample',
  //    sample2: 'https://emoji.slack-edge.com/xxx/sample 2/6535867372d3b644.png'
  //  },
  //  cache_ts: '1668865194.021600',
  //  response_metadata: { scopes: [ 'emoji:read' ], acceptedScopes: [ 'emoji:read' ] }
  //}
  Object.keys(res.emoji).forEach((key) => {
    const fileUrl = res.emoji[key]
    if (fileUrl.startsWith("alias:")) {
      return
    }

    const fileName = key + fileUrl.match(/\.(\w+)$/)[0]
    download.image({
      url: fileUrl,
      dest: `${process.cwd()}/images/${fileName}`,
      extractFilename: false,
    })
  })
})

実行

それでは作成した Script を実行します。

yarn node index.js

images directory 以下に emoji が保存されていれば成功です。

References