# CLI Examples

Esta prática demonstra como brincar com a API de conteúdo em um terminal. Usaremos a instância da Decentraland Foundation em `peer.decentraland.org`, e tudo o que você precisa é o `curl` ferramenta de linha de comando.

{% hint style="info" %}
Você pode usar [`httpie`](https://github.com/httpie/httpie) ou formatar respostas com [`jq`](https://github.com/stedolan/jq) para obter JSONs mais legíveis a cada solicitação. Neste guia, mostraremos documentos formatados para maior clareza.
{% endhint %}

Isto é o que faremos:

1. Consultar o status do servidor de conteúdo.
2. Localize e baixe um [snapshot](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) com uma lista de entidades.
3. Obtenha o manifesto de uma entidade.
4. Baixe um dos arquivos da entidade.

Vamos começar consultando o status do servidor usando `/about`:

```bash
curl "https://peer.decentraland.org/about"
```

```js
{
  "healthy": true,
  "content": {
    "healthy": true,
    "version": "6.5.0",
  },
  // ... mais informações do servidor (feature flags, versões, caminhos, etc.)
}
```

Parece que o servidor está ativo e funcionando normalmente (`"healthy": true`), e está nos dando informações sobre a versão que implementa para cada conjunto de recursos, além de algumas opções de configuração da instância.

Estamos interessados em baixar algum conteúdo, então vamos explorar os [snapshots](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) para obter alguns identificadores via `/content/snapshots`.

```bash
curl "https://peer.decentraland.org/content/snapshots"
```

```js
[
  {
    "hash": "bafybeia6qoum64psaooiqo3f45i6hykfwx723uc236waub3gng2naof224",
    "timeRange": {
      "initTimestamp": 1689120000000,
      "endTimestamp": 1689206400000
    },
    "replacedSnapshotHashes": [],
    "numberOfEntities": 981,
    "generationTimestamp": 1689219353866
  },
  // ...mais arquivos de snapshot
]
```

Cada item no array descreve um [snapshot](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md). Vamos pegar um `hash` e baixar o arquivo do `/content/contents` endpoint.

```bash
curl "https://peer.decentraland.org/content/contents/bafybeia6qoum64psaooiqo3f45i6hykfwx723uc236waub3gng2naof224" > snapshot
```

{% hint style="info" %}
Você pode experimentar snapshots maiores, como no [exemplo avançado em python](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots.py). Para testar isso interativamente, provavelmente você vai querer um dos menores.
{% endhint %}

Podemos verificar que baixamos o arquivo correto em um formato que conhecemos, olhando a primeira linha:

```bash
head -n1 snapshot
```

```
### Decentraland json snapshot
```

Ótimo! Agora temos um resumo local de todas as entidades capturadas nesse snapshot. Vamos pegar a primeira listada (a segunda linha do arquivo), um `perfil`:

```bash
tail -n+2 snapshot | head -n1 
```

```js
{
  "entityId": "bafkreif7hjremkxlvixyxoxnoo7bdcnf7qqp245sjb2pag2nk3n6o6yc4c",
  "entityType": "profile",
  "pointers": [
    "0x271cdb3b1c792c336c4b2bdc52c4f415d0046b92"
  ],
  "authChain": [
    // Veja https://docs.decentraland.org/contributor/auth/authchain/
  ],
  "entityTimestamp": 1689120135624
}
```

{% hint style="info" %}
Como snapshots expiram e entidades são substituídas, os identificadores neste artigo não funcionarão. Acompanhe no seu terminal para obter IDs de arquivos reais e ativos.
{% endhint %}

Esta é uma informação que poderíamos salvar. Usaremos o `entityId` para baixar o manifesto JSON da entidade, mas persistir os [pointer](https://github.com/decentraland/docs/blob/main/contributor/practice/pointers/README.md) listados é uma boa ideia se quisermos localizar esta entidade e quaisquer versões atualizadas no futuro.

Também temos o [auth\_chain](https://github.com/decentraland/docs/blob/main/contributor/entities/README.md#ownership) usado para assinar esta entidade, e poderíamos validar as assinaturas listadas para verificar a autenticidade de quaisquer arquivos relacionados que baixarmos.

Vamos obter o manifesto da entidade. Lembre-se, o `entityId` é o [file identifier](https://github.com/decentraland/docs/blob/main/contributor/practice/\(filesystem/README.md#identifiers\)) de que precisamos, e podemos usar o `/content/contents` endpoint novamente:

```bash
curl "https://peer.decentraland.org/content/contents/bafkreigcreq7rv6b2wf4zc4fsnif43ziwb4q46v4qhsewpf7gbsyxew3om"
```

```js
{
  "version": "v3",
  "type": "profile",
  "pointers": [
    "0x273cdb3b1c791c336c4b2bcc52c4f415d0046b91"
  ],
  "timestamp": 1689120135624,
  "content": [
    {
      "file": "body.png",
      "hash": "bafybeibzaqkirz7fk474xvyhurho5xviphs7anawaceb6gscuigia4x33u"
    },
    // ...mais arquivos
  ],
  "metadata": {
    // ...avatars e outras informações
  }
}
```

Esta `perfil` entidade tem todas as informações que os World Explorers usam para renderizar e animar um jogador. Se estivermos interessados em obter um dos arquivos empacotados, podemos continuar a usar o `/content/contents` endpoint.

Se olharmos o campo `content` , podemos ver o `hash` do arquivo internamente chamado `body.png`. Vamos pegá-lo:

```bash
curl "https://peer.decentraland.org/content/contents/bafybeibzaqkirz7fk474xvyhurho5xviphs7anawaceb6gscuigia4x33u" > body.png
```

Podemos abrir este `png` arquivo em um visualizador de imagens ou navegador web e conferir o trabalho do autor. Legal!
