Um problema para acessar os dados do Evernote , é que a API do Evernote (https://dev.evernote.com/doc) não possuí suporte para acessar os dados via REST.

 

Aqui vou apresentar de forma resumida os passos necessários para viabilizar o acesso do Evernote usando o Qlik Sense.


Encontrei um projeto denominado "Evernote REST Webapp", localizado em https://github.com/ttddyy/evernote-rest-webapp.


"Evernote REST Webapp" é um aplicativo baseado em java que se comporta como um proxy entre os servidores Evernote e seus aplicativos. Ele é construído sobre o Spring Boot , o Sprnig Social Evernote e o evernote-java-sdk.


Para testar, coloquei o aplicativo java em meu computador, criei um tokem no Evernote (https://dev.evernote.com/doc) e configurei o arquivo application.properties, conforme orientado na documentação do "Evernote REST Webapp" (https://github.com/ttddyy/evernote-rest-webapp/wiki/QuickStart).


Meu computador usa Windows 10, porém preferi então usar o Bash Linux do Windows (Isto mesmo o Windows possui um Shell Linux nativo. Vide https://docs.microsoft.com/en-us/windows/wsl/install-win10 para maiores detalhes). Você pode ter que instalar o java ou algum componente adicional, e sendo o caso use o comando "apt install...' 


Uma vez instalado o "Evernote REST Webapp" (arquivo evernote-rest-webapp-1.1.2.war) e configurado o arquivo "application.properties", é só executar o programa:


$ java -jar evernote-rest-webapp-1.1.2.war


Estando tudo OK, o "Evernote REST Webapp" vai ficar aguardando solicitações REST na porta 8080.


Lembrete: Você pode executar "Evernote REST Webapp" usando o Java no Windows, bem como instalar no mesmo servidor do Qlik Sense ou outros que desejar.


Para testar se tudo encontra-se OK, abra uma nova janela do Bash Linux e execute:


$ curl -X POST -H "Content-Type: application/json" http://localhost:8080/userStore/getUser


Se retornar um json com os dados do usuário Evernote, encontra-se funcionando tudo OK!


A API do Evernote possuí diversos métodos (Vide http://dev.evernote.com/doc/reference). Basicamente elas estão divididas em 2 módulos: NoteStore e UserStore.


Vamos falar apenas dos métodos necessários para identificar os Cadernos (Notebooks) e as Notas (Notes) existentes em cada um dos cadernos.


Todos os objetos (Ex: Cadernos e Notas), são identificados por seu GUID, um código único para cada objeto.


Para acessar os dados vamos usar o Conector REST do Qlik Sense (Também pode ser feito no Qlikview, bastando seguir os mesmos passos, com os ajustes necessários)


Vamos configurar uma conexão REST para cada método da API Evernote utilizado. Lembrando que sempre usaremos na configuração REST o "Method HTTP" POST:


EvernoteRest1.png


E uma entrada em Query Headers com "Content-Type: application/json":

EvernoteRest2.png


Nas chamadas REST que exigirem a passagem de parâmetros (ex: '{ "filter": { "notebookGuid": "984df245-4b20-4686-9ab9-57ad1018e0e0"}, "offset": 0, "maxNotes": 1000 }' o mesmo deverá ser feito no campo do conector REST "Request Body" .


EvernoteRest3.png


Inicialmente, podemos buscar os dados referente ao usuário corrente:


- Usar a chamada a API Evernote: http://localhost:8080/userStore/getUser


O Script ficará:


LIB CONNECT TO 'EvernoteUserInfo';


RestConnectorMasterTable:

SQL SELECT

"id",

"username",

"email",

"name",

"timezone",

"privilege",

"created",

"updated" AS "updated_u0",

"deleted",

"active",

"shardId",

"attributes",

"premiumInfo",

"businessUserInfo",

"__KEY_root",

(SELECT

"uploadLimit",

"uploadLimitEnd",

"uploadLimitNextMonth",

"premiumServiceStatus",

"premiumOrderNumber",

"premiumCommerceService",

"premiumServiceStart",

"premiumServiceSKU",

"lastSuccessfulCharge",

"lastFailedCharge",

"lastFailedChargeReason",

"nextPaymentDue",

"premiumLockUntil",

"updated",

"premiumSubscriptionNumber",

"lastRequestedCharge",

"currency",

"unitPrice",

"businessId",

"businessName",

"businessRole",

"unitDiscount",

"nextChargeDate",

"__FK_accounting"

FROM "accounting" FK "__FK_accounting")

FROM JSON (wrap on) "root" PK "__KEY_root";


[accounting]:

LOAD [uploadLimit] AS [uploadLimit],

[uploadLimitEnd] AS [uploadLimitEnd],

[uploadLimitNextMonth] AS [uploadLimitNextMonth],

[premiumServiceStatus] AS [premiumServiceStatus],

[premiumOrderNumber] AS [premiumOrderNumber],

[premiumCommerceService] AS [premiumCommerceService],

[premiumServiceStart] AS [premiumServiceStart],

[premiumServiceSKU] AS [premiumServiceSKU],

[lastSuccessfulCharge] AS [lastSuccessfulCharge],

[lastFailedCharge] AS [lastFailedCharge],

[lastFailedChargeReason] AS [lastFailedChargeReason],

[nextPaymentDue] AS [nextPaymentDue],

[premiumLockUntil] AS [premiumLockUntil],

[updated] AS [updated],

[premiumSubscriptionNumber] AS [premiumSubscriptionNumber],

[lastRequestedCharge] AS [lastRequestedCharge],

[currency] AS [currency],

[unitPrice] AS [unitPrice],

[businessId] AS [businessId],

[businessName] AS [businessName],

[businessRole] AS [businessRole],

[unitDiscount] AS [unitDiscount],

[nextChargeDate] AS [nextChargeDate],

[__FK_accounting] AS [__KEY_root]

RESIDENT RestConnectorMasterTable

WHERE NOT IsNull([__FK_accounting]);

 

[users]:

LOAD [id] AS [id],

[username] AS [username],

[email] AS [email],

[name] AS [name_user],

[timezone] AS [timezone],

[privilege] AS [privilege],

[created] AS [created],

[updated_u0] AS [updated_u0],

[deleted] AS [deleted],

[active] AS [active],

[shardId] AS [shardId],

[attributes] AS [attributes],

[premiumInfo] AS [premiumInfo],

[businessUserInfo] AS [businessUserInfo],

[__KEY_root] AS [__KEY_root]

RESIDENT RestConnectorMasterTable

WHERE NOT IsNull([__KEY_root]);


DROP TABLE RestConnectorMasterTable;


Para buscar os dados de cada nota, precisamos identificar inicialmente quais os Cadernos existentes, e em seguida, para cada caderno, identificar quais as notas existentes. No final então, para cada nota encontrada, precisamos buscar o conteúdo da Nota.


Sendo Assim, a sequencia de métodos da API do Evernote que usaremos, será:


    1. http://localhost:8080/noteStore/listNotebooks (Lista os Cadernos existentes)
    2. http://localhost:8080/noteStore/findNotes (Lista as notas existentes em cada Caderno)
    3. http://localhost:8080/noteStore/getNoteContent (Recebe o conteúdo de cada nota)

 

Nas chamadas dos métodos findNotes e getNoteContent, é necessário fazer um loop em todos GUID dos Cadernos/Notas e fazer a chamada do connector REST, usando a clausula WITH CONNECTION (URL "http://localhost:8080/noteStore/getNoteContent", HTTPHEADER "Content-Type" "application/json", BODY "$(vBody)" );


Exemplo:


Trace ##### CARREGANDO CONTEÚDO DAS NOTAS #####;


set ErrorMode=0;


Let v_regs = NoOfRows('notes'); // Recebe o número de Itens do Array

 

//Loop em todos os registros de notebooks

For v_i = 0 to v_regs-1

    let vGuidNota = peek('noteguid',v_i,'notes') ; //Pega GUID dos Cadernos

   

    v_PercExec = Num(((v_i+1)/v_regs)*100,'#.##0,00'); //Calcula o percentual de registros processados

    v_Qtde = v_i+1; //Quantidade de Regristros Processados

   

    Trace ========>[$(vGuidNota)] $(v_i)  $(v_PercExec)%<========;    //mostrar no script log)


    Let vBody = '{ "guid": "$(vGuidNota)"}';

    Let vBody = Replace(vBody,'"', chr(34)&chr(34));

   

    LIB CONNECT TO 'EvernoteNoteContent';


    RestConnectorMasterTable:

    SQL SELECT

        "col_1"

    FROM CSV (header off, delimiter "tab", quote """") "CSV_source"

    WITH CONNECTION(URL "http://localhost:8080/noteStore/getNoteContent",

                    HTTPHEADER "Content-Type" "application/json",

                    BODY "$(vBody)"

                  );


    [notescontents]:

    LOAD [col_1] AS [notecontent],

            '$(vGuidNota)' as [noteguid],

            RecNo() as [contentseq] 

    RESIDENT RestConnectorMasterTable;


    DROP TABLE RestConnectorMasterTable;

Next


Informações do Evernote no Qlik Sense:

EvernoteRest4.png

No final você vai conseguir ter as informações de cada uma das notas do Evernote.

 

A base deste texto serve como principio para chamar cada um dos métodos da API do Evernote.


Espero este post seja útil para aqueles que precisam acessar o Evernote. Até a proxima!!!!