API de iCloud (v1)

Actualizado

Esta documentación cubre el uso de la API iCloud heredada de Reincubate.

Visión general

La API, y en particular las fuentes, proporcionan una serie de beneficios sustanciales:

  • Facilidad de integración . Es fácil para los equipos de desarrollo en cualquier nivel trabajar con la API, y eliminan la necesidad de que los clientes tengan conocimientos altamente especializados sobre el almacenamiento de iCloud / CloudKit o sobre las aplicaciones de terceros.

    Este beneficio no se puede exagerar fácilmente: la complejidad de desarrollar y mantener una interfaz para iCloud es considerable, y además de eso hay que admitir múltiples formatos de datos para los datos principales de iOS y los archivos de aplicaciones. IOS no solo utiliza diferentes formatos de datos, sino que cada aplicación (por ejemplo, WhatsApp) utiliza un conjunto de formatos y estructuras de datos que pueden cambiar de una semana a otra con las actualizaciones de la aplicación.

    La API es compatible con todas las funciones "difíciles" : iOS 9, iOS 10, CloudKit, iCloud 8 + 9, 2SV / 2FA, instantáneas parciales, tokenización, A9 y A9X.

  • Pruebas de futuro . Reincubate se compromete a mantener el soporte para los formatos de datos de iCloud e iOS actuales y pasados, y tiene un sólido historial en este espacio:

    • Primero en soportar el acceso a datos iOS (2008)
    • Primero en soportar el acceso a datos cifrados de iOS (2009)
    • Primero en soportar la extracción de datos de iCloud (2011)
    • Primero y solo con una API para admitir el acceso a datos de iCloud / CloudKit iOS 9 (2015)
  • Soporte y acceso a una experiencia inigualable . Como consecuencia del enfoque y el posicionamiento de la compañía como compañía de datos de aplicaciones , el equipo de Reincubate tiene una experiencia y un conocimiento inigualables en el campo. Esta experiencia es particularmente valiosa para los clientes que exploran nuevas aplicaciones y casos de uso.

    Los usuarios de las fuentes JSON pueden aprovechar las técnicas patentadas de Reincubate en la extracción y recuperación de datos de aplicaciones, de modo que los datos resultantes sean más precisos.

  • Fuera de la caja de soporte de aplicaciones . Aparte de los tipos de datos principales de iOS, todos los cuales son compatibles con todas las versiones de iOS en todos los dispositivos, la API tiene módulos para soportar docenas de aplicaciones de terceros. Algunas de las aplicaciones compatibles más populares incluyen WhatsApp, Viber, Kik, WeChat, Line, SnapChat, Facebook Messenger y Skype.

  • Fuera de la caja de soporte de la plataforma de desarrollador . La API tiene implementaciones de cliente de código abierto disponibles en varios idiomas, incluidos Python , .NET / C# y JavaScript .

  • Velocidad y escalabilidad . La plataforma Reincubate iCloud API está diseñada para escalar, y el sistema de alimentación JSON es más rápido y se escala mejor que el acceso a archivos sin procesar.

  • Opciones de personalización de alimentación rica . La plataforma de alimentación es fácilmente personalizable para implementaciones de socios. Los ejemplos incluyen las protobuf formato protobuf y la agregación de archivos adjuntos de aplicaciones de mensajería.

  • Confianza Los usuarios de seguridad, LEA y gubernamentales de todo el mundo confían en Reincubate. La compañía está sujeta a la estricta legislación de protección de datos del Reino Unido, y cumple con las regulaciones de puerto seguro de la UE y los Estados Unidos.

Empezando

Las partes interesadas pueden ponerse en contacto con el equipo de la empresa para acceder a una clave API. Sin embargo, se proporciona una clave de prueba en todas las implementaciones del cliente de muestra.

Instalando el cliente Python de muestra

La biblioteca de Python iCloud se puede instalar con un solo comando. Para obtener la biblioteca heredada, se debe instalar la última versión 1.* .

