Slackのemojiを別のTeamに引っ越しするスクリプトをGoで書き直してみた

2019/07/07追記 結構前からSlackの仕様が変更されて動作しない状態となっております m(_ _)m

この記事は[Slack その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/slack2 "Slack その2 Advent Calendar 2016")の18日目の記事です。
※12/20 記事の内容を色々修正しました。

#はじめに
以前に[Slackのemojiを別のTeamに引っ越しするスクリプトをRubyで作ってみた](http://qiita.com/from_Unknown/items/e1f99d9a2c4d19ffed52 "Slackのemojiを別のTeamに引っ越しするスクリプトをRubyで作ってみた")という記事を書きました。
しかし、以下の理由で実際に動かすのは少しハードルが高いのではないかと感じていました。

+ Slackのemojiを引っ越すためだけにRubyの環境を作るのは面倒
+ 世の中のSlackユーザーはエンジニアばかりでない

上記理由から、もっと簡単に実行出来ればより便利だろうなと考えていました。

そんな中、[VimConf 2016](http://vimconf.vim-jp.org/2016/ "VimConf2016")で[熱いGolang推し](http://www.slideshare.net/takuyaueda967/go-68228940 "エディタの壁を越えるGoの開発ツールの文化と作成法")の発表を聞いたことを思い出し、Golangで作って実行形式ファイルを配布すれば少なくとも環境作成は必要なくなるのではないか、と思いました。

##Golangで作ると何がおいしいの？
Golangは書いたソースをクロスコンパイルすることができ、一つのソースからMac、Windows、Linuxなどの環境で実行可能なファイルを作成することが出来ます。

**環境設定しなくても動くって素晴らしい。**

また、JavaVM上で動作しているJavaとは違い、機械語にコンパイルして実行するため速度がとても速いです。
詳しくは[公式サイト](http://golang-jp.org/ "golang-jp.org")や、Googleで検索してください。

#そんな訳で作りました
[slack_emoji_mover_go](https://github.com/from-unknown/slack_emoji_mover_go "slack_emoji_mover_go")

Release内にビルドしたモジュールを入れてあるので、そちらを使ってください。
WindowsとMacでzipファイルを分けたので、必要なファイルをダウンロードしてください。

**なお、Windowsはダブルクリックで実行出来ますが、MacはTerminalから実行する必要があります。**

#使い方
使い方は[Ruby版](http://qiita.com/from_Unknown/items/e1f99d9a2c4d19ffed52 "Slackのemojiを別のTeamに引っ越しするスクリプトをRubyで作ってみた")とほぼ同じです。

環境のセットアップは必要ありません。
emoji_conf.txtに必要な情報を記入してください。

**引っ越し先の情報**

+ Slack team URL
+ Slackにログインするためのメールアドレス
+ Slackにログインするためのパスワード

**引っ越し元の情報**

+ token

tokenはbot等で既に使用している場合はそちらでも大丈夫ですが、ない場合は生成する必要があります。
以下のurlから引っ越し元のSlackのteamのtokenを生成してください。
[Test token generator](https://api.slack.com/docs/oauth-test-tokens)

tokenの生成方法については、下記記事も参考になります。
[ロードバランスすだちくん Slackの絵文字、他社のも見たいよね](https://blog.animereview.jp/slack-emoji-matrix/ "Slackの絵文字、他社のも見たいよね")

なお、tokenを使うことで様々な事が出来てしまうため、**くれぐれも他人に教えたりはしないでください。**

全て記入できたら以下手順で実行してください。

**Macの場合**

1. Terminalを開く
2. cdコマンドでフォルダまで移動
3. ```./slack_emoji_mover```でslack_emoji_moverを実行

**Windowsの場合**

1. ```slack_emoji_mover```をダブルクリック

**注意：**
**SlackのAPIやカスタマイズ甩ページに繋がりにくい時があり、失敗する時があるようです。**
**失敗した時は時間をおいて再度試してください。**

#どんなことをやっているのか
動作はRuby版とあまり違いはありません。
ざっくり書くと以下のような動作をしています。

1. 初期設定ファイルと標準のemojiのリストファイルを読み込む
2. SlackのAPIからemojiのJSONデータを取得
3. Slackのチームにログインし、emojiのカスタマイズページを開く
4. Webページ上のemojiの名前をスクレイピング
5. 3.で取得したemojiのリストから2.の標準のemojiと、6.で取得したemojiを除外
6. emojiの画像をダウンロード
7. SlackのTeamにアップロード

今回はMechanizeの代わりに[Surf](https://github.com/headzoo/surf "Surf")というGoのLibraryを使用してます。
~~実はまだファイルのアップロードに対応していなくてどうしようか焦っていたら、プルリク内にファイル対応版があって助かりました・・・。~~
↑上記プルリクは取り込まれていました。

また、追加機能としてSlackのemojiページ内をスクレイピングし、既に登録されているemojiは再アップロードしないという動きに変えました。
これにより、定期実行してemojiの同期を取りたい場合でも、差分のみしかアップしないので負荷が大分下がるかと思います。

#作った感想
Golangを全く触ったことがなく、見切り発車だったことは否めないですが、取り敢えず動くものが出来てよかったです。
Javaなら知っているという程度でしたが、構文は割と理解しやすかったと思います。
ただしまだ本当に作って動いたという段階なので、バグ等ありましたらご連絡ください。

また、Golangの書き方も未熟だと思いますので、おかしな部分がありましたら是非ご指摘お願いします。
今回Golangで以下のことが学べたので、中々良い経験だったと思います。

+ 基本的なファイルの読み込み＆書き込み
+ 配列を`for ... range`で回す
+ httpを使って画像をダウンロード [こちらの記事を参考にしました](http://qiita.com/kiyo_e/items/9fd13f15b7b1a13a457d "初心者向けシェルスクリプトの基本コマンドの紹介")
+ Web APIを叩いて取得したJSONをデコードする [こちらの記事を参考にしました](http://qiita.com/oahiroaki/items/ff21d9adfb843161d1d8 "golangでのjsonのデコード")
+ Surfを使ってのWebスクレイピング

また何かGolangで作ってみようと考えています。

では、良いSlackライフを！