我对写作工具的理解是:工具带来的编辑体验往往是第一位的,很多时候并不是简单地为了某个特定的功能去更换合适的工具能达到的,比如我最喜欢的 Markdown 工具 Ulysses ,它很专业,虽然也有不足,但于我而言,某种程度上它是不可代替的,所以本文不是在讨论“为什么不直接用xxx” 🙃。

我在痛些什么

越来越多的人都会用 Markdown 工具来编写文章,但使用 Markdown 工具写文章的过程中有一个很大的痛点就是图片怎么快捷地保存到图床。将图片保存到图床的最大好处就是写出来的 Markdown 文档可以很方便地分享到各个地方。就拿在少数派 Matrix 上写稿这个事来说,我很头疼当文章里出现了大量图片的时候,怎么快捷地将编辑好的文章上传到 Matrix 上。我并不喜欢直接在 Matrix 的编辑器里去解决文章的有和无的问题(专业工具更适合做这个事情),而通过 Mac 和 iPhone 上使用 Ulysses 这样的 Markdown 工具来写文章对我而言是一件非常享受的事情。Ulysses 是通过 iCloud 同步的,我非常喜欢它带来的编辑体验和笔记管理,但图片的存储方式却不能达到 Run Anywhere 的效果,因为 Ulysses 是把图片当做资源文件存起来的,使用相对路径来从本地引入图片,这其实也是大多数 Markdown 工具对图片或附件的处理方法(有些工具自带云,但并不适合创作,比如印象笔记),但这样的方式就带来了编辑出来的 Markdown 文章无法完成随处分享,像我以前通过 Ulysses 编辑好了一篇文章,想把它同步到 Matrix 上去发表,图片的转移工作变得非常巨大,因为你不得不将一张张图片重新上传到 Matrix 上去(前几篇投稿就是这么干的🌚)。

其实 Mac 上已经有很方便的工具来快速上传图片到自定义图床了,比如 iPic、Dropzone3 + Qiniu Action 等多种组合来快速将图片上传至自定义图床并返回图片链接,我在 Mac 上也充分享受到了这种写作的方便,真的是非常方便,我把写出来的文章预览为 html 再拷贝到 Matrix 进行粘贴,完全不用担心文档格式或者图片需要上传的问题,几乎是所见即所得💁。

但实际写作的过程中还是有另一件事情困扰着我,也是我写这篇文章解决的主要问题,当我在 iPhone 上写作或者需要上传手机里的图片时怎么也让图片自动上传到图床里并以一种极便捷的方式给我图片链接的反馈?就拿我前阵子创作2016,我和手机摄影的故事这篇文章来做例子,因为是分享手机摄影,写作过程中自然有许多手机截图或者拍摄图要添加到 Ulysses 里,这里有两个问题,首先我不是用 Mac 一步到位就把素材准备好并把文章写完的,所以创作过程中经常要将素材从手机通过 Airdrop 传输到 Mac 上,再将素材通过上面讲到的工具上传到图床来快速生成链接;其次是我偶尔也要在 iPhone 上对文档进行补充或直接加图片,在 Ulysses ios 客户端里直接加图片后我还得在用 Mac 继续编辑的时候把图片拿出更换成链接(保证可以 Run Anywhere)。这两个问题很明显让我在创作时显得不够“酷”了。最终我还是忍着将文章写完了🤣,但这个梗却在我心头挥之不去,于是乎有了这么一篇捣腾的文章🙈。

解梗之道

在我的上一篇分享Matrix Talk | 如何有效地提高效率:Talk With @weihong中,我已经充分说明了个人对于打造工作流的一些看法。对于痛点的深究我觉得已经足够清楚了,尽管痛点清楚了,现阶段还没到直接拿工具开刀的地步。现在需要深究的是我要打造出一个什么效果的工作流,也就是要明确最终目标是什么,才知道到底要做些什么。

1、目标

我的目标就是打造一个这样的工作流:通过快捷入口 —> 自动弹窗选取照片 —> 照片自动上传至自定义图床 —> 返回图片链接并存储起来 —> 弹出成功提示。

2、解剖关键要素

快捷入口

手机上可选的效率工具,我比较熟悉也比较符合的是 Workflow / Drafts

自定义图床

