【Python3】「pyicloud」を使ってiPhoneやMacの位置情報を取得してみた!

目次

参考サイト

KYLA株式会社-技術ブログ
pyicloudによる友達の位置情報の取得①-権限取得編 iCloudの位置情報を取得するpythonライブラリ「pyicloud」による位置情報の取得について説明します。 今回はiCloudの情報へアクセスできるまでの手順を紹介していきたいと...

https://qiita.com/azipinsyan/items/1f70bc66c2ff23a0a411

iphoneを使って自分のGPS記録を取得する(アプリ未使用) – Qiita

ライブラリのインストール

まずは「pyicloud」を使うためにインストール

pip3 install pyicloud

pyicloudを使って接続テスト

早速、インストールした「pyicolud」を使って接続テストを行います。
「check_gps_device.py」を作成して、「アカウントID」と「パスワード」をご自身のものを入力してください。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pyicloud import PyiCloudService

#以下は接続するicloudのアカウントとパスワードを記載します。
api = PyiCloudService('xxxxxx@xxxx.com', 'xxxxxxxx')

def get_oauth():
    auth = api.devices
    return auth

if __name__ == '__main__':
    auth=get_oauth()
    print('\n')
    print(auth)

これを実行させます。

python3 check_gps_device.py

アカウントとパスワードが正しいと、手持ちのiPhone・Macにサインインの認証通知が届きます。
「許可する」をクリックし、次の画面はコードが表示されますがスルーして「完了」をクリックしてください。

すると、実行したコマンドラインの画面に、入力したAppleアカウントに紐づくデバイスの情報が表示されます。
(私の場合は、「Mac Mini」と「Macbook Air」「iPhone12 mini」の3台がちゃんと表示されていました。)
この表示がされていれば、正常に完了していることがわかります。

pyicloudで位置情報を取得する

続いてが本番。
デバイスの位置情報を取得します。

先ほどのコードに加えて少し増えています。

ちなみに、「デバイスナンバー」の部分は、基本「0」ですが、デバイスの管理状況と、位置情報を取得したいデバイスに応じて、変更が必要です。筆者の場合は、先ほどテストで表示された順番で、
「0」=「Mac Mini」
「1」=「Macbook Air」
「2」=「iPhone12 mini」
のようになります。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pyicloud import PyiCloudService

#以下は接続するicloudのアカウントとパスワードを記載します。
api = PyiCloudService('xxxxxx@xxxx.com', 'xxxxxxxx')

def get_oauth():
    # デバイスナンバーは、icloudに登録しているデバイスに応じて数が異なる。
    auth = api.devices[0].location()
    return auth

if __name__ == '__main__':
    auth = str(get_oauth())
    eval_auth = eval(auth)
    is0 = auth.find('isOld')
    pst = auth.find('positionType')
    lat = eval_auth['latitude']
    lon = eval_auth['longitude']
    print(lat, lon)

2ファクタ認証を利用している場合は少し変わってきます。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pyicloud import PyiCloudService
import sys


#以下は接続するicloudのアカウントとパスワードを記載します。
api = PyiCloudService('xxxxxx@xxxx.com', 'xxxxxxxx')

#ここから2段認証を実施する。
if api.requires_2fa:
    import click
    print ("Two-factor authentication required. Your trusted devices are:")

    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print ("  %s: %s" % (i, device.get('deviceName',
            "SMS to %s" % 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)

def get_oauth():
    # デバイスナンバーは、icloudに登録しているデバイスに応じて数が異なる。
    auth = api.devices[0].location()
    return auth

if __name__ == '__main__':
    auth = str(get_oauth())
    eval_auth = eval(auth)
    is0 = auth.find('isOld')
    pst = auth.find('positionType')
    lat = eval_auth['latitude']
    lon = eval_auth['longitude']
    print(lat"," lon)

早速、実行してみましょう。
まずはどちらかを実行。

# 通常の認証の場合
python3 get_gps.py

# 2ファクタ認証の場合
python3 get_gps_2Auth.py

通常の認証の方を使用して、正常に動作すれば、
デバイスの所在の「緯度」「軽度」が数字で表示されます。

こんな感じです。白塗りしてます。

「Google Map」などにこの数字を入力して現在地かどうかを確認してみましょう。

#!/bin/sh
ther=$(python /home/pi/get_gps.py)
day=$(date +%Y,%m,%d,%H,%M,%S)
echo "$day,$ther" >> /home/pi/gps.csv

あとは、GPSの位置情報の取得日時を合わせて吐き出すようにしておくと便利そうです。

pythonの知識も全然ない筆者でしたが、結構わかりやすくて勉強になりました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次