【问题标题】:Evernote API Sandbox Rate Limit Duration greater than 15 secondsEvernote API 沙盒速率限制持续时间大于 15 秒
【发布时间】:2017-02-11 19:19:23
【问题描述】:

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()

【问题讨论】:

    标签: evernote


    【解决方案1】:

    除了errorCode=RATE_LIMIT_REACHED,例外包括

    message="DuplicateNoteLimiter"

    此消息表明印象笔记服务通过 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 调用,否则您将浪费您的津贴。

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 2021-07-12
      • 2016-12-08
      • 1970-01-01
      • 2022-10-15
      • 2018-12-19
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多