miキーボード入力状態モニタ、それってキーロガーではないの?
miの機能を部分的にご紹介する話しの続きです
リモートワークのコンディション管理としてのキーボード入力状態モニター
ありがたいことに結構長くSOHOリモートワークをさせていただいています。
元々1人でやらないと効率が悪いタイプの人間なのですが、だからといって人の目がないとぼんやりしてしまうことがあり、それはそれで効率が悪い。旅するAI botの原型であるmi-runnerを含め、自作のmi-serverはそういう作業コンディションを調整/モニタするためのシステムとして作ったものです。
そのための基本機能の一つとして元々作ったものに「キーボードのタイピング状況を定常的にモニタする」という機能があります。
キーボードのタイピング状態を検出し、一定時間以上キーを叩いていない場合、ぼんやりしていると仮定して、気分の切替を促す訳です。
もちろんマウスだけで作業をしている場合もありますが、ショートカット入力を含めcntl+sを定期的に押す癖もあるので10分もキーを叩いていなければブラウザでSNSでも見て遊んでるかもしれないという想定です。
実現方法
キーボード状態を取得するのに、以前RPAがまだない頃にRPAっぽいことをやらせたくて、資料を調べながらキーボードドライバを書いたこともあるのでそれを使う手もありました。でもやっぱりキーボードドライバを書くのは大変ですし、最近はドライバ証明書などもいるのでそのままではアンチウイルスソフトに文句を言われ続けることになりあまりよろしい状況ではないです。
必要なことは「あまり精度は必要ないので一定期間キーボードの押下がないことを検出する」だけなので、アプリレベルでWin32APIを定期監視するというざっくりした方法を使いました。
mi-のフロントアプリ(electron+Vue)のelectron起動部分からforkしてC#.NetCoreのコンソールアプリを起動、そのなかで0.5秒ごとにWin32のGetAsyncKeyState()でキーの押下状態を検出する仕組みにしました。キーボードdown/upのようなイベントトリガーは扱わず、あくまでキーボードの押下ステートを静的に取得する方法にしているので比較的負荷は少ないという想定です。キーボードイベント入力で考えると当然取り落としはありますが、今回の目的は未操作期間の検出と概ねの押下量で十分なのでざっくりかつPC負荷が少なめの方法で考えています。
検出した概略キーボード押下数を5分ごとにmi-server(node/tsed)にREST APIで送り、キーボード押下状態ログを記録します。
10分以上キーボード押下がなければ、作業のテンションが落ちているので休憩などの気分切替を指示するようにしています。
Win32を呼ぶのにnode-gypを使う手も考えました。node-gypでまとめられればC#とか引っ張り出さずに済むのですが、自分の環境ではnode-gypが安定しないことがあるし、ミッションクリティカルでなければ、それぞれが得意な技術でつぎはぎ構成にしたほうが作る上での見通しがよくなります。
ですのでMSの技術でWin32が使え、かつ古すぎて使うのが面倒にならない程度に新しめの技術として、.NetCore コンソールアプリの形にすることを考えました。
生成AIと組み合わせて、気分切替の雑談を発する機能に拡張
mi-runnerと同じく、ChatGPTを使ってこの部分も機能を強化しました。
10分以上キーボード押下がなければChatGPTに「直近の会話ログや話題(次回解説予定)を使って雑談を話しかけてください」という形で雑談を開始する仕組みに拡張しています。
結果として、ちょっとぼんやりしていると「ChatGPTが何やら話しを語りかけてくる」という形になりました。簡単に雑談会話を返しつつも「ちょっとぼんやりしてたかな」と考えて、気分を切り替えるなり小休止を取るなりをするようにしています。
企業が同様なことをしたとしても、ちょっと怖くてやれない
俗に言うキーロガーとは違い、あくまでWinアプリで検出していることはキーボードの押下状態の一定時間中の概略件数だけです。このため文字列として収集している訳ではなくパスワードが記録される訳でもありません。でも最大のセキュリティは「これは他人/他社が作った機能ではなく、自分でOS APIから作った機能である」という点です。自分のPCの情報を自分で集めるんですからセキュリティはまったく関係ありません。
個人情報をどれほど収集していようが、自分が自分で収集して自分で使っている限りなにもやましいことはありません。
たとえば企業が「あなたのキーボード操作を監視して解析し、あなたの仕事状態をお知らせします」みたいな話しをしたとしたら、超一流企業がどんなにセキュリティとコンプライアンス大丈夫です、と言っても私は怖いです。仕事の情報を入力してたり個人的なパスワードを入力しているかもしれないキーボード状態を監視していると言われたらちょっと怖いです。
その点で言えば「自分で自分の都合でキーボード状態を取得しています。具体的な情報を取得していないのも自分で知っています」は最強の対策とも言えます。
企業の「テレワーク監視システム」とか言ってサービスしているものがどこまでやってて、そのあたりをどこまで保証しているのかは知りませんがそういうはどうやってトラブル防止を担保しているのでしょうかね。
まぁでもこういう普通ではやりにくいものをやれるのは、「自分で作る」の強みだと思ってます。