API do iCloud (v1)

Atualizada

Esta documentação cobre o uso da API iCloud herdada do Reincubate.

visão global

A API - e, em particular, os feeds - fornecem vários benefícios substanciais:

  • Facilidade de integração . A API é fácil para as equipes de desenvolvimento em qualquer nível, e elimina a necessidade de os clientes terem qualquer conhecimento altamente especializado sobre o armazenamento do iCloud / CloudKit ou sobre quaisquer aplicativos de terceiros.

    Esse benefício não é exagerado com facilidade: a complexidade de desenvolver e manter uma interface para o iCloud é substancial e, além disso, há a necessidade de oferecer suporte a vários formatos de dados para arquivos de aplicativos e dados do iOS principais. O iOS não apenas usa formatos de dados diferentes, mas cada aplicativo (por exemplo, WhatsApp) usa um conjunto de formatos de dados e estruturas que podem mudar de semana para semana com atualizações de aplicativos.

    A API suporta todos os recursos "difíceis" : iOS 9, iOS 10, CloudKit, fusão do iCloud 8 + 9, 2SV / 2FA, instantâneos parciais, tokenização, A9 e A9X.

  • Prova futura . A Reincubate está empenhada em manter o suporte para os formatos de dados iCloud e iOS contemporâneos e passados e tem um sólido histórico neste espaço:

    • para suportar o acesso a dados do iOS (2008)
    • para suportar acesso a dados criptografados no iOS (2009)
    • para apoiar a extração de dados do iCloud (2011)
    • 1º e único com uma API para suportar o acesso a dados do iCloud / CloudKit iOS 9 (2015)
  • Suporte e acesso a conhecimento incomparável . Como consequência do foco e posicionamento da empresa como a empresa de dados de aplicativos , a equipe da Reincubate possui experiência e conhecimento incomparáveis no campo. Essa experiência é particularmente valiosa para clientes que exploram novos aplicativos e casos de uso.

    Os usuários dos feeds JSON podem aproveitar as técnicas proprietárias da Reincubate na extração e exclusão de dados de aplicativos, de modo que os dados resultantes sejam mais precisos.

  • Suporte de aplicativo pronto para uso . Além dos principais tipos de dados iOS - todos suportados em todas as versões do iOS em todos os dispositivos - a API possui módulos para suportar dezenas de aplicativos de terceiros. Alguns dos mais populares aplicativos suportados incluem WhatsApp, Viber, Kik, WeChat, Linha, SnapChat, Facebook Messenger e Skype.

  • Suporte à plataforma de desenvolvedor pronto para uso . A API tem implementações de clientes de código aberto disponíveis em vários idiomas, incluindo Python , .NET / C# e JavaScript .

  • Velocidade e escalabilidade . A plataforma de API Reincubate iCloud foi criada para escalar e o sistema de feed JSON é mais rápido e dimensionado melhor que o acesso a arquivos raw.

  • Opções de personalização de feed avançadas . A plataforma de feed é facilmente personalizável para implantações de parceiros. Os exemplos incluem feeds de formato protobuf e agregação de anexos de aplicativos de mensagens.

  • Confiança . Reincubar são confiáveis para usuários de segurança, LEA e governo em todo o mundo. A empresa está sujeita à rigorosa legislação de proteção de dados do Reino Unido e está em conformidade com as regulamentações de Safe Harbor da UE e dos EUA.

Começando

As partes interessadas podem entrar em contato com a equipe da empresa para acessar uma chave de API. No entanto, uma chave de teste é fornecida em todas as implementações do cliente de amostra.

Instalando o Cliente Python de Amostra

A biblioteca do Python iCloud pode ser instalada com um único comando. Para obter a biblioteca legada, a última versão 1.* deve ser instalada.

$ pip install ricloud==1.*

A fonte para este cliente pode ser encontrada no GitHub sob o ricloud-py .

Instalando o Cliente JavaScript de Amostra

A biblioteca JavaScript iCloud pode ser instalada com um único comando. Para obter a biblioteca legada, a última versão 1.* deve ser instalada.

$ npm install ricloud==1.*

A fonte para este cliente pode ser encontrada no GitHub sob o ricloud-js .

Instalando o Cliente .NET / C # de Amostra

A biblioteca do c # iCloud pode ser instalada com um único comando. Para obter a biblioteca legada, a última versão 1.* deve ser instalada.

