你用过印象笔记吗?一个奇葩需求的另类玩法
当阅读一些网上的文章时,我经常会发现一些有价值的段落或句子,于是我收集起来做了个网站:乔木记录
如何快速收集整理这些摘抄的句子呢?下面跟大家分享下我的诀窍。
手机上的解决方案
如果用手机阅读,复制句子后通过Workflow自动存到印象笔记。
什么是Workflow?
这是一个iPhone上非常值得购买的一款自动化处理软件,少数派网站有相当完善的教程:关于 Workflow 的文章 - 少数派
实现的效果是这样:
手机选中复制一段内容,下拉划出iPhone的Widget,点击自己创建的“从剪贴板保存到印象笔记”。
然后每天都会产生一条以日期命名的笔记,当天粘贴的所有内容都会在这条笔记中。
使用Workflow避免了需要频繁切换到印象笔记,手动新建笔记,然后长按粘贴的复杂操作。
而选择印象笔记的好处就是支持所有平台同步,随时随地查看,异常方便。
电脑上的解决方案
如果在电脑上阅读,以往就是就复制粘贴句子到Mweb这个牛逼的Markdown编辑器中,抽空整理后发布。
关于Markdown和Mweb的介绍看这篇 知乎专栏
对于电脑上的复制粘贴操作来说,其实已经很简单了。
但是:“懒是无止境的”。
我的设想是:“如果复制一句话后,然后按个快捷键就实现类似于手机上Workflow的功能就好了。”
于是我开始寻找解决方案。
虽然印象笔记客户端也支持快捷键新建笔记,但是每次都新建一条笔记,不能把内容都放到一起,况且切换窗口或弹出的快捷输入框,都需要花费一些操作,阅读的快感容易被打断。
后来我发现,印象笔记居然提供有API,可以根据自己需要定制开发。
怎么做呢?
首先去印象笔记开发者平台申请一个token,其实就是密码,不能谁都可以访问你的印象笔记内容吧。
Token申请地址:
Developer Tokens - 印象笔记开发者
第一段里有两个链接地址,一个叫沙盒,一个叫产品。
其实申请的Token可以通用,我们点击“产品”链接:
欢迎回来
然后会要求登录你的印象笔记账号,之后出现如下界面:
点击 “Create a developer token”,出现如下界面:
复制生成的 Developer Token,类似于:
S=s3:U=1d3c1:E=16081a4df70:C=15929f3b2d0:P=1cd:A=en-devtoken:V=2:H=f540d0359f7e0d5c52235eb1c19c9122
把这段东西保存好,关了页面就消失了,不然下次还得生成。
印象笔记不亏是国际化产品,提供了各种语言的开发SDK。
对PHP稍微熟悉些,于是点击安装PHP的SDK,然后发现跳转到Github网站。
evernote/evernote-cloud-sdk-php
按照教程,一步步操作,打开电脑上的终端输入:
curl -sS https://getcomposer.org/installer | php
php composer.phar require evernote/evernote-cloud-sdk-php
因为都是国外的网站,获取代码的速度有些慢,请耐心等待。
等下载安装完成,本地会出现一个叫“vendor”的文件夹,这里面都是SDK文件。和文件夹同级的位置新建一个文件,比如叫 evernote.php
下面就可以开始写代码了:
<?php
//引用Evernote的PHP API
require dirname(__FILE__).'/vendor/autoload.php';
// 时区设置,貌似不设置也行。
date_default_timezone_set('Asia/Shanghai');
// 读取剪贴板导出的txt文本内容。 Mac下可以命令行运行pbpaste获取剪贴板里的内容。
// 比如 pbpaste > /tmp/evernote.txt 可以把剪贴板里的内容导出到临时目录下叫做evenote.txt的文件中。
// 用于写入笔记中。
$content = file_get_contents("/tmp/evernote.txt");
// 个人使用开发者token就可以,申请地址:Developer Tokens - 印象笔记开发者
// 类似于 S=s3:U=1d3c1:E=16081a4df70:C=15929f3b2d0:P=1cd:A=en-devtoken:V=2:H=f540d0359f7e0d5c52235eb1c19c9122
$token = 'token';
// 不做沙盒测试,直接读写真实的evenote笔记,所以设置为false。
$sandbox = false;
// Evernote在中国叫印象笔记,对应的API地址不同,这里需要设置为true
$china = true;
// 创建一个Evernote读写客户端对象。
$client = new \Evernote\Client($token, $sandbox, null, null, $china);
// 遍历读取你的印象笔记(evernote)账号里所有笔记本名称、GUID,还有对应的笔记本类型。
function getNotebookGuid($client){
$notebooks = array();
$notebooks = $client->listNotebooks();
foreach ($notebooks as $notebook) {
echo "\n\nName : " . $notebook->name;
echo "\nGuid : " . $notebook->guid;
echo "\nIs Business : ";
echo $notebook->isBusinessNotebook()?"Y":"N";
echo "\nIs Default : ";
echo $notebook->isDefaultNotebook()?"Y":"N";
echo "\nIs Linked : ";
echo $notebook->isLinkedNotebook()?"Y":"N";
echo "\n\n";
}
}
// 运行后获取自己所有evernote笔记本的GUID
getNotebookGuid($client);
// 单条笔记名称,结构例如:“20161225阅读记录”,就是当天的日期组合上“阅读记录”,可以根据自己喜好设置
$noteName = Date("Ymd")."阅读记录";
// 以笔记名去某个笔记本中搜索。
$search = new \Evernote\Model\Search($noteName);
$notebook = new \Evernote\Model\Notebook();
$notebook->guid = '9e965c09-5045-4909-ad78-bf95a5bbc09d';
//最大返回结果条数,因为笔记名字格式不会重名,所以结果只需要返回一个就够。
$maxResult = 1;
$results = $client->findNotesWithSearch($search, $notebook, $maxResult);
// 如果搜不到结果,说明没有这条笔记,立马使用剪贴板里的内容创建一条以日期命名的笔记。
if($results == null){
// 创建笔记读写模型对象
$note = new \Evernote\Model\Note();
$noteName = Date("Ymd")."阅读记录";
// 设置笔记名称
$note->title = $noteName;
// 设置笔记内容,纯文本格式就行,所以使用PlainTextNoteContent对象,这样比较简单。
// 可以查看官方文档,还有别的API,实现添加图片、附件等等高级格式。
$note->content = new \Evernote\Model\PlainTextNoteContent($content);
// 设置笔记Tag标签,可根据自己需要修改。
$note->tagNames = array('乔木阅读记录', '摘抄');
// 因为阅读摘要想放到对应的单独的笔记本中,所以这里需要设置存入的笔记本。
$notebook = new \Evernote\Model\Notebook();
$notebook->guid = '9e965c09-5045-4909-ad78-bf95a5bbc09d';
// 如果不需要存入指定笔记本则替换上面两行为:$notebook = null;
// 这样笔记会写入默认的笔记本。
// 把设置好的笔记写入 “印象笔记”
$firstInsert = $client->uploadNote($note, $notebook);
// 这里可以读取写入的笔记名称,还有其他参数,请参考官方文档。
$title = $firstInsert->title;
// 我个人需求是每天一条笔记,用于存放今天看到的好句子或段落。
echo "The first item of today, note's name is: ".$title;
}else{
// 读取第一条搜索结果的笔记GUID。
$guid = $results[0]->guid;
// 获取这条笔记的数据,是一个对象结构。
$res = $client->getNote($guid);
// 把笔记的内容读出来,并转化为字符串。
$str = (string)($res->content);
// 原本笔记内容是XML结构,我只需要提取其中的笔记纯文本部分。
$pattern = '/<en-note>(.*)<\/en-note>/is';
preg_match_all($pattern, $str, $matches);
// 获取之前笔记的内容。
$oriStr = $matches[1][0];
// 把本次剪贴板里的内容赋值给$newline
$newline = $content;
// 旧的笔记内容,加上两个换行符号,然后再加上新的剪贴板里的内容。
$newStr = $oriStr."<br /><br />".$newline;
// 创建新的笔记对象
$note = new \Evernote\Model\Note();
$noteName = Date("Ymd")."阅读记录";
$note->title = $noteName;
$note->content = new \Evernote\Model\PlainTextNoteContent($newStr);
$note->tagNames = array('乔木阅读记录', '摘抄');
// 替换旧的笔记内容为新的笔记内容,变相实现在一条笔记中增加新的内容。
$updated = $client->replaceNote($client->getNote($guid), $note);
echo "Append content: ".$newline;
}
?>
科学上网困难的朋友,完整包含SDK的实现代码这里:
Coding | 代码托管,项目管理,WebIDE,演示部署,开启云端开发模式,让开发更简单
代码虽然有了,但工作并没有结束。
我们需要让这段代码在按下某个快捷键时自动运行,这就需要Mac OSX系统自带的工具Automator。
它可以打包脚本成为一个应用程序。
打开Automator后新建一个“工作流程”文稿,点击资源库->实用工具->运行 Shell脚本(双击)
输入如下内容:
#! /bin/bash
LANG=en_US.UTF-8 pbpaste -txt > /tmp/evernote.txt & /usr/local/bin/php /pathto/evernote.php
请注意,LANG=en_US.UTF-8 很重要,否则会造成乱码。
pbpaste是Linux类系统自带的命令,可以读取剪贴板里的数据。然后使用 “> /tmp/evernote.txt” 在/tmp目录下输入生成一个叫做evernote.txt的文件。
而“/usr/local/bin/php” 是本机的PHP程序的位置,”/pathto/evernote.php” 是我们刚才写的PHP文件的位置。
整个脚本的意思是:
先把剪贴板里的内容存入临时文件夹下的evernote.txt文件中,然后执行PHP文件evernote.php
然后把这个文件存储到“应用程序”文件夹里,文件格式修改为“应用程序”,文件名为“save2evernote”。
然后再新建一个Automator文件,选择“服务”文档格式。
点击左侧的实用工具,然后找到“开启应用程序”后双击。
修改“服务”收到 下拉菜单为“没有输入”,因为不需要输入任何东西,然后保存,名字为“save2evernote”。
下面开始设置快捷键,打开Mac OSX中的系统偏好设置,点击键盘->服务。
找到我们刚才创建的服务“save2evernote”,勾选上后设置一个自己喜欢的快捷键,如下图所示。(Ctrl+ALt+Command+V)
至此,终于一切都搞定了,以后遇到好段落和句子,只需要选中按下Command+C,然后再按 Ctrl+ALt+Command+V 就自动贴到印象笔记了。
总结
通过这么一番折腾发现:
学会一门编程语言很重要,可以不用求人开发自己需要的功能,推荐PHP、Python或JavaScript(因为有Nodejs)
尽量让一些工作变得自动化,可以提升效率、节省时间,让工作和生活更美好。
作为产品经理,我在编程方面是新手,但很享受自己能开发做出小工具的感觉,欢迎热爱编程的朋友们加我微信:vista8