🔍

[Python]家の中で見つからないiPhoneの音を鳴らしたい

4 min read

はじめに

みなさんは家の中で自分のiPhoneの場所がわからなくなることはないですか?私はあります。
私は自宅でGoogle Homeを使用しているので、「ねーグーグル、iPhoneを探して」と話しかけることで、どこかに行ってしまったiPhoneの音を鳴らすことで見つけられるようになったら便利ですよね。
今回は、Pythonの pyicloud というライブラリを使用して、まずはコマンドラインでiPhoneの音を鳴らすところまでを実現してみたいと思います。

このエントリーでわかること

  • プログラムでiCloudにログインし、「iPhoneを探す」の機能を呼び出せるようになる

このエントリーでは解決できないこと

  • iPhoneを家の中でなくさないようになること

環境

必要なライブラリをインストール

pip3 install pyicloud

認証まで

from pyicloud import PyiCloudService
import sys

APPLE_ID = 'your_apple_id'
PASSWORD = 'your_apple_id_password'
COOKIE_DIR = './cookie'

api = PyiCloudService(apple_id=APPLE_ID, password=PASSWORD, cookie_directory=COOKIE_DIR)

if api.requires_2fa:
    print("Two-factor authentication required.")
    code = input("Enter the code you received of one of your approved devices: ")
    result = api.validate_2fa_code(code)
    print("Code validation result: {}".format(result))

    if not result:
        print("Failed to verify security code")
        sys.exit(1)

    if not api.is_trusted_session:
        print("Session is not trusted. Requesting trust...")
        result = api.trust_session()
        print("Session trust result {}".format(result))

        if not result:
            print("Failed to request trust. You will likely be prompted for the code again in the coming weeks")
elif api.requires_2sa:
    import click
    print("Two-step authentication required. Your trusted devices are:")

    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print("  {}: {}".format(i, device.get("deviceName", "SMS to %s".format(device.get("phoneNumber")))))

    device = click.prompt("Which device would you like to use?", default=0)
    device = devices[device]
    if not api.send_verification_code(device):
        print("Failed to send verification code")
        sys.exit(1)

    code = click.prompt("Please enter validation code")
    if not api.validate_verification_code(device, code):
        print("Failed to verify verification code")
        sys.exit(1)

ここまでで一度実行すると認証用のコードを入力するプロンプトが表示されるので、自身のiPhoneなどに表示される6桁のコードを入力することで ./cookie ディレクトリにセッション情報が保存されます。次回以降の実行ではこの保存されたセッション情報が読み込まれるため、認証は不要になります。
※2ステップ認証のアカウントを持っていないので elif api.requires_2sa: 以降の部分のコードは未確認です(今は2ファクタ認証の方が推奨されています)

iCloudに登録されているデバイスの一覧を取得

api.devices

=> {'aAbBcCdDeEfFgGhHiIjJkK': <AppleDevice(iPad Pro: iPad Pro 12.9)>, 'lLmMnNoOpPqQrRsStTuUvV': <AppleDevice(iPhone 8: My iPhone6s)>}

※ファミリー共有を使用している場合は自身に共有されているデバイスも返却されます

取得したリストからデバイスを指定する

api.devices[1]

=> iPhone 8: My iPhone8
api.devices['lLmMnNoOpPqQrRsStTuUvV']

=> iPhone 8: My iPhone8

iCloudに登録されている最初のデバイスを取得

api.iphone

=> iPad Pro: iPad Pro 12.9

デバイスのロケーションを取得

api.iphone.location()

=> {'isOld': False, 'isInaccurate': False, 'altitude': 0.0, 'positionType': 'Cell', 'latitude': 35.6809591, 'floorLevel': 0, 'horizontalAccuracy': 65.0, 'locationType': '', 'timeStamp': 1612427791108, 'locationFinished': False, 'verticalAccuracy': 0.0, 'longitude': 139.7673068}
api.iphone.location()['latitude']

=> 35.6809591
api.iphone.location()['longitude']

=> 139.7673068

デバイスでサウンドを鳴らす(結構大きな音が鳴るので注意)

api.iphone.play_sound()

※通知音をオフにしていても音が鳴ります!

まとめ

PythonでiCloudの情報にアクセスしてみました。pyicloudのv0.10.1未満では2ファクタ認証のセッションが 4時間しか持続しなかった ようですが、2021/2/1にリリースされたv0.10.1からセッションが長期間維持できるようになったそうなので活用の場が広がりそうです。忘れた頃にセッションが切れそうなので、切れた際にはSlackに通知するなどしておきたいところです。
ファミリー共有されているデバイスの情報も取得できるので、子供がiPhoneを持つようになったら活用してみたいですね。
続編はいつになるかわかりませんが、Google HomeからiPhoneを鳴らせるようにしてみたいと思います。

Discussion

ログインするとコメントできます