首发于向阳乔木
你用过印象笔记吗?一个奇葩需求的另类玩法

你用过印象笔记吗?一个奇葩需求的另类玩法

当阅读一些网上的文章时,我经常会发现一些有价值的段落或句子,于是我收集起来做了个网站:乔木记录

如何快速收集整理这些摘抄的句子呢?下面跟大家分享下我的诀窍。

手机上的解决方案

如果用手机阅读,复制句子后通过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 getcomposer.org/install | 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 就自动贴到印象笔记了。

总结

通过这么一番折腾发现:

  1. 学会一门编程语言很重要,可以不用求人开发自己需要的功能,推荐PHP、Python或JavaScript(因为有Nodejs)

  2. 尽量让一些工作变得自动化,可以提升效率、节省时间,让工作和生活更美好。

作为产品经理,我在编程方面是新手,但很享受自己能开发做出小工具的感觉,欢迎热爱编程的朋友们加我微信:vista8


编辑于 2016-12-24 22:40