API iCloud (v1)

обновленный

Эта документация охватывает использование устаревшего API-интерфейса iCloud от Reincubate.

обзор

API - и, в частности, каналы - предоставляют ряд существенных преимуществ:

  • Простота интеграции . С API легко работать командам разработчиков любого уровня, и они избавляют клиентов от необходимости иметь высокоспециализированные знания о хранилище iCloud / CloudKit или о любых сторонних приложениях.

    Это преимущество нелегко переоценить: сложность разработки и поддержки интерфейса к iCloud является существенной, и к тому же необходимо поддерживать несколько форматов данных для основных данных iOS и файлов приложений. IOS не только использует разные форматы данных, но и каждое приложение (например, WhatsApp) использует набор форматов и структур данных, которые могут обновляться еженедельно при обновлении приложений.

    API поддерживает все «сложные» функции: iOS 9, iOS 10, CloudKit, объединение iCloud 8 + 9, 2SV / 2FA, частичные снимки, токенизация, A9 и A9X.

  • Будущее . Reincubate стремится поддерживать поддержку современных и прошлых форматов данных iCloud и iOS и имеет солидный послужной список в этой области:

    • 1-й по поддержке доступа к данным iOS (2008)
    • 1-й по поддержке зашифрованного доступа к данным iOS (2009)
    • 1-й по поддержке извлечения данных iCloud (2011)
    • 1-й и только с API для поддержки доступа к данным iCloud / CloudKit iOS 9 (2015)
  • Поддержка и доступ к непревзойденному опыту . Вследствие того, что компания сосредоточена и позиционируется как компания , занимающаяся данными приложений , команда Reincubate обладает непревзойденным опытом и знаниями в этой области. Этот опыт особенно полезен для клиентов, исследующих новые приложения и варианты использования.

    Пользователи каналов JSON могут использовать преимущества запатентованных технологий Reincubate для извлечения и восстановления данных приложений, благодаря чему получаемые данные будут более точными.

  • Поддержка приложений из коробки . Помимо основных типов данных iOS - все из которых поддерживаются во всех версиях iOS на всех устройствах - в API есть модули для поддержки десятков сторонних приложений. Некоторые из наиболее популярных поддерживаемых приложений включают WhatsApp, Viber, Kik, WeChat, Line, Snapchat, Facebook Messenger и Skype.

  • Встроенная поддержка платформы для разработчиков . API имеет клиентские реализации с открытым исходным кодом, доступные на нескольких языках, включая Python , .NET / C# и JavaScript .

  • Скорость и масштабируемость . Платформа Reincubate iCloud API создана для масштабирования, а система подачи JSON быстрее и масштабируется лучше, чем доступ к необработанным файлам.

  • Богатые настройки фида . Платформа каналов легко настраивается для партнерских развертываний. Примеры включают protobuf формата protobuf и агрегирование вложений приложения обмена сообщениями

  • Доверие Reincubate пользуются доверием со стороны безопасности, LEA и правительственных пользователей по всему миру. Компания подчиняется строгому британскому законодательству о защите данных и соответствует правилам Safe Harbor ЕС и США.

Начиная

Заинтересованные стороны могут связаться с командой предприятия для получения доступа к ключу API. Однако тестовый ключ предоставляется во всех примерах реализации клиента.

Установка примера клиента Python

Библиотека Python iCloud может быть установлена с помощью одной команды. Чтобы получить устаревшую библиотеку, должна быть установлена последняя версия 1.* .

$ pip install ricloud==1.*

Исходный код этого клиента можно найти на GitHub в разделе ricloud-py .

Установка примера клиента JavaScript

Библиотека JavaScript iCloud может быть установлена с помощью одной команды. Чтобы получить устаревшую библиотеку, должна быть установлена последняя версия 1.* .

$ npm install ricloud==1.*

Исходный код этого клиента можно найти на GitHub в разделе ricloud-js .

Установка примера клиента .NET / C #

Библиотека C # iCloud может быть установлена с помощью одной команды. Чтобы получить устаревшую библиотеку, должна быть установлена последняя версия 1.* .

