Pular para o conteúdo
Decoding Chat API

Extrações de dados

Uma extração de dados (data harvest) é um arquivo ZIP contendo os dados da conta atual. O Decoding Chat a compila em segundo plano, relata o progresso durante a execução e emite uma URL de download temporária assim que o arquivo é gravado.

Todas as rotas, exceto Download data harvest archive, são exclusivas para usuários. O Decoding Chat rejeita um bot ou credencial de portador (bearer) OAuth2 com 403 ACCESS_DENIED, e uma conta que possui sinalizadores de atividade suspeita com 403 ACCOUNT_SUSPICIOUS_ACTIVITY. Nenhuma rota aqui requer o modo sudo. A rota Delete current user’s messages aceita o mesmo formato de filtro, destrói as mensagens e o exige.

Use status para acompanhar a preparação do arquivo.

ValorDescrição
pendingNenhuma tentativa de processamento foi iniciada
processingUma tentativa começou e não foi concluída nem falhou
completedO arquivo foi gravado e está pronto para download
failedA tentativa mais recente registrou uma falha

O Decoding Chat tenta novamente a tarefa subjacente. Uma nova tentativa limpa failed_at e error_message, define started_at novamente, zera o progresso relatado para 0 e relata processing enquanto está em execução. Em caso de sucesso, registra completed_at, file_size e um prazo de download, e relata completed.

A confirmação retornada por ambas as operações de criação.

CampoTipoDescrição
harvest_idsnowflakeO ID da extração criada
status1stringO status da extração na criação
created_at2timestamp ISO8601Quando a extração foi solicitada

1 Sempre pending

2 Registrado no mesmo momento em que o snowflake é gerado, portanto, ordenar as extrações por ID é o mesmo que ordená-las por created_at

O estado completo de uma extração. Ele estende o objeto de criação da extração com campos de progresso e conclusão.

CampoTipoDescrição
harvest_idsnowflakeO ID da extração
statusstringO status da extração derivado
created_attimestamp ISO8601Quando a extração foi solicitada
started_at1?timestamp ISO8601Quando a tentativa de processamento atual começou, ou null enquanto a extração estiver pendente
completed_at?timestamp ISO8601Quando o arquivo foi gravado, ou null quando não foi
failed_at2?timestamp ISO8601Quando a tentativa mais recente registrou falha, ou null quando não houve falha
file_size3?stringO tamanho do arquivo em bytes como uma string decimal, ou null antes do arquivo ser gravado
progress_percent4numberProgresso de 0 a 100
progress_step5?stringO etapa de progresso da extração para o estágio atual
error_message6?stringA descrição da falha da tentativa mais recente, ou null quando não tiver falhado
download_url_expires_at7?timestamp ISO8601Quando o prazo de download do arquivo expira, ou null antes da conclusão
expires_at8?timestamp ISO8601Quando o prazo de download do arquivo expira, ou null antes da conclusão

1 Uma nova tentativa de processamento substitui este timestamp, redefine progress_percent para 0 e define progress_step como Starting harvest

2 Limpo quando uma nova tentativa começa, de modo que é não-nulo apenas quando a tentativa mais recente falhou

3 Uma string decimal porque o valor é de 64 bits

4 Cada valor registrado é um número inteiro. Ele nunca diminui dentro de uma mesma tentativa, e a conclusão o define para exatamente 100

5 Todo registro é criado com a etapa Queued, então este membro nunca é nulo

6 A forma em string da falha subjacente. É para diagnóstico e não é estável para correspondência programática

7 Registrado quando o arquivo é gravado, exatamente sete dias após esse momento. Depois disso, o Decoding Chat não emite uma nova URL de download

8 Um segundo nome para download_url_expires_at. O valor armazenado é o mesmo

Um rótulo curto em inglês que descreve o estágio atual. Todos os valores são fixos, exceto o rótulo de mensagens extraídas, que inclui a contagem de mensagens.

