【Python】pyautoguiを使ってKindle書籍を自動でスクショするツールを作ってみた!

スポンサーリンク
PC創作
マイケル
マイケル
みなさんこんにちは!
平日真っ只中ですがみなさんいかがお過ごしでしょうか?
マイケル
マイケル
僕はもちろん仕事です・・・
エレキベア
エレキベア
現実はカナシマシマシクマ
マイケル
マイケル
しかし今日は割と仕事に余裕があったので
合間をぬってツールを作ろうと考えてみました!
マイケル
マイケル
その名も・・・Kindle書籍自動スクショくん!
エレキベア
エレキベア
(仕事しろよ・・・)
マイケル
マイケル
みなさんはKindleで購入した書籍を画像として保存したり印刷したいと思ったことはありませんか?
今回作ったツールはKindleアプリを自動でページ移動しながらスクリーンショットを行うことで全ページを画像ファイルとして保存するツールです!
エレキベア
エレキベア
それは法律的にアウトなのではないクマ?
マイケル
マイケル
電子書籍は、著者が禁止している場合等を除いて、基本的にスクショや印刷はOKとなっているよ!
2020年8月現在、個人利用で楽しむ範囲であれば基本的にスクショや印刷はOKとなっているよ!
でも、スクショや印刷したものを自分以外の人に渡してしまうとアウトになるから気をつけてね!
エレキベア
エレキベア
悪用は厳禁クマね
スポンサーリンク

仕様を考える

マイケル
マイケル
ざっくりとツールの仕様を考えます!
まずKindleアプリの画面仕様はこのようになっています
スクリーンショット 2020 02 25 22 37 44
マイケル
マイケル
矢印キーを押せばページがめくられる。
つまり最低限、矢印キー押下とスクリーンショットをページ数分繰り返す処理をさせれば画像への変換はできそうだ!
エレキベア
エレキベア
手でやるのが大変だからツールで自動化しようということクマね
スポンサーリンク

開発環境の準備

マイケル
マイケル
次に開発環境を準備します!
僕が久しぶりに使いたいのと、手頃だからという理由から
今回はPythonを開発言語として選定しました!
マイケル
マイケル
入れていない方は自身の環境にPython3をインストールしましょう!
エレキベア
エレキベア
インストール方法はぐぐるクマ
マイケル
マイケル
そして今回はキー操作やスクリーンショットを行うために、
pyautoguiというライブラリを使用しました。
こちらもpipでインストールしましょう!
pip install pyautogui
↑インストールコマンド
エレキベア
エレキベア
これで準備完了クマね
スポンサーリンク

ツールの作成

マイケル
マイケル
そして作成完了したツールはこちらになります!
import pyautogui
import time
import os
import datetime

#########################
# 変数定義
# (環境に応じて変更する)
#########################

# ページ数
page = 5
# 取得範囲:左上座標
x1, y1 = 270, 160
# 取得範囲:右下座様
x2, y2 = 3230, 2010
# スクショ間隔(秒)
span = 1
# 出力フォルダ頭文字
h_foldername = "output"
# 出力ファイル頭文字
h_filename = "picture"


#########################
# スクリーンショット取得処理
#########################

# 待機時間5秒
# (この間にスクショを取得するウィンドウをアクティブにする)
time.sleep(5)