$ nuget install ricloud==1.*

Исходный код этого клиента можно найти на GitHub в разделе ricloud-csharp .

конфигурация

Каждая клиентская реализация поставляется со своим собственным набором документации и примером сценария, который показывает, как его можно использовать. Конфигурация обычно ограничивается указанием user и значения key для аутентификации по API.

Работа с API

Пользователю может потребоваться выполнить три основных операции с API.

  • Аутентификация и перечисление: sign-in , perform-2fa-challenge , submit-2fa-challenge
  • Доступ к данным фида: download-data
  • Доступ к необработанному файлу: download-file

Примеры в этом разделе приведены в формате curl .

Во всех запросах к API необходимо curl следовать перенаправлениям с параметром -L . --user "USER:KEY" данные API пользователя также должны быть установлены с --user "USER:KEY" , как и заголовок пользовательской версии API, --header "Accept: application/vnd.icloud-api.v1" . Поэтому все вызовы curl в этих примерах должны начинаться с:

curl -L
     -v
     -X POST
     --user "USER:KEY"
     --header "Accept: application/vnd.icloud-api.v1"

Обратите внимание, что также указана опция -X POST , так как все запросы выполняются через POST . Поскольку этот вызов не изменится, он упоминается ниже как CURL_CALL .

Как правило, все запросы (кроме ошибок) возвращают поле session_key которое идентифицирует текущий сеанс. Если он не отправлен, следует использовать запрос на sign-in для создания нового сеанса. Значения session_key должны использоваться последовательно.

1. Аутентификация, 2FA / 2SV и поиск устройства и списка данных

Чтобы войти в систему как пользователь с двухфакторной аутентификацией или двухэтапной аутентификацией, включенной в его учетной записи, необходимо использовать метод sign-in .

CURL_CALL --data-urlencode "email=ICLOUD_EMAIL"
          --data-urlencode "password=ICLOUD_PASSWORD"
          https://api.icloudextractor.com/c/sign-in/

email и password учетной записи iCloud для доступа передаются в качестве параметров, используя --data-urlencode чтобы гарантировать, что управляющие символы, такие как @ , экранированы.

Вход с использованием недопустимой пары ключей API

Если пользователь делает запрос API с недопустимой парой ключей, он не вернет никаких данных, кроме 403 .

HTTP/1.1 403 FORBIDDEN

Вход в учетную запись, в которой конечный пользователь не принял Условия использования iCloud.

Если пользователь пытается войти в учетную запись iCloud, для которой не был принят обновленный набор условий и положений iCloud.

HTTP/1.1 400 BAD REQUEST
{
 "error": "terms-of-service-update",
 "message": "User hasn't agreed to Apple's Terms of Service."
}

Вход с неверными учетными данными iCloud

Если пользователь пытается войти с неверными учетными данными iCloud, будет возвращено 403 вместе с сообщением об ошибке.

HTTP/1.1 403 FORBIDDEN
{"message": "Unsuccessful login attempt: renate@reincubate.com",
 "error": "unable-to-login"}

Вход в учетную запись, которую конечный пользователь не подтвердил

Если пользователь пытается войти в учетную запись iCloud, для которой основной адрес электронной почты не был проверен пользователем.

HTTP/1.1 400 BAD REQUEST
{
 "error": "unverified-account",
 "message": "User's primary email hasn't been verified."
}

Вход без 2FA / 2SV

Вход в учетную запись не-2FA может быть выполнен с помощью одного запроса.

HTTP/1.1 200 OK
{"devices":
 {"7c7fba66680ef796b916b067077cc246adacf01d": {
    "ios_version":   "9.0.1",
    "colour":        "#e4e7e8",
    "device_name":   "Renate's iPhone",
    "latest-backup": "2015-11-17 16:46:39.000000",
    "model":         "N71mAP",
    "serial":        "D56DF63DYTBG",
    "name":          "iPhone 6s"},
 "8e281be6657d4523710d96341b6f86ba89b56df7": {
    "ios_version":   "9.1",
    "colour":        "#e1e4e3",
    "device_name":    "Renate's iPad",
    "latest-backup": "2015-11-13 19:35:52.000000",
    "model":         "J98aAP",
    "serial":        "E32VR64AFXVF",
    "name":          "iPad Pro"},
 },
 "key": "b3d11d6c-52c0-4754-a971-8f305047a0f6",
 "auth_token": "N28GZaKvTXAGrhBIx3UgRGml47oPVCCq4tqM5huyCKo2r7h2HfMtyBsZVc3SS2sh5h3I"}
}

