> This page is for Plataforma, version Herdado.
> For other versions, use one of these documentation indexes:
> - V4 (default): https://next.developer.frame.io/platform/v4/llms.txt
> - V4 experimental: https://next.developer.frame.io/platform/v4-experimental/llms.txt
> - Herdado: https://next.developer.frame.io/platform/v2/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://next.developer.frame.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://next.developer.frame.io/_mcp/server.

# Coletar todos os comentários de um projeto

## Visão geral




O extrator de comentários recuperará todos os ativos de um projeto, extrairá os comentários e os exportará para um arquivo .csv.Este tutorial usa os seguintes recursos:



* [SDK do Python](https://github.com/Frameio/python-frameio-client) — O SDK cuida da paginação para você e configura um cliente que você pode usar com tokens de desenvolvedor (autenticação bearer).
* [Extrator de comentários em Python](https://github.com/Frameio/comment-scraper-python) — O exemplo de código que estamos usando está aqui.




### Experimentar no Glitch

O Glitch é uma ferramenta simples que permite que você configure seus próprios aplicativos e os teste e execute usando os servidores deles.Se você não estiver familiarizado com o Glitch, confira nosso guia sobre [Como usar o Glitch](/other-tools/using-glitch).Se você quiser ver o extrator de comentários em ação em um servidor, temos um aplicativo Flask configurado no [Glitch](https://glitch.com): [Extrator de comentários do Frame.io em Python](https://glitch.com/~frameio-comment-scraper).

### Escopos obrigatórios




Antes de começar este guia, você precisará se certificar de que possui um token que inclua, no mínimo, os seguintes escopos:




| Escopo | Motivo |
| ---------- | ---------- |
| **Projetos:** Leitura | Não é estritamente obrigatório, mas é necessário para obter o `root_asset_id` de um projeto. |
| **Ativos:** Leitura | Necessário para navegar pelos `asset_ids` via API |
| **Comentários:** Leitura | Necessário para recuperar os próprios comentários. |




### 1. Preparar seu aplicativo

Este guia seguirá um padrão semelhante ao de [Como ler a árvore de arquivos](/workflows-assets/reading-the-file-tree). Portanto, para começar, você precisará de:
* O `root_asset_id` do projeto que você está rastreando
* Seu [Token de desenvolvedor](/authentication/developer-tokens)

Você também vai precisar importar o `FrameioClient` para o seu aplicativo em Python, bem como algumas bibliotecas auxiliares adicionais:

**`Python`**

```python title="Python"
from frameioclient import FrameioClient
import requests, json, csv, itertools

ROOT_ASSET_ID = "<ROOT_ASSET_ID>"
TOKEN = "<DEV_TOKEN>"
```





### 2. Rastrear o projeto




Agora, você precisará recuperar recursivamente todos os ativos, verificar se eles contêm comentários e armazenar todos os ativos com comentários em uma lista a partir da qual você poderá criar seu arquivo .csv.





À medida que rastreia o projeto, você precisará realizar as seguintes verificações em cada ativo:



* O ativo é um arquivo?(`&quot;_type&quot;: &quot;file&quot;`).

* Se for um arquivo, ele possui comentários?* **Se sim, recupere-os e adicione-os à sua lista.**
* O ativo é uma pasta?(`&quot;_type&quot;: &quot;folder&quot;`)

* **Se for uma pasta, faça uma pesquisa recursiva em suas tarefas derivadas.**
* O ativo é uma pilha de versões?(`&quot;_type&quot;: &quot;version_stack&quot;`)

* **Se for uma pilha de versões, obtenha todas as tarefas derivadas e verifique se há comentários.**

**`Python`**

```python title="Python"
def all_comments(client, asset_id, comment_list):
    files = client.get_asset_children(asset_id)

    for asset in files:
        if asset['type'] == "file":
            if asset['comment_count'] > 0:
                asset_parent_id = asset['parent_id']
                asset_name = asset['name']
                comments = client.get_comments(asset['id'])
                my_comment_list = [comment for comment in comments.results]
                for object in my_comment_list:
                    object.update({'parent_id':asset_parent_id})
                    object.update({'name':asset_name})
                comment_list.append(my_comment_list)

        if asset['type'] == "folder":
            if asset['item_count'] > 0:
                all_comments(client, asset['id'], comment_list)

        if asset['type'] == "version_stack":
            asset_name = asset['name']
            parent_id = asset['parent_id']
            vfiles = client.get_asset_children(asset['id'])

            for asset in vfiles.results:
                asset_name = asset['name']
                parent_id = asset['parent_id']
                if asset['type'] == "file":
                    if asset['comment_count'] > 0:
                        comments = client.get_comments(asset['id'])
                        my_comment_list = [comment for comment in comments.results]
                        for object in my_comment_list:
                            object.update({'parent_id':parent_id})
                            object.update({'name':asset_name})
                        comment_list.append(my_comment_list)

def get_all_project_comments(root_asset_id, token):
    comment_list = []
    client = FrameioClient(token)

    all_comments(client, root_asset_id, comment_list)

    return comment_list
```




<Info title="Não se esqueça de paginar">
  O exemplo acima ignora a paginação, mas, ao navegar por coleções grandes, você não deve fazer isso!Consulte nosso guia de [Conceitos principais](/getting-started/key-concepts#pagination) para referência.
</Info>


### 3. Simplificar sua lista de comentários




A menos que você já tenha feito isso durante o rastreamento, é recomendável simplificar sua lista para facilitar o processamento.





**`Python`**

```python title="Python"
# The response list comes back as a list of lists.
# Flatten out responses to a single list so you can build your .csv file.

flat_response_list = list(itertools.chain.from_iterable(responses))
```





### 4. Filtre a lista e crie seu arquivo .csv




Quando sua lista estiver simplificada, você pode usar a compreensão de lista para extrair os elementos de cada comentário que considerar úteis e depois exportá-los para um arquivo .csv.Recomendamos incluir, no mínimo:



* Comentário — `text`
* ID principal — `parent_id`
* ID do ativo — `asset_id`
* Nome do ativo — `name`
* ID do proprietário — `owner_id`
* Email do proprietário — `owner.email`
* Carimbo de data e hora — `timestamp`
* Atualizado em — `updated_at`




Depois de criar uma nova lista contendo os dados que você deseja para cada ativo na sua saída final, é hora de gravar no seu arquivo .csv.





**`Python`**

```python title="Python"
list_for_csv = [[o['text'], o['parent_id'], o['asset_id'], o['name'], o['owner_id'], o['owner']['email'], o['timestamp'], o['updated_at']] for o in flat_response_list]

# Let's write our new list out to a .csv file. We'll add a heading.
with open("output.csv", 'w') as myfile:
     wr = csv.writer(myfile, dialect='excel')
     wr.writerow(['Comment', 'Parent ID', 'Asset ID', 'Asset Name', 'Owner ID', 'Email', 'Timestamp', 'Updated At'])
     wr.writerows(list_for_csv)
```





E pronto!Agora você tem um arquivo .csv com os comentários simplificados de todo um projeto do Frame.io.