Deepin V20 右键发送至为知笔记


1. 创作背景

昨天在深度系统上做了一个打开文件管理器选择文件右键发送文本至博客园的插件。
这个插件对于我自己来说是及其方便的东西,平时的学习积累,工作经验或者生活感悟,随手记下之后,就能够轻松发送出去,不需要登录和编辑。
其实以前使用win10的时候,通常的方式就是在为知笔记下面创建好markdown文本之后,通过为知笔记的分享功能发布博客。为知笔记其实也是调用博客园的API,对吧。
然后昨晚发布到deepin论坛的时候,感觉有时候自己应该还可以保存一些不想发布的内容到为知笔记。于是就有了今天的这篇博客

注:这篇博客是通过deepin终端写的,在deepin下面,你可以选择终端,编辑器,typroa,vscode来创建markdown文档

2. 学习为知笔记的API

为知笔记很厚道地提供了API给用户使用。具体的地址在这里,
在API快速上手这里,官方更加厚道地提供了很多示例。看到这些代码,我第一眼是懵逼的,不知道这是什么语言,惭愧。最后确定是js之后,我这个纯js小白,毫不犹豫地在deepin上安装nodejs环境,并开始撸起来

2.1 deepin部署nodejs与npm

直接命令行执行sudo apt-get install nodejs npm即可,先不要管版本是否是最新的事情。

2.2 编辑代码

下面就是正儿八经的编程过程了,好歹也有其他语言的编程基础,所以在研究为知笔记官方提供的API代码时,还是稍微能看得懂的。
意思就是:你首先得用你的账号和密码,发送http请求到既定的URL,然后或获取到你的访问令牌,用这个令牌你随便玩。
OK,开始吧。
具体摸索的过程,对于js小白来有些困难的,详细过程我就不表了,都在代码里了,show code!

//注意:如果下面三个包没有的话,deepin命令行执行npm install xxx即可。有包管理器就是方便。
var fs = require("fs")
var program = require("commander")
var linerByLine = require("n-readlines")

const axios = require('axios');
const AS_URL = 'https://as.wiz.cn';

//这里主要是通过命令行指定文件,因为要集成到deepin的文件管理器右键。它的右键实际就是用文件名做参数,调用你的命令。
program
    .option('-f, --file ','add filename')
    .parse(process.argv)

async function execRequest(method, url, body, token) {
  const options = {
    url,
    method,
    data: body,
  };
  if (token) {
    options.headers = {
      'X-Wiz-Token': token,
    };
  }
  const res = await axios(options);
  const data = res.data;
  if (data.returnCode !== 200) {
    console.error(`request error: ${data.returnMessage}`);
    const err = new Error(data.returnMessage);
    err.code = data.returnCode;
    err.externCode = data.externCode;
    throw err;
  }
  return data.result;
}

async function login(userId, password) {
  return await execRequest('post', `${AS_URL}/as/user/login`, {userId, password});
}

async function createNote(kbServer, kbGuid, title, folder, html, extOptions, token) {

  const url = `${kbServer}/ks/note/create/${kbGuid}`;
  let note = {
    kbGuid,
    title,
    category: folder,
    html,
  };
  if (extOptions) {
    note = Object.assign(note, extOptions);
  }
  return await execRequest('post', url, note, token);
}

 async function test02(mdfile,noteHtml) {
  const userId = '这里是你的为知笔记账号';
  const password = '这里是的你为知笔记密码';
  try {
    const loginResult = await login(userId, password);
    const {kbServer, kbGuid, token} = loginResult;
	//js的字符串分割,避免绝对路径的干扰
	const title = mdfile.split('/').pop()
    const newNote1 = await createNote(kbServer, kbGuid, title, '/我的笔记/', noteHtml, null, token);
  } catch (err) {
    if (err.externCode === 'WizErrorInvalidPassword') {
      console.error('Invalid password');
    } else {
      console.error(err.message);
    }
  }
}
//这里其实很重要,我摸索了快一天 。
//如果以js读取文件转化为字符串的话,markdown问被分享到为知笔记的时候,不会被正确渲染为markdown
//然后我想到了typora里面有个
的标记,索性就按行读取,每行后面添加换行符,果然凑效。 if (program.file){ const liner = new linerByLine(program.file); let line; let str = ''; while (line = liner.next()){ str += line + '
'; } test02(program.file,str); }

上面的代码,保存为wiz.js,放置到/home/liwl/.myscripts/下即可

注:代码有些丑陋,先work后fly吧

2.3 创建右键拓展

不废话,直接su到root之后,直奔主题:cd /usr/share/deepin/dde-file-manager/oem-menuextensions
然后创建desktop文件:touch deepin-wiz.desktop,内容如下:

Desktop Entry]
Type=Application
Exec=nodejs /home/liwl/.myscripts/wiz.js -f %U
Name=发送到为知笔记

至此,基本完成了大部分工作了。然后有自己做的“发送至博客园”和"发送至为知笔记",发送这篇文章即可。
后期看看有空做做“右键发送邮件”,“右键翻译”等。