Вход с помощью 2SV / 2FA

Если учетная запись была защищена с помощью двухфакторной аутентификации, запрос на sign-in вернет сообщение об ошибке, в котором будет указано, что для two-factor authentication is enabled on this account , session_key и, в случае 2SV, также список trustedDevices .

  • 2SV
HTTP/1.1 409 CONFLICT
{"message": "This account has Two Step Verification enabled, please select a device to challenge.",
 "data": {
  "trustedDevices": ["********12", "Renate's iPhone - iPhone 6s"],
  "key": "b3d11d6c-52c0-4726-a971-8f305047a0f6"
 },
 "error": "2fa-required"
}

Для 2SV следующим шагом является выдача кода вызова trustedDevices одному из trustedDevices . Для этого делается запрос на perform-2fa-challenge .

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode "challenge=DEVICE_TO_CHALLENGE"
          https://api.icloudextractor.com/c/perform-2fa-challenge/

Параметры, посылаемые являются challenge , который должен содержать по пунктам , перечисленным в trustedDevices , и session_key , которые будут так же , как sign-in запросе вернулся.

  • 2fa

В случае 2FA разница состоит в том, что запрос вернет пустой список trustedDevices .

HTTP/1.1 409 CONFLICT
{"message": "This account has Two Factor authentication enabled, all devices will be challenged.",
 "data": {
  "trustedDevices": ["Challenge all 2FA devices"],
  "key": "b3d11d6c-52c0-4726-a971-8f305047a0f6"
 },
 "error": "2fa-required"
}

Что касается 2FA, мы не можем выбирать, какое устройство будет протестировано, поскольку каждое доверенное устройство будет автоматически подвергаться сомнению. Для этого делается запрос на perform-2fa-challenge без аргумента вызова.

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode
          https://api.icloudextractor.com/c/perform-2fa-challenge/

Следовательно, для 2FA отправляются только параметры session_key , которые будут такими же, как и возвращенный запрос на sign-in .

Борьба с плохим устройством (2FA / 2SV)

Если пользователь делает запрос API с недопустимым device , он не вернет данные, превышающие 500 .

HTTP/1.1 500 INTERNAL SERVER ERROR

Борьба с плохим ключом (2FA / 2SV)

Если пользователь делает запрос API с неверным key , он возвращает 403 с сообщением проверки.

HTTP/1.1 400 BAD REQUEST
{"message": "Your iCloud session has expired. To continue, please sign in again.",
 "error": "key-invalid"}

Соревнование успешно (2FA / 2SV)

HTTP/1.1 200 OK
{"message": "Challenge has been submitted."}

Как только запрос отправлен на устройство пользователя, отправленные данные должны быть переданы обратно в API с помощью submit-2fa-challenge .

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode "code=2FA_CODE"
          https://api.icloudextractor.com/c/submit-2fa-challenge/

Отправка неверного ответа на вызов (2FA / 2SV)

HTTP/1.1 403 FORBIDDEN
{"message": "Incorrect code supplied for Two Factor Authentication.",
 "error": "invalid-2fa-code"}

Отправка правильного ответа на вызов (2FA / 2SV)

HTTP/1.1 200 OK
{"message": "Challenge has been submitted."}

С этим запросом пользователь будет полностью аутентифицирован и сеанс API будет активным.

Чтобы завершить процесс входа в систему и получить список устройств, отправьте окончательный запрос на sign-in используя тот же email и password что и в первом запросе, и тот же key использовался в процессе аутентификации 2FA / 2SV.