七牛云,因为我前期已经对比过,而且我 Mac 上的工具也是采用了七牛云的图床。七牛云给每个免费用户提供了10G的免费空间,它还具备强大的开发者支持(意味着良好的 api 支持),基于这一点基本可以确定用七牛云。此外说明下为啥不用微博图床,因为微博图床并不是一个真正的图床,存在很大的不稳定性。


存储方式

剪贴板 ,它是一个可以无阻碍抵达所有应用的系统工具,就像一个人身体里的血液,可以抵达身体的每个角落,所以利用好剪贴板足矣。

解梗之路

痛点和目标都明确了,可以开始着手实现了,在分享实现过程之前需要说明一下,目标是很明确,但不意味着你一定可以成功,所以如果遇到确定无法解决的问题了,那就需要有灵活变通的替代方案,前提是你要确定是否真的是解决不了的问题。在实现的过程中,自然会有无法解决的问题,但其实很多并不是真的不能解决,敢于尝试才能曲线救国。

1、实现的难点在哪 

实现的难点在哪 ?为什么要问这个问题,因为如果你把最难啃的骨头的给啃了那就真的是顺水推舟了,这人人皆知的道理自然不能忘,所以马上分析出最难啃的骨头。

看回上面的目标工作流,选取照片、设置剪贴板、弹出通知这些都是 Workflow 现成的功能啊,没有了开发成本那就撇开放在一边,接着只剩下一个上传图片并返回图片链接的功能了,这就是要通过七牛云提供的开发指导进行探索的部分,这才是最难啃的!上传图片其实可以理解为一个请求 API ,所以我们要找到七牛云提供的上传图片请求。

2、文档调研

所谓“知己知彼,百战不殆”,我们要很清楚官方文档都有哪些可利用的信息。点击个人面板,进入文档中心


可以看到官方提供了各个平台的 SDK 开发包,但我在手机上定制并不是实际的开发过程,也不可能在手机 App 引入 SDK 来开发。但我们还是要浏览一遍,查阅下有没有可利用的信息。


这里由于我熟悉的平台是 JavaScript ,所以点击进入浏览。这里提到了七牛云底层 API ,因为我们无法在手机引入所谓的 SDK 开发包,所以尝试进一步了解这个上传策略上传凭证到底是什么。

我们可以看到官方对于上传策略和上传凭证的说明。也就是说上传策略是上传图片时的配置信息,上传凭证是调用上传请求时必须携带的认证参数。这些信息很关键,因为一旦我们找到了官方提供的上传文件的请求接口,那这些参数就是必不可少的。

WX20170119-092814@2x.pngWechatIMG80.jpeg

紧接着我们切换到其他 Tab 来尝试找到上传文件的 API ,最终发现在帮助文档这个 Tab 下有一个 API 参考的二级目录存储着上传文件的关键说明。

很快我就注意到了这个上传 —> 直传文件,很明显这个直传文件(upload)就是我在手机上可以用到的请求接口。

WechatIMG78.jpegWX20170119-090244@2x.png

在接口说明里,上传凭证是必传的一个参数。所以我得知道上传凭证怎么获取。


回到上传凭证说明页,找到上传凭证生成器这个链接。


在尝试生成 Uptoken 的过程中我发现,网页并不需要发起网络请求,言外之意就是仅仅依靠当前网页提供的代码就可以生成 Uptoken 。其实官方对于代码调用和步骤都已经说得很清楚了。


对于上传策略我在这里简单地说明下必要的两个参数

  • scope:空间名(存储空间名称)
  • deadline:上传凭证失效时间戳

3、分而治之 各个击破

在充分的调研之后我决定分派两路人马尝试攻城。

一、使用上传凭证生成器生成的凭证尝试能否成功在手机上传图片

主将:Workflow

必杀技:Get Contents of URL

1、从手机相册选择上传图片并保存图片名称扩展名信息,并构建文件名2、进行网络请求并处理


Headers 里的两个参数是按照官方提供的说明来构造的,Request Body 里的 key 对应的是文件名,file则是图片文件。

WX20170121-145431@2x.pngworkflow-IMG_6159.jpeg

按照官方说明,上传成功则会返回一个包含 key 字段的 JSON 数据,失败则会返回一个包含 error 字段的 JSON 数据,所我使用正则匹配的方式来判断返回成功还是失败并做相对应的处理。

