読者です 読者をやめる 読者になる 読者になる

orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

画像内の秘密情報をOCRでマスクするコマンドmasecretを作った

python

2017-02-05 更新 v0.2.0へのバージョンアップに伴って、使い方を更新しました。

スクリーンショットを撮影していると、しばしばマスクしておきたい値が存在します。数枚ならば手作業で塗りつぶしてもいいですが、手順書を作成するようなときは枚数が多くなって面倒です。

いつも同じ場所に表示されるのであれば、機械的に塗りつぶすのも簡単ですが、画像によって異なることもあります。そこでOCRを使ってスクリーンショット内の秘密情報をマスクするコマンドmasecretを作りました。

OCRなので思い通りに塗りつぶされないことも多々ありますが、限定された局面ではそれなりに便利なので公開します。

masecret

秘密情報の正規表現を書いたファイルSECRETS.txtと画像ファイルを与えると、秘密情報をマスクした画像を保存するコマンドです。

github.com

必要なもの

  • Python 3.3+
  • Tesseract
    • OCRに使用する言語が使える必要があります。Homebrewならばbrew install tesseract --all-languagesでインストールすれば全言語が使えます。

インストール

以下のコマンドでインストールできます。環境によってはsudoが必要かもしれません。

$ pip3 install masecret

使い方

SECRETS.txtをカレントディレクトリに作成しておきます。このファイルは各行に秘密情報の正規表現を書きます。秘密情報をそのまま書くとこのファイルが流出した時に悲しいことになるので、それっぽい正規表現を書きます。

例えばAWSのアカウントナンバーを塗りつぶそうとすると、以下のようになります。日本語だとハイフンがダッシュと認識されることがあったので、両方のパターンをカバーできるようにしています。

[-—\d]{12,}

以下のように実行すると、original-ja.png内で上記の正規表現にマッチした箇所が灰色に塗りつぶされたmasked-ja.pngが生成されます。--langオプションで言語を指定します。+で繋げることで複数書けます。

$ masecret --lang eng+jpn original-ja.png -o masked-ja.png
Processing original-ja.png...
Found 1 secrets at [((1500, 235), (1705, 259))]
Saved to masked-ja.png

-oオプションにディレクトリを指定すれば、複数のファイルを処理対象に指定することも可能です。

v0.2.0からはSECRETS.txtを作らずに、-rオプションで直接正規表現を指定できます。

実行結果

以下のように正規表現にマッチする箇所がマスクされます。

Before

f:id:mi_kattun:20160619195025p:plain

After

f:id:mi_kattun:20160619195047p:plain

内部実装

OSSOCRソフトの中でも有名なTesseractPythonから使用しました。TesseractをPythonから使うためのライブラリとしてPyOCRを使いました。PythonからTesseractを使う簡単なサンプルになっていると思いますので、興味があればソースコードをご覧ください。

本当はこういうCLIのコマンドはGo言語で書いたほうが簡単に実行できて良いのですが、思いついたものをさくっと作るだけのGo言語力がなかったので、Pythonで書きました。そのうちGo言語で書き直すかもしれません。

まとめ

OCRソフトTesseractを使って、画像内の秘密情報を塗りつぶすコマンドmasecretを作りました。良ければ使ってみてください。画像によっては正しく塗りつぶされないこともあるので、必ず正しく塗りつぶされたことをご確認ください。