$ pip install ricloud==1.*

La fuente de este cliente se puede encontrar en GitHub en ricloud-py .

Instalando el cliente JavaScript de muestra

La biblioteca de JavaScript iCloud se puede instalar con un solo comando. Para obtener la biblioteca heredada, se debe instalar la última versión 1.* .

$ npm install ricloud==1.*

La fuente de este cliente se puede encontrar en GitHub en ricloud-js .

Instalando el cliente .NET / C # de muestra

La biblioteca de C # iCloud se puede instalar con un solo comando. Para obtener la biblioteca heredada, se debe instalar la última versión 1.* .

$ nuget install ricloud==1.*

La fuente de este cliente se puede encontrar en GitHub bajo ricloud-csharp .

Configuración

Cada implementación de cliente viene con su propio conjunto de documentación empaquetada y una secuencia de comandos de muestra que muestra cómo se puede usar. La configuración generalmente se limita a especificar un user y key valor key para la autenticación en la API.

Trabajando con la API

Hay tres operaciones principales que un usuario puede necesitar realizar con la API.

  • Autenticación y enumeración: sign-in , perform-2fa-challenge , submit-2fa-challenge
  • Acceso a los datos del feed: download-data
  • Acceso al archivo sin formato: download-file

Los ejemplos en esta sección se dan en formato curl .

En todas las solicitudes realizadas a la API, se debe indicar a curl que siga las redirecciones con el parámetro -L . Las credenciales de la API del usuario también deben configurarse con --user "USER:KEY" , al igual que el encabezado de la versión de la API personalizada, --header "Accept: application/vnd.icloud-api.v1" . Así que todas las llamadas de curl en estos ejemplos deben comenzar con:

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

Tenga en cuenta que también se especifica la opción -X POST , ya que todas las solicitudes se realizan a través de POST . Como esta llamada no va a cambiar, se menciona a continuación como CURL_CALL .

Como norma general, todas las solicitudes (excepto los errores) devuelven un campo session_key que identifica la sesión actual. Si no se envía, se debe usar una solicitud de sign-in para generar una nueva sesión. session_key valores de session_key deben usarse de manera consistente.

1. Autenticación, 2FA / 2SV y recuperación de dispositivo y lista de datos

Para iniciar sesión como usuario con autenticación de dos factores o verificación de dos pasos habilitada en su cuenta, se debe utilizar el método de sign-in .

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

El email y la password de la cuenta de iCloud para acceder se pasan como parámetros, utilizando --data-urlencode para garantizar que los caracteres de control como @ se escapen.

Iniciar sesión con un par de claves API no válido

Si un usuario realiza una solicitud de la API con un par de claves no válido, no devolverá datos más allá de un 403 .

HTTP/1.1 403 FORBIDDEN

Iniciar sesión en una cuenta donde el usuario final no ha aceptado los T & Cs de iCloud

Si el usuario intenta iniciar sesión en una cuenta de iCloud para la cual no se ha aceptado un conjunto actualizado de términos y condiciones de iCloud.

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

Iniciar sesión con malas credenciales de iCloud

Si un usuario intenta iniciar sesión con malas credenciales de iCloud, se devolverá un 403 junto con un mensaje de error.

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

Iniciar sesión en una cuenta que el usuario final no ha validado

Si el usuario intenta iniciar sesión en una cuenta de iCloud para la cual el usuario no ha validado el correo electrónico principal.

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

Iniciar sesión sin 2FA / 2SV

El inicio de sesión en una cuenta que no sea 2FA se puede hacer con una sola solicitud.

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"}
}

Iniciar sesión con 2SV / 2FA

Si la cuenta se aseguró con la autenticación de dos factores, el sign-in la solicitud devolverá un mensaje de error que indica que la two-factor authentication is enabled on this account , la session_key y, en el caso de 2SV, también una lista de trustedDevices de 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"
}

