使用Python从Workflowy同步大纲到印象笔记
title: 从Workflowy到印象笔记
toc: true
comment: true
date: 2018-03-17 10:05:54
tags: ["Python", "Workflowy", "Evernote"]
category: ["Craft"]
Workflowy是一个极简风格的大纲写作工具,使用它提供的无限层级缩进和各种快捷键,可以非常方便的理清思路,写出一个好看而实用的大纲。如下图所示。

印象笔记更是家喻户晓,无人不知的跨平台笔记应用。虽然有很多竞争产品在和印象笔记争抢市场,但是印象笔记强大的搜索功能还是牢牢抓住了不少用户。
如果能够把用Workflowy写大纲的便利性,与印象笔记强大的搜索功能结合起来,那岂不是如虎添翼?如下图所示。

EverFlowy就是这样一个小工具。它可以自动把Workflowy上面的条目拉下来再同步到印象笔记中。如果Workflowy有更新,再运行一下这个小工具,它就会同步更新印象笔记上面的内容。Workflowy负责写,印象笔记负责存,各尽其能,各得其所。
工具介绍
Everflowy基于Python 3开发,代码托管在Github中,地址为:https://github.com/kingname/EverFlowy这个小工具在持续开发中,目前可以实现Workflowy单向同步到印象笔记和差异更新。由于印象笔记的Oauth验证方式需要申请才能对正式的账号使用,但它又不会通过这种个人小工具的申请,所以目前暂时使用开发者Token。关于如何申请开通正式账号的开发者Token,在后文会有详细的说明。
安装
首先需要保证电脑中安装了Python 3,否则无法运行这个小工具。代码的依赖关系使用Pipenv来管理,所以需要首先使用pip安装pipenv:
python3 -m pip install pipenv
有了Pipenv以后,使用Git把代码拉到本地再安装依赖:
git clone https://github.com/kingname/EverFlowy.git
cd EverFlowy
pipenv install
pipenv shell
运行了上面的4条命令以后,你的终端窗口应该如下图类似。

Pipenv会自动创建一个基于Virtualenv的虚拟环境,然后把EverFlowy依赖的第三方库自动安装到这个虚拟环境中,再自动激活这个虚拟环境。
配置
在代码的根目录,有一个config.json文件,打开以后如下图所示。

你需要修改三个地方,分别是username,password和dev_token。其中username和password分别对应了Workflowy的用户名和密码,而dev_token是印象笔记的开发者Token。
这里需要说明一下印象笔记的开发者Token。印象笔记的开发者Token有两套,分别是沙盒环境的开发者Token和生产环境的开发者Token。所谓沙盒环境,就是一个测试开发环境,这个环境是专门为了快速开发印象笔记App而设计的,它的地址为:https://sandbox.evernote.com。打开这个网址,可以看到页面上弹出了警告,如下图所示。

无论你之前是否有印象笔记的账号,要使用沙盒环境,都必需重新注册。注册完成以后,通过访问https://sandbox.evernote.com/api/DeveloperToken.action获取沙盒环境的开发者Token。
关于印象笔记的沙盒环境,我将另外开一篇文章来说明。本文主要介绍如何申请生产环境的开发者Token,从而可以使用正式的印象笔记账号。
在2017年6月以后,印象笔记关闭了生产环境开发者Token的申请通道,如果打开申请网址:https://app.yinxiang.com/api/DeveloperToken.action,你会发现申请的按钮是灰色的且无法点击。要解决这个问题,就需要让印象笔记的客服帮忙。
登录自己的印象笔记正式账号,打开印象笔记首页,把页面拉到最下面,可以看到有一个“联系我们”,如下图所示。

进入“联系我们”,点击“联系客服”,如下图所示。

在联系客服的页面填写如下信息,最后一项“简要描述问题”填写“我需要基于印象笔记API开发,请帮我开通生产环境开发者Token”并提交。

大约24小时内,就可以受到客服回复的邮件,如下图所示。

此时再次打开https://app.yinxiang.com/api/DeveloperToken.action就可以申请开发者Token了,如下图所示。

