Androidのスクリーンショット&スクロールを自動化


自動でスクロールしてスクショを撮るプログラムを書いた

Androidで、画面をスクロールしてスクリーンショットを撮る作業をプログラムで自動化しました。
これをやろうとした動機は、AndroidからiPhoneに乗り換えようとした際に、LINEのトーク履歴を引き継げない問題があったからです。LINEの機能でトーク履歴をテキストファイルとして出力することはできますが、味気ないものになってしまいます。
大切な思い出を保存しておきたかったので、トーク画面をスクリーンショットしようとしたのですが、手作業では気が遠くなる量です。
そこで、スクショ→スクロールの作業を自動化しました。調べたらすぐにできるだろうと思っていたのですが、予想以上に情報が出てこなかったので記事にまとめておきます。
友人から「やり方教えて」と言われたついでに書いているだけなので、細かい部分はカバーしていません。

環境

Mac OS Catalina 10.15.7
Android version 9

使用したツール

Android端末の操作にはADB(Android Debug Bridge)を使いました。
簡単に言えば、MacやWindowsでAndroid端末を操作するためのツールです。
詳しくはこちらの記事を見てみて下さい。
Android Debug Bridgeとは?Android開発のデバッグツールのインストールと初期設定

プログラムはPythonで書きました。
subprocessモジュールでADBのコマンドを呼び出して使う、というやり方です。
subprocessは、Pythonから他のアプリを起動したり、実行結果を得たりするモジュールです。
詳しくはこちらがわかりやすいかと思います。

ADBのインストール

ADBの使い方については、こちらの記事を参照して下さい。
パスを通す必要がありますが、Macのパスの通し方はこの記事がわかりやすいと思います。
MacでPATHを通す

Androidでタッチした座標を表示する

プログラムの中でスクロールの動作(正確にはスワイプ)を指定するので、どれだけの長さを動かせば良いかを知る必要があります。
Androidの開発者オプションの中に、タッチした場所の座標を表示させる機能があるので、これをオンにします。
開発者オプションの使い方についてはこちらを、タッチの座標を表示する方法についてはこの記事を参照して下さい。
この機能を使って、大体どれくらいの座標の位置でスクロールすれば良いか、大まかに掴みます。

Pythonのコード

import subprocess

swipe_up = ('adb', 'shell', 'input', 'swipe', '300', '400', '300', '1520')
swipe_down = ('adb', 'shell', 'input', 'swipe', '300', '1520', '300', '400')

if __name__ == "__main__":
    for i in range(100):
        screen_capture = ('adb', 'shell', 'screencap', '-p', '/sdcard/chat/screenshot' + str(i) + '.png')
        subprocess.call(screen_capture)
        subprocess.call(swipe_up)
        # subprocess.call(swipe_down)
        print(i)

これが実際のコードです。端末を接続した状態でこれを実行すれば実機上でプログラムが走ります。
自分の場合はswipe_downを使いましたが、コメントアウトしてあるswipe_upを使えば下にスクロールしていくことができます。
数値は実験して丁度いい値に調節しました。ちょうど画面のサイズ分だけスクロールするようなスワイプの長さにしました。
4つの数値の意味は、「目的地点のx座標, 目的地点のy座標, 出発地点のx座標, 出発地点のy座標」です。
画像の名前や保存先はお好みで設定して下さい。

このコードを実行すると、chatというフォルダにscreenshot0〜screenshot99という名前で99枚のスクリーンショットが保存されます。