Para 2SV, el siguiente paso es emitir un código de desafío 2SV a uno de los trustedDevices de trustedDevices . Para ello se realiza una solicitud para perform-2fa-challenge .

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

Los parámetros que se enviaron son de challenge , que deben contener en los elementos listados en trustedDevices , y la session_key , que será la misma que la solicitud de sign-in devuelta.

  • 2FA

En el caso de 2FA, la diferencia es que la solicitud devolverá una lista de trustedDevices vacía.

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"
}

Para 2FA, no podemos elegir qué dispositivo es desafiado, ya que cada dispositivo de confianza será desafiado automáticamente. Para hacer esto, se realiza una solicitud para perform-2fa-challenge , sin el argumento de desafío.

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

Por lo tanto, para 2FA, los únicos parámetros que se envían son la session_key , que será la misma que la solicitud de sign-in devuelta.

Desafiando con un mal dispositivo (2FA / 2SV)

Si un usuario realiza una solicitud de la API con un device no válido, no devolverá datos más allá de 500 .

HTTP/1.1 500 INTERNAL SERVER ERROR

Desafiando con una clave mala (2FA / 2SV)

Si un usuario realiza una solicitud de la API con una key no válida, devolverá un 403 con un mensaje de validación.

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

Desafiando con éxito (2FA / 2SV)

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

Una vez que el desafío se ha enviado al dispositivo del usuario, los datos enviados deben retransmitirse a la API utilizando submit-2fa-challenge .

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

Enviar una respuesta de desafío (2FA / 2SV)

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

Enviar la respuesta de desafío correcta (2FA / 2SV)

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

Con esta solicitud, el usuario estará completamente autenticado y la sesión de API estará activa.

Para completar el proceso de inicio de sesión y recuperar la lista de dispositivos, enviar una solicitud final para sign-in el uso de la misma email y password como la primera solicitud y utilizando la misma key utilizada por el proceso de autenticación 2FA / 2SV.

Tenga en cuenta que la respuesta solo contendrá la entrada auth_token si su clave de API tiene habilitada la tokenización. En este caso, le recomendamos que envíe la solicitud final para refresh-session como se describe en la Sección 4 a continuación, en lugar de enviarla para sign-in . El uso de auth_token es más robusto ya que es un indicador de una sesión ya establecida en los sistemas de Apple.

En el nuevo adaptador de backend API, debe esperar una respuesta diferente. Esto se debe a las optimizaciones en el flujo del proceso 2FA / 2SV.

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

2. Recuperación de datos de alimentación: datos de download-data

El método de download-data se utiliza para acceder a los datos de alimentación.

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/

Los parámetros necesarios para esta solicitud son la session_key actual, el device_id de uno de los dispositivos de la respuesta de inicio de sesión y la data_mask , que es una combinación OR de todas las data_mask del módulo de alimentación en las que está interesado el usuario. También puede especificar una since Fecha a partir de la cual comenzar a buscar datos.

Suponiendo que la clave API del cliente es válida para todos estos módulos, el método devolverá los datos solicitados en formato JSON.

Enviar una solicitud de feed válida

Si los valores pasados al método son válidos, devolverá el contenido de la fuente en el cuerpo de respuesta HTTP.

HTTP/1.1 200 OK

Enviar una solicitud de feed con los parámetros que faltan

Si falta uno de los parámetros requeridos, el método devolverá un código de respuesta de solicitud incorrecta.

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

Enviar una solicitud de alimentación con parámetros no válidos

Si se envía un valor no válido o con formato incorrecto para cualquier parámetro, el método devolverá un código de respuesta de solicitud incorrecta.

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

Indicadores de módulo de alimentación de muestra