Обратите внимание, что ответ будет содержать auth_token запись auth_token если в вашем ключе API включен токенизация. В этом случае мы рекомендуем вам отправить окончательный запрос на refresh-session как описано в Разделе 4 ниже, вместо того, чтобы отправлять его для sign-in . Использование auth_token является более надежным, поскольку он является индикатором уже установленного сеанса в системах Apple.

В новом бэкэнд-адаптере API вы должны увидеть другой ответ. Это связано с оптимизацией процесса 2FA / 2SV.

HTTP/1.1 200 OK
{"key": "b3d11d6c-52c0-4726-a971-8f305047a0f6",
"message": "Log-in successful",
"auth_token": "N28GZaKvTXAGrhBIx3UgRGml47oPVCCq4tqM5huyCKo2r7h2HfMtyBsZVc3SS2sh5h3I"
}

2. Извлечение данных фида: данные download-data

Метод download-data используется для доступа к данным канала.

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode "device=DEVICE_ID"
          --data-urlencode "mask=DATA_MASK"
          --data-urlencode "since=MIN_DATE"
          https://api.icloudextractor.com/c/download-data/

Параметры , необходимые для этого запроса в настоящее время являются session_key , то device_id одного из устройств от ответа входа и data_mask , который является OR сочетанием всех модулей подачи флагов пользователя заинтересован. Вы также можете указать since дата начала поиска данных.

Предполагая, что ключ API клиента действителен для всех этих модулей, метод вернет запрошенные данные в формате JSON.

Отправка действительного запроса фида

Если значения, переданные методу, являются действительными, он вернет содержимое канала в теле ответа HTTP.

HTTP/1.1 200 OK

Отправка запроса фида с отсутствующими параметрами

Если один из обязательных параметров отсутствует, метод возвращает неверный код ответа на запрос.

HTTP/1.1 400 BAD REQUEST
{"message": "mask missing from post.",
 "error": "invalid-request"
}

Отправка запроса фида с неверными параметрами

Если для какого-либо параметра отправлено неверное или неверно отформатированное значение, метод вернет неверный код ответа на запрос.

HTTP/1.1 400 BAD REQUEST
{"message": "Invalid since.",
 "error": "invalid-parameter"
}

Флаги модуля примера подачи

Следующие флаги модуля могут быть замаскированы вместе для параметра mask метода download-data . Это не исчерпывающий список.

  • 0000000000001 Сообщения
  • 0000000000002 Фото и видео
  • 0000000000004 История браузера
  • 0000000000008 История звонков
  • 0000000000016 Контакты
  • 0000000000032 Установленные приложения
  • 0000000000256 Местоположение (в прямом эфире)
  • 0000000000512 WhatsApp сообщения
  • 0000000001024 Skype сообщения
  • 0000000002048 Календарь
  • 0000000004096 Строка сообщений
  • 0000000008192 Кик сообщения
  • 0000000016384 Viber сообщения
  • 0000000032768 Facebook сообщения
  • 0000000065536 WeChat сообщения
  • 0000000131072 Snapchat сообщения
  • 0000000262144 Список файлов
  • 0000000524288 История браузера (вживую)
  • 0000001048576 WhatsApp история звонков
  • 0000002097152 История 0000002097152 Viber
  • 0000004194304 Использование приложения
  • 0000008388608 Примечания
  • 0000033554432 HealthKit
  • 0000067108864 HealthKit только для шагов
  • 0000134217728 Печенье Safari
  • 0000268435456 Кик контакты
  • 0000536870912 Viber контакты
  • 0001073741824 Viber разговоры
  • 0002147483648 История звонков (вживую)
  • 0004294967296 Расположение
  • 0008589934592 Поход сообщения
  • 0017179869184 Snapchat истории
  • 0034359738368 почта
  • 0068719476736 Записи
  • 0137438953472 Видео
  • 0274877906944 Фото и видео (в прямом эфире)
  • 0549755813888 сообщений
  • 1099511627776 Связанные часы Apple
  • 2199023255552 сообщения
  • 4398046511104 Контакты (вживую)
  • 8796093022208 Информация о счете

Например, для запроса потока сообщений, истории звонков и истории браузера маска будет 1 + 4 + 8 = 13 .

Форматы JSON

