收集项目中的所有评论

概述

评论抓取工具将检索项目中的所有资产,抓取其中的评论,并将它们输出到一个 .csv 文件中。本演练使用以下资源:

  • Python SDK - SDK 为您处理分页,并构建一个可与开发者令牌(持有者身份验证)配合使用的客户端。
  • Python 评论抓取工具 - 我们使用的代码示例在此处。

在 Glitch 上尝试

Glitch 是一个简单的工具,允许您搭建自己的应用程序,并使用他们的服务器进行测试和运行。如果您不熟悉 Glitch,请参阅我们关于使用 Glitch 的指南。如果您想看看评论抓取工具在服务器上运行的效果,我们在 Glitch 上搭建了一个 Flask 应用程序:Frame.io Python 评论抓取工具

必需的权限范围

在开始本指南之前,您需要确保拥有一个至少包含以下权限范围的令牌:

权限范围原因
**项目:**读取并非严格必须,但对于获取项目的 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 文件。

当您抓取项目时,需要对每个资产进行以下检查:

  • 该资产是一个文件吗?(&quot;_type&quot;: &quot;file&quot;).

  • 如果是一个文件,它是否有评论?* 如果有,则获取这些评论并添加到您的列表中。

  • 该资产是一个文件夹吗?(&quot;_type&quot;: &quot;folder&quot;)

  • 如果是一个文件夹,则对其次项进行递归操作。

  • 该资产是一个版本堆栈吗?(&quot;_type&quot;: &quot;version_stack&quot;)

  • 如果是一个版本堆栈,则获取其所有次项并检查其中的评论。

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)

这样就完成了!现在,您拥有了一个 .csv 文件,其中包含来自整个 Frame.io 项目的展平后评论。