$ nuget install ricloud==1.*

A fonte para este cliente pode ser encontrada no GitHub em ricloud-csharp .

Configuração

Cada implementação do cliente vem com seu próprio conjunto de documentação e um exemplo de script que mostra como ele pode ser usado. A configuração geralmente é limitada a especificar um valor de key e um user para autenticação na API.

Trabalhando com a API

Existem três operações principais que um usuário pode precisar realizar com a API.

  • Autenticação e enumeração: sign-in , perform-2fa-challenge , submit-2fa-challenge
  • Acesso de dados de feed: download-data
  • Acesso a arquivos brutos: download-file

Exemplos nesta seção são fornecidos em formato de curl .

Em todas as solicitações feitas à API, o curl deve ser informado para seguir os redirecionamentos com o parâmetro -L . As credenciais da API do usuário também devem ser configuradas com --user "USER:KEY" , assim como o cabeçalho da versão da API personalizada, --header "Accept: application/vnd.icloud-api.v1" . Portanto, todas as chamadas de curl nesses exemplos devem começar com:

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

Observe que a opção -X POST também é especificada, pois todas as solicitações são feitas por meio do POST . Como esta chamada não vai mudar, ela é mencionada abaixo como CURL_CALL .

Como uma diretriz geral, todas as solicitações (exceto erros) retornam um campo session_key que identifica a sessão atual. Se não for enviado, um sign-in pedido deve ser usado para gerar uma nova sessão. session_key valores de session_key devem ser usados de forma consistente.

1. Autenticação, 2FA / 2SV e recuperação de lista de dispositivos e dados

Para fazer login como um usuário com autenticação de dois fatores ou duas etapas ativadas em sua conta, o método de sign-in deve ser usado.

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

O email e a password da conta do iCloud para acessar são passados como parâmetros, usando --data-urlencode para garantir que os caracteres de controle, como @ sejam escapados.

Como fazer login com um par de chaves de API inválido

Se um usuário fizer uma solicitação da API com um par de chaves inválido, ele não retornará nenhum dado além de um 403 .

HTTP/1.1 403 FORBIDDEN

Fazer login em uma conta em que o usuário final não aceitou os iCloud T & Cs

Se o usuário tentar entrar em uma conta do iCloud para a qual um conjunto atualizado de termos e condições do iCloud não foi aceito.

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

Fazer login com credenciais ruins do iCloud

Se um usuário tentar entrar com credenciais ruins do iCloud, um 403 será retornado juntamente com uma mensagem de erro.

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

Fazer login em uma conta que o usuário final não validou

Se o usuário tentar entrar em uma conta do iCloud para a qual o email principal não tenha sido validado pelo usuário.

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

Entrando sem 2FA / 2SV

Fazer login em uma conta que não seja 2FA pode ser feito com uma única solicitação.

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

Entrando com 2SV / 2FA

Se a conta foi protegida com autenticação de dois fatores, o sign-in solicitação retornará uma mensagem de erro informando que two-factor authentication is enabled on this account , a session_key e, no caso do 2SV, também uma lista 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, o próximo passo é emitir um código de desafio 2SV para um dos trustedDevices . Para fazer isso, uma solicitação é feita 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/

Os parâmetros enviados são challenge , que devem conter os itens listados em trustedDevices , e session_key , que será o mesmo que a solicitação de sign-in retornada.

  • 2FA

No caso de 2FA, a diferença é que a solicitação retornará uma lista vazia de 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"
}

Para o 2FA, não podemos escolher qual dispositivo é desafiado, pois todos os dispositivos confiáveis serão automaticamente desafiados. Para fazer isso, uma solicitação é feita para perform-2fa-challenge , sem o argumento de desafio.

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

Portanto, para 2FA, os únicos parâmetros enviados são a session_key , que será a mesma que a solicitação de sign-in retornada.

Desafiando com um dispositivo ruim (2FA / 2SV)

Se um usuário fizer uma solicitação da API com um device inválido, ele não retornará nenhum dado além de um 500 .

HTTP/1.1 500 INTERNAL SERVER ERROR

Desafiando com uma chave ruim (2FA / 2SV)

Se um usuário fizer uma solicitação da API com uma key inválida, ele retornará um 403 com uma mensagem de validação.

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

Desafiando com sucesso (2FA / 2SV)

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

Depois que o desafio for enviado ao dispositivo do usuário, os dados enviados devem ser retransmitidos para a API usando o submit-2fa-challenge .

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