ValorDescrição
QueuedRegistrado quando o registro da extração é criado, com progresso 0
Starting harvestRegistrado quando uma tentativa de processamento começa, com o progresso redefinido para 0
Harvesting messagesA coleta de mensagens foi iniciada, com progresso 5
Harvested N messages1A coleta de mensagens foi concluída, onde N é a contagem decimal exata coletada
Collecting user metadataOs dados da conta estão sendo coletados, com progresso 60
Downloading attachments and creating archiveO arquivo ZIP está sendo gravado, com progresso 65
CompletedO arquivo está pronto, com progresso 100

1 Ignorado quando nenhuma mensagem é coletada

Uma URL de download emitida e sua expiração declarada.

CampoTipoDescrição
download_url1stringA URL temporária de download do arquivo (1-2048 caracteres)
expires_at2timestamp ISO8601Sete dias após esta resposta ter sido gerada

1 Resolve para um único objeto ZIP servido como application/zip

2 Exatamente sete dias após a emissão, mesmo quando o prazo do próprio arquivo termina antes

Uma URL apontando para Download data harvest archive ainda para de resolver no prazo do próprio arquivo, então a expiração declarada nela pode durar mais do que o ponto em que ela para de funcionar.

O filtro escolhe quais mensagens uma extração coleta. Todas as seções não relacionadas a mensagens do arquivo são incluídas independentemente do que o filtro determinar.

CampoTipoDescrição
scope?1stringQual conjunto de contextos a extração segmenta, seja selected ou inaccessible_only (padrão selected)
include_dms?booleanSe deve incluir mensagens diretas um-para-um que o autor da chamada ainda tem abertas (padrão true)
include_dms_closed?2booleanSe deve incluir mensagens diretas um-para-um que o autor da chamada fechou (padrão true)
include_group_dms?booleanSe deve incluir DMs em grupo das quais o autor da chamada ainda é membro (padrão true)
include_guilds?booleanSe deve incluir canais de texto em servidores (guilds) dos quais o autor da chamada é membro (padrão true)
guild_filter_mode?3stringComo a lista de servidores é lida, seja exclude ou include_only (padrão exclude)
excluded_guild_ids?array[snowflake]Os servidores para omitir no modo exclude (máx. 500, padrão vazio)
included_guild_ids?array[snowflake]Os únicos servidores a incluir no modo include_only (máx. 500, padrão vazio)
start_date?4?timestamp ISO8601Limite inferior inclusivo nos timestamps de mensagens, ou null para sem limite inferior
end_date?4?timestamp ISO8601Limite superior exclusivo nos timestamps de mensagens, ou null para sem limite superior

1 O escopo selected requer que pelo menos um dos campos de inclusão seja verdadeiro (true), e um corpo que os desabilite todos é rejeitado no caminho include_dms

2 Independente de include_dms, portanto, definir include_dms como falso e include_dms_closed como verdadeiro direciona apenas para conversas fechadas

3 As listas de servidores são lidas apenas quando include_guilds for verdadeiro e o escopo for selected, e a lista que não corresponde ao modo é ignorada

4 Comparado com o tempo de criação embutido no snowflake da mensagem, então a edição de uma mensagem antiga não a move para uma janela posterior

No escopo selected, cada contexto tem sua própria condição:

  • Uma mensagem direta um-para-um é coletada quando a conversa ainda está aberta e include_dms é verdadeiro, ou quando foi fechada e include_dms_closed é verdadeiro.
  • Um DM em grupo é coletado apenas enquanto o autor da chamada ainda for um destinatário e include_group_dms é verdadeiro.
  • Um canal de servidor é coletado apenas enquanto o autor da chamada ainda for um membro, include_guilds é verdadeiro e o servidor for admitido pelo modo de lista configurado.

O escopo inaccessible_only seleciona mensagens em servidores dos quais o autor da chamada saiu ou foi removido e em DMs em grupo que o autor da chamada abandonou. Ele nunca seleciona mensagens diretas um-para-um e ignora as opções, o modo de filtro de servidor e as duas listas de servidores.

Ambos os escopos excluem o canal de anotações pessoais do autor da chamada, e ambos excluem uma mensagem cujo canal não é mais resolvido ou não é nem uma mensagem direta, um DM em grupo nem um canal de servidor.

Fornecer ambos os limites de data exige que start_date seja estritamente anterior a end_date. Um par igual ou invertido é rejeitado no caminho end_date.

