3

我试图简单地删除我的应用程序创建的一些卡片。但是,该list()方法似乎在整个用户时间线中的每张卡片中循环。

我下面的代码是从timeline list. 当我尝试使用它时,它意外地循环了我时间轴中的每张卡片,在操作超时前的几秒钟内用完了我的全部 1,000 / 天配额。

 def delete_previous_cards(self):
   """
     This cleans up any cards that may have been leftover.
   """

   result = []
   request = self.mirror_service.timeline().list()
   while request:
     try:
       timeline_items = request.execute()
       result.extend(timeline_items.get('items', []))
       request = self.mirror_service.timeline().list_next(request, timeline_items)
     except errors.HttpError, error:
       print 'An error occurred: %s' % error
       break

   for item in result:
     item_id = item['id']
     self.mirror_service.timeline().delete(id=item_id).execute()

有效删除我的应用创建的卡片的最佳方法是什么?

4

2 回答 2

3

Explorer 专门为此目的编写了一个基于 JavaScript 的工具:Glass Cleaner

于 2013-07-01T00:42:10.053 回答
2

在我看来,Python 示例缺少任何 pageToken 概念,大多数其他语言示例都有 nextPageToken 并循环直到响应没有 nextPageToken。如果你一遍又一遍地请求第一页,即使你只有三张卡,你也会很快耗尽你的 API 配额。

该答案的其余部分是有关 list 和 delete 的一般信息以及一些您可以安全地试验的 curl 命令,它们不会很快循环并耗尽您的配额。特别注意从列表命令返回的 JSON 中的 nextPageToken 属性...

LISTDELETE很奇怪,根据我的经验,它们并没有完全遵循文档。

这是 List 的示例 CURL 命令。

curl -x http://localhost:5671 -H "Authorization: Bearer YOUR_TOKEN_HERE" 
https://www.googleapis.com/mirror/v1/timeline

它为与令牌关联的用户和应用程序返回 10 个项目。

它包括已删除的项目(isDeleted 设置为 true),但未在输出 JSON 中显示 isDeleted 属性。这很奇怪。

如果稍微修改一下:

curl -x http://localhost:5671 -H "Authorization: Bearer YOUR_TOKEN_HERE" 
https://www.googleapis.com/mirror/v1/timeline?isDeleted=true

(注意尾随参数)现在您得到相同的列表,但输出 JSON 包含 isDeleted 属性。对我来说,这里的教训是您可能应该请求 isDeleted=false 来循环删除请求。

要删除项目,您可以执行以下操作:

curl -x http://localhost:5671 -H "Authorization: Bearer YOUR_TOKEN_HERE" 
-H "Content-Type: application/json" -v -X DELETE 
https://www.googleapis.com/mirror/v1/timeline/ID_OF_A_TIMELINE_CARD

请注意,您必须使用最后从列表命令获得的卡中的实际 ID。从上面的列表命令中获取一个。

当您执行成功 DELETE 时,响应是 204,在 RESTful 世界中可以指示delete succes

然后,如果您按照上面的第一个示例执行后续列表,则该项目将立即返回并且不会被标记为已删除,因为缺少 isDeleted 属性。

页面大小似乎为 10,但我想这可能会改变,因为我没有发现任何地方都有记录。

nextPageToken 值似乎经常具有相同的开头和结尾,并且它们是很长的字符串,因此查看它们可能会令人困惑,并且您可能会不经意间认为它们是相同的,而实际上它们不是相同的,这里的教训是要非常仔细地比较中间.

也许这些 curl 命令可以帮助您在 API 配额恢复时进行试验,我会尝试测试 null 或空字符串 nextPageToken 以告诉您何时退出循环。等效的java代码是:

} while (request.getPageToken() != null && request.getPageToken().length() > 0);

祝你好运,很好的问题。

于 2013-07-01T07:35:19.153 回答