プロジェクトからのすべてのコメントの収集

概要

コメントスクレイパーは、プロジェクトに含まれているすべてのアセットを取得し、コメントをスクレイピングして .csv ファイルに出力します。この説明では次のリソースを使用します。

  • Python SDK -この SDK はページネーションを処理し、開発者トークン(ベアラー認証)で使用できるクライアントを設定します。
  • Python のコメントスクレイパー -使用しているコードサンプルにはこちらからアクセスできます。

Glitch で試す

Glitch はシンプルなツールで、独自のアプリケーションを設定し、それらを Glitch 側のサーバーを使用してテストおよび実行できます。Glitch に慣れていない場合は、Glitch の使用に関するガイドを参照してください。

サーバー上でコメントスクレイパーが動作することを確認する場合は、Glitch に用意した Flask アプリをご利用ください:Python で記述した Frame.io コメントスクレイパー

必要なスコープ

このガイドを開始する前に、少なくとも次のスコープを含むトークンがあることを確認してください。

スコープ理由
**プロジェクト:**読み取り厳密には必須ではありませんが、プロジェクトの root_asset_id をフェッチするために必要です。
**アセット:**読み取りAPI 経由での asset_ids ナビゲーションに必要です。
**コメント:**読み取りコメントそのものを取得するために必要です。

1.アプリを準備する

このガイドでは、ファイルツリーの読み取りと同様のパターンに従います。したがって、開始するには以下が必要です。

また、FrameioClient やいくつかの追加ヘルパーライブラリーを Python アプリに読み込むことになります。

Python
1from frameioclient import FrameioClient
2import requests, json, csv, itertools
3
4ROOT_ASSET_ID = "<ROOT_ASSET_ID>"
5TOKEN = "<DEV_TOKEN>"

2.プロジェクトをクロールする

次に、すべてのアセットを再帰的に取得し、コメントを確認し、コメント付きのアセットをリストに保管する必要があります。それをもとに .csv ファイルを作成できます。

プロジェクトをクロールする際には、各アセットについて次のチェックを行う必要があります。

  • アセットはファイルか?("_type": "file"
    • ファイルの場合、コメントはあるか?
      • ある場合は、それらを取得してリストに追加します。
  • アセットはフォルダーか?("_type": "folder"
    • フォルダーの場合は、その子に対して再帰処理を行います。
  • アセットはバージョンスタックか?("_type": "version_stack"
    • バージョンスタックの場合は、すべての子を取得し、コメントを確認します。
Python
1def all_comments(client, asset_id, comment_list):
2 files = client.get_asset_children(asset_id)
3
4 for asset in files:
5 if asset['type'] == "file":
6 if asset['comment_count'] > 0:
7 asset_parent_id = asset['parent_id']
8 asset_name = asset['name']
9 comments = client.get_comments(asset['id'])
10 my_comment_list = [comment for comment in comments.results]
11 for object in my_comment_list:
12 object.update({'parent_id':asset_parent_id})
13 object.update({'name':asset_name})
14 comment_list.append(my_comment_list)
15
16 if asset['type'] == "folder":
17 if asset['item_count'] > 0:
18 all_comments(client, asset['id'], comment_list)
19
20 if asset['type'] == "version_stack":
21 asset_name = asset['name']
22 parent_id = asset['parent_id']
23 vfiles = client.get_asset_children(asset['id'])
24
25 for asset in vfiles.results:
26 asset_name = asset['name']
27 parent_id = asset['parent_id']
28 if asset['type'] == "file":
29 if asset['comment_count'] > 0:
30 comments = client.get_comments(asset['id'])
31 my_comment_list = [comment for comment in comments.results]
32 for object in my_comment_list:
33 object.update({'parent_id':parent_id})
34 object.update({'name':asset_name})
35 comment_list.append(my_comment_list)
36
37def get_all_project_comments(root_asset_id, token):
38 comment_list = []
39 client = FrameioClient(token)
40
41 all_comments(client, root_asset_id, comment_list)
42
43 return comment_list
ページネーションをお忘れなく

上記の例ではページネーションは無視されます — ただし、大きなコレクションをナビゲートするときは無視しないでください。詳細については、基本概念ガイドを参照してください。

3.コメントリストをフラット化する

クロール段階で処理しないのであれば、処理を簡単にするためにリストをフラット化します。

Python
1# The response list comes back as a list of lists.
2# Flatten out responses to a single list so you can build your .csv file.
3
4flat_response_list = list(itertools.chain.from_iterable(responses))

4.リストを選択し、.csv を作成する

リストがフラットの場合は、リスト内包表記を使用して、有用と思われるコメントそれぞれから要素を取得し、.csv ファイルに出力できます。少なくとも以下を含めることを推奨します。

  • コメント - text
  • 親 ID - parent_id
  • アセット ID - asset_id
  • アセット名 - name
  • 所有者 ID - owner_id
  • 所有者のメールアドレス - owner.email
  • タイムスタンプ - timestamp
  • 更新日時 - updated_at

アセットごとに必要な出力を含む新しいリストを最終出力用に作成したら、.csv ファイルに書き出します。

Python
1list_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]
2
3# Let's write our new list out to a .csv file. We'll add a heading.
4with open("output.csv", 'w') as myfile:
5 wr = csv.writer(myfile, dialect='excel')
6 wr.writerow(['Comment', 'Parent ID', 'Asset ID', 'Asset Name', 'Owner ID', 'Email', 'Timestamp', 'Updated At'])
7 wr.writerows(list_for_csv)

これで完了です。これで、Frame.io プロジェクト全体からのフラット化されたコメントを含む .csv ファイルが作成されました。