Slack のカスタム絵文字を一括でダウンロードする Ruby のスクリプト書いた

いくつかのワークスペースを行き来してると「あの絵文字とかもろもろ引っ越ししたいんだよなあ…」と思うことあると思います。いや知らんけど。

そこで、Slack のカスタム絵文字を一括でダウンロードするコード書いてみみました。これを実行すると実行したディレクトリに /emoji が作られ、そこに絵文字の画像が全部入ります。

こんな感じのコード

# frozen_string_literal: true

require 'json'
require 'down'

SLACK_OAUTH_TOKEN = '<your OAuth Access Token here>'
SLACK_ENDPOINT = 'slack.com/api'
SLACK_METHOD_EMOJI_READ = 'emoji.list'

uri = URI("https://#{SLACK_ENDPOINT}/#{SLACK_METHOD_EMOJI_READ}?token=#{SLACK_OAUTH_TOKEN}")
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
 http.request(req)
end
result = JSON.parse(res.body)
raise('Failed to get emoji lists.') unless result['ok']

emoji_urls = result['emoji'].reject { |_, v| v.match?(/\Aalias:.+\z/) }

FileUtils.mkdir('./emoji') unless system('find ./emoji')

emoji_urls.each do |k, v|
 tmpfile = Down.download(v)
 extension = tmpfile.original_filename.match(/[^.]+\.(.+)\z/)[1]
 FileUtils.mv(tmpfile.path, "./emoji/#{k}.#{extension}")
end

必要なものは以下の通りです。
- emoji:read の Permission を持つ適当な Slack App の OAuth Access Token
- down っていう 安全にファイルをダウンロードする gem

ホントは Slack App の Slash command とかでどっか適当なエンドポイント叩いたら Serverless Function 的なのが動いてダウンロードしたファイル群を zip で Slack の適当なチャンネルに投下する、みたいなことしたかったんですけど、 OAuth Access Token がワークスペースごとかつ Slack App ごとに発行されるヤツなので、どのワークスペースでも汎用的に使えるってわけじゃなさそうなんですよね…。

絵文字を一括アップロードする

ちなみに絵文字を一括でアップロードしたい場合は、こちらの Chrome 拡張機能がおすすめです。アップロードするとファイル名が絵文字の名前になります。

スクリーンショット 2019-11-17 18.08.17

↑↑ドラッグアンドドロップで画像を突っ込んでいけます。

参考文献