@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Slack のスレッドのスクリーンショットを半自動で撮影する

Slack のスレッドが嫌いな理由その 3: スレッドのスクリーンショットが撮りづらい。長いスレッドはそれだけで嫌なものだが、スクリーンショットの撮影は気が遠くなるほど面倒くさい。伝家の宝刀 Google Chrome デベロッパーツールの Capture full size screenshot / Capture node screenshot もうまくいかない。Slack をブラウザで開いても、full size screenshot はスレッドをスクロールせず、画面に表示されていない HTML ノードは DOM から消えるので node screenshot も効果なし。

そこで、スレッドを一画面ずつスクロールしながら順番にスクリーンショットを撮影するプログラムを開発した。macOS 用。

いくつかコツがある。

  • プログラム実行前に Slack のスレッドを開き、スレッド内のテキストエリアではない部分をクリックして activate しておく(フォーカスを当てておく)こと。でないとうまく画面スクロールできない。
  • Slack.app を画面いっぱいに表示しておくこと。画面全体のスクリーンショットを撮影するので Slack.app の面積が小さいと周辺の余計な部分も撮影されてしまって撮影後の画像が見づらくなる。

スクリーンショットの撮影には macOS にインストール済みの screencapture コマンドを使っている。Slack.app の操作(画面のスクロール)は osascript 経由で AppleScript でやっている。最後に撮影したスクリーンショットを縦に連結するのに convert コマンドを使っていて、これは ImageMagick をインストールする必要がある。

gist.github.com

AppleScript 版も作った。というかこちらを先に Script Editor.app で作り、シェルスクリプトで書き直した。

画像を縦に連結してるのは一覧性のため。複数の画像を一枚ずつ見るよりも、一枚のでかい画像をスクロールするほうがスレッド内の会話を追いやすい(はず)。

デモ動画では分かりやすさのために OK・Cancel ボタンをマウスでクリックしているが、キーボード操作でも可。RETURN で OK、ESC で Cancel 扱いになる。

一番下までスクロールし終わったことをプログラムで判定するのが面倒くさそうだったので、一枚撮影するごとに人間の判断を仰ぐ、という仕組みにした。なので半自動(semi-automatic)。

カッとなって作った系のあれだが、実際に使ってみると、連結画像は馬鹿馬鹿しいほど巨大でとてもみられたもんじゃない。境界線ドラッグでスレッドの表示領域(横幅)を広げておけば多少はマシになるかも。あと、Slack.app のヘッダ領域とか Thread という小見出しが連結した画像にいちいち含まれるので、スレッド部分だけ切り出したとしてもアプリ上で読むのと同じような体験にはならない。一定間隔で同じパターンのノイズが現れる様は広告っぽい。

スレッド内のテキストを全部コピペするほうが(ゴミが混ざるが)速いし検索もできて便利だと思う。コピペは改ざんしてないことの証明が難しそうなので、証拠保全とか「言った言わない」で揉めたときの保険として使う場合はこのスクリプトも役に立つかもしれない。

お気に入りポイントは、毎回ダイアログのボタンを押してあげないといけないところで、よくある「人間が機械に合わせてあげないといけない」シュールさが気に入っている。しかもわざわざそれを自作したわけで、単純作業が嫌で効率化したかったはずなのにもっと単純な作業をするはめになって一体おれは何をしているんだろう、と哲学的な気持ちになれる。