yagshi's website
SlackをEmacsで使う

SlackをEmacsで使う

Emacsようの非公式Slackクライアント emacs-slack を使う方法を解説します。ほぼそのページに書いてある通りで いいのですが、tokenとcookieを auth-source で管理したりしなかったりする方法が(恥ずかしながらauth-sourceを使ったことが なかったぼくとしては)ちょっとわかりづらかったのでその辺中心に。

準備

init.elを以下のような感じに書きます。use-package が 使えない場合はrequire等で代替してください。でもuse-packageを 使えるようにしちゃう方がいろいろ楽だと思います。

(use-package oauth2 :ensure t :demand t)
(use-package emojify :ensure t :demand t)
(use-package circe :ensure t :demand t)
(use-package request :ensure t :demand t)
(use-package websocket :ensure t :demand t)

(use-package slack :ensure t :demand t
  :commands (slack-start)
  :init
  (setq slack-buffer-emojify t)
  (setq slack-prefer-current-team t)
  :config
  (slack-register-team
   :name "ワークスペースの表示名"
   :default t
   :token "xoxc-そのワークスペースの token"
   :cookie "xoxd-そのワークスペースの cookie"
   :full-add-display-names t)
  )

ここがめんどくさいところで、アクセスするための credential である tokenとcookieを 公式webアプリから 手作業で取り出す必要があります。 ブラウザの開発者コンソールなどを使って文字列をコピペする、という 作業です。

  • token は TS.boot_data.api_token
  • cookie は d

というものですが、 emacs-slackの “How to get token and cookie” と書いてある節のとおりにやれば ok です。

token のみでいいワークスペース(少し楽)と cookie も必要なもの (2倍めんどくさい)とがあるようですが ぼくの場合は cookie が必要でした。 token は(cookieが必要な場合は) xoxc- で始まる文字列、cookie は xoxd- で始まる文字列です。

これらを上記の init.el などの例にコピペすれば基本的には ok です。 M-x slack-start で読み込みが始まります。

auth-source で credential を保護する

絶対他に誰も使わない環境でしたら上記で終了、でいいのですが いわゆる credential を 平文のまま設定ファイルにハードコード するのは気持ち悪い、と思います。そんなときは Emacs の auth-source を使いましょう。

auth-source とは ~/.authinfo, ~/.authinfo.gpg, ~/.netrc いずれかのファイルにパスワード等の情報を記録しておくデータベース的 機能です。このファイル基本的には単純な行レコード形式の key value の組み合わせなのですが、なんと!! keymachine, login, port, password の決め打ち というびっくり仕様でした。(ぼくはこれで数時間はハマりました。)

とうわけで以下のような.authinfoファイルを作ります。以下の例では awesomeworkspace.slack.comniceworkspace.slack.comという 二つのワークスペースに同一e-mailでログインするケースを書いています。 portでtokenとcookieを識別しています。

machine awesomeworkspace.slack.com login yagshi@hogemail.com port token password xoxc-123
machine awesomeworkspace.slack.com login yagshi@hogemail.com port cookie password xoxd-456
machine niceworkspace.slack.com login yagshi@hogemail.com port token password xoxc-789
machine niceworkspace.slack.com login yagshi@hogemail.com port cookie password xoxd-abc

次にこれを Emacs 側から参照します。*Scratch*バッファで試します。

(auth-source-pick-first-password
 :host "awesomeworkspace.slack.com"
 :user "yagshi@hogemail.com"
 :port "token"
 )
"xoxd-789"

とこんな具合です。ちゃんと引っ張ってこられました。え? hostuserって何かって?はいすみません、ぼくも良くわかってないのですが、

  • .authinfomachineキーは auth-source で引く時には machine でもhostでもいい
  • .authinfologinキーは auth-source で引く時には login じゃだめでuserにする。 ということのようです(←追記。環境だかバージョンによって少し違うみたいです)。 ここでは host, user, port にしました。横幅も揃いますしね。

さあ、ではinit.elの該当部分をauth-source対応に書き直しましょう。

  (slack-register-team
   :name "ワークスペースの表示名"
   :default t
   :token (auth-source-pick-first-password
           :host "awesomeworkspace.slack.com"
           :user "yagshi@hogemail.com"
           :port "token")
   :cookie (auth-source-pick-first-password
           :host "awesomeworkspace.slack.com"
           :user "yagshi@hogemail.com"
           :port "cookie")
   :full-add-display-names t)
  )

これでcredentialをハードコードすることはなくなりました。 でもまだ平文のままです。最後にこれを暗号化します。これは 簡単。単に gpg コマンドで .authinfo.authinfo.gpg に するだけです。暗号化したら元の平文ファイルは消しておきましょう。

yagshi@x1turbo $ gpg -e .authinfo
(インタラクティブに鍵設定)
yagshi@x1turbo $ rm .authinfo

以上。

screenshot