V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
NxnXgpuPSfsIT
V2EX  ›  Python

Python 小工具配合 Evernote 完成每周工作安排

  •  
  •   NxnXgpuPSfsIT ·
    littlecodersh · 2016-05-17 20:08:24 +08:00 · 3021 次点击
    这是一个创建于 3138 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因:

    近期看 Evernote API 的时候发现印象笔记对 Python 非常友好,就试了一下各类操作。

    刚好一直觉得用过的那些备忘、代办软件功能太乱还不如拿记事本或者短信记。就用印象笔记写一个,反正摆脱不了印象笔记,就干脆都存在里面。

    用过一段时间以后发现备份和检索功能还不错,也可以把一些文档做链接放进去。

    其实身边的 API 都可以通过 Python 用起来,简单的利用也会有不错的效果。

    有什么想法或者问题,欢迎和分享!

    演示用的软件可以在我的Github,或者360 云盘(0fe0)上下载。

    演示视频

    我把简单的演示放在了优酷上,如果对演示感兴趣可以看下去。

    演示中没有示范如何安装 evernote 的包,pip install evernote一下就好了。

    演示主要分为配置 Secret Key 、使用、配置快捷启动,具体的文字说明我写在了后面。

    用途

    • 该玩具将会将上周的 Memo (在 Memo 笔记本组中)备份到 S-Memo 笔记本组(如果有的话)
    • 用一份空白 Memo 替代旧 Memo

    配置

    配置 Python 及程序

    • pip install evernote:安装 evernote 包
    • pip install requests:如需要使用 Oauth ,安装 requests 包
    • Memo 样式可以通过修改模板文件content.enex调整
    • 存放位置与工作安排的名字可以通过修改PackMemo.py 4-6 行配置

    配置 Secret Key

    • 进入印象笔记官网登陆(其实也可以忽略这一步,但下面的网址链接不太稳定)
    • 进入印象笔记开发者 Token获取开发者 Token
    • 将获取到的开发者 Token 添加到 EvernoteController.py 第 21 行单引号内(->21 DEV_TOKEN = '')

    使用

    • python PackMemo.py:将会自动登录完成日志创建与存储
    • Win+R pm <CR>: Windows 系统内配置好快捷启动后即可使用

    配置快捷启动

    • Win+R %systemroot%/system32 <CR>:打开文件夹
    • PackMemo.bat创建快捷方式并重命名为pm
    • pm拖入文件夹

    程序细节

    EvernoteController.py

    • 示例程序:基本的笔记操作
    e = EvernoteController()
    e.create_notebook('Notebook1')
    e.create_note('Hello', '<en-note>Hello, world!</en-note>', 'Notebook1')
    e.create_notebook('Notebook2')
    e.show_notes()
    e.move_note('Notebook1/Hello', 'Notebook2')
    e.show_notes()
    e.delete_note('Notebook2/Hello')
    # deleting notebook can only be available when you use developer token for your own evernote
    e.delete_notebook('Notebook1')
    e.delete_notebook('Notebook2')
    e.show_notes()
    
    • 可以选择是否开启本地存储与 Oauth 验证(就是账号密码登陆)
    • 笔记指定方式通过myfile方法确定为Notebook/Note
    • 删除操作仅在使用开发者 Token 时可以使用,否则仅能移入已删除的文件文件夹( API 限制)
    • 完整版 EvernoteControler.py 包含其余组件,如果感兴趣可以再做研究

    Memo.py

    • 通过替换将日期周数等内容
    • 关于 enex 的文档格式,文档的内容都在<en-note>标签里面
    • 建议有什么需要的格式自己导出一份研究就可以了,这里是扩展阅读

    PackMemo.bat

    • 虽然演示视频中把快捷方式直接放到了%systemroot%/system32 下面,但还是得说,这不是一个好习惯
    • 建议确定一个别的文件夹,专门用来放各类快捷启动,然后把这个文件夹加入环境变量
    • 没准就有人觉得有用呢(摊手)

    API

    快速入门

    • 官方对于 Python 很友善,读完这里就能有个大致的了解
    • 整个 API 的框架分为 OAuth (使用开发者 Token 的话直接获取 EvernoteClient 即可)和常用方法
    • 仅是小应用的话可以不用了解 OAuth
    • OAuth 原意不是通过命令行实现,但还是可以通过一定的方法实现,官方文档见这里

    权限

    印象笔记有两种权限类型,开发者权限和普通权限。

    • 开发者权限:沙盒内与使用开发者 Token (仅能操作本人账号)时的权限,可以使用所有的方法
    • 普通权限:用户可以通过输入账号密码和点击确认给予应用授权,可以使用绝大部分方法,具体操作见Oauth.py

    获得授权后会获得一个 Token ,在各种方法中都会使用到

    通过这个 Token 即可获取 EvernoteClient, userStore, noteStore

    if SANDBOX:
        client = EvernoteClient(token=self.token)
    else:
        client = EvernoteClient(token=self.token, service_host=SERVICE_HOST)
    userStore = client.get_user_store()
    noteStore = client.get_note_store()
    

    基本方法

    Function: NoteStore.deleteNote为例演示如何使用 API ,以下为官方介绍:

    Function: NoteStore.deleteNote

    首先,由于其为 NoteStore 类的方法,所以调用的方式为NoteStore.deleteNote(token, guid)

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

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

    Note

    那么,只要获取到 Note ,就可以获得 guid 。

    所以,最后一步,这里牵扯到印象笔记的数据结构,了解即可

    • 通过NoteStore.listNotebooks获取 Notebook 列表,找到需要的 Notebook 的 guid (和 Note 的 guid 不同)
    • 通过NoteStore.findNotes设置特定笔记本的NoteFilter获取 Note 列表,找到需要的 Note
    • 调用 NoteStore.deleteNote 方法即可以生效

    值得一提的是,某些操作需要特殊的权限, sandbox 中和使用开发者 Token 时可以使用不代表外部可以使用

    结束语

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

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

    160517

    LittleCoder

    EOF

    mongost3t
        1
    mongost3t  
       2016-05-18 18:27:38 +08:00
    evernote 包不支持 python3 ,创建 note 还得手动加 en-note 的 tag ,一大堆 thrift ,不知道友好在哪……

    倒是挺稳定,申请 production api 也会给批
    NxnXgpuPSfsIT
        2
    NxnXgpuPSfsIT  
    OP
       2016-05-18 21:12:31 +08:00
    @mongost3t
    py3 的 sdk 可以用这个 https://github.com/evernote/evernote-sdk-python3 ,我用下来基础操作没什么问题,可以一试。
    说友好是因为入门的介绍和例程都给的很到位,过渡到 api 表完全没有瓶颈。
    <en-note>是别人的文件内容嘛,为了区分自家的标记和普通的标记。
    多了一个<en-note>我感觉还是好处多一点,就最常见的,文章里的附件、图片什么的只要写<en-media>就行。
    看来是同道中人,之后开发可以多交流:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1869 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.