Evernote API沙盒速率限制持续时间大于15秒

时间:2017-02-11 19:19:23

标签: evernote

Evernote API(Python SDK)应该在sandbox中实现与生产完全相同的速率限制,但速率限制仅持续15秒。

我有一个测试套件,通过make 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 个答案:

答案 0 :(得分:1)

errorCode=RATE_LIMIT_REACHED外,例外还包括

  

消息=&#34; DuplicateNoteLimiter&#34;

此消息表明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)

此修改将阻止&#34;复制限制器&#34;从被触发。根据我的测试,速率限制几乎会在投掷后立即重置。不知怎的,Evernote解释说,重置发生的时间要早​​于15秒。

顺便说一句,每次创建笔记时,您的代码都会调用client.get_note_store()。您应该只调用一次以获得NoteStore处理程序以便重用。由于函数调用将导致UserStore上的API调用,否则您将浪费您的限额。