3、测试成功!

查看七牛云内容管理,也已经成功上传!


二、研究如何在手机上生成 Uptoken

主将:Drafts

必杀技:Action Script Step

选用 Drafts 是因为它提供了在手机上执行 JavaScript 代码的可能,用它来生成 Uptoken 准没错。

扩展阅读:强大如怪物:顶级文本处理应用 Drafts 4 深度评测

Step 1:初始化参数(只需用户操作一次)

在官方提供的上传凭证生成器页面,我们可以知道必须的几个参数,其中 deadline 参数可自动生成,其它均得用户手动输入。

  • accessKey / secretKey:分别对应密钥管理中的 AK / SK
  • bucketName:对应空间名
  • deadline:凭证失效时间戳


所以制作 Drafts Action 的第一步就是用户填入 accessKey 、secretKey 、bucketName

Step 2:生成 uploadToken(自动完成)

官方提供的上传凭证生成器例子中,包含有所有的处理代码,我将 CryptoJS 还有例子中其它的 JavaScript 代码一并拷贝 Step2 里的 SCRIPT 一栏(这部分代码主要是初始化处理方法),然后在末尾加上处理代码(如下)


处理完毕后,我们还要将 uploadToken 保存到剪贴板中给 Workflow 使用。

至此,两路将士均已告捷,大获全胜。

4、合二为一

既然两块大骨头都啃下来了,那么就可以将 Workflow 和 Drafts 整合起来了。合起来并不难,在 Workflow里调用一个 Drafts 的 Action 就完成了。


动图展示

上传图片并返回图片链接

workflow-imb_7E8C86A3-46E0-4B5A-BA0A-205

通过 Telegram 快速将图片链接传至电脑

通过 Workflow 打开 Telegram 给自己发消息的界面 ,但需要自己手动点击发送按钮。Mac 上打开 Telegram 接收即可。


下拉通知栏自动同步剪贴板至 Pin mac 客户端

👉🏻视频教程:设置 Pin 同步推送

先启用 Pin 通知栏组件,上传成功后只要下拉一下通知栏(目前好像只有下拉通知栏才能推送,想跟作者反馈跳转至应用也能完成推送就不用自己下拉通知栏了)就会自己推送到 Pin 的Mac 客户端,直接在使用的地方粘贴就ok了。正常情况下 3s 内就可以收到推送,速度相当快。

下载工作流

第一步导入 Drafts Action

👉🏻下载「generate_qiniu_upload_token」Drafts Action(在 iPhone 打开才有效)

由于导入的 JavaScript 代码过大无法生成有效的链接,我将第二个 Step 里的代码导了出来,所以在安装了上面的 Action 后,还需要各位手动下载 Step2.txt ,然后将里面的代码原原本本拷贝到第二个 Script Step

第二步导入 Workflow

👉🏻下载「七牛云」Workflow 

👉🏻下载「七牛云-Telegram」Workflow 

注:需要自动生成 Markdown 格式的链接比较简单,可自行扩展。

下载并安装完毕后请按照使用须知来进行配置。

使用须知

Drafts

修改 Drafts 应用设置


手动填入 Action 初始化参数

按照以下说明将自己的密钥和空间名填入


Workflow

手动填入空间域名、上传服务器域名(默认华东地区,请根据自己的地区类型更改域名,建议创建华东地区的服务器)。


这一次,终于可以酷酷地写作了

至此,解决了开头提到的两个痛点,我现在发表的文章就是我直接从 Ulysses 拷贝过来的,不需任何调整。事实上不只是 Matrix ,其它平台(例如微信公众平台)也可以直接拷贝,最终可以实现 Run Anywhere

这篇文章断断续续写了好几天,期间总共用了三种方式来写

  • Mac + Ulysses + Dropzone3
  • iPhone + Ulysses + Workflow + Drafts
  • 通过扩展 Telegram/Pin(Mac) 在 Mac 上获取手机上的图片链接

这样的组合让我更专注写作了,不再需要手动整理素材到电脑,手机写作也不再有后期烦琐的图片转移工作,令人轻松又愉悦的写作过程。

这一次,终于可以酷酷地写作了。