> This page is for Plate-forme, version Hérité.
> For other versions, use one of these documentation indexes:
> - V4 (default): https://next.developer.frame.io/platform/v4/llms.txt
> - V4 expérimental: https://next.developer.frame.io/platform/v4-experimental/llms.txt
> - Hérité: 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.

# Rassembler tous les commentaires d'un Projet

## Vue d'ensemble




L'extracteur de commentaires récupère tous les Assets d'un Projet, extrait les commentaires et les exporte dans un fichier .csv. Cette procédure utilise les ressources suivantes :



* [SDK Python](https://github.com/Frameio/python-frameio-client) - Le SDK gère la pagination pour vous et configure un client que vous pouvez utiliser avec les jetons de développeur (authentification bearer).
* [Extracteur de commentaires en Python](https://github.com/Frameio/comment-scraper-python) - L'exemple de code que nous utilisons se trouve ici.




### Testez-le sur Glitch

Glitch est un outil simple qui vous permet de configurer vos propres Application et de les tester et les exécuter en utilisant leurs serveurs. Si vous ne connaissez pas Glitch, consultez notre Guide sur [l'utilisation de Glitch](/other-tools/using-glitch). Si vous voulez voir l'extracteur de commentaires fonctionner sur un serveur, nous avons configuré une appli Flask sur [Glitch](https://glitch.com) : [Extracteur de commentaires Frame.io en Python](https://glitch.com/~frameio-comment-scraper).

### Portées requises




Avant de commencer ce Guide, vous devez vous assurer d'avoir un jeton qui inclut au moins les portées suivantes :




| Portée | Raison |
| ---------- | ---------- |
| **Projets :** Lecture | Pas strictement requis, mais nécessaire pour récupérer le `root_asset_id` d'un Projet. |
| **Assets :** Lecture | Nécessaire pour naviguer dans les `asset_ids` via API |
| **Commentaires :** Lecture | Nécessaire pour récupérer les commentaires eux-mêmes. |




### 1. Préparez votre appli

Ce Guide suivra un Motif similaire à [Lecture de l'arborescence de fichiers](/workflows-assets/reading-the-file-tree) -- par conséquent, pour Commencer, vous aurez besoin de :
* Le `root_asset_id` du Projet que vous explorez
* ```json { &quot;trancreatedText&quot;: [ &quot;Votre [jeton développeur](/authentication/developer-tokens)

Vous devrez également importer `FrameioClient` dans votre application Python, ainsi que quelques bibliothèques assistant supplémentaires :

**`Python`**

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

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





### 2. Parcourir le Projet




Maintenant, vous devez récupérer de manière récursive tous les asset, vérifier s'ils contiennent des commentaires et stocker tous les asset commentés dans une liste à partir de laquelle vous pourrez construire votre fichier CSV.





Lorsque vous parcourez votre Projet, vous devez effectuer les vérifications suivantes sur chaque asset :



* L'asset est-il un fichier ?(`\&quot;_type\&quot;: \&quot;file\&quot;`).

* S'il s'agit d'un fichier, contient-il des commentaires ?* **Si c'est le cas, récupérez-les et ajoutez-les à votre liste.**
* L'asset est-il un dossier ?(`\&quot;_type\&quot;: \&quot;folder\&quot;`)

* **S'il s'agit d'un dossier, effectuez alors une récursion sur ses enfants.**
* L'asset est-il une pile de versions ?(`\&quot;_type\&quot;: \&quot;version_stack\&quot;`)

* **S'il s'agit d'une pile de versions, récupérez alors tous les enfants et vérifiez la présence de commentaires.**

**`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="Pensez à paginer">
  L'exemple ci-dessus ignore la pagination, mais vous ne devriez pas l'ignorer lorsque vous naviguez dans de grandes collections !Consultez notre Guide [Concepts clés](/getting-started/key-concepts#pagination) pour référence.
</Info>


### 3. Aplatir votre liste de commentaires




À moins que vous ne l'ayez géré pendant votre parcours, vous voudrez aplatir votre liste pour faciliter le traitement.





**`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. Épurer la liste et créer votre CSV




Lorsque votre liste est aplatie, vous pouvez utiliser la compréhension de liste pour récupérer les éléments de chaque commentaire que vous jugez utiles, puis les exporter dans un fichier CSV. &quot; ] } ```Nous recommandons d'avoir au moins :



* Commentaire - `texte`
* ID gabarit - `parent_id`
* ID asset - `asset_id`
* Nom asset `nom`
* ID propriétaire - `owner_id`
* E-mail propriétaire - `owner.email`
* Date et heure - `timestamp`
* Mis à jour le - `updated_at`




Lorsque vous avez créé une nouvelle liste contenant la sortie souhaitée par asset pour votre sortie finale, il est temps d'écrire dans votre fichier CSV (valeurs séparées par des virgules).





**`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)
```





Et voilà ! Vous avez maintenant un fichier CSV (valeurs séparées par des virgules) avec les commentaires aplatis d'un Projet Frame.io entier.