Los siguientes indicadores del módulo se pueden enmascarar para el parámetro de mask del método de download-data . Esta no es una lista exhaustiva.

  • 0000000000001 mensajes
  • 0000000000002 fotos y videos
  • 0000000000004 Historial del navegador
  • 0000000000008 Historial de llamadas
  • 0000000000016 Contactos
  • 0000000000032 Aplicaciones instaladas
  • 0000000000256 Ubicación (en vivo)
  • 0000000000512 mensajes de WhatsApp
  • 0000000001024 mensajes de Skype
  • 0000000002048 Calendario
  • 0000000004096 mensajes de línea
  • 0000000008192 mensajes de Kik
  • 0000000016384 mensajes de Viber
  • 0000000032768 mensajes de Facebook
  • 0000000065536 mensajes de WeChat
  • 0000000131072 mensajes de Snapchat
  • 0000000262144 lista de archivos
  • 0000000524288 Historial del navegador (en vivo)
  • 0000001048576 historial de llamadas de WhatsApp
  • 0000002097152 historial de llamadas Viber
  • 0000004194304 uso de la aplicación
  • 0000008388608 Notas
  • 0000033554432 HealthKit
  • 0000067108864 HealthKit pasos solo
  • 0000134217728 cookies de safari
  • 0000268435456 contactos de Kik
  • 0000536870912 contactos Viber
  • 0001073741824 conversaciones 0001073741824
  • 0002147483648 Historial de llamadas (en vivo)
  • 0004294967296 Ubicaciones
  • 0008589934592 Caminar mensajes
  • 0017179869184 historias de Snapchat
  • 0034359738368 voz
  • 0068719476736 Grabaciones
  • 0137438953472 videos
  • 0274877906944 Fotos y videos (en vivo)
  • 0549755813888 Mensajes de Tinder
  • 1099511627776 relojes de Apple vinculados
  • 2199023255552 puestos de caminata
  • 4398046511104 Contactos (en vivo)
  • 8796093022208 Información de la cuenta

Por ejemplo, para solicitar una fuente de mensajes, el historial de llamadas y el historial del navegador, la máscara sería 1 + 4 + 8 = 13 .

Formatos de alimentación JSON

Los feeds JSON están diseñados para ser lo más sencillos de analizar que sea posible. La fuente devolverá todos los tipos de datos solicitados en una sola respuesta.

Cada módulo de alimentación especificado en el indicador de módulo tendrá su propia clave en el diccionario JSON de nivel superior que se devuelve.

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

3. Recuperación de archivos sin formato: download-file

El método de download-file está disponible para descargar archivos adjuntos de mensajes o para descargar directamente más archivos esotéricos desde 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

Los parámetros necesarios son la session_key , el device_id destino y un file_id . La solicitud anterior descargará el archivo y almacenará la ruta especificada para curl con la opción -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.

Enviar una solicitud de archivo válida

Si los valores pasados al método son válidos, devolverá el contenido del archivo binario en el cuerpo de respuesta HTTP.

HTTP/1.1 200 OK

Enviar una solicitud de archivo para un archivo no existente

Si un archivo no está presente en iCloud, o no podemos recuperarlo del tercero apropiado, el método seguirá regresando con éxito, sin embargo, el cuerpo del mensaje estará vacío.

HTTP/1.1 200 OK

Enviar una solicitud de archivo después de que la sesión haya expirado

Si la sesión ha caducado, los clientes recibirán un código de respuesta de solicitud incorrecta.

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

Muestra file_id s

