2013-06-30 52 views
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() 

什麼是有效刪除我的應用程序創建的卡片的最佳方式?

+1

你的代碼看起來對我來說是正確的。時間表列表僅列出Glassware有權訪問的卡片。這僅包括您創建的卡或通過與Glassware共享創建的卡。但它似乎有些東西了。爲什麼你懷疑它列出所有卡? – mimming

+0

我相當確信(a)我發佈的代碼不好或(b)'list()'函數獲取每張卡(不僅僅是我的應用程序創建的)。我的推理?我的應用程序只創建了2-3張卡,循環應該是即時的。然而,運行上面的代碼導致這樣的結果:http://i.imgur.com/9LBUxWV.png我在幾秒鐘內意外地使用了我的整個API調用配額! –

+0

明白了。另一種可能性是退出條件未被觸發。 Mirror API使用遊標,因此可能會通過無盡的空白頁面進行分頁。您可以通過記錄每個頁面中的記錄數量來測試它。您可能還需要一個逃生艙添加到該代碼,以便它幾次迭代(而不是所有1000您的定額限制)後退出 – mimming

回答

3

有一個基於JavaScript的工具,資源管理器爲此目的而寫道:Glass Cleaner

+0

+1對於我不知道的玻璃器皿,請注意,這隻會刪除由工具提供的客戶端ID /玻璃器皿應用程序創建的時間線卡片,珍妮是正確的,儘管薩哈斯的假設是他將所有卡片都收回到列表中,沒有發生。 –

2

它在我看來像Python示例缺少pageToken的任何概念,大多數其他語言示例都有nextPageToken並循環,直到響應沒有nextPageToken。即使您只有三張卡,如果您一直請求第一頁,您將很快耗盡您的API配額。

此答案的其餘部分是關於列表和刪除的一般信息,以及一些可以安全地嘗試的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從你在最後一個list命令有一個卡。從上面的列表命令中抓取一個。

當您成功執行DELETE時,響應是204,在RESTful世界中,響應可能表示delete succes s。

然後,如果您在上面的第一個示例中執行後續列表,則該項目將右後退並且不會被標記爲已刪除,因爲isDeleted屬性缺失。

頁面大小似乎爲10,但我想這可能會改變,因爲我沒有發現任何地方記錄。

nextPageToken值似乎經常具有相同的開始和結束,並且它們是非常長的字符串,所以看着它們可能會令人困惑,並且當它們不是時,您可能會無意中認爲它們是相同的,這裏的教訓是比較非常仔細地在中間。

也許這些捲曲的命令幫助當您的API配額回來你嘗試了,我將與測試空或空字符串的nextPageToken告訴你什麼時候離開你的循環試驗。相當於java的代碼是:

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

祝你好運,和一個很好的問題。

相關問題