Каналы JSON разработаны так, чтобы их было максимально просто проанализировать. Фид вернет все типы данных, запрошенные в одном ответе.

Каждый модуль канала, указанный в флаге модуля, будет иметь свой собственный ключ в словаре JSON верхнего уровня, который возвращается.

{
    "first_module_name": "Module's data",
    "second_module_name": "Module's data",
    "etc.": "etc."
}

3. Извлечение сырых файлов: download-file

Метод download-file доступен для загрузки вложений сообщений или прямой загрузки более эзотерических файлов из iCloud.

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode "device=DEVICE_ID"
          --data-urlencode "file=FILE_ID"
          https://api.icloudextractor.com/c/download-file/
          -o PATH_TO_SAVE_FILE

Необходимыми параметрами являются session_key , target device_id и file_id . Запрос выше загрузит файл и сохранит его в пути, указанном для curl с опцией -o .

file_ids are either stored files in iCloud, or identifiers for hosted files on the internet. In the former case, file_ids are built from SHA-1 hashes of a file's AppDomain and filename. In the latter case we may process and decrypt the file before returning it.

file_ids may be previously known for static files, or can be obtained from message feeds, where they are used as identifiers by attachments.

Отправка действительного запроса файла

Если значения, переданные методу, являются действительными, он вернет содержимое двоичного файла в теле ответа HTTP.

HTTP/1.1 200 OK

Отправка запроса на файл для несуществующего файла

Если файл отсутствует в iCloud или мы не можем получить его от соответствующего стороннего производителя, метод все равно будет успешно возвращен, однако тело сообщения будет пустым.

HTTP/1.1 200 OK

Отправка запроса файла после истечения сеанса

Если сеанс истек, клиенты получат неверный код ответа на запрос.

HTTP/1.1 400 BAD REQUEST
{"message": "Your iCloud session has expired. To continue, please sign in again.",
 "error": "key-invalid"}

Образец file_id s

Общие хэш-ключи, связанные с приложениями для прямого доступа к файлам, включают следующее.

  • 3d0d7e5fb2ce288813306e4d4636395e047a3d28 SMS
  • 1b6b187a1b60b9ae8b720c79e2c67f472bab09c0 WhatsApp
  • 1c6a49018bcace96656e4fe8f08d572ce071b92c WhatsApp
  • 7c7fba66680ef796b916b067077cc246adacf01d WhatsApp
  • b39bac0d347adfaf172527f97c3a5fa3df726a3a Viber
  • 8e281be6657d4523710d96341b6f86ba89b56df7 Kik
  • ff1324e6b949111b2fb449ecddb50c89c3699a78 Calls
  • a49bfab36504be1bf563c1d1813b05efd6076717 Звонки
  • 2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca Calls
  • 5a4935c78a5255723f707230a451d79c540d2741 Звонки
  • 12b144c0bd44f2b3dffd9186d3f9c05b917cee25 Фотографии
  • adb8c77534444e97c31ff15924d50f3ed1fbd3b1 Контакты
  • 2041457d5fe04d39d0ab481178355df6781e6858 Назначения
  • 3ecf3efff3a55d6155efce2828579e8a3cd881c1 История просмотров
  • cd89f9e10d3497912bfc92e5dc674ca989cfdd44 История просмотров
  • 2d711a1f5613f5259730b98328a3f7e816698f88 Line

Некоторые приложения для обмена сообщениями, такие как Skype, Facebook Messenger и WeChat, изменяют значение file_id зависимости от разговора.

4. Обновление учетной записи с использованием токенов аутентификации.

auth_token - это токен для входа в Apple. Он длится не менее одного дня и обновляется, когда делается запрос к конечной точке refresh-session в API. Ежедневный опрос конечной точки refresh-session это все, что необходимо для сохранения этого маркера.

Поскольку конечной точке refresh-session требуется только вход auth_token и она возвращает список устройств и новый ключ сеанса, ее можно использовать для запуска нового сеанса в API без необходимости повторного входа в учетную запись. Это особенно полезно для учетных записей с поддержкой 2FA / 2SV, поскольку процесс аутентификации должен быть завершен только для первоначального запроса на sign-in .

