使用 Python 操做 Evernote API

本文做者: 伯乐在线 - LittleCoder 。未经做者许可,禁止转载!
欢迎加入伯乐在线做者团队php

Evernote自己就是很好的笔记应用,其API又赋予了咱们更多的自由,值得花点时间尝试。html

本文将结合代码和理论,介绍如何使用这些API。python

在阅读完成本文后,你将可以完成相似PackMemo的程序。git

配置环境

配置Python

  • 本教程使用Python 2.7.11,别的版本若是有什么奇怪的问题能够联系我补进去好了(摊手)github

  • pip install evernote:Evernote的包能够经过pip很容易的安装编程

  • pip install requests:为了使用OAuth,须要安装requests包api

  • 记得在须要使用这两个包的时候加上import evernote, requests安全

配置印象笔记开发环境

沙盒环境配置网络

  • 这里配置的沙盒和Token的具体介绍在后面系统结构一节中哦数据结构

  • 这里配置的三样东西建议拿个小notepad记一下

  • 进入沙盒登录页面建立帐户便可

沙盒帐户开发者Token获取

  • 进入沙盒登录页面并登录(网络没问题的话能够忽略这一步)

  • 进入沙盒开发者Token获取沙盒开发者Token(记得要复制全哦)

普通帐户开发者Token获取

  • 进入印象笔记官网登录(其实也能够忽略这一步,但下面的网址连接不太稳定)

  • 进入印象笔记开发者Token获取开发者Token

进度确认

  • 那么如今你应该已经配置好了全部环境并有一个记录帐号的小本本

  • 关于环境,你应该可以在命令行里可以运行并不产生错误提示:

    • python -c 'from evernote.api.client import EvernoteClient'

    • python -c 'import requests'

  • 以及记录了沙盒帐户及两个开发者Token

系统结构

印象笔记存在两种帐户,以及每种帐户相同的两种受权方式

受权方式

想要使用印象笔记的API,确定须要先得到某个帐户的受权(受权进入他的笔记,对于咱们来讲就是受权本身使用啦)

印象笔记的受权方法有两种

  • 一种是程序提交某一帐户的开发者Token,显示已经被受权,获取受权。

 

 

1

2

3

4

from evernote.api.client import EvernoteClient

 

devToken = "沙盒或者普通帐户的Token"

client = EvernoteClient(token = devToken)

  • 另外一种是程序提交帐号和密码,用户在特定的网页端确认受权时间,获取受权。

    • 这是一种较为复杂的认证方法,官方在SDK中有给出普通的认证方式

    • 这种方式须要得到需申请的API Key

    • 我这里给出了命令行认证方式(这不是正常的认证方法,也许哪一天就不能用了)

    • 轮子都造好了何须再去造一遍呢,因此有兴趣或者问题的能够邮件联系我

  • 若是认证失败会出现失败提示,因此没有失败这一部分就算完成了

  • 经过这两种方法能够获取一个EvernoteClient类,这是以后一切的开始

值得注意的是,并不是全部受权都得到了全部的权限

  • 经过OAuth方式得到的普通帐户受权,出于安全考虑是受到限制的。

  • 受限的方法会在API表中特别提示

后文用到的token变量即开发者Token受权方式的devToken或是OAuth方式获取的token

帐户

  • 帐户分为两种,分别为沙盒帐户与普通帐户

  • 沙盒帐户只能经过网页登录

  • 沙盒帐户和普通帐户的各特殊功能网页的网址之间都有着相同的区别,例如:

服务 地址
沙盒 https://sandbox.evernote.com/api/DeveloperToken.action
产品 https://app.yinxiang.com/api/DeveloperToken.action

数据结构

整体而言,各数据的获取顺序为:UserStore, NoteStore -> Notebook -> Note -> Resource

关于笔记、笔记本的操做所有都是NoteStore类的方法,须要传入指向须要操做的对象的guid

获取Notebook、Note、Resource类用于读取内容与获取其guid

UserStore,用户信息

  • 在获取了EvernoteClient类的变量client后(见系统结构节),很容易的就能够获取UserStore类

  • 这个类里面存储了有关用户信息、受权的内容(其实除了用户信息其余的都暂时用不到)

 

 

1

2

3

4

5

# 获取类

userStore = client.get_user_store()

# 打印用户名

print('Log in successfully as {}'.format(userStore.getUser().username))

