あれか?これか?

プログラミングのこととかを書いたりするかもしれない。

バックグラウンドでキー入力を読み取る Pythonライブラリ「keyboard」を使いキーロガーを作る

Pythonを使ってバックグラウンドで稼働するキーロガーを作った。

具体的には、「一秒間に特定のキーを押した回数をBB背景上に表示する」といったものである。



f:id:winzu44:20200409204052g:plain
画面左、やや上のところで 〇KPS と表示しているのが今回作ったプログラムである。キャプチャする際に、ブルーバックを切り抜いている。
はじめは「PyHooked」を使おうと思っていたが

ATTENTION: pyhooked has been deprecated in favor of keyboard for new projects. This library is will no longer be supported. Please use one keyboard or one of the alternatives listed in Alternatives.

 

 とあるのでライブラリ「keyboard」を使うことにした。

インストール

pip install keyboard

 プロンプトから実行してインストール。


キーボードイベントを読み取る

if keyboard.read_event().event_type == keyboard.KEY_DOWN: 

 このように記述すれば、キーが押されている状態を読み取ることができる。(厳密には、キーが押されるまでプログラムが待機する。)

バックグラウンドでキーの状態を読み取りたいだけならこれでOKだが、今回はキー入力を読み取ると同時にGUIの更新も行わないといけないため、少し工夫をしてやらないといけなかった。単純にこれだけだと、キー入力がないとき、この文でコードが止まってしまうためGUIがフリーズしてしまう。
そこで、

keyboard.is_pressed(key)
     # return bool

を使う。
引数で渡したキーが押されていたらTrueを返す。
入力検知対象のキーをリストにしておき、各キーが押されていることを確認したうえで、キーボードイベントを読み取らせている。

target_key = ['x', 'e', 'f', 'j', 'space', 'k', 'l', 'a', ';']        
while True:                                                                                         
      for key in target_key:
            if keyboard.is_pressed(key):
                   if keyboard.read_event().event_type == keyboard.KEY_DOWN:
                        key_counter += 1
      ....
      # この下にGUIの処理

こうすることで、キーの入力がない場合でもコードを止めないで済み、GUIの更新ができる。

全コード

参考

github.com