Чтобы использовать его, необходимо использовать поле auth_token полученное при входе в систему. Это должно быть отправлено конечной точке refresh-session .

Параметр auth_token возвращается из начального запроса на sign-in и должен использоваться для конечной точки refresh-session .

Мы рекомендуем также включить в запрос необязательный параметр account , так как это помогает нам отслеживать запрос через всю нашу систему. Значение этого параметра - просто имя пользователя учетной записи iCloud.

CURL_CALL --data-urlencode "auth_token=AUTHENTICATION_TOKEN"
          --data-urlencode "account=ICLOUD_EMAIL"
          https://api.icloudextractor.com/c/refresh-session/

Отправка неверного токена аутентификации

Если токен недействителен, конечная точка вернет неверный код запроса.

HTTP/1.1 400 BAD REQUEST
{"message": "Invalid auth_token.",
 "error": "invalid-parameter"}

Отправка действительного токена аутентификации

Ответ будет аналогичен конечной точке входа в систему: вновь созданный ключ сеанса и обновленный список устройств со всеми метаданными, необходимыми для идентификации каждого. Можно использовать новый сеанс для продолжения извлечения данных.

HTTP/1.1 200 OK

5. Удаление файлов библиотеки фотографий iCloud: delete-file

Метод delete-file доступен для удаления фотографий из библиотеки фотографий iCloud. Он принимает file , key и флаг permament качестве параметров.

CURL_CALL --data-urlencode "key=SESSION_KEY"
          --data-urlencode "file=FILE_ID"
          --data-urlencode "permanent=False"
          https://api.icloudextractor.com/c/delete-file/

Параметр file будет содержать идентификатор фотографии (которую можно получить через web_photos ) и permanent флаг, который будет контролировать, будет ли файл мягко или жестко удален. Если установлено значение False , запрос приведет к перемещению файла в альбом недавно удаленных фотографий (известный как мягкое удаление). С другой стороны, если для этого параметра установлено значение True , запрос удалит файл из альбома «Недавно удаленные» и приведет к его окончательному удалению (так называемое «жесткое удаление»).

Успешное мягкое удаление

Если мягкое удаление было успешно выполнено, фотография будет перемещена в альбом «Недавно удаленные», и появится сообщение об успешном завершении.

HTTP/1.1 200 OK
{
  "message": "Success: File number: FILE_ID has been recycled."
}

Успешное жесткое удаление

Если полное удаление прошло успешно, фотография будет удалена со связанных устройств при следующей синхронизации этих устройств с iCloud. Тем не менее, благодаря используемой методике, жестко удаленные файлы будут по-прежнему обнаруживаться и загружаться из iCloud Photo API от Reincubate в течение неопределенного периода времени. Такое поведение можно использовать для удаления не перечисленных файлов.

Обратите внимание, что для того, чтобы файл был жестко удален, он должен быть сначала удален без проблем.

HTTP/1.1 200 OK
{
  "message": "Success: File number: FILE_ID has been deleted permanently."
}

Ошибка мягкого или жесткого удаления

Если запрос не выполнен, он вернет ответ об ошибке.

HTTP/1.1 400 BAD REQUEST
{
  "message": "Failure: File number: FILE_ID was not deleted."
}

Ускорение загрузки с помощью собственного SDK

Для высокопараллельных загрузок файлов мы предлагаем C ++ SDK, который позволяет клиентам загружать и дешифровать файлы локально, избегая издержек (но теряя удобство) конечной точки download-file . Этот SDK доступен для Linux (Ubuntu 12.04, Ubuntu 14.04, Debian Jessie) и Windows.

Он интегрирован с остальной частью рабочего процесса API.

Загрузки

Пользователи могут загрузить текущую библиотеку и вызвать DownloadFiles , точку входа SDK, которая имеет следующую подпись:

int DownloadFiles(const wchar_t* clientID, const wchar_t* clientKey, const wchar_t* sessionKey,
                  const wchar_t* deviceID, const wchar_t** fileIDs, size_t fileIDs_count,
                  const wchar_t* targetDir, ProgressFunction progFunc, void* progParam,
                  GetWStringBuffer getErrorBuffer)

