ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20200225_01

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

      ツール開発Python自動化
      2020-02-26

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

      仕様を考える

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

      開発環境の準備

      マイケル
      マイケル
      次に開発環境を準備します!
      僕が久しぶりに使いたいのと、手頃だからという理由から
      今回は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)
      
      ※「pyautogui.keyDown(‘right’)」の後に「pyautogui.keyUp(‘right’)」も実行しないと
      うまくいかない情報もあるようです。(コメント欄参照)
      マイケル
      マイケル
      そして最後のロジック部で、
      スクリーンショットを取ったあと右矢印キー押下して1秒待機といった処理をページ数分繰り返すようにしています!
      エレキベア
      エレキベア
      これで画像取得完了クマね

      実行結果

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

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

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

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

      おわりに

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

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


      ツール開発Python自動化
      2020-02-26

      関連記事
      【Unity】Timeline × Excelでスライドショーを効率よく制作する
      2024-10-31
      【Node.js】廃止されたAmazonアソシエイト画像リンクをAmazon Product Advertising API経由で復活させる
      2024-01-08
      【Electron × Vue3】カテゴリ情報のCSVデータを操作するツールを作る
      2023-12-31
      【Electron × Vue3】画像をリサイズして任意の場所に保存するツールを作る
      2023-12-31
      【Electron × Vue3】Electron × Vue3 × TypeScript × Vite でツール開発環境を整える
      2023-12-31
      【Flutter3】Googleスプレッドシートと連携した英単語学習アプリを作る
      2022-12-11
      【Python】Pythonスクリプトをexe、app化する【cx_Breeze】
      2021-08-29
      【Python】Pillowを使ってピクセル操作!画像フィルタをかけてみる
      2021-02-17