Python とマウス操作だけで作業証跡を簡単に取る方法

はじめに

システム操作をしているとき、その作業証跡を取ることは非常に重要です。しかし、従来の作業証跡取得ツールはキーボード操作が必要で、時として面倒だと感じることもあります。そこで、マウス操作だけで作業証跡を簡単に取れる Python のスクリプトを作成しました。このスクリプトでは、マウスの任意のボタンを押すたびにスクリーンショットが自動的に取られ、指定したフォルダに保存されます。また、マウスの右クリックを 0.5 秒以内に 2 回連続で行うことでスクリプトが終了します。これにより、作業中のどんな瞬間でも証跡を残すことが可能になります。

Python を使用して自動で取得するスクリプト

以下にスクリプトの全体像を示します:

# ----------------------------------------------------------------------------
# Author: tomo
# Creation Date: 2023-05-10
#
# This script is free to use and modify at your own discretion.
# No warranty is provided for the script's functionality.
# Use this script at your own risk.
# ----------------------------------------------------------------------------
import os
from pynput import mouse
import pyautogui
from time import time

class Screenshotter:
    def __init__(self):
        self.screenshot_counter = 0
        self.desktop = r"C:\Users\tomo\Desktop\ss"  # 保存先を指定
        if not os.path.exists(self.desktop):  # 指定した保存先が存在しない場合は作成
            os.makedirs(self.desktop)
        self.last_click_time = 0
        self.last_button_clicked = None

    def take_screenshot(self):
        screenshot = pyautogui.screenshot()
        screenshot.save(os.path.join(self.desktop, f"screenshot_{self.screenshot_counter}.png"))  # 指定した保存先にスクリーンショットを保存
        self.screenshot_counter += 1

screenshotter = Screenshotter()

def on_any_mouse_button(x, y, button, pressed):  # マウスの任意のボタンが押されたとき
    if pressed:  # ボタンが押された瞬間だけスクリーンショットを取る
        screenshotter.take_screenshot()
        if button == mouse.Button.right and screenshotter.last_button_clicked == mouse.Button.right and time() - screenshotter.last_click_time < 0.5:
            # 前回のクリックから0.5秒以内に右クリックが2回行われた場合、スクリプトを終了
            return False
        screenshotter.last_button_clicked = button
        screenshotter.last_click_time = time()

# マウスリスナーを別のスレッドで実行
mouse_listener = mouse.Listener(on_click=on_any_mouse_button)
mouse_listener.start()

# マウスリスナーが終了するのを待つ
mouse_listener.join()

スクリプトの詳細解説

まずは必要なライブラリをインストールします。このスクリプトでは pynputpyautogui を使用しています。以下のコマンドでこれらのライブラリをインストールします。

pip install pynput
pip install pyautogui

それでは、各部分の説明に移ります。

import os
from pynput import mouse
import pyautogui
from time import time

ここでは必要なモジュールをインポートしています。os モジュールは、ファイルやディレクトリを操作するためのモジュールです。pynput ライブラリは、マウスやキーボードの入力をハンドリングするためのライブラリです。pyautogui ライブラリは、GUI 自動化(スクリーンショットの撮影、マウスの移動やクリックなど)を行うためのライブラリです。time 関数は、現在の UNIX 時間(1970年1月1日からの経過秒数)を取得するための関数です。

class Screenshotter:
    def __init__(self):
        ...

この部分では Screenshotter という名前のクラスを定義しています。このクラスのインスタンスは、スクリーンショットを撮影し、それをファイルとして保存する能力を持ちます。また、スクリーンショットの数をカウントし、最後にクリックされたマウスボタンとその時間を記録します。

    def take_screenshot(self):
        ...

このメソッドは、スクリーンショットを撮影し、それを指定したディレクトリに保存します。保存されるファイルの名前は screenshot_<カウンターの値>.png となります。

screenshotter = Screenshotter()

この行では Screenshotter クラスのインスタンスを作成しています。このインスタンスはマウスがクリックされるたびにスクリーンショットを撮影します。

def on_any_mouse_button(x, y, button, pressed): 
    ...

この関数は、マウスの任意のボタンがクリックされたときに呼び出されます。クリックが押された瞬間にスクリーンショットを撮影します。また、右ボタンが 0.5 秒以内に 2 回クリックされた場合には、スクリプトを終了します。

# マウスリスナーを別のスレッドで実行
mouse_listener = mouse.Listener(on_click=on_any_mouse_button)
mouse_listener.start()

この部分では、マウスのクリックを監視するリスナーを作成し、別のスレッドで実行を開始しています。mouse.Listener は、pynput.mouse モジュールが提供するクラスで、マウスイベントを監視するためのものです。このリスナーは、マウスボタンが押されるたびに on_any_mouse_button 関数を呼び出します。

# マウスリスナーが終了するまでメインスレッドを維持
mouse_listener.join()

ここでは、マウスリスナーが終了するまでメインスレッドを維持しています。joinメソッドは、スレッドが終了するまで現在のスレッドの実行をブロックします。

スクリーンショットの保存先はクラス Screenshotter__init__ メソッド内で定義されています。このパスを変更することで、保存先をカスタマイズすることができます。また、右クリック 2 回でスクリプトを終了する時間(0.5秒)も on_any_mouse_button 関数内で定義されています。この値を調整することで、ダブルクリックと判定される間隔をカスタマイズすることも可能です。

以上がこのスクリプトの詳細な説明です。このスクリプトを使うことで、マウス操作をトレースし、その結果をスクリーンショットとして保存することができます。特定のマウス操作を記録しておきたい場合や、GUI の自動テストを行いたい場合などに活用できます。

以上