2017-02-11 64 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调用,否则将浪费您的补贴。