POST/v1/users/@me/harvest

Cria uma extração não filtrada da conta. Retorna um objeto de criação de extração em caso de sucesso.

A operação não recebe corpo na solicitação e sempre retorna antes que o arquivo exista, de modo que o autor da chamada deve consultar Get data harvest status ou Get latest data harvest usando o ID retornado.

StatusCorpoCondição
200objeto de criação de extraçãoA solicitação de extração foi aceita
404resposta de erroA conta autenticada não é mais resolvida e a requisição retorna UNKNOWN_USER
500resposta de erroO registro da extração não pôde ser gravado ou o trabalho não pôde ser enfileirado

Um registro de extração é criado com um novo snowflake, o horário da solicitação como created_at, progresso 0, a etapa Queued, e todos os outros timestamps nulos. Criar uma extração não remove nenhum registro anterior e não impõe limite de quantas uma conta pode reter, então o bucket de rotas é o único limite.

O Decoding Chat prepara o arquivo em segundo plano. Ele contém:

  • user.json, o documento da conta, incluindo conexões com seus identificadores, configurações de visibilidade e datas de verificação, mas nenhuma credencial
  • um arquivo channels/{channel_id}/messages.json para cada canal que contribuiu com uma mensagem, com suas mensagens ordenadas da mais antiga para a mais nova
  • payments/payment_history.json
  • integrations/oauth.json, as aplicações de propriedade da conta, sem entrada para uma aplicação que ela apenas autorizou
  • account/security.json
  • o avatar e o banner da conta em assets/user/, quando presentes

Metadados de anexo aparecem com sua mensagem e têm o ID do anexo, nome do arquivo, tamanho, tipo de conteúdo, URL do CDN e dimensões em pixels. A URL do CDN é uma URL de anexo de pacote de dados, portanto não expira e ainda lê seu anexo depois que o próprio prazo de sete dias do arquivo expira. Remover o segredo que o assinou é a única coisa que o encerra. Os próprios arquivos de anexo nunca são incluídos.

Cada mensagem de autoria é coletada, sem limite na contagem. Mensagens que não existem mais são omitidas. Outras falhas de leitura falham a tentativa. Após a conclusão, o Decoding Chat tenta enviar uma URL de download por e-mail se a conta tiver um endereço de e-mail e a instância tiver a entrega de e-mail ativada. Essa URL expira sete dias após sua emissão. A falha no e-mail não impede o download de um arquivo concluído.

5 requisições por 30 minutos para cada usuário autenticado, no bucket user:data:harvest compartilhado com Request filtered data harvest.

POST/v1/users/@me/harvest/filtered

Cria uma extração cuja coleta de mensagens é restrita por um filtro. Retorna um objeto de criação de extração em caso de sucesso.

O corpo é um objeto de filtro de mensagens de extração. Todo campo é opcional, então um objeto vazio é aceito e todo valor padrão admite seu contexto. Um corpo de solicitação vazio é lido como um objeto vazio.

StatusCorpoCondição
200objeto de criação de extraçãoA solicitação da extração filtrada foi aceita
400resposta de erroUm campo de filtro falhou na validação, o escopo selected não ativou nenhum contexto, uma lista de servidores excedeu 500 entradas ou os limites de data não eram estritamente crescentes
404resposta de erroA conta autenticada não é mais resolvida e a requisição retorna UNKNOWN_USER
500resposta de erroO registro da extração não pôde ser gravado ou o trabalho não pôde ser enfileirado

Os efeitos colaterais correspondem a Request data harvest, exceto que apenas as mensagens selecionadas pelo filtro são coletadas.

5 requisições por 30 minutos para cada usuário autenticado, no bucket user:data:harvest compartilhado com Request data harvest.

GET/v1/users/@me/harvest/latest

Retorna o objeto de status de extração criado mais recentemente para a conta.

Retorna a extração mais recente, independentemente do status, incluindo uma extração que falhou e que é mais recente que uma concluída.

StatusCorpoCondição
200objeto de status de extração | nullO estado mais recente da extração foi retornado, ou null quando não houver nenhuma

40 requisições a cada 10 segundos para cada usuário autenticado, no bucket user:harvest:latest.