需要注意的是,开发者Token只会显示一次,所以你需要立刻把它记录下来。
运行
有了生产环境的开发者Token以后,把它填写到config.json中,配置就算完成了。在终端输入命令:
python3 EverFlowy.py
程序就可以开始同步Workflowy的数据到印象笔记了。
同步完成以后,你会发现程序的根目录出现了一个history.db文件。这是一个sqllite的文件,里面就是你在Workflowy中的所有大纲内容和对应的印象笔记GUID和enml格式的内容。这是为了实现数据的差异更新而生成的。你可以使用各种能够浏览sqllite的工具来查看里面的内容。
已知问题
- 如果删除了history.db,那么再次运行Everflowy,Workflowy中的所有内容都会再次写入印象笔记。
- 如果单独删除了EverFlowy写入印象笔记中的某一条目,却不删除history.db中的对应条目,WorkFlowy会因为找不到GUID而抛出异常。
- 没有测试国际版印象笔记账号是否可用。
- 如过你想测试沙盒环境的开发者账号,请修改
evernote_util/EverNoteUtil.py第98行,把
client = EvernoteClient(token=self.dev_token, sandbox=False, service_host='app.yinxiang.com')
修改为:
client = EvernoteClient(token=self.dev_token)
使用Python从Workflowy同步大纲到印象笔记的更多相关文章
- Python 黑帽编程大纲(变化中)
Python 黑帽编程大纲(预览版) 教程说明: 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and Defense with Pytho ...
- 全国计算机等级考试二级Python语言程序设计考试大纲
全国计算机等级考试二级Python语言程序设计考试大纲(2018年版) 基本要求 掌握Python语言的基本语法规则. 掌握不少于2个基本的Python标准库. 掌握不少于2个Python第三方库,掌 ...
- 孤荷凌寒自学python第四十三天python 的线程同步之Queue对象
孤荷凌寒自学python第四十三天python的线程同步之Queue对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Queue对象是直接操作队列池的对象,队列中可以存放多种对象,当然也 ...
- 孤荷凌寒自学python第四十一天python的线程同步之Event对象
孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于 ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- Python:Day28 同步锁
同步锁: Python不是有一把锁了吗?为什么还要加锁? Python解释器的GIL的作用是同一时刻只有一个线程被CPU执行,而同步锁的作用同一时刻只有一个线程对锁定代码块操作 如果不加锁,当多个线程 ...
- python多线程以及同步队列(转)
转自:http://www.w3cschool.cc/python/python-multithreading.html 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长 ...
- python多线程--线程同步
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步. 使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire ...
- python 多线程中同步的小样例
#!/usr/bin/python # -*- coding: UTF-8 -*- # 在一个资源池中.获取资源 # Author: zhang # Date: 2015-7-27 import ti ...
随机推荐
- ireport报表学习
常用组件介绍: 制作一个报表一般四个组件比较常用,下面分别介绍 Rectangle:用于画表格的样式,整个表格的样式使用次组件做出来的,本控件表现为一个黑色矩形框,多个黑色矩形框排在一起可以组合出来任 ...
- myeclispe中向mysql中插入中文数据出现??问题解决办法
或许很多人会出现??这种令人头痛的mysql的中文乱码问题:解决如下: 1.先对于新建的数据库要设置默认的字符集为UTF-8 create database mydb default characte ...
- 常见JedisConnectionException异常分析
异常内容:我看了很多人的博客,千篇一律都是说redis.conf文件的配置问题,发现并不能解决我的问题,今天写这个博客讲解一下我的解决办法: 遇到这个问题第一步:查看虚拟机的防火墙是否关闭,测试方法就 ...
- C语言_了解下结构体指针
在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型.当然也可以指向结构体,先看一个小案例: #include <stdio.h> #include <string.h&g ...
- php 网络爬虫2种方法
1,通过curl进行抓取再进行写入文件当中: $curlobj = curl_init(); // 初始化curl_setopt($curlobj, CURLOPT_URL, "https: ...
- c++ 如何把RGB图像转换成HSV图像?
CV_<bit_depth>(S|U|F)C<number_of_channels> 1--bit_depth---比特数---代表8bite,16bites,32bites, ...
- HDU - 2154 线性dp
思路:0表示A,1表示B,2表示C,d(i, j)表示在第j次时正好到达i. AC代码 #include <cstdio> #include <cmath> #include ...
- 针对特定XML的解析器XMLParser
一.建立网页库和偏移文件 为文本搜索引擎建立网页库,首先要把所有的网页(这里是文章)格式化,并保存到指定的格式中.如以下格式: | ...
- 好用的Markdown编辑器汇总
Markdown 是一种简单的.轻量级的标记语法.用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成极富表现力的文档. Markdown具有很多优点: 写作中添加简单符号即完成排版,所见即 ...
- freemarker自定义标签报错(七)
1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...