if userStore.getUser().premiumInfo.premium: print('We are friends!')

NoteStore,笔记本仓库

  • 在获取了EvernoteClient类的变量client后(见系统结构节),很容易的就能够获取NoteStore类

  • 全部对笔记本、笔记进行的操做都须要经过该类完成,包括建立、删除笔记、笔记本

 

 

1

2

3

4

# 获取类

noteStore = client.get_note_store()

# 获取笔记本数量

print('There are {} notebooks in your account'.format(len(noteStore.listNotebooks())))

Notebook,笔记本

  • 经过NoteStore类的listNotebooks方法能够获取一个包含全部笔记本的列表

  • 在客户端视图中存在笔记本的嵌套,但实际上数据存储中全部笔记本都在同一层

  • 其下的笔记并不能经过该类的某个属性或者方法获取

  • 具体的属性能够参照这里

 

 

1

2

3

4

5

# 打印每一个笔记本的名字与guid

for notebook in self.noteStore.listNotebooks():

    notebookName = notebook.name

    notebookGuid = notebook.guid

    print('{}: {}'.format(notebookName, notebookGuid))

Note,笔记

  • 获取某一笔记本下的笔记较为复杂

    • 须要先经过NoteFilter类设定一个筛选规则

    • 而后经过NoteStore类的方法获取全部知足这一规则的笔记

  • 其内容(content)是ENML格式的文本

  • 具体的属性能够参照这里

 

 

1

2

3

4

5

6

# 列出第一个笔记本中的全部笔记的标题

notebookGuid = noteStore.listNotebooks()[0]

f = NoteStore.NoteFilter()

f.notebookGuid = notebookGuid

for note in noteStore.findNotes(token, f, 0, 999).notes:

    print(note.title)

进度确认

  • 目前应当能够经过命令行获取四种主要的数据类型

  • 简单的测试一下:以必定格式输出某一个或某几个特定名字的笔记本中的全部笔记

     

     

    1

    2

    3

    4

    5

    6

    # 格式为

    笔记本1:

      笔记1

      笔记2

    笔记本2:

      笔记3

  • 如下为实现代码:

     

     

    1

    2

    3

    4

    5

    6

    7

    8

    def show_notes(noteStore, notebookList=[]):

      for nb in noteStore.listNotebooks():

          if nb in notebookList or not notebookList:

          print(nb.name + ':')

          f = noteStore.NoteFilter()

          f.notebookGuid = nb.guid

          for ns in noteStore.findNotes(self.token, f, 0, 999).notes:

              print(('' if notebook else '    ') + ns.title)

具体方法的使用示范

以删除笔记操做(Function: NoteStore.deleteNote)为例演示如何阅读官方介绍,如下为官方介绍:

Function: NoteStore.deleteNote

首先,因为其为NoteStore类的方法,因此调用的方式为NoteStore.deleteNote(token, guid)

其次,token为上述的开发者Token或者OAuth获取到的token

再次,从图中第七行能够看出,guid的为GUID of the note to delete,下面是Note的介绍

Note

那么,只要获取到Note,就能够得到guid。

因此,最后一步,根据已经介绍过的印象笔记的数据结构,咱们知道若是获取Note

如下为代码:

 

 

1

2

3

4

5

6

7

8

def find_note_guid(noteStore, noteName):

    for notebook in noteStore.listNotebooks():

        f = NoteStore.NoteFilter()

        f.notebookGuid = notebookGuid

        for note in noteStore.findNotes(token, f, 0, 999).notes:

            if note.title == noteName: return note.guid

 

noteStore.deleteNote(token, find_note_guid(noteStore, '要删除的笔记的名字'))

其他的方法相差不大,也就不一一赘述,你能够在这里找到全部你须要的东西

一些基础的方法我进行了必定的包装与简化,写了一个简单的EvernoteController,但愿在你尝试的时候可以给予你一些启发。

你如今已经得到了完成文首处提到的PackMemo所须要的全部知识,能够开始尝试就本身的需求写应用了!

结束语

但愿读完这篇文章能对你有帮助,有什么不足之处万望指正(鞠躬)。

有什么想法或者想要关注个人更新,欢迎来GithubStar或者Fork

问啊-定制化IT教育平台,牛人一对一服务,有问必答,开发编程社交头条 官方网站:www.wenaaa.com 下载问啊APP,参与官方悬赏,赚百元现金。

QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!