はじめに
私の通ってる大学では電子教材を使った英語の科目があり、それが非常に面倒くさいのです。幸いなことに答えが出回ってるので教材を速く終わらせることはできるのですが、あまりに学習時間が短いと不正学習扱いされ、単位が降りなくなります(裏で学習時間を記録されてる)。そういうわけでパソコンのブラウザで電子教材を開いて放置して学習時間を稼ぐ必要があるのですが、運営側はそういう人たちのことを見抜いて、webページがアイドル状態だったら学習時間のカウントをやめるという対策をしているのです。かといって放置するときに時々マウスを動かしたりするのもだるいので、私はその問題をプログラムで解決することにしました。真面目にやれという意見は受け付けません!また、どの電子教材でも使えるわけではないので、その点はご了承ください。
アイドル状態の判定法
まず前提として、電子教材のタブを開いて、Chromeをアクティブにしないと学習時間は加算されません。しかし、そうして放置したとしても5分後くらいにアイドル状態判定がなされ、学習時間がカウントされなくなるので私は以下のことを調べました。
- マウスの動きを監視してアイドル状態の判定をしているのか
- マウスのクリックの動きを監視してるのか
その結果、マウスの動きは無関係で、クリックの動きのみを元にアイドル状態の判定をしてることがわかりました。
ということで、私はJavaScriptで何秒かおきにサイトにマウスのクリックイベントを発火させればアイドル状態の判定がなされないのではないかと考えました。
ソースコード
先ほどの名案を試しに実行してみました。JavaScriptで何秒かおきにサイトにマウスのクリックイベントを発火するプログラムです。
(async () => {
let i = 0;
while (true) {
document.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true, view: window }));
i++;
if (i % 5 === 0) {
const waitTime = 120000 + 30000 * Math.random();
await new Promise(resolve => setTimeout(resolve, waitTime));
i = 0;
}
const intervalTime = 5000 * Math.random();
await new Promise(resolve => setTimeout(resolve, intervalTime));
}
})();
5分以上放置したらアイドル状態判定を喰らうので、マウスクリックの時間間隔は5分よりも短くしています。
これを実行してみたところ、私がパソコンを全く操作しなくても学習時間が加算されました!
実行方法
- 電子教材を開く
- ブラウザの上部のURL欄に、
javascript:{改行を削除した上記のソースコード}を記述 - Enterを押して実行
ブックマークして使うと楽かもしれません。
まとめ
サイトのアイドリング判定が緩かったおかげで、本当にパソコンを放置するだけで電子教材の学習時間を稼ぐことができました。
ただし、サイトによってはプログラムによるマウスクリック入力などを判別して処理してる可能性もあるので、そのときはWin32APIを用いてOSのマウスクリックイベントを直接呼び出すしかないかもしれません。