KindleのスクショをPyautoguiで自動化する方法
Kindleのスクショは個人利用でかつ非営利の場合問題ありません
この記事では、Pyautoguiを使ってKindleのスクリーンショットを自動化する方法を紹介します。これで手間を省き、効率的にスクリーンショットを撮ることができます。
スクリーンショットの自動化
手動で一枚一枚スクリーンショットを撮るのは時間がかかり、非常に面倒です。この悩みを解決する方法があれば、良いと思ったことはあるかと思います。
なによりも、手動でのスクリーンショット撮影を続けると、貴重な時間が浪費されるだけでなく、誤って重要な部分を撮り忘れることもおこってしまいかねません。
pyautoguiの利用
そんな悩みを解決するのが、Pyautoguiを使った自動スクリーンショット撮影です。
pyautoguiは、PythonのGUIオートメーションライブラリです。
Pyautoguiを使えば、以下の操作が可能です:
画面全体や指定範囲のスクリーンショットを撮影
Kindleアプリを自動で操作してページ送り
画像を指定フォルダに自動保存 具体的なコードも提供されているため、初心者でも簡単に始められます。
自動テスト、デスクトップの自動化タスクなどに使用することが出来ます。
実装は無料で利用できるVisual Studio Codeがオススメです
Pyautoguiの導入
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)
ブログ記事はこちらです