Enviando uma resposta de desafio ruim (2FA / 2SV)

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

Enviando a resposta correta do desafio (2FA / 2SV)

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

Com essa solicitação, o usuário será totalmente autenticado e a sessão da API estará ativa.

Para concluir o processo de login e recuperar a lista de dispositivos, apresentar um pedido final para sign-in usando o mesmo email e password como o primeiro pedido e utilizando a mesma key usada durante o processo de autenticação 2FA / 2SV.

Tenha em atenção que a resposta apenas conterá a entrada auth_token se a chave da API tiver a tokenização ativada. Nesse caso, recomendamos que você envie a solicitação final para refresh-session conforme descrito na Seção 4 abaixo, em vez de enviá-la para o sign-in . Usar o auth_token é mais robusto, pois é um indicador de uma sessão já estabelecida nos sistemas da Apple.

No novo adaptador de backend de API, você deve esperar ver uma resposta diferente. Isto é devido a otimizações no fluxo do processo 2FA / 2SV.

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

2. Recuperação de dados de feed: download-data

O método de download-data é usado para acessar os dados do feed.

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/

Os parâmetros necessários para esta solicitação são a session_key atual, o device_id de um dos dispositivos da resposta de login e o data_mask , que é uma combinação OR de todos os sinalizadores do módulo de feed em que o usuário está interessado. Você também pode especificar um since data a partir da qual começar a procurar dados.

Supondo que a chave da API do cliente seja válida para todos esses módulos, o método retornará os dados solicitados no formato JSON.

Enviando um pedido de feed válido

Se os valores passados para o método forem válidos, ele retornará o conteúdo do feed no corpo da resposta HTTP.

HTTP/1.1 200 OK

Envio de uma solicitação de feed com parâmetros ausentes

Se um dos parâmetros necessários estiver faltando, o método retornará um código de resposta de solicitação inválido.

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

Envio de uma solicitação de feed com parâmetros inválidos

Se um valor inválido ou mal formatado for enviado para qualquer parâmetro, o método retornará um código de resposta de solicitação incorreto.

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

Exemplos de sinalizadores de módulo de feed

Os seguintes sinalizadores de módulo podem ser mascarados juntos para o parâmetro de mask do método de download-data . Isto não é uma lista exaustiva.

  • 0000000000001 Mensagens
  • 0000000000002 Fotos e vídeos
  • 0000000000004 Histórico do Navegador
  • 0000000000008 Histórico de chamadas
  • 0000000000016 Contatos
  • 0000000000032 Aplicativos instalados
  • 0000000000256 Localização (ao vivo)
  • 0000000000512 Mensagens WhatsApp
  • 0000000001024 mensagens do Skype
  • 0000000002048 Calendário
  • 0000000004096 Mensagens de linha
  • 0000000008192 mensagens Kik
  • 0000000016384 Mensagens Viber
  • 0000000032768 mensagens do Facebook
  • 0000000065536 Mensagens WeChat
  • 0000000131072 Mensagens Snapchat
  • 0000000262144 Lista de arquivos
  • 0000000524288 Histórico do navegador (ao vivo)
  • 0000001048576 Histórico de chamadas do WhatsApp
  • 0000002097152 Histórico de chamadas do Viber
  • 0000004194304 Uso do aplicativo
  • 0000008388608 Notas
  • 0000033554432 HealthKit
  • 0000067108864 HealthKit apenas para etapas
  • 0000134217728 Cookies do Safari
  • 0000268435456 contatos do Kik
  • 0000536870912 contatos Viber
  • 0001073741824 conversas Viber
  • 0002147483648 Histórico de chamadas (vivo)
  • 0004294967296 Locais
  • 0008589934592 Hike messages
  • 0017179869184 Histórias do Snapchat
  • 0034359738368 Correio de voz
  • 0068719476736 Gravações
  • 0137438953472 Vídeos
  • 0274877906944 Fotos e vídeos (ao vivo)
  • 0549755813888 Mensagens Tinder
  • 1099511627776 Relógios da Apple
  • 2199023255552 caminhada
  • 4398046511104 Contatos (ao vivo)
  • 8796093022208 Informação da conta

Por exemplo, para solicitar um feed de mensagens, histórico de chamadas e histórico do navegador, a máscara seria 1 + 4 + 8 = 13 .

