2017-02-11 6 views
0

Evernote API(Python SDK)は、sandboxでレートリミットを実装する予定ですが、レート制限は15秒間しかありません。Evernote APIサンドボックスレート制限期間15秒以上

例外が発生するまで、API呼び出しを作成してレート制限をテストするテストスイートがあります。

1分待ってから同じエラーEDAMSystemException(errorCode=19, rateLimitDuration=2651, _message='DuplicateNoteLimiter')が発生します。

コード:errorCode=RATE_LIMIT_REACHEDに加え

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

、例外が

メッセージ= "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呼び出しが行われるため、そうでなければ手数料が浪費されます。