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 <type>','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里面有個</br>的標記,索性就按行讀取,每行后面添加換行符,果然湊效。
if (program.file){
const liner = new linerByLine(program.file);
let line;
let str = '';
while (line = liner.next()){
str += line + '</br>';
}
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=發送到為知筆記
至此,基本完成了大部分工作了。然后有自己做的“發送至博客園”和"發送至為知筆記",發送這篇文章即可。
后期看看有空做做“右鍵發送郵件”,“右鍵翻譯”等。
