Apple iCloudサービス
APIは、AppleのiCloudサービスからのさまざまなデータとファイルの取得をサポートしています。
セッション
APIでiCloudサービスのセッションを設定することは、iCloudアカウントにログインするのと同じくらい簡単です。アカウントが2FAや2SVなどの多要素認証を有効にしている場合、プロセスはセッションの作成で複数回の試行を要求する可能性があります。
2FA / 2SVのないアカウントのセッションを作成する
2FA / 2SVが有効になっていないアカウントのセッションを作成するためのセッションペイロードには、次のパラメーターが含まれています。
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>" } }'
応答
{ "id": "<session ID>", "resource": "session", ... "state": "succeeded", "error": null, ... }
2FAでアカウントのセッションを作成する
2FA対応アカウントのセッションの作成は、2つのステップのプロセスです。
- iCloudアカウントのパスワードだけを使用してセッションを作成してみてください。これにより、アカウントに関連付けられたiOSおよびmacOSデバイスに認証コードを送信する2FAプロセスがトリガーされます。セッションの作成は、
error="code-required"
失敗しerror="code-required"
。 - (1)で受け取ったiCloudアカウントのパスワードと認証コードを使用して、セッションを作成します。コードが受け入れられると、セッションは正常に作成されます。
ステップ1:セッションを作成する
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>" } }'
応答
2FAプロセスが期待どおりにトリガーされた場合、セッションは次のエラーで作成に失敗するはずcode-required
: code-required
。
{ "id": "<session ID>", "resource": "session", ... "state": "failed", "error": "code-required", ... }
ステップ2:コードでセッションを作成する
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
code | ストリング | 認証コード。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>", "code": "<authentication code>" } }'
応答
{ "id": "<session ID>", "resource": "session", ... "state": "succeeded", "error": null, ... }
2SVでアカウントのセッションを作成する
2SV対応アカウントのセッションを作成するプロセスには、3つのステップがあります。
- iCloudアカウントのパスワードを使用してセッションを作成してみてください。 2SVが必要なため、これは
error="choice-required"
およびerror_info={"choices": [<2SV enabled devices>]}
失敗しerror="choice-required"
。 - iCloudアカウントのパスワードと
error_info["choices"]
リストからの選択を使用して、セッションを再度作成してerror_info["choices"]
ください。今回は、試行により、選択したデバイスに認証コードを送信する2SVプロセスがトリガーされます。試行はerror="code-required"
失敗しerror="code-required"
。 - (2)で受け取ったiCloudアカウントのパスワードと認証コードを使用して、セッションを作成します。コードが受け入れられると、セッションは正常に作成されます。
これにより2SVプロセスがトリガーされ、アカウントに関連付けられたiOSおよびmacOSデバイスに認証コードが送信されます。セッションの作成は、 error="code-required"
失敗しerror="code-required"
。
ステップ1:セッションを作成する
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>" } }'
応答
アカウントで2SVが有効になっている場合、セッションの作成はエラーchoice-required
失敗します。
{ "id": "<session ID>", "resource": "session", ... "state": "failed", "error": "choice-required", "error_info": { "choices": [ "********02 - SMS to Phone Number" ] } ... }
ステップ2:選択したセッションを作成する
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
choice | ストリング | 認証コードの送信先として選択されたデバイス。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>", "choice": "********02 - SMS to Phone Number" } }'
応答
2FAプロセスが期待どおりにトリガーされた場合、セッションは次のエラーで作成に失敗するはずcode-required
: code-required
。
{ "id": "<session ID>", "resource": "session", ... "state": "failed", "error": "code-required", ... }
ステップ3:コードでセッションを作成する
名前 | タイプ | 解説 |
---|---|---|
password | ストリング | iCloudアカウントのパスワード。 |
code | ストリング | 認証コード。 |
cURLを使う
curl https://ricloud-api.reincubate.com/sessions \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "source": { "user": "1", "type": "icloud.account", "identifier": "<iCloud account username>" }, "payload": { "password": "<iCloud account password>", "code": "<authentication code>" } }'
応答
{ "id": "<session ID>", "resource": "session", ... "state": "succeeded", "error": null, ... }
ソースタイプ
識別子 | 解説 |
---|---|
icloud.account | プライマリソース iCloudアカウントに対応します。 |
アンケート
iCloudサービスは、すべてのポーリングペイロードスキーマ属性をサポートしています。
ソース情報の取得
このポーリングタイプは、ターゲットソースに関する情報を取得します。結果はJSON形式で公開されています。
cURLを使う
curl https://ricloud-api.reincubate.com/polls \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "session": "<session ID>", "payload": { "info_types": ["*"] } }'
* ricloud-py * を使う
import ricloud # The ID of a session we made earlier. session_id = "<session ID>" poll = ricloud.Poll.create( session=session_id, payload={ "info_types": ["*"] } )
データの取得
このポーリングタイプは、ターゲットセッションからデータを取得して処理します。結果はJSON形式で公開されます。
特定のデータ型の詳細については、利用可能なデータ型のリストをご覧ください。
cURLを使う
curl https://ricloud-api.reincubate.com/polls \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "session": "<session ID>", "payload": { "data_types": ["icpl.photos"] } }'
* ricloud-py * を使う
import ricloud # The ID of a session we made earlier. session_id = "<session ID>" poll_payload = { "data_types": ["icpl.photos"] } poll = ricloud.Poll.create( session=session_id, payload=poll_payload, )
ファイルを取得する
files
pollペイロード属性は、ターゲットソースからのバイナリファイルの取得を要求するために使用されます。
通常、IDは、iCloudフォトライブラリなどの直接ファイル参照を含むデータタイプ、またはメッセージデータタイプなどの添付ファイルを含むデータタイプの以前の投票から取得されます。
cURLを使う
curl https://ricloud-api.reincubate.com/polls \ -X POST \ -H 'Authorization: Token <your key_token>' \ -H 'Content-Type: application/json' \ -d '{ "session": "<session ID>", "payload": { "files": [ "icpl://ATnrIxddlwbCEjN33NBq8zXQwYgE", "icpl://AbfMRXQ55H4WfS5YguuUWxir4hq6" ] } }'
* ricloud-py * を使う
import ricloud # The ID of a session we made earlier. session_id = "<session ID>" poll_payload = { 'files': [ 'icpl://ATnrIxddlwbCEjN33NBq8zXQwYgE', 'icpl://AbfMRXQ55H4WfS5YguuUWxir4hq6', ] } poll = ricloud.Poll.create( session=session_id, payload=poll_payload, )
データ型
iCloudデータ型
識別子 | 説明 |
---|---|
icpl.photos | iCloudフォトライブラリアセットを取得します。 |
mme_contacts.contacts | iCloudに保存されたiOS連絡先データを取得します。 |
mme_calendar.events | iCloudに保存されたiOSカレンダーデータを取得します。 |
mme_notes.notes | iCloudに保存されているiOS Notesデータを取得します。 |
callkit.calls | CallKit同期iOS Phoneデータを取得します。 |
cloudkit_safari.history | iCloudに保存されているSafariブラウザーの履歴データを取得します。 |
fmip.devices | Find My iPhoneデバイスと位置データを取得します。 |
iCloudフォトライブラリ
写真、ビデオ、その他のメディア
iCloudフォトライブラリ(ICPL)に保存されている写真、ビデオ、その他のメディアに関する情報を取得します。
このモジュールでは、ユーザーのiCloudアカウントでiCloudフォトライブラリが有効になっている必要があります。
データ型ID | icpl.photos |
関連する設定 | Settings > [username] > iCloud > Photos > iCloud Photo Library |
データ属性
名 | タイプ | 説明 |
---|---|---|
id | ストリング | データ項目の識別子。複数のポーリングにわたるデータの重複排除に役立ちます。 |
filename | ストリング | ICPLに保管されているファイルの名前。 |
files | image 、 video 、 audio アイテムのリスト | このICPLアセットに関連付けられているファイル。元のファイル、Live Photos、サムネイルがこのリストに含まれます。 |
date_created | 日付時刻 | ファイルが最初に作成されたとき。 iOSデバイスで撮影された写真またはビデオの場合、これはそれらが撮影された日付になります。 ICPLにインポートされた既存のアセットの場合、これは元のインポート日になります。 |
date_uploaded | 日付時刻 | ファイルが最後にICPLにアップロードされた日時。これは、ファイルがricloud APIを介して最初に取得できた時期に対応します。 |
local_date_created |
optional datetime | When the asset was originally created, in local time. This attribute is only populated if sufficient metadata is stored with the asset in ICPL, and is currently supported for parsing by the API. The value of this attribute can vary by a few seconds from that of date_created , as the two are determined from different sources. |
データフィルター
名前 | タイプ | 解説 |
---|---|---|
since | 日付時刻 | 指定された値より後のdate_uploaded 持つアイテムのみが含まれます。 |
until | 日付時刻 | 提供された値より前のdate_uploaded 持つアイテムのみが含まれます。 |
サンプルデータ
[ { "id": "7f1384f5038255f5", "data_type": "icpl.asset", "filename": "IMG_0002.HEIC", "files": [ { "id": "icpl://AWo/lDeN8fEExAUJajRHzVx2j605", "data_type": "image", "extension": "heic", "size": 905818, "width": 4032, "height": 3024 }, { "id": "icpl://ASDPdJ/LvFWjsBy4YOOp7B5c+XOi", "data_type": "video", "extension": "mov", "size": 2456163, "width": 980, "height": 1308 }, { "id": "icpl://ASAwWOvwrvAUuO71uXcU6mm+nMU4", "data_type": "image", "extension": "jpg", "size": 595624, "width": 1536, "height": 2048 }, { "id": "icpl://ATy/qmemCas1jzYWuhR4mQywhpzz", "data_type": "image", "extension": "jpg", "size": 65407, "width": 360, "height": 480 } ], "date_created": "2020-09-18T12:32:17Z", "date_uploaded": "2020-09-18T12:41:19Z", "local_date_created": "2020-09-18T13:32:17+01:00" } ]
MobileMe連絡先
連絡先
iCloudに保存されているiOSの連絡先データを取得します。
データ型ID | mme_contacts.contacts |
関連する設定 | Settings > [username] > iCloud > Contacts |
データ属性
mme_contacts.contact
データ型は、基本のcontact
データ型からほとんどの属性を継承します。以下の表に、追加または異なる属性の概要を示します。
名 | タイプ | 説明 |
---|---|---|
id | ストリング | データ項目の識別子。複数のポーリングにわたるデータの重複排除に役立ちます。 |
data_type | 文字列、常にmme_contacts.contact | アイテムのデータ型。 |
uid | ストリング | iOS連絡先データのさまざまなソース間で重複排除に使用できる一意の識別子。 |
image | ネストされたimage アイテム、オプション | 連絡先のプロフィール画像。 |
サンプルデータ
[ { "id": "2cf6a837304d6614", "data_type": "mme_contacts.contact", "uid": "NzNlNjkxYjctOTBmYi00MTYxLWI5YzYtZTk0ZDlhZjljMmE5", "first_name": "John", "middle_name": "'Gala'", "last_name": "Appleseed", "prefix": "Mr.", "suffix": "Jr.", "nickname": "John'o", "records": [ { "type": "Phone", "name": "MAIN", "value": "1-800-MY-APPLE" }, { "type": "Phone", "name": "UK", "value": "0800 039 1010" }, { "type": "URL", "name": "HOMEPAGE", "value": "http://www.apple.com" }, { "type": "URL", "name": "HOMEPAGE", "value": "http://www.apple.com/uk/" }, { "City": "Cupertino", "State": "CA", "ZIP": "95014", "name": "WORK", "CountryCode": "US", "Country": "United States", "Street": "1 Infinite Loop", "type": "Address", "SubLocality": null, "Municipality": null } ], "organisation": "Apple Inc.", "department": "Marketing", "jobtitle": "VP Coring", "birthday": "1976-04-01", "image": { "id": "mme_contact_image://2cf6a837304d6614", "data_type": "image", "extension": "jpg" } } ]
MobileMeカレンダーイベントmme_calendar.events
iCloudに保存されているiOSカレンダーデータを取得します。
MobileMeノートノートmme_notes.notes
iCloudに保存されているiOS Notesデータを取得します。
CallKit
callkit.calls
からの呼び出し callkit.calls
CallKitサービスと同期した通話記録を取得します。
エラー
callkit-uninitialised
このアカウントに対してCallKitサービスがセットアップされていないことを示します。 iCloudアカウントの所有者は、次の手順でiCloudアカウントに関連付けられたiOSデバイスを使用してこのエラーを解決できます。-デバイスがWi-Fiに接続されていることを確認します。 - Settings > [username] > iCloud
ます。 -iCloudドライブをオフにし、変更が有効になるまで30〜60秒待ちます。 -前の変更が完了したら、iCloudドライブをオンにします。これにより初期化がトリガーされます。
このプロセスを実行してもエラーが解決しない場合は、サポートに連絡してください。
callkit-sync-disabled
この場合、CallKitサービスは初期化されましたが、デバイスが通話履歴をiCloudに同期し始めるために必要な条件が満たされていません。 APIはiCloudを介してリモートでこれを解決しますが、iCloudアカウントに関連付けられているデバイスはこれがキャッシュされているため同期状態を再評価できない可能性があります。
iCloudアカウントの所有者は、次の手順でデバイスをトリガーして、通話履歴の同期条件を再確認できます。
-
Settings > [username] > iCloud
ます。 - iCloud Driveをオフにして、変更が有効になるまで30〜60秒待ちます。
- 前の変更が完了したら、iCloudドライブをオンにします。これにより初期化がトリガーされます。
トラブルシューティング
- 最近の通話履歴は、投票結果に返されません。
これは通常、デバイスが最新の通話履歴レコードをiCloudと同期していないことが原因です。 CallKitサービスは内部iOSサービスであり、設定でオンまたはオフにしたり、手動で同期させることはできません。これにより、デバイスがiCloudと同期しているかどうかがわからなくなるため、失われたデータをデバッグすることが難しくなります。
この問題は、同期するデータがそれほど多くないアカウント(3回以内の呼び出し)でよく見られますが、これはアカウントのテストでよく見られることです。
推奨事項:
- デバイスに同期する通話履歴レコードが少数あることを確認してください。私たちのテストでは、通話履歴レコードが数個しかないデバイスはiCloud同期プロセスをトリガーしないことが示されています。
- デバイスが定期的な同期を実行するのを待ちます。これには、デバイスの使用方法、接続状態、充電状態に応じて、最大12時間かかります。
デバイスを電源に接続します。この状態の場合、デバイスは同期をトリガーする可能性が高くなります。
ポーリング結果で古い通話履歴が返されません。
CallKitサービスは、デバイス間で通話履歴レコードを同期するためのものであり、これらのレコードを無期限に保存するためのものではありません。通常、通話履歴レコードは約3ヶ月間CallKitから取得できますが、これはiCloudの内部クリーンアッププロセスによってアカウント間で異なる場合があります。
CloudKit
iCloudからのブラウザ履歴 cloudkit_safari.history
iCloud同期サービスに保存されているSafariブラウザの履歴データを取得します。
Find MyおよびFind My iPhone
デバイスの場所
デバイスの検索と位置データを取得します。
このデータ型では、完全なデータを返すために、2番目のポーリングが最初のポーリングの10秒後から10〜30秒後に複数のポーリングを必要とする場合があることに注意してください。これはFind Myの動作によるものです。最初のポーリングはFind Myをトリガーして、到達可能なデバイスから新しいデータを要求しますが、そのデータはさらに10〜30秒間利用できません。
データ型ID | fmip.devices |
関連する設定 | Settings > [username] > Find My |
データ属性
名 | タイプ | 説明 |
---|---|---|
id | ストリング | データ項目の識別子。複数のポーリングにわたるデータの重複排除に役立ちます。 |
data_type | 文字列、常にfmip.devices | アイテムのデータ型。 |
name | ストリング | デバイスのユーザーセット名。 |
model_name | ストリング | Appleのデバイスモデルのマーケティング名。 |
model_identifier | ストリング | Appleのデバイスモデルの識別子。 |
product_type | ストリング | デバイスの製品カテゴリ。 |
location | オプションのネストされたlocation | デバイスの最後に報告された場所(利用可能な場合)。 |
battery_status | ストリング | デバイスの現在のバッテリー状態。 |
battery_level | 浮く | わかっている場合は、バッテリー残量のパーセンテージ。 |
サンプルデータ
[ { "id": "e7694d7a0d2ab6cf", "data_type": "fmip.device", "name": "John's iMac", "model_name": "iMac with Retina 5K display", "model_identifier": "iMac15,1", "product_type": "iMac", "location": null, "battery_status": "Unknown", "battery_level": 0.0 }, { "id": "4d86a6181808d152", "data_type": "fmip.device", "name": "John's iPhone 11", "model_name": "iPhone 11", "model_identifier": "iPhone6,2", "product_type": "iPhone", "location": { "data_type": "location", "latitude": 51.507452392689146, "longitude": -0.07398372304584414, "altitude": 0.0, "horizontal_accuracy": 65.0, "vertical_accuracy": 0.0, "positioning_type": "Wifi", "date_created": "2020-01-01T00:00:00.000000Z" }, "battery_status": "Unknown", "battery_level": 0.0 } ]
ファイルタイプ
識別子 | 解説 |
---|---|
icpl | iCloudフォトライブラリのファイル。 |
mme_contact_image | mme_contacts.contacts 連絡先のプロフィール画像。 |