Las claves hash comunes asociadas con las aplicaciones para el acceso directo a archivos incluyen lo siguiente.

  • 3d0d7e5fb2ce288813306e4d4636395e047a3d28 SMS
  • 1b6b187a1b60b9ae8b720c79e2c67f472bab09c0 WhatsApp
  • 1c6a49018bcace96656e4fe8f08d572ce071b92c WhatsApp
  • 7c7fba66680ef796b916b067077cc246adacf01d WhatsApp
  • b39bac0d347adfaf172527f97c3a5fa3df726a3a Viber
  • 8e281be6657d4523710d96341b6f86ba89b56df7 Kik
  • ff1324e6b949111b2fb449ecddb50c89c3699a78 Llamadas
  • a49bfab36504be1bf563c1d1813b05efd6076717 Llamadas
  • 2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca Llamadas
  • 5a4935c78a5255723f707230a451d79c540d2741 llamadas
  • 12b144c0bd44f2b3dffd9186d3f9c05b917cee25 fotos
  • adb8c77534444e97c31ff15924d50f3ed1fbd3b1 contactos
  • 2041457d5fe04d39d0ab481178355df6781e6858 citas
  • 3ecf3efff3a55d6155efce2828579e8a3cd881c1 historial de navegación
  • cd89f9e10d3497912bfc92e5dc674ca989cfdd44 historial de navegación
  • 2d711a1f5613f5259730b98328a3f7e816698f88 Line

Algunas aplicaciones de mensajería, como Skype, Facebook Messenger y WeChat, varían el file_id dependiendo de la conversación.

4. Actualizar el inicio de sesión de una cuenta utilizando tokens de autenticación

El auth_token es un token de inicio de sesión con Apple. Dura por lo menos un día y se actualiza cuando se realiza una solicitud al punto final de la refresh-session en la API. Una encuesta diaria para el punto final de la refresh-session es todo lo que se necesita para conservar este token.

Como el punto final de la refresh-session solo necesita auth_token como entrada y devuelve la lista de dispositivos más una nueva clave de sesión, se puede usar para iniciar una nueva sesión en la API sin la necesidad de iniciar sesión en la cuenta nuevamente. Esto es especialmente útil para las cuentas habilitadas para 2FA / 2SV, ya que el proceso de autenticación solo debe completarse para la solicitud de inicio de sign-in inicial.

Para usarlo, uno debe usar el campo auth_token recuperado durante el inicio de sesión. Esto se debe enviar al punto final de la refresh-session .

El parámetro auth_token se devuelve de la solicitud de inicio de sign-in inicial y debe usarse contra el punto final de la refresh-session .

Recomendamos también incluir la account parámetros opcionales en la solicitud, ya que esto nos ayuda a monitorear la solicitud a través de todo nuestro sistema. El valor de este parámetro es simplemente el nombre de usuario de la cuenta iCloud del usuario.

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

Enviar un token de autenticación no válido

Si el token no es válido, el punto final devolverá un código de solicitud incorrecto.

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

Enviar un token de autenticación válido

La respuesta será similar al punto final de inicio de sesión: una clave de sesión recién creada y la lista actualizada de dispositivos con todos los metadatos necesarios para identificar cada uno. Uno puede usar la nueva sesión para continuar extrayendo datos.

HTTP/1.1 200 OK

5. Eliminación de archivos de iCloud Photo Library: delete-file

El método de delete-file está disponible para eliminar fotos de la biblioteca de fotos de iCloud. Acepta file , key y un indicador de permament como parámetros.

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

El parámetro del file contendrá la identificación de la foto (que se puede recuperar a través de la fuente de web_photos ) y la bandera permanent controla si el archivo se eliminará de forma web_photos o permanent . Si se establece en False , la solicitud hará que el archivo se mueva al álbum de fotos "Eliminado recientemente" (conocido como eliminación suave). Por otro lado, si se establece en True , la solicitud eliminará el archivo del álbum "Eliminado recientemente" y hará que se elimine permanentemente (lo que se conoce como eliminación definitiva).

Eliminación suave exitosa

Si la eliminación suave fue exitosa, la foto se moverá al álbum "Eliminados recientemente" y devolverá un mensaje de éxito.

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

Eliminar con éxito

Si la eliminación definitiva se realizó correctamente, la foto se eliminará de los dispositivos asociados cuando estos dispositivos se sincronicen con iCloud. Sin embargo, debido a la técnica utilizada, los archivos eliminados se podrán detectar y descargar de la API iCloud Photo de Reincubate durante un período de tiempo indeterminado. Este comportamiento se puede utilizar para eliminar archivos no listados.

