# Ejemplos de Python

Esta práctica muestra cómo escribir un programa simple que descarga y analiza algún contenido usando el [snapshots](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) proporcionado por los servidores de contenido.

{% hint style="info" %}
Puedes encontrar el [script completo](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots_mini.py) en GitHub, junto con un [ejemplo más avanzado](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots.py).
{% endhint %}

Usaremos el servidor de la Decentraland Foundation en `peer.decentraland.org`, y Python 3 como nuestro lenguaje de elección.

Esto es lo que haremos:

1. Consultar el estado del servidor de contenido.
2. Seleccionar y descargar un [snapshot](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) con una lista de entidades.
3. Imprimir el tipo y el ID de todas las entidades referenciadas.

Comencemos nuestro script con algunas preparaciones. Usaremos solo módulos de la biblioteca estándar, pero en código real probablemente querrás un cliente HTTP más cómodo (como la [requests](https://github.com/psf/requests) library).

```py
# Hacer una petición HTTP GET, devolver una respuesta HTTP similar a un archivo.
def fetch(path):
    url = f"https://peer.decentraland.org/{path}"
    headers = { "User-Agent": "urllib" } # importante en algunos servidores (si está vacío, 403 Forbidden)

    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)

    return response
```

Nuestro simple ayudante hace una `GET` request, y devuelve el objeto de respuesta similar a un archivo. Nada sofisticado. Usemos esto para llamar al `/about` endpoint y comprobar el estado del servidor:

```py
# Comprobar el estado del servidor:
about = json.load(fetch('about'))

if not about['healthy']:
    print("¡Servidor no saludable!")
    sys.exit(1)
```

Si pasamos este punto, el servidor está activo y en funcionamiento (obtuvimos una `200` response) y reporta estar operativo. Podemos solicitar el conjunto actual de snapshots (que viene en formato de arreglo JSON):

```py
# Obtener la lista de snapshots:
all_snapshots = json.load(fetch('content/snapshots'))
```

Los archivos de snapshot (especialmente para los rangos de tiempo más largos) pueden ser muy grandes. Para un experimento rápido, tomemos el más pequeño de la lista por `numberOfEntities`:

```py
# Tomar el snapshot más pequeño, en términos de entidades incluidas:
snapshot = min(all_snapshots, key=lambda s: s['numberOfEntities'])
```

Para descargar el contenido, necesitamos el `hash` campo de `snapshot`. Obtenemos la URL del archivo agregándolo a la raíz de contenido:

```py
# Solicitar el archivo desde la API de contenido:
response = fetch('content/contents/' + snapshot['hash'])
```

El archivo que seleccionamos es lo suficientemente pequeño para almacenar en memoria, pero finjamos que no lo sabemos y hagámoslo en streaming. La primera línea es el encabezado del snapshot, y cada línea después de esa contiene un objeto JSON.

Comprobar el encabezado siempre es una buena idea:

```py
# Verificar el encabezado del snapshot:
header = response.readline().decode('utf-8').strip()

if header != '### Decentraland json snapshot':
    print("Encabezado de snapshot inválido: " + header)
    sys.exit(1)
```

Ahora podemos procesar todas las entidades en el snapshot, leyendo la respuesta línea por línea. Para nuestros humildes propósitos, *process* significa imprimir el tipo y el ID de la entidad:

```py
# Leer y decodificar todos los ítems, un JSON por línea:
for line in response:
    item = json.loads(line)
    print(item['entityType'], item['entityId'])
```

Este bucle comenzará a hacer streaming, analizar e imprimir líneas como estas hasta que termine con el snapshot:

```
profile bafkreic36qmzyprs6whkpuxbeiif4no6kvdrr2tfpichbx2fzfz5py6eyv
scene bafkreibr5xfujqrp5q3o4s73vm2yljlcp7cucqgugssnarsuclxv4emlmy
profile bafkreid7khr5wnkialba44rsslffi633rh3lvctad5oa5vjoe6wa7s4c5a
wearable bafkreihlqcb7jgubomyidikpwpqhgzbagltk5m4rgbjdvzydxmoka7bg4i
```

¡Salud! Hemos usado el sistema de snapshots para explorar parte del contenido disponible en Decentraland.

Recuerda que puedes encontrar el [script completo](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots_mini.py) en GitHub, junto con un [ejemplo más avanzado](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots.py).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/contributor/contributor-es/contenido/practica/python-examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
