見出し画像

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)

ブログ記事はこちらです


関連記事


いいなと思ったら応援しよう!