Linux で Cloudflare R2 などを使って Gyazo っぽい仕組みを作った

読了まで:約2分


私は大分前から Gyazo の有償プランを契約していたのですが、 近年はまったく使っていなかった上に、

これ今の使い方だと Gyazo を使う意味ってなくね……?

と気がついてしまい、経費削減の準備も兼ねて Linux ローカルで似た様な仕組みを作れないか、 と思ってやってみたら出来た、と言うのが今回の話です。

今回再現した Gyazo っぽい仕組みとは?

大まかな流れとしては下記の様な仕組みです:

  1. いくつかの方法でスクリーンショットなどを取る
  2. それを独自ドメインを割当てた Cloudflare R2 に upload する
  3. その後 upload した画像ファイルをブラウザで開く

どうやって再現したの?

具体的には下記のスクリプトを Openbox の Keybinding から呼び出す形にしました。

なおこのスクリプトを実行するためには、

  • coreutils + xdg-utils + bash
  • s5cmd(Cloudflare R2 へのアップロードに利用)
  • op(1passwod の cli)
  • maim + xdotool(screenshot などを撮るために利用)

と言った辺りのコマンドが必要で、Cloudflare R2 の Credentials を隠すために 1password を利用しているため、 当然 1password の契約が必要となってきます。

とは言え 1password 周りは他の方法でもたぶん代用可能なので、その辺りは各自工夫してみると良いかと思います:

#!/usr/bin/env bash
set -euo pipefail
exec 2>&1 >$HOME/.cache/r2yazo.log
export S3_ENDPOINT_URL="op://Application/R2Yazo/S3_ENDPOINT_URL"
export AWS_ACCESS_KEY_ID="op://Application/R2Yazo/AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="op://Application/R2Yazo/AWS_SECRET_ACCESS_KEY"
export R2YAZO_URL="https://zo.kalaclista.com"
export R2YAZO_DIR="${HOME}/Pictures/R2Yazo"
filename() {
  echo $(date +%Y/%m/%d/%H-%M-%S).webp
  return 0
}
push-to-r2() {
  op run -- bash -c 'env s5cmd --endpoint-url $S3_ENDPOINT_URL sync --delete ${R2YAZO_DIR}/* s3://kalaclista-r2yazo/'
}
crop() {
  maim -u -s -f webp "${1}"
}
capture() {
  local wid="$(xdotool selectwindow)"
  maim -u -f webp -i $wid "${1}"
}
screenshot() {
  maim -u -f webp "${1}"
}
main() {
  local action=$1 fn="$(filename)"
  local fp="${R2YAZO_DIR}/${fn}"
  mkdir -p "$(dirname "${fp}")"
  case $action in
    capture) capture "${fp}" ;;
    crop) crop "${fp}" ;;
    screenshot) screenshot "${fp}" ;;
    push) push-to-r2 ; exit 0 ;;
    *) exit 1 ;;
  esac
  push-to-r2 && xdg-open "${R2YAZO_URL}/${fn}"
}
main "${@:-}"

作ってみた感想

なんとも言えない感じで Gyazo っぽいです。

ただ Gyazo っぽいとは言え Linux でしか動かせない上、GIF アニメーションなどは作れないため、 その辺りは別の方法を取る必要がある様に感じます。

また Gyazo っぽい動きを最低限再現するだけの仕組みなので、当然 Web インンターフェースなどはありません。 特に Gyazo に付いている画像加工やパスワードを付ける、と言う仕組みも当然有りません。

そのため、

とりあえずスクリーンショートを取ってサクっとアップロードする

と言うぐらいにしか使えないため、まぁ本当に役に立つかどうかは人次第なところでしょう。

ちなみに私は Gyazo をスクリーンショットを上げるぐらいの用途にしか使ってなかったので、 たぶんこれだけで事足りそうな予感がします……。

まぁ Gyazo が必要になればまたその時に契約すれば良いだけなので、当面はこれでしのげると感じています。はい。

以上

……と言う様な仕組みを今日一日で組み上げていたのですが、 まぁ Gyazo っぽい動き自体は Linux の cli toolchain で出来上がりました。

とは言え Gyazo が素晴しいのはこれ + αの部分で、Windows や macOS での対応や、 アップロードした画像の編集、パスワードを付与して閲覧者を制限したりして云々……、 と言った辺りなので、それらの付加価値を得たいのであれば、是非とも課金して Gyazo を利用すると良いと思います。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。