Formatos de feed JSON

Os feeds JSON são projetados para serem tão simples quanto possível. O feed retornará todos os tipos de dados solicitados em uma única resposta.

Cada módulo de feed especificado no flag do módulo terá sua própria chave no dicionário JSON de nível superior que é retornado.

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

3. Recuperação de arquivos brutos: download-file

O método de download-file está disponível para o download de anexos de mensagens ou o download direto de arquivos mais esotéricos do 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

Os parâmetros necessários são a session_key , o target device_id e o file_id . A solicitação acima fará o download do arquivo e armazenará o caminho especificado para curl com a opção -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.

Enviando uma solicitação de arquivo válida

Se os valores passados para o método forem válidos, ele retornará o conteúdo do arquivo binário no corpo da resposta HTTP.

HTTP/1.1 200 OK

Enviando uma solicitação de arquivo para um arquivo inexistente

Se um arquivo não estiver presente no iCloud, ou não pudermos recuperá-lo do terceiro apropriado, o método ainda retornará com sucesso, mas o corpo da mensagem estará vazio.

HTTP/1.1 200 OK

Enviando uma solicitação de arquivo após a expiração da sessão

Se a sessão expirou, os clientes receberão um código de resposta de solicitação incorreto.

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

Exemplo de file_id s

Chaves hash comuns associadas a aplicativos para acesso direto a arquivos incluem o seguinte.

  • 3d0d7e5fb2ce288813306e4d4636395e047a3d28 SMS
  • 1b6b187a1b60b9ae8b720c79e2c67f472bab09c0 WhatsApp
  • 1c6a49018bcace96656e4fe8f08d572ce071b92c WhatsApp
  • 7c7fba66680ef796b916b067077cc246adacf01d WhatsApp
  • b39bac0d347adfaf172527f97c3a5fa3df726a3a Viber
  • 8e281be6657d4523710d96341b6f86ba89b56df7 Kik
  • ff1324e6b949111b2fb449ecddb50c89c3699a78 Ligações
  • a49bfab36504be1bf563c1d1813b05efd6076717 Ligações
  • 2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca Ligações
  • 5a4935c78a5255723f707230a451d79c540d2741 Ligações
  • 12b144c0bd44f2b3dffd9186d3f9c05b917cee25 Fotos
  • adb8c77534444e97c31ff15924d50f3ed1fbd3b1 Contatos
  • 2041457d5fe04d39d0ab481178355df6781e6858 Compromissos
  • 3ecf3efff3a55d6155efce2828579e8a3cd881c1 Histórico de navegação
  • cd89f9e10d3497912bfc92e5dc674ca989cfdd44 Histórico de navegação
  • Linha 2d711a1f5613f5259730b98328a3f7e816698f88

Alguns aplicativos do messenger - como o Skype, o Facebook Messenger e o WeChat - variam a dependência do file_id da conversa.

4. Atualizando o login de uma conta usando tokens de autenticação

O auth_token é um token de login com a Apple. Ele dura pelo menos um dia e é atualizado quando uma solicitação é feita ao ponto de extremidade da refresh-session na API. Uma pesquisa diária para o terminal de refresh-session é tudo o que é necessário para persistir esse token.

Como o terminal de refresh-session precisa apenas do auth_token como entrada e retorna a lista de dispositivos mais uma nova chave de sessão, ele pode ser usado para iniciar uma nova sessão na API sem a necessidade de efetuar login na conta novamente. Isto é especialmente útil para as contas 2FA / 2SV habilitados como o processo de autenticação só precisa ser concluída para a inicial sign-in pedido.

Para usá-lo, é preciso usar o campo auth_token recuperado durante o login. Isso deve ser enviado para o terminal de refresh-session .

O parâmetro auth_token é retornado da solicitação de sign-in inicial e deve ser usado no terminal de refresh-session .

Recomendamos também incluir a account parâmetro opcional na solicitação, pois isso nos ajuda a monitorar a solicitação em todo o nosso sistema. O valor desse parâmetro é simplesmente o nome de usuário da conta do iCloud do usuário.

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

Enviando um token de autenticação inválido

Se o token não for válido, o nó de extremidade retornará um código de solicitação inválido.

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

Enviando um token de autenticação válido

A resposta será semelhante ao ponto de extremidade de login: uma chave de sessão recém-criada e a lista atualizada de dispositivos com todos os metadados necessários para identificar cada um. Pode-se usar a nova sessão para continuar puxando dados.