# 出力フォルダ作成(フォルダ名:頭文字_年月日時分秒)
folder_name = h_foldername + "_" + str(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
os.mkdir(folder_name)

# ページ数分スクリーンショットをとる
for p in range(page):
    # 出力ファイル名(頭文字_連番.png)
    out_filename = h_filename + "_" + str(p+1).zfill(4) + '.png'
    # スクリーンショット取得・保存処理
    # キャプチャ範囲: 左上のx座標, 左上のy座標, 幅, 高さ
    s = pyautogui.screenshot(region=(x1, y1, x2-x1, y2-y1))
    # 出力パス: 出力フォルダ名 / 出力ファイル名
    s.save(folder_name + '/' + out_filename)
    # 右矢印キー押下
    pyautogui.keyDown('right')
    # 次のスクリーンショットまで待機
    time.sleep(span)
マイケル
マイケル
1. スクショを撮る範囲、ページ数を設定して実行する。
2. 実行後、待機時間中にスクショを撮りたい画面をアクティブにする。
3. 自動でスクショ取得処理が実行されて出力フォルダに画像が出力される。

といった流れになっています!
エレキベア
エレキベア
思ったより簡潔クマね
マイケル
マイケル
pythonは簡潔に書けるのも特徴だからね!
それぞれ処理部分を見ていきます

スクショ範囲、ページ数の設定

#########################
# 変数定義
# (環境に応じて変更する)
#########################

# ページ数
page = 5
# 取得範囲:左上座標
x1, y1 = 270, 160
# 取得範囲:右下座様
x2, y2 = 3230, 2010
# スクショ間隔(秒)
span = 1
# 出力フォルダ頭文字
h_foldername = "output"
# 出力ファイル頭文字
h_filename = "picture"
マイケル
マイケル
ここの値は、各自の環境に合わせて変更します!

ページ数: スクリーンショットを撮る枚数を設定する。
取得範囲: スクリーンショットを撮る左上・右下の座標(x座標,y座標)を設定する。
スクショ間隔: スクリーンショットを1枚撮るごとの待ち時間を設定する。
出力フォルダ・ファイル頭文字: 出力するフォルダ名とファイル名の頭文字を設定する。

マイケル
マイケル
スクリーンショットを撮る座標については、
「pyautogui.position()」でマウスカーソル位置の座標を取得できるみたいだから計測ツールも作ってみたよ!
import pyautogui
import time

#########################
# キャプチャ座標計測
#########################

# 左上座標を取得
print('キャプチャ範囲の左上座標にマウスカーソルを合わせるでやんす')
time.sleep(3)
print('左上座標:' + str(pyautogui.position()))

# 1秒待機
time.sleep(1)

# 右下座標を取得
print('キャプチャ範囲の右下座標にマウスカーソルを合わせるでやんす')
time.sleep(3)
print('右下座標:' + str(pyautogui.position()))
マイケル
マイケル
でも画面の解像度によっては取得座標の倍率が変わってくるみたいだから、参考程度での計測としてください!
エレキベア
エレキベア
ぜんぶ設定完了クマ〜〜〜
マイケル
マイケル
できるクマですね

スクリーンショット取得処理

マイケル
マイケル
そして次はメインとなるスクリーンショット取得処理をみていきます!
#########################
# スクリーンショット取得処理
#########################

# 待機時間5秒
# (この間にスクショを取得するウィンドウをアクティブにする)
time.sleep(5)

# 出力フォルダ作成(フォルダ名:頭文字_年月日時分秒)
folder_name = h_foldername + "_" + str(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
os.mkdir(folder_name)
マイケル
マイケル
まず実行した後にスクショ開始までの待機時間を5秒設けてあるので・・・
マイケル
マイケル
この間に手動でスクショを撮る画面をクリックして対象を合わせます!
合わせた対象画面に対して、キー押下やスクショを実行していく流れになります!
エレキベア
エレキベア
(作りが雑クマ・・・・・)
# ページ数分スクリーンショットをとる
for p in range(page):
    # 出力ファイル名(頭文字_連番.png)
    out_filename = h_filename + "_" + str(p+1).zfill(4) + '.png'
    # スクリーンショット取得・保存処理
    # キャプチャ範囲: 左上のx座標, 左上のy座標, 幅, 高さ
    s = pyautogui.screenshot(region=(x1, y1, x2-x1, y2-y1))
    # 出力パス: 出力フォルダ名 / 出力ファイル名
    s.save(folder_name + '/' + out_filename)
    # 右矢印キー押下
    pyautogui.keyDown('right')
    # 次のスクリーンショットまで待機
    time.sleep(span)
マイケル
マイケル
そして最後のロジック部で、
スクリーンショットを取ったあと右矢印キー押下して1秒待機といった処理をページ数分繰り返すようにしています!
エレキベア
エレキベア
これで画像取得完了クマね
スポンサーリンク

実行結果

マイケル
マイケル
さて実際にこのツールを僕が購入した書籍で試すとどうなるのか!

スクリーンショット 2020 02 25 22 39 51

スクリーンショット 2020 02 25 22 38 18

スクリーンショット 2020 02 25 22 38 29

マイケル
マイケル
スクショ181枚(362ページ分)が無事完了して、
かかった時間は約12分!
マイケル
マイケル
シャワー浴びてる間に終わるし許容範囲ではないでしょうか・・・
エレキベア
エレキベア
無事成功クマ〜〜〜
マイケル
マイケル
もう少し速度を上げたい場合はアプリの反応速度と相談しながらspanの値を変えてみてください!
スポンサーリンク

おわりに

マイケル
マイケル
電子書籍のスクショ自動化にPythonを使ってみましたが
このライブラリは割と汎用性が高いのではないでしょうか
マイケル
マイケル
今回は右矢印キーとスクショだけだったけど、他のキーや文字入力もできるから、ケースバイケースで修正していろいろな場面で使えると思う!
エレキベア
エレキベア
単調な仕事もこんな感じで自動化すれば楽になるクマね
マイケル
マイケル
休憩してる間にプログラムに作業させておくことなんてことも全然可能だね!
マイケル
マイケル
こんな感じで、今後も日々の生活にプログラミングを役立てていきましょう!
それではアデュー!
エレキベア
エレキベア
クマ〜〜〜

【Python】pyautoguiを使ってKindle書籍を自動でスクショするツールを作ってみた! 〜完〜

コメント

  1. 野口 より:

    「電子書籍は、著者が禁止している場合等を除いて、基本的にスクショや印刷はOKとなっているよ!」の部分ですが、
    日本の現行の著作権法では 著者が禁止している場合でも合法 だと思うのですが。
    他人にあげるとかはもちろんアウトですが、私的利用の範囲には著作権が及ばないと解釈できますがいかがでしょうか。

    • マイケル マイケル より:

      コメント及びご指摘ありがとうございます。
      こちらでも調べてみたところ、おっしゃるとおり著者が禁止している場合でも著作権上は合法になりそうですね。
      そのため基本的に「私的利用の範囲には著作権が及ばない」解釈で問題無いかと思います。
      こちらの内容は記事の方にも追記させていただきます。