日常の臨床業務や研究活動において、専門書や最新の医学論文、電子書籍(Kindle)から必要な図表・記述をキャプチャし、文献管理ソフトやノートアプリに整理する作業は日常茶飯事です。
しかし、「ページをめくり、スクショを撮り、トリミングして保存する」という単純作業を手動で何十回、何百回と繰り返すのは、貴重な時間を奪うだけの完全な「時間泥棒」に他なりません。医師や研究者のタイムバリューを考慮すれば、こうした単純な定型作業は即刻自動化するべきです。
本記事では、Pythonの外部ライブラリ PyAutoGUI を活用し、Kindleのページ送りからスクリーンショット保存までを完全自動化するスクリプトを解説します。
※著作権法に関する注意書き
電子書籍のスクリーンショット作成や保存は、著作権法第30条に定められた「私的使用のための複製」の範囲内でのみ認められています。取得した画像を第三者に配布・転載・譲渡することや、ネット上に公開する行為は著作権侵害となりますので絶対におやめください。必ず個人での文献整理・学習の範囲内でご活用ください。
1. 環境構築(PyAutoGUIの基本)
まずはPython環境でGUI操作を自動化するためのライブラリをセットアップします。
そんな悩みを解決するのが、Pyautoguiを使った自動スクリーンショット撮影です。
pyautoguiは、PythonでGUIオートメーションライブラリです。
Pyautoguiを使えば、以下の操作が可能です:
- 画面全体や指定範囲のスクリーンショットを撮影
- Kindleアプリを自動で操作してページ送り
- 画像を指定フォルダに自動保存 具体的なコードも提供されているため、初心者でも簡単に始められます。
自動テスト、デスクトップの自動化タスクなどに使用することが出来ます。
実装は無料で利用できるVisual Studio Codeがオススメです
Python環境でPyautoguiをインストールします
$ pip install pyautoguiスクリーンショットをとる
基本的なデスクトップのスクリーンショットはこちら
import pyautogui
# 全画面のスクリーンショットを撮る場合
img1 = pyautogui.screenshot('my_screenshot_all.png')
# 範囲を指定する場合
img2 = pyautogui.screenshot('my_screenshot_region.png', region=(left,top,width,height))
これでデスクトップのスクリーンショットを保存することが出来ます
では、続いてPyatutoguiを使ってKindleのスクショをとります
pyatutoguiでKindleのスクショをとる
コードが動作するためには以下の条件が必要です
- Kindleアプリケーションが起動している
- スクリーンショットをとりたいライブラリが開いている
- アプリを最前面に開いておく
最前面にアプリを開く必要があるのですが面倒なので
スクリーンショットをとるアプリを指定するためにコードを改良します
pygetwindowライブラリを使用します
pip install pyautogui pygetwindow次にコードを示します。コピペでOKですが、調整を要するところがあります
import pyautogui
import pygetwindow as gw
import time
import os
import datetime
#########################
# 変数定義
#########################
page = 5
span = 1
h_foldername = "output"
h_filename = "picture"
window_title_contains = "kindle" # kindleを含むウインドウを開く
#########################
# スクリーンショット取得処理
#########################
time.sleep(5)
desktop_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
folder_name = h_foldername + "_" + str(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
os.mkdir(os.path.join(desktop_path, folder_name))
for p in range(page):
out_filename = h_filename + "_" + str(p+1).zfill(4) + '.png'
windows = gw.getWindowsWithTitle(window_title_contains)
if windows:
window = windows[0]
window.activate()
window.moveTo(0,0)
time.sleep(1)
s = pyautogui.screenshot(region=(window.left, window.top, window.width, window.height))
s.save(os.path.join(desktop_path, folder_name, out_filename))
else:
print(f"No window containing '{window_title_contains}' in the title was found.")
break
pyautogui.keyDown('right')
time.sleep(span)
デスクトップに保存していますが、保存先のパスを変更できます
このコードは右で進むタイプの書籍でWorkします
左で進む作品の対応
漫画などの左で進む作品はこちらのコードがWorkします。このコードではキャプチャ範囲を指定しています。
import pyautogui
import pygetwindow as gw
import time
import os
import datetime
#########################
# 変数定義
#########################
page = 5
span = 1
h_foldername = "output"
h_filename = "picture"
window_title_contains = "kindle" # ウィンドウタイトルに含まれるべき文字列
#########################
# スクリーンショット取得処理
#########################
time.sleep(5)
desktop_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
folder_name = h_foldername + "_" + str(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
os.mkdir(os.path.join(desktop_path, folder_name))
for p in range(page):
out_filename = h_filename + "_" + str(p+1).zfill(4) + '.png'
windows = gw.getWindowsWithTitle(window_title_contains)
if windows:
window = windows[0]
window.activate() # ウィンドウをアクティブにする
time.sleep(1) # アクティブ化後の安定化のために少し待つ
# 左上の座標
x1, y1 = 573, 236
#右下の座標
x2, y2 = 3383, 2173
s = pyautogui.screenshot(region=(x1, y1, x2-x1, y2-y1))
s.save(os.path.join(desktop_path, folder_name, out_filename))
pyautogui.press('left')
time.sleep(span)
else:
print(f"No window containing '{window_title_contains}' in the title was found.")
break
スクリーンショットの範囲を指定する
さて、これで写真がとれていることが確認されたら
トリミングも行いたいですよね。トリミングはディスプレイの解像度やウインドウの大きさで変わってしまうので、ウインドウを最大化した状態で環境に合わせて変更されることをオススメします。
画面には座標が設定されているので以下のコードを用いることで左上と右下の座標を得ることが出来ます。ここであわせた座標を上のコードに調整することで画面キャプチャの場所を合わせることが出来ます
import pyautogui
import time
print("3秒後に座標を取得します...")
time.sleep(3)
position1 = pyautogui.position()
print("左上の座標:", position1)
print("次の座標を取得するまで3秒待ちます...")
time.sleep(3)
position2 = pyautogui.position()
print("右下の座標:", position2)
結論:自動化で生み出した時間を、最大の投資へ回す
本記事で紹介したPyAutoGUIによる自動化スクリプトを活用すれば、これまで数十分〜数時間かかっていた文献のキャプチャ作業を、バックグラウンドに近い形で数分で終わらせることが可能です。
時間資本が極めて限られている医療従事者や研究者にとって、定型作業の自動化(RPA)は単なる作業効率化にとどまらず、「最も価値のある思考時間や研究時間を創出するための投資」に他なりません。浮いた時間を活用して、より深い論文執筆や質の高い自己研鑽へリソースを配分していきましょう。
▼ Pythonの環境構築から、文献管理、PCの周辺ガジェットまで。医師の知的生産を支える「デジタル書斎」構築の全体像はこちら ▼
▼ PC作業の機動力を高め、視覚ノイズを削ぎ落とすデスク周りの最適化プロトコルはこちら ▼