HTTP/1.1 200 OK

5. Exclusão dos arquivos do iCloud Photo Library: delete-file

O método delete-file está disponível para excluir fotos da iCloud Photo Library. Aceita file , key e um sinalizador 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/

O parâmetro file conterá o ID da foto (recuperável através do feed web_photos ) e o flag permanent controla se o arquivo será apagado ou apagado. Se estiver definido como False , a solicitação fará com que o arquivo seja movido para o álbum de fotos "Excluído recentemente" (conhecido como exclusão temporária). Por outro lado, se estiver configurado como True , a solicitação removerá o arquivo do álbum "Recentemente excluído" e fará com que ele seja excluído permanentemente (conhecido como exclusão real).

Eliminação suave bem sucedida

Se a exclusão suave foi bem-sucedida, a foto será movida para o álbum "Recentemente excluído" e ela retornará uma mensagem de sucesso.

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

Eliminação difícil bem sucedida

Se a exclusão for bem-sucedida, a foto será removida dos dispositivos associados quando esses dispositivos forem sincronizados com o iCloud. No entanto, devido à técnica usada, os arquivos excluídos permanentemente podem ser descobertos e baixados da API do iCloud Photo da Reincubate por um tempo indeterminado. Esse comportamento pode ser usado para excluir arquivos não listados.

Por favor, note que, para um arquivo ser deletado, ele deve ter sido deletado primeiro.

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

Falha na exclusão suave ou difícil

Se a solicitação falhar, retornará uma resposta de erro.

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

Acelerando os downloads com o SDK nativo

Para downloads de arquivos altamente paralelizados, oferecemos um C ++ SDK que permite aos clientes baixar e descriptografar arquivos localmente, evitando a sobrecarga (mas perdendo a conveniência) do ponto final do download-file . Este SDK está disponível para Linux (Ubuntu 12.04, Ubuntu 14.04, Debian Jessie) e Windows.

Está integrado com o restante do fluxo de trabalho da API.

Transferências

Os usuários podem carregar a biblioteca atual e chamar o DownloadFiles , o entrypoint do SDK, que possui a seguinte assinatura:

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)

Com essas definições de retorno de chamada externas:

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

Os parâmetros são:

  • clientID O ID do cliente da API.
  • clientKey A chave do cliente da API.
  • sessionKey Chave de sessão atual.
  • deviceID ID do dispositivo alvo.
  • fileIDs Matriz de file_ids necessários.
  • fileIDs_count Comprimento da matriz fileIDs .
  • targetDir Diretório de saída onde os arquivos serão baixados.
  • progFunc retorno de chamada progress do progFunc , que é chamada toda vez que uma atualização de progresso é feita.
  • progParam Parâmetro personalizado que pode ser passado para o retorno de chamada do progFunc .
  • getErrorBuffer Esta função de retorno de chamada deve retornar um buffer que conterá os erros ocorridos durante o download.

Após o término do download, os IDs dos arquivos solicitados estarão na pasta designada por targetDir .

Versões mais antigas do SDK

Em versões mais antigas, o ponto de entrada DownloadFiles tinha uma assinatura ligeiramente 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)

O parâmetro adicional é:

  • getReplyBuffer Semelhante a getErrorBuffer , essa função de retorno de chamada é responsável por retornar um buffer válido no qual o método DownloadFiles pode gravar. Nesse caso, esse buffer conterá a resposta com um status final do download.

Desativação e reativação de conta e 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/
Reativação de conta
CURL_CALL --data-urlencode "account=ACCOUNT_ID"
          https://api.icloudextractor.com/c/client-management/activation/
Desativação de dispositivos
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/deactivation/
Reativação de dispositivos
CURL_CALL --data-urlencode "device=DEVICE_ID"
          https://api.icloudextractor.com/c/client-management/activation/

Enviando um pedido válido

Se os valores passados para o método de desativação de conta forem válidos, ele retornará uma mensagem no corpo da resposta HTTP.

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

No caso de um usuário solicitando que um dispositivo seja desativado, uma mensagem semelhante é retornada no corpo da resposta HTTP:

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

Enviando uma solicitação com credenciais inválidas

Se o usuário fizer uma solicitação para desativar ou reativar uma conta com um account_id inválido ou um device_id inválido, ou se o account_id ou device_id não estiver associado ao usuário, ele retornará um HTTP 400.

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

