2017-02-11 45 views
0

印象筆記API(Python SDK)應該執行速率限制sandbox與生產完全相同,但速率限制只能持續15秒。Evernote API沙盒速率限制持續時間大於15秒

我有一個測試套件,通過調用API調用來測試速率限制,直到發生異常。

等待1分鐘後,仍然出現相同的錯誤EDAMSystemException(errorCode=19, rateLimitDuration=2651, _message='DuplicateNoteLimiter')

代碼:

from evernote.api.client import EvernoteClient 
from evernote.edam.error.ttypes import EDAMSystemException 
import evernote.edam.type.ttypes as Types 
import time 


def getClient(): 
    return EvernoteClient(
      token=config.dev_token, 
      sandbox=True 
     ) 

def makeNote(client): 
    note = Types.Note() 
    note.title = 'spam' 
    content = '' 
    note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' 
    note.content += '<en-note>'+ content + '</en-note>' 
    return client.get_note_store().createNote(note) 

def test_api_limit(): 
    client = getClient() 

    try: 
     while(True): 
      makeNote(client) 
    except EDAMSystemException as e: 
      assert e.errorCode == 19 
      print 'Caught Rate Limit Exception' 
      time.sleep(60) 
      makeNote(client) # still raise exception 
      print 'No exception occurred!' # this statement is not executed. 

test_api_limit() 

回答

1

除了errorCode=RATE_LIMIT_REACHED,異常包括

消息= 「DuplicateNoteLimiter」

此消息指示的Evernote服務已檢測到大量的請注意通過API調用進行重複。由於在帳戶中擁有相同內容的筆記太多沒有意義,因此限制了這種請求以避免浪費其計算資源。

如果您嘗試創建具有獨特內容的筆記,則不會看到此行爲。

例如:

你可以嘗試包括在新的筆記毫秒的系統時間在你的代碼

from datetime import datetime 

def makeNote(client): 
    note = Types.Note() 
    note.title = 'spam' 
    content = str(datetime.now().microsecond) 
    note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' 
    note.content += '<en-note>'+ content + '</en-note>' 
    return client.get_note_store().createNote(note) 

此修改將阻止越來越引發了「重複限制」。根據我的測試,速率限制在投擲後幾乎立即被重置。不知怎麼的,重置發生的時間早於Evernote解釋15秒。

順便說一句,您的代碼每次創建便箋時都會調用client.get_note_store()。您只需調用一次即可獲取NoteStore處理程序以重用。由於函數調用將導致UserStore上的API調用,否則將浪費您的補貼。