С этими внешними определениями обратного вызова:

typedef wchar_t* (*GetWStringBuffer)(size_t size);
typedef bool(*ProgressFunction)(double percent, unsigned long long downloadedSize,
                                unsigned long long totalSize, void* param);

Параметры:

  • clientID Идентификатор клиента API.
  • clientKey Клиентский ключ API.
  • sessionKey текущей сессии.
  • deviceID ID целевого устройства.
  • fileIDs Массив требуемых file_ids .
  • fileIDs_count Длина массива fileIDs .
  • targetDir Выходной каталог, в который будут загружаться файлы.
  • progFunc Функция обратного вызова Progress, которая вызывается при каждом обновлении прогресса.
  • progParam Пользовательский параметр, который можно передать в progFunc вызов progFunc .
  • getErrorBuffer Эта функция обратного вызова должна возвращать буфер, в котором будут храниться ошибки, возникшие во время загрузки.

После завершения загрузки запрошенные идентификаторы файлов будут находиться в папке, обозначенной targetDir .

Старые версии SDK

В старых версиях точка входа DownloadFiles имела немного другую подпись:

int DownloadFiles(const wchar_t* clientID, const wchar_t* clientKey, const wchar_t* sessionKey,
                  const wchar_t* deviceID, const wchar_t** fileIDs, size_t fileIDs_count,
                  const wchar_t* targetDir, ProgressFunction progFunc, void* progParam,
                  GetWStringBuffer getReplyBuffer, GetWStringBuffer getErrorBuffer)

Дополнительный параметр:

  • getReplyBuffer Подобно getErrorBuffer , эта функция обратного вызова отвечает за возврат допустимого буфера, в который может записать метод DownloadFiles . В этом случае этот буфер будет содержать ответ с окончательным статусом загрузки.

Деактивация и повторная активация учетной записи и устройства

The `client-management` method allows for clients to deactive or reactivate billing for account or device access. The methods for deactivation and reactivation have separate endpoints.

##### Account deactivation