Um erro e uma mensagem semelhantes são retornados por account_id inválido ou por account_id que não é associado ao usuário.

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

Repetindo uma solicitação

Se um usuário solicitar que um dispositivo ou uma conta seja desativada ou reativada quando já existir nesse estado, uma mensagem será retornada no corpo da resposta HTTP, informando ao usuário que o device_id ou account_id solicitado já está no estado solicitado:

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

Uma mensagem semelhante é mostrada no caso de uma solicitação repetida de desativação e reativação do dispositivo e reativação da conta.

Solicitando dados para uma conta ou dispositivo desativado

Se um usuário solicitar dados de uma conta ou dispositivo que tenha sido desativado, o HTTP 403 será:

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

Novamente, uma mensagem semelhante é dada no caso de solicitar dados de uma conta desativada.

O feed retorna uma mensagem: "Entre em contato com enterprise@reincubate.com para acessar esses dados"

Esta mensagem será retornada quando a chave de demonstração for usada. Entre em contato conosco para obter uma chave de avaliação com acesso a mais dados. Se você já tem uma chave de teste, está especificando corretamente na implementação do cliente?

Estou tentando extrair o arquivo de banco de dados de um aplicativo por file_id mas não estou recebendo nenhum dado de volta

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.

No entanto, às vezes, os autores de aplicativos alteram o nome do arquivo no qual armazenam dados (e às vezes a Apple o faz em novas versões do iOS). É por isso que, por exemplo, existem vários file_id s diferentes para examinar ao obter dados do WhatsApp. Esses file_id s podem ser alterados sempre que um aplicativo é atualizado.

Recomenda-se que os usuários coloquem feeds JSON em vez de trabalhar com arquivos e manipulá-los diretamente. Usando os feeds, não é preciso se preocupar com a eficácia do SQL, da análise de PList ou do undeletion, e os feeds são mais rápidos e muito mais simples de se trabalhar.

Estou recebendo erros de limitação de taxa do servidor

Os limites de taxa da API são solicitados em uma janela de 15 minutos, e esse limite é configurado por chave. A maioria das chaves é limitada por motivos de segurança.

Os clientes da API recebem dados sobre seu uso em relação aos limites nas respostas do cabeçalho HTTP que recebem. Essas respostas usam os seguintes cabeçalhos:

  • X-Rate-Limit-Limit O número de solicitações permitidas em uma janela de 15 minutos.
  • X-Rate-Limit-Remaining O número de solicitações restantes na alocação da janela atual.
  • X-Rate-Limit-Reset O tempo restante até a atual janela de limite de taxa terminar, em milissegundos.

Veja um exemplo de conjunto de cabeçalhos ativos de uma chave em um limite de taxa de solicitação de 1.000.

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

Se o limite de taxa for atingido, o servidor responderá com:

HTTP/1.1 429 TOO MANY REQUESTS

O servidor incluirá os três cabeçalhos de limite de taxa nessa resposta.

O comportamento correto do cliente é aguardar a passagem da duração especificada por X-Rate-Limit-Reset , ponto no qual X-Rate-Limit-Remaining será redefinido.

Recebi um email sobre o acesso remoto à conta do iCloud que acessei

A consulta dos módulos de feeds ao vivo herdados (conforme observado acima na seção de sinalizadores de módulo de feed de amostra) pode acionar um email sendo enviado para o endereço associado a essa conta do iCloud. Observe que isso ocorre apenas para os módulos de alimentação ao vivo herdados e não para os módulos de produção.

Como podemos ajudar?

Nossa equipe de suporte está aqui para ajudar!

Nosso horário de atendimento é de segunda a sexta, das 9h às 17h GMT. A hora é atualmente 7:37 AM GMT.

Nosso objetivo é responder a todas as mensagens dentro de um dia útil.

Vá para a seção de apoio › Entre em contato com a equipe da empresa ›
Nossa equipe de suporte incrível

Podemos melhorar este artigo?

Adoramos ouvir os usuários: por que não nos enviar um e-mail, deixar um comentário ou twittar? @reincubate?

© 2008 - 2019 Reincubate Ltd. Todos os direitos reservados. Registrado na Inglaterra e no País de Gales #5189175, VAT GB151788978. Reincubate® é uma marca registrada. Privacidade e Termos. Recomendamos 2FA. Construído com em Londres.