KindleのスクショをPyautoguiで自動化する

本ページはプロモーションが含まれています

Kindleのスクショは個人利用でかつ非営利の場合問題ありません

こちらの記事で詳しく解説しています

今回の記事では、スクショを楽にできるような方法を紹介します

pyautoguiとは

pyautoguiは、PythonでGUIオートメーションライブラリです。これは、キーボードやマウスの自動操作、スクリーンショットの取得などをシミュレートするために使用されます。自動テスト、デスクトップの自動化タスクなどに使用することが出来ます。

実装はフリーで利用できるVisual Studio Codeがオススメです


Python環境でインストールをおこないます

$ 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)

  • この記事を書いた人

drーharv

こんにちは、Dr. Harv です。専門医としてのキャリアを積む一方で、資産運用、副業、ポイ活にも取り組んでいます。 このブログ「dr-harv.com」では、日々の日常、投資の知見、趣味など幅広いトピックを扱っています。より良い未来につながることをコンセプトにしています。読者の皆様にとって何か役立つ情報を提供できれば幸甚です。

-Amazon, Python