2017-02-11 5 views
0

Die Evernote-API (Python SDK) soll die Ratenbegrenzung in sandbox genauso implementieren wie die Produktion, aber das Ratenlimit dauert nur 15 Sekunden.Evernote-API Sandbox-Ratenbeschränkung Dauer größer als 15 Sekunden

Ich habe eine Testsuite, die die Rate-Limit von API-Aufrufe testen, bis eine Ausnahme auftritt.

Nach einer Wartezeit von 1 Minute tritt immer noch derselbe Fehler EDAMSystemException(errorCode=19, rateLimitDuration=2651, _message='DuplicateNoteLimiter') auf.

Code:

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

Antwort

1

Neben errorCode=RATE_LIMIT_REACHED, die Ausnahme enthält

message = "DuplicateNoteLimiter"

Diese Meldung zeigt an, dass Everdienst eine große Anzahl von erfasst hat Notizverdopplung über API-Aufruf. Da es nicht sinnvoll ist, so viele Notizen mit demselben Inhalt in einem Konto zu haben, wird eine solche Anfrage begrenzt, um zu vermeiden, dass ihre Computerressourcen verschwendet werden.

Wenn Sie versuchen, eine Notiz mit einem eindeutigen Inhalt zu erstellen, wird dieses Verhalten nicht angezeigt.

Zum Beispiel:

können Sie versuchen, eine Systemzeit in Millisekunden in einer neuen Notiz in Ihrem Code

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) 

Diese Modifikation umfasst die „Duplizierung Limiter“ verhindern, ausgelöst zu werden. Nach meinen Tests wird das Ratenlimit fast sofort nach dem Auslösen zurückgesetzt. Irgendwie geschieht der Reset viel früher als 15 Sekunden, wie Evernote erklärt.

BTW, Ihr Code ruft client.get_note_store() jedes Mal auf, wenn Sie eine Notiz erstellen. Sie sollten nur einmal aufrufen, um einen NoteStore-Handler zur Wiederverwendung zu erhalten. Da der Funktionsaufruf zu einem API-Aufruf im UserStore führt, verschwenden Sie sonst Ihre Berechtigungen.

Verwandte Themen