GET/v1/users/@me/harvest/{harvestId}

Retorna um objeto de status de extração pertencente à conta atual.

Uma extração pertencente a outra conta retorna 404 UNKNOWN_HARVEST.

O Decoding Chat não remove nenhum registro de extração, portanto, um ID que foi resolvido uma vez continua a ser resolvido. Um 404 significa que o ID nunca foi emitido para esta conta, e a extração de outra conta nunca é distinguível de uma que nunca existiu.

CampoTipoDescrição
harvestIdsnowflakeO ID da extração
StatusCorpoCondição
200objeto de status de extraçãoO estado da extração foi retornado
404resposta de erroA extração é desconhecida ou pertence a outra conta, retornando UNKNOWN_HARVEST

40 requisições a cada 10 segundos para cada usuário autenticado, no bucket user:harvest:status.

GET/v1/users/@me/harvest/{harvestId}/download

Emite uma URL temporária de download para uma extração concluída. Retorna um objeto de download de extração em caso de sucesso.

O Decoding Chat avalia os casos de rejeição em uma ordem fixa, cada um com seu próprio código. Uma extração desconhecida ou de terceiros resulta em 404 UNKNOWN_HARVEST. Uma extração cuja tentativa mais recente falhou é 400 HARVEST_FAILED. Uma extração sem conclusão registrada ou nenhum arquivo armazenado é 400 HARVEST_NOT_READY. Uma extração além do prazo de download é 400 HARVEST_EXPIRED.

A URL assume uma das formas abaixo. Quando a instância tem downloads de extração pré-assinados (presigned) habilitados, que é o padrão, é uma URL pré-assinada de armazenamento de objetos. Caso contrário, ela aponta para Download data harvest archive nesta API com um parâmetro de consulta token assinado.

CampoTipoDescrição
harvestIdsnowflakeO ID da extração
StatusCorpoCondição
200objeto de download de extraçãoUma URL de download foi emitida
400resposta de erroA extração retorna HARVEST_NOT_READY, HARVEST_FAILED, ou HARVEST_EXPIRED
404resposta de erroA extração é desconhecida ou pertence a outra conta, retornando UNKNOWN_HARVEST
500resposta de erroA URL de download não pôde ser emitida

10 requisições por minuto para cada usuário autenticado, no bucket user:harvest:download.

GET/v1/harvest-downloads/{harvestId}Unauthenticated

Transmite o arquivo de uma extração concluída.

O parâmetro de consulta token emitido por Get data harvest download URL autoriza o download sem uma sessão. Use a URL completa emitida e a mantenha em segredo.

A operação está ativa apenas enquanto a instância tem downloads de extração pré-assinados desabilitados. Essa configuração é habilitada por padrão, portanto, uma implantação padrão responde a todas as solicitações aqui como 404 sem inspecionar o token.

CampoTipoDescrição
harvestIdsnowflakeO ID da extração
CampoTipoDescrição
tokenstringToken de download assinado emitido com a URL de download
CampoTipoDescrição
Range?stringIntervalo de bytes padrão, respondido com 206 e um cabeçalho Content-Range
StatusCorpoCondição
200bytes do arquivoO arquivo completo foi transmitido
206bytes do arquivoO intervalo de bytes solicitado foi transmitido
404Not FoundO token está ausente, inválido ou expirado, a extração não permite download ou a instância emite URLs pré-assinadas no lugar
500resposta de erroO armazenamento de objetos não pôde ser lido

O 200 possui Content-Type: application/zip, Content-Disposition1, Content-Length, Accept-Ranges: bytes e Cache-Control: private, no-store. O 206 possui os cabeçalhos do 200 mais Content-Range. O 404 possui Content-Type: text/plain.

1 Content-Disposition é sempre attachment e nomeia o arquivo fluxer-data-{harvestId}.zip

O arquivo é lido e transmitido. A extração fica inalterada e o token não é consumido, de forma que permanece utilizável até a sua própria validade.

60 requisições por minuto para cada endereço IP do cliente, ou para a conta autenticada quando a solicitação tiver uma credencial resolúvel, no bucket user:harvest:download_file.