Evernote API 沙盒速率限制持续时间大于 15 秒
Evernote API Sandbox Rate Limit Duration greater than 15 seconds
Evernote API (Python SDK) 应该在 sandbox 中实现与生产完全相同的速率限制,但速率限制仅持续 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()
除了errorCode=RATE_LIMIT_REACHED
,异常还包括
message="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)
此修改将阻止 "duplication limiter" 被触发。根据我的测试,速率限制在抛出后几乎会立即重置。正如 Evernote 解释的那样,重置发生的时间比 15 秒要快得多。
顺便说一句,每次创建笔记时,您的代码都会调用 client.get_note_store()
。您应该只调用一次以获取要重用的 NoteStore 处理程序。由于函数调用将导致对 UserStore 的 API 调用,否则您将浪费您的津贴。
Evernote API (Python SDK) 应该在 sandbox 中实现与生产完全相同的速率限制,但速率限制仅持续 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()
除了errorCode=RATE_LIMIT_REACHED
,异常还包括
message="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)
此修改将阻止 "duplication limiter" 被触发。根据我的测试,速率限制在抛出后几乎会立即重置。正如 Evernote 解释的那样,重置发生的时间比 15 秒要快得多。
顺便说一句,每次创建笔记时,您的代码都会调用 client.get_note_store()
。您应该只调用一次以获取要重用的 NoteStore 处理程序。由于函数调用将导致对 UserStore 的 API 调用,否则您将浪费您的津贴。