```bash
CURL_CALL --data-urlencode "account=ACCOUNT_ID"
          https://api.icloudextractor.com/c/client-management/deactivation/
Реактивация аккаунта
CURL_CALL --data-urlencode "account=ACCOUNT_ID"
          https://api.icloudextractor.com/c/client-management/activation/
Отключение устройства
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/deactivation/
Реактивация устройства
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/activation/

Отправка действительного запроса

Если значения, переданные методу деактивации учетной записи, действительны, он вернет сообщение в теле ответа HTTP.

HTTP/1.1 200 OK
{"message": "deactivation has been set to True for account: ACCOUNT_ID"}

В случае, если пользователь запрашивает отключение устройства, в теле ответа HTTP возвращается аналогичное сообщение:

HTTP/1.1 200 OK
{"message": "deactivation has been set to True for device: DEVICE_ID"}

Отправка запроса с неверными учетными данными

Если пользователь делает запрос на деактивацию или device_id активацию учетной записи с неверным account_id или недействительным device_id , или если account_id или device_id не связаны с пользователем, он возвращает HTTP 400.

HTTP/1.1 400 BAD REQUEST
{"message": "no device with device ID: BAD_DEVICE_ID",
 "error": "bad-device"}

Аналогичная ошибка и сообщение возвращается для неверного account_id или account_id который не связан с пользователем.

HTTP/1.1 400 BAD REQUEST
{"message": "no account with account ID: ACCOUNT_ID",
 "error": "bad-account"}

Повторение запроса

Если пользователь запрашивает деактивацию или повторную активацию устройства или учетной записи, когда они уже существуют в этом состоянии, в теле ответа HTTP будет возвращено сообщение, информирующее пользователя о том, что запрошенный device_id или account_id уже находится в запрошенном состоянии:

HTTP/1.1 200 OK
{"message": "deactivation is already set to True for account: ACCOUNT_ID "}

Аналогичное сообщение отображается в случае повторного запроса на деактивацию и повторную активацию устройства и повторную активацию учетной записи.

Запрос данных для деактивированной учетной записи или устройства

Если пользователь запрашивает данные у деактивированной учетной записи или устройства, это будет HTTP 403:

HTTP/1.1 403 FORBIDDEN
{"message": "The requested account has been deactivated",
 "error": "deactivated-account"}

Опять же, аналогичное сообщение выдается в случае запроса данных от деактивированной учетной записи.

Фид возвращает сообщение: «Свяжитесь с enterprise@reincubate.com для доступа к этим данным»

Это сообщение будет возвращено при использовании демонстрационного ключа. Пожалуйста, свяжитесь с нами для пробного ключа с доступом к дополнительным данным. Если у вас уже есть пробный ключ, правильно ли вы указали его в своей реализации клиента?

Я пытаюсь получить файл базы данных приложения по file_id но не получаю никаких данных обратно

file_ids are derived from an SHA-1 hash of the file's path and name, so they are constant for any given file. If the file's attributes or content change, it won't affect the hash.

Однако иногда авторы приложений меняют имя файла, в котором они хранят данные (а иногда Apple делает это в новых версиях iOS). Вот почему, например, есть несколько разных file_id для проверки при получении данных WhatsApp. Эти file_id могут быть изменены в любое время при обновлении приложения.

Пользователям рекомендуется использовать каналы JSON, а не работать с файлами и управлять ими напрямую. Используя каналы, вам не нужно беспокоиться об эффективности SQL, разборе или удалении PList, а с лентами работать быстрее и проще

Я получаю ошибки ограничения скорости с сервера

API-запросы ограничивают скорость в течение 15-минутного окна, и это ограничение настраивается для каждого ключа. Большинство ключей ограничены по скорости в целях безопасности.

Клиентам API возвращаются данные об их использовании с учетом ограничений в ответах HTTP заголовков, которые они получают. Эти ответы используют следующие заголовки:

  • X-Rate-Limit-Limit Количество разрешенных запросов в 15-минутном окне.
  • X-Rate-Limit-Remaining Количество запросов, остающихся в выделении текущего окна.
  • X-Rate-Limit-Reset Время, оставшееся до окончания текущего окна ограничения скорости, в миллисекундах.

Вот пример набора живых заголовков от ключа на пределе скорости 1000 запросов.

X-Rate-Limit-Remaining: 995
X-Rate-Limit-Limit: 1000
X-Rate-Limit-Reset: 3546.3297081

Если ограничение скорости достигнуто, сервер ответит:

HTTP/1.1 429 TOO MANY REQUESTS

Сервер будет включать три заголовка ограничения скорости в этом ответе.

Правильное поведение клиента состоит в том, чтобы ждать, пока пройдет время, указанное в X-Rate-Limit-Reset , и в этот момент X-Rate-Limit-Remaining будет сброшен.

Я получил письмо об удаленном доступе к учетной записи iCloud, к которой я обращался

Опрос устаревших модулей прямой трансляции (как отмечено выше в разделе примеров флагов модулей подачи) может вызвать отправку электронного письма на адрес, связанный с этой учетной записью iCloud. Обратите внимание, что это происходит только для устаревших модулей прямой трансляции, а не для производственных модулей.

Как мы можем помочь?

Наша служба поддержки здесь, чтобы помочь!

Наш офис работает с понедельника по пятницу с 9:00 до 17:00 по Гринвичу. Время в настоящее время 5:47 ПП с GMT.

Мы стремимся отвечать на все сообщения в течение одного рабочего дня.

Перейти в раздел поддержки › Связаться с командой предприятия ›
Наша отличная команда поддержки

Можем ли мы улучшить эту статью?

Нам нравится слышать от пользователей: почему бы не написать нам электронное письмо, оставить комментарий или написать в Твиттере @reincubate?

© 2008 - 2019 Reincubate Ltd. Все права защищены. Зарегистрировано в Англии и Уэльсе #5189175, VAT GB151788978. Reincubate® является зарегистрированным товарным знаком. Защита & Условия. Мы рекомендуем 2FA. Построен с в Лондоне.