画像内の秘密情報をOCRでマスクするコマンドmasecretを作った
2017-02-05 更新 v0.2.0へのバージョンアップに伴って、使い方を更新しました。
スクリーンショットを撮影していると、しばしばマスクしておきたい値が存在します。数枚ならば手作業で塗りつぶしてもいいですが、手順書を作成するようなときは枚数が多くなって面倒です。
いつも同じ場所に表示されるのであれば、機械的に塗りつぶすのも簡単ですが、画像によって異なることもあります。そこでOCRを使ってスクリーンショット内の秘密情報をマスクするコマンドmasecret
を作りました。
OCRなので思い通りに塗りつぶされないことも多々ありますが、限定された局面ではそれなりに便利なので公開します。
masecret
秘密情報の正規表現を書いたファイルSECRETS.txt
と画像ファイルを与えると、秘密情報をマスクした画像を保存するコマンドです。
必要なもの
- Python 3.3+
- Tesseract
- OCRに使用する言語が使える必要があります。Homebrewならば
brew install tesseract --all-languages
でインストールすれば全言語が使えます。
- OCRに使用する言語が使える必要があります。Homebrewならば
インストール
以下のコマンドでインストールできます。環境によっては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
After
内部実装
OSSのOCRソフトの中でも有名なTesseractをPythonから使用しました。TesseractをPythonから使うためのライブラリとしてPyOCRを使いました。PythonからTesseractを使う簡単なサンプルになっていると思いますので、興味があればソースコードをご覧ください。
本当はこういうCLIのコマンドはGo言語で書いたほうが簡単に実行できて良いのですが、思いついたものをさくっと作るだけのGo言語力がなかったので、Pythonで書きました。そのうちGo言語で書き直すかもしれません。
まとめ
OCRソフトTesseractを使って、画像内の秘密情報を塗りつぶすコマンドmasecretを作りました。良ければ使ってみてください。画像によっては正しく塗りつぶされないこともあるので、必ず正しく塗りつぶされたことをご確認ください。