of 73
8/10/2019 Evernote Reaktor Helsinki 2013
1/73
Hacking with the Evernote API for fun and profit
8/10/2019 Evernote Reaktor Helsinki 2013
2/73
What will Damian talk about?
What is Evernote? How do people use it?
Evernote Service API fundamentals
Samsung Galaxy Gear watch integration
Full Sync clients how I got hired by Evernote
Taking advantage of Evernotes OCR
Web Based integration
Whats next?
8/10/2019 Evernote Reaktor Helsinki 2013
3/73
What is Evernote?
8/10/2019 Evernote Reaktor Helsinki 2013
4/73
Evernote is a note taking app
Capture anything (text, photos, audio clips)
Capture anywhere
Syncs to all your devices
Access anywhere
Find stuff quickly
8/10/2019 Evernote Reaktor Helsinki 2013
5/73
Evernote is a set of apps
8/10/2019 Evernote Reaktor Helsinki 2013
6/73
Evernote is a service
Evernote Service
8/10/2019 Evernote Reaktor Helsinki 2013
7/73
8/10/2019 Evernote Reaktor Helsinki 2013
8/73
8/10/2019 Evernote Reaktor Helsinki 2013
9/73
8/10/2019 Evernote Reaktor Helsinki 2013
10/73
8/10/2019 Evernote Reaktor Helsinki 2013
11/73
8/10/2019 Evernote Reaktor Helsinki 2013
12/73
8/10/2019 Evernote Reaktor Helsinki 2013
13/73
8/10/2019 Evernote Reaktor Helsinki 2013
14/73
8/10/2019 Evernote Reaktor Helsinki 2013
15/73
8/10/2019 Evernote Reaktor Helsinki 2013
16/73
8/10/2019 Evernote Reaktor Helsinki 2013
17/73
8/10/2019 Evernote Reaktor Helsinki 2013
18/73
8/10/2019 Evernote Reaktor Helsinki 2013
19/73
8/10/2019 Evernote Reaktor Helsinki 2013
20/73
8/10/2019 Evernote Reaktor Helsinki 2013
21/73
8/10/2019 Evernote Reaktor Helsinki 2013
22/73
How do I use the Evernote Service API?
Evernote Service
8/10/2019 Evernote Reaktor Helsinki 2013
23/73
Apache Thrift
Define platform independent Interface Definition
Language
Generate proxies for many languages
Proxies combine with runtime to provide API
So API Together: Evernote and Thrift
8/10/2019 Evernote Reaktor Helsinki 2013
24/73
Thrift examples
struct Note {
1: optional Guidguid,
2: optional string title,3: optional string content,
4: optional binary contentHash,
5: optional i32 contentLength,
6: optional Timestamp created,
7: optional Timestamp updated,
8: optional Timestamp deleted,
9: optional bool active,10: optional i32 updateSequenceNum,
11: optional string notebookGuid,
12: optional list tagGuids,
13: optional list resources,
14: optional NoteAttributesattributes,
15: optional list tagNames
}
Types.Note createNote(1: string authenticatio
2: Types.Note note)
throws (1: Errors.EDAMUserException use2: Errors.EDAMSystemException syst
3: Errors.EDAMNotFoundException no
JavaScript
8/10/2019 Evernote Reaktor Helsinki 2013
25/73
JavaScript
iOS
Android
Java
C Sharp Python
Mac
PHP
Ruby
Perl
C++
PhoneGap
ActionScript
8/10/2019 Evernote Reaktor Helsinki 2013
26/73
My top 10 mistakes: 1
On mobile devices, trying to download and create large notes
images) using the standard Thrift calls
Run out of memory very quickly
Use Thrift library to stream content
8/10/2019 Evernote Reaktor Helsinki 2013
27/73
ENML Evernote Markup Language
8/10/2019 Evernote Reaktor Helsinki 2013
28/73
8/10/2019 Evernote Reaktor Helsinki 2013
29/73
htt // db t /
8/10/2019 Evernote Reaktor Helsinki 2013
30/73
https://sandbox.evernote.com/
Play here without risking hurting yourself or others
Replica of production environment
API K
8/10/2019 Evernote Reaktor Helsinki 2013
31/73
API Keys
8/10/2019 Evernote Reaktor Helsinki 2013
32/73
Authentication
8/10/2019 Evernote Reaktor Helsinki 2013
33/73
Authentication
Username & Password
Optional Two Factor Authentication
Authenticate using OAUTH
8/10/2019 Evernote Reaktor Helsinki 2013
34/73
Developer Tokens
8/10/2019 Evernote Reaktor Helsinki 2013
35/73
Developer Tokens
8/10/2019 Evernote Reaktor Helsinki 2013
36/73
My top 10 mistakes: 2
8/10/2019 Evernote Reaktor Helsinki 2013
37/73
My top 10 mistakes: 2
SSL and other Auth exceptions caused by clock being set inco
Demo Client
8/10/2019 Evernote Reaktor Helsinki 2013
38/73
Demo Client
My top 10 mistakes: 3
8/10/2019 Evernote Reaktor Helsinki 2013
39/73
My top 10 mistakes: 3
Create a note, then use the original note, not the returned no
A simpler way
8/10/2019 Evernote Reaktor Helsinki 2013
40/73
A simpler way
Local Evernote APIs
8/10/2019 Evernote Reaktor Helsinki 2013
41/73
Local Evernote APIs
Mac : AppleScript
Windows : ENScript scripting interface Android
Standard inter-app communication mechanisms
Send Android Intents to other apps
Create
Search
Update
..
Expose content using Content providers
Demo: Using Android Intents
8/10/2019 Evernote Reaktor Helsinki 2013
42/73
Demo: Using Android Intents
Using the Service API: what kind of client?
8/10/2019 Evernote Reaktor Helsinki 2013
43/73
Using the Service API: what kind of client?
Ploze: a full sync client
8/10/2019 Evernote Reaktor Helsinki 2013
44/73
y
Full sync client
8/10/2019 Evernote Reaktor Helsinki 2013
45/73
y
Well defined and documented approach
Each object has an UpdateSequenceNumber set by the Server Incremental synchronization
NoteStore. getFilteredSyncChunk(string authenticationToken,
i32 afterUSN,
i32 maxEntries,
SyncChunkFilter filter)
Supports Concurrent clients
http://dev.evernote.com/media/pdf/edam-sync.pdf
My top 10 mistakes: 4
http://dev.evernote.com/media/pdf/edam-sync.pdfhttp://dev.evernote.com/media/pdf/edam-sync.pdfhttp://dev.evernote.com/media/pdf/edam-sync.pdf8/10/2019 Evernote Reaktor Helsinki 2013
46/73
y p
Using Evernote Guids as primary keys in local database
Better to use int ids
Messy for new (unsynced) notes.
Client-allocated Guid until synced.
Primary key then changes when server allocates Guid for note
Thin (non-full sync) clients
8/10/2019 Evernote Reaktor Helsinki 2013
47/73
( y )
Save items to Evernote
Add value to users
Analyze content
Help organize
Process notes
Generate insights
Evernotes text recognition capabilities are interesting
Creating Notes with images
8/10/2019 Evernote Reaktor Helsinki 2013
48/73
8/10/2019 Evernote Reaktor Helsinki 2013
49/73
8/10/2019 Evernote Reaktor Helsinki 2013
50/73
var recoXml = noteStoreClient.getResourceRecognition(AuthToken, resourc
8/10/2019 Evernote Reaktor Helsinki 2013
51/73
8/10/2019 Evernote Reaktor Helsinki 2013
52/73
8/10/2019 Evernote Reaktor Helsinki 2013
53/73
Auto-title notes?
8/10/2019 Evernote Reaktor Helsinki 2013
54/73
8/10/2019 Evernote Reaktor Helsinki 2013
55/73
http://damianblog.com/2012/10/28/autotitle-evernote-from-im
Web based clients
http://damianblog.com/2012/10/28/autotitle-evernote-from-images/http://damianblog.com/2012/10/28/autotitle-evernote-from-images/http://damianblog.com/2012/10/28/autotitle-evernote-from-images/8/10/2019 Evernote Reaktor Helsinki 2013
56/73
Evernote V5 supports Reminders on Notes
Popup within Evernote when reminder time reached
8/10/2019 Evernote Reaktor Helsinki 2013
57/73
8/10/2019 Evernote Reaktor Helsinki 2013
58/73
8/10/2019 Evernote Reaktor Helsinki 2013
59/73
8/10/2019 Evernote Reaktor Helsinki 2013
60/73
8/10/2019 Evernote Reaktor Helsinki 2013
61/73
8/10/2019 Evernote Reaktor Helsinki 2013
62/73
8/10/2019 Evernote Reaktor Helsinki 2013
63/73
Polling is yucky
8/10/2019 Evernote Reaktor Helsinki 2013
64/73
Evernote supports Web Hooks
Specify a URL to be invoked when user creates or updates a note
Supplies User info and Note Guid
Optional filter
I can request to be only notified when reminder notes are created/updated
Use web hooks to trigger update of Google Calendar
My top 10 mistakes: 6
8/10/2019 Evernote Reaktor Helsinki 2013
65/73
Assuming I am a typical user
Test thousands of notes
Massive notes
No Tags, Lots of Tags
No Notebooks, Lots of Notebooks
Test extremes
My top 10 mistakes: 7
8/10/2019 Evernote Reaktor Helsinki 2013
66/73
Not using API Regexes to validate names
My top 10 mistakes: 8
8/10/2019 Evernote Reaktor Helsinki 2013
67/73
Not making use of existing examples
https://github.com/evernote/
My top 10 mistakes: 9
https://github.com/evernote/https://github.com/evernote/https://github.com/evernote/8/10/2019 Evernote Reaktor Helsinki 2013
68/73
Struggling alone through issues
http://discussion.evernote.com/forum/61-evernote-for-deve
My top 10 mistakes: 10
http://discussion.evernote.com/forum/61-evernote-for-developers/http://discussion.evernote.com/forum/61-evernote-for-developers/http://discussion.evernote.com/forum/61-evernote-for-developers/8/10/2019 Evernote Reaktor Helsinki 2013
69/73
Blank screen for new users of Windows Phone client on cellu
networks
Whats next?
8/10/2019 Evernote Reaktor Helsinki 2013
70/73
Get an API Key
Create an account on the Sandbox
Generate an auth token
Explore Github examples
Scratch that itch
Evernote App Center
8/10/2019 Evernote Reaktor Helsinki 2013
71/73
Recap
8/10/2019 Evernote Reaktor Helsinki 2013
72/73
What is Evernote, and how do people use it?
Evernote Service API fundamentals Galaxy Gear integration approach
Full Sync client essentials
Taking advantage of Evernotes OCR
Web Based integration
Whats next?
Questions?
8/10/2019 Evernote Reaktor Helsinki 2013
73/73
@DamianMehers
http://about.me/dmehers/
mailto:[email protected]:[email protected]:[email protected]