我正在尝试删除由我的应用创建的几张卡片。但是,似乎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()
有效删除我的应用创建的卡片的最佳方法是什么?
答案 0 :(得分:3)
资源管理器为此目的编写了一个基于JavaScript的工具:Glass Cleaner。
答案 1 :(得分:2)
在我看来,Python示例缺少pageToken的任何概念,大多数其他语言示例都有nextPageToken并循环,直到响应没有nextPageToken。如果您不断反复请求第一页,即使您只有三张卡,也会很快耗尽您的API配额。
这个答案的其余部分是关于列表和删除的一般信息,以及一些你可以安全地试验的curl命令,这些命令不会很快地循环和耗尽你的配额。请特别注意列表命令返回的JSON中的nextPageToken属性...
LIST和DELETE很奇怪,根据我的经验,不会完全遵循文档。
以下是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
请注意,您必须使用最后从list命令获得的卡中的实际ID。从上面的列表命令中获取一个。
成功完成DELETE后,响应为204,在RESTful世界中可以指示delete succes。
然后,如果您按照上面第一个示例执行后续列表,则该项目将立即返回,并且不会被标记为已删除,因为缺少isDeleted属性。
页面大小似乎是10,但我想这可能会改变,因为我没有在任何地方找到记录。
nextPageToken值似乎经常具有相同的开头和结尾,并且它们是非常长的字符串,所以看到它们可能会让人感到困惑,如果不是这样,你可能会无意中认为它们是相同的,这里的教训是要非常仔细地比较在中间。
也许那些curl命令可以帮助您在API配额恢复时进行实验,我会尝试测试null或空字符串nextPageToken以告诉您何时退出循环。等效的java代码是:
} while (request.getPageToken() != null && request.getPageToken().length() > 0);
祝你好运,这是一个很好的问题。