Tenga en cuenta que, para que un archivo se elimine por hardware, primero se debe haber eliminado por software.

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

Falló el borrado suave o duro

Si la solicitud falla, devolverá una respuesta de error.

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

Acelerando descargas con SDK nativo

Para descargas de archivos altamente paralelizados, ofrecemos un SDK de C ++ que permite a los clientes descargar y descifrar archivos localmente, evitando los gastos generales (pero perdiendo la conveniencia) del punto final de download-file . Este SDK está disponible para Linux (Ubuntu 12.04, Ubuntu 14.04, Debian Jessie) y Windows.

Se integra con el resto del flujo de trabajo de la API.

Descargas

Los usuarios pueden cargar la biblioteca actual y llamar a DownloadFiles , el punto de entrada del SDK, que tiene la siguiente firma:

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)

Con estas definiciones externas de devolución de llamada:

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

Los parámetros son:

  • clientID El ID de cliente de la API.
  • clientKey La clave de cliente API.
  • sessionKey Clave de la sesión actual.
  • deviceID Target ID de dispositivo.
  • fileIDs Array de file_ids requeridos.
  • fileIDs_count Longitud de la matriz fileIDs .
  • targetDir Directorio de salida donde se descargarán los archivos.
  • progFunc Función de devolución de llamada de progreso, que se llama cada vez que se realiza una actualización de progreso.
  • progParam Parámetro personalizado que se puede pasar a la progFunc llamada progFunc .
  • getErrorBuffer Esta función de devolución de llamada debe devolver un búfer que contendrá los errores ocurridos durante la descarga.

Una vez finalizada la descarga, los identificadores de archivo solicitados estarán en la carpeta designada por targetDir .

Versiones anteriores de SDK

En versiones anteriores, el punto de entrada de DownloadFiles tenía una firma ligeramente diferente:

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)

El parámetro adicional es:

  • getReplyBuffer Similar a getErrorBuffer , esta función de devolución de llamada es responsable de devolver un búfer válido donde el método DownloadFiles puede escribir. En este caso, este búfer contendrá la respuesta con un estado final de la descarga.

Desactivación y reactivación de cuenta y dispositivo

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/
Reactivación de cuenta
CURL_CALL --data-urlencode "account=ACCOUNT_ID"
          https://api.icloudextractor.com/c/client-management/activation/
Desactivación del dispositivo
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/deactivation/
Reactivación del dispositivo
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/activation/

Enviar una solicitud válida

Si los valores pasados al método de desactivación de la cuenta son válidos, devolverá un mensaje en el cuerpo de respuesta HTTP.

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

En el caso de que un usuario solicite que se desactive un dispositivo, se devuelve un mensaje similar en el cuerpo de respuesta HTTP:

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

Enviar una solicitud con credenciales inválidas

Si el usuario realiza una solicitud para desactivar o reactivar una cuenta con un account_id no account_id o account_id no device_id , o si el account_id o device_id no están asociados con el usuario, devolverá un HTTP 400.

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

Se devuelve un error y mensaje similares para account_id no account_id o account_id que no se asocia con el usuario.

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

Repitiendo una solicitud

Si un usuario solicita que un dispositivo o cuenta se desactive o se reactive cuando ya existe en ese estado, se devolverá un mensaje en el cuerpo de respuesta HTTP, informando al usuario que el device_id o account_id solicitado ya se encuentra en el estado solicitado:

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

Se muestra un mensaje similar en el caso de una solicitud repetida para la desactivación y reactivación del dispositivo y la reactivación de la cuenta.

Solicitando datos para una cuenta o dispositivo desactivado

Si un usuario solicita datos de una cuenta o dispositivo que ha sido desactivado, será un HTTP 403:

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

