
マイケル
みなさんこんにちは!
平日真っ只中ですがみなさんいかがお過ごしでしょうか?
平日真っ只中ですがみなさんいかがお過ごしでしょうか?

マイケル
僕はもちろん仕事です・・・

エレキベア
現実はカナシマシマシクマ

マイケル
しかし今日は割と仕事に余裕があったので
合間をぬってツールを作ろうと考えてみました!
合間をぬってツールを作ろうと考えてみました!

マイケル
その名も・・・Kindle書籍自動スクショくん!

エレキベア
(仕事しろよ・・・)

マイケル
みなさんはKindleで購入した書籍を画像として保存したり印刷したいと思ったことはありませんか?
今回作ったツールはKindleアプリを自動でページ移動しながらスクリーンショットを行うことで全ページを画像ファイルとして保存するツールです!
今回作ったツールはKindleアプリを自動でページ移動しながらスクリーンショットを行うことで全ページを画像ファイルとして保存するツールです!

エレキベア
それは法律的にアウトなのではないクマ?

マイケル
2020年8月現在、個人利用で楽しむ範囲であれば基本的にスクショや印刷はOKとなっているよ!
でも、スクショや印刷したものを自分以外の人に渡してしまうとアウトになるから気をつけてね!

エレキベア
悪用は厳禁クマね
仕様を考える

マイケル
ざっくりとツールの仕様を考えます!
まずKindleアプリの画面仕様はこのようになっています
まずKindleアプリの画面仕様はこのようになっています


マイケル
矢印キーを押せばページがめくられる。
つまり最低限、矢印キー押下とスクリーンショットをページ数分繰り返す処理をさせれば画像への変換はできそうだ!
つまり最低限、矢印キー押下とスクリーンショットをページ数分繰り返す処理をさせれば画像への変換はできそうだ!

エレキベア
手でやるのが大変だからツールで自動化しようということクマね
開発環境の準備

マイケル
次に開発環境を準備します!
僕が久しぶりに使いたいのと、手頃だからという理由から
今回はPythonを開発言語として選定しました!
僕が久しぶりに使いたいのと、手頃だからという理由から
今回はPythonを開発言語として選定しました!

マイケル
入れていない方は自身の環境にPython3をインストールしましょう!

エレキベア
インストール方法はぐぐるクマ

マイケル
そして今回はキー操作やスクリーンショットを行うために、
pyautoguiというライブラリを使用しました。
こちらもpipでインストールしましょう!
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. 自動でスクショ取得処理が実行されて出力フォルダに画像が出力される。
といった流れになっています!
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()」でマウスカーソル位置の座標を取得できるみたいだから計測ツールも作ってみたよ!
「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秒待機といった処理をページ数分繰り返すようにしています!
スクリーンショットを取ったあと右矢印キー押下して1秒待機といった処理をページ数分繰り返すようにしています!

エレキベア
これで画像取得完了クマね
実行結果

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


マイケル
スクショ181枚(362ページ分)が無事完了して、
かかった時間は約12分!
かかった時間は約12分!

マイケル
シャワー浴びてる間に終わるし許容範囲ではないでしょうか・・・

エレキベア
無事成功クマ〜〜〜

マイケル
もう少し速度を上げたい場合はアプリの反応速度と相談しながらspanの値を変えてみてください!
おわりに

マイケル
電子書籍のスクショ自動化にPythonを使ってみましたが
このライブラリは割と汎用性が高いのではないでしょうか
このライブラリは割と汎用性が高いのではないでしょうか

マイケル
今回は右矢印キーとスクショだけだったけど、他のキーや文字入力もできるから、ケースバイケースで修正していろいろな場面で使えると思う!

エレキベア
単調な仕事もこんな感じで自動化すれば楽になるクマね

マイケル
休憩してる間にプログラムに作業させておくことなんてことも全然可能だね!

マイケル
こんな感じで、今後も日々の生活にプログラミングを役立てていきましょう!
それではアデュー!
それではアデュー!

エレキベア
クマ〜〜〜
【Python】pyautoguiを使ってKindle書籍を自動でスクショするツールを作ってみた! 〜完〜
コメント
「電子書籍は、著者が禁止している場合等を除いて、基本的にスクショや印刷はOKとなっているよ!」の部分ですが、
日本の現行の著作権法では 著者が禁止している場合でも合法 だと思うのですが。
他人にあげるとかはもちろんアウトですが、私的利用の範囲には著作権が及ばないと解釈できますがいかがでしょうか。
コメント及びご指摘ありがとうございます。
こちらでも調べてみたところ、おっしゃるとおり著者が禁止している場合でも著作権上は合法になりそうですね。
そのため基本的に「私的利用の範囲には著作権が及ばない」解釈で問題無いかと思います。
こちらの内容は記事の方にも追記させていただきます。
auto_screenshot.pyの
> pyautogui.keyDown(‘right’)
のあとに、
pyautogui.keyUp(‘right’)
も実行しないと、うまく行きませんでした。
keyUp()を実行せずにkeyDown()だけだと、ずっと矢印キーを押し続けろという命令だと、python側で解釈されるようです。
情報ありがとうございます!!
記事の中に追記させていただきました( ̄^ ̄)ゞ