De nuevo, se da un mensaje similar en el caso de solicitar datos de una cuenta desactivada.

La fuente devuelve un mensaje: "Póngase en contacto con enterprise@reincubate.com para acceder a estos datos"

Este mensaje se devolverá cuando se utilice la clave de demostración. Póngase en contacto con nosotros para obtener una clave de prueba con acceso a más datos. Si ya tiene una clave de prueba, ¿la está especificando correctamente en la implementación de su cliente?

Estoy intentando extraer el archivo de base de datos de una aplicación mediante file_id pero no estoy recuperando ningún dato

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.

Sin embargo, a veces los autores de las aplicaciones cambian el nombre del archivo en el que almacenan los datos (y a veces Apple lo hace en las nuevas versiones de iOS). Es por eso que, por ejemplo, hay varios file_id diferentes para examinar al obtener datos de WhatsApp. Estos file_id s podrían cambiarse cada vez que se actualice una aplicación.

Se recomienda que los usuarios extraigan las fuentes JSON en lugar de trabajar con archivos y manipularlos directamente. Al usar los feeds, no es necesario preocuparse por la eficacia de SQL, el análisis o la eliminación de PList, y los feeds son más rápidos y mucho más fáciles de utilizar.

Estoy recibiendo errores de limitación de velocidad del servidor

Las solicitudes de límite de velocidad de la API en una ventana de 15 minutos, y esta limitación se configura por clave. La mayoría de las claves tienen una tasa limitada por razones de seguridad.

A los clientes API se les devuelven datos sobre su uso en función de los límites en las respuestas de encabezado HTTP que reciben. Estas respuestas usan los siguientes encabezados:

  • X-Rate-Limit-Limit La cantidad de solicitudes permitidas en una ventana de 15 minutos.
  • X-Rate-Limit-Remaining La cantidad de solicitudes restantes en la asignación de la ventana actual.
  • X-Rate-Limit-Reset El tiempo restante hasta que finaliza la ventana de límite de velocidad actual, en milisegundos.

Este es un ejemplo de conjunto de encabezados en vivo desde una clave en un límite de tasa de solicitud de 1,000.

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

Si se alcanza el límite de velocidad, el servidor responderá con:

HTTP/1.1 429 TOO MANY REQUESTS

El servidor incluirá los tres encabezados de límite de velocidad en esta respuesta.

El comportamiento correcto del cliente es esperar a que pase la duración especificada por X-Rate-Limit-Reset , momento en el que se restablecerá X-Rate-Limit-Remaining .

Recibí un correo electrónico sobre el acceso remoto a la cuenta de iCloud a la que accedí

El sondeo de los módulos de alimentación en vivo heredados (como se indicó anteriormente en la sección de indicadores del módulo de alimentación de muestra) puede provocar que se envíe un correo electrónico a la dirección asociada con esa cuenta de iCloud. Tenga en cuenta que esto solo ocurre con los módulos de transmisión en vivo heredados, y no con los módulos de producción.

¿Cómo podemos ayudar?

¡Nuestro equipo de soporte está aquí para ayudar!

Nuestro horario de atención es de lunes a viernes de 9 a.m. a 5 p.m. GMT. El tiempo es actualmente 5:48 AM GMT.

Intentamos responder todos los mensajes en un plazo de un día laboral.

Ir a la sección de soporte › Póngase en contacto con el equipo de la empresa. ›
Nuestro increíble equipo de soporte.

¿Podemos mejorar este artículo?

Nos encanta escuchar de los usuarios: ¿por qué no enviarnos un correo electrónico, dejar un comentario o tuitear? @reincubate?

© 2008 - 2019 Reincubate Ltd. Todos los derechos reservados. Registrado en Inglaterra y Gales #5189175, VAT GB151788978. Reincubate® es una marca registrada. Términos y privacidad. Recomendamos la autenticación de múltiples factores. Construido con en Londres.