本博客具備很強的推廣性,不限於博主使用的這些操作系統和博客平台
1. 引言
在win10系統上,本人比較喜歡用為知筆記創作markdown博客,並通過其“分享到博客”的功能,發布博客到博客園。最近比較喜歡用Deepin系統作為主力操作系統,平時自己一些學習和實踐的內容,很希望通過博客的方法發布出去,並保存在個人筆記中。
但是為知筆記的Linux客戶端勸退了我,同時又不希望使用博客園自帶編輯器。因此花了點時間,做了一個替代方案,就是這篇博客的主要內容了。
主要的思路分為兩步:創作,發布。通過什么方式創作,和怎樣發布。
2. 創作
在Linux下創建markdown文檔,是非常容易的。比如在deepin系統,你可以通過以下三種方式:
- vim編輯器
- typora編輯器
- vscode編輯器
vim 是自帶編輯器,不比多說,適用於習慣vim操作的用戶,比如我自己。創建markdown時,只要使用markdown語法就可以了。網上有很多vim支持markdown語法或者markdown(實時預覽)的插件,估計配置比較復雜吧,我本人也不推薦配置vim實時預覽markdown的方式。比較推薦瀏覽器插件打開本地.md文件進行預覽的方式。推薦一個markdown priview plus的谷歌插件,但是樣式不太好,可以自己加載別的樣式。
vscode編輯器能夠很好地支持vim插件,支持markdown及其預覽的插件。也是非常不錯的選擇。
最后我選擇了typora編輯器。它即可預覽你所創作的文檔,可選多種樣式,能夠支持側邊欄和大綱,像極了一款本地筆記本。如果配上就堅果雲的同步,圖庫等,更像一款雲筆記了。具體的功能這里不多說,有興趣的同學可以自己去摸索。
本篇就是通過typora編輯創作。讓人專注於內容編排。唯一不足的可能就是不支持vim編輯器。
綜上,選擇創作的方式,目的是創建一篇markdown格式的文檔,這很容易實現。
重要的是創作完成之后,該如何發布出去。且看下文。
3. 發布
本篇博客主要想介紹3種發布方式,2種發布對象,涉及deepin系統的兩個操作系統版本。
3.1 發布對象
博客園,為知筆記是我比較喜歡的組合。也許網友們有更多的其他選擇,比如CSDN,開源中國,51CTO,掘金,簡書,個人博客等。比較方面有有道雲筆記,印象筆記,onenote,螞蟻筆記等。
其實看懂了這篇博客,很容易主動學習和動手操作,應用到別的平台。希望大家有所收獲。
很多東西我自己有很多都是現學現賣的,面向搜索引擎的編程......
確定了發布對象,就需要了解如何不登錄就可以發布了。這要得益於這些平台開放API功能。
3.1.1 博客園的開放API
API在哪里
要使用博客園的API發布自己的博客,需要在自己博客里面設置允許這樣的操作。
具體的設置地方,在自己博客后台管理-設置-最后幾行,有允許MetaWeblog博客客戶端訪問的勾選項。
同時也可以看到MetaWeblog的訪問地址(因人而異),點擊這個url,就可以看到提供的api接口了。
如何使用API
Deepin系統調用這些API很方便,因為Deepin自帶了Python3。
Python3如果需要使用這些API,需要import一個庫,xmlrpc.client庫。如果系統沒有這個庫,可以先安裝。
sudo apt-get install python3-pip
sudo pip3 install xmlrpc.client
如果Python3 能夠導入這個xmlrpc.client的話,基本上就成功一大半了。
下面的工作,就是編程了,可以先參考這篇CSDN博客
編寫發布程序
已經萬事具備了 ,只需要創建發布腳步。下面是我的代碼,我把它命名為send_to_cnblogs.py
#!/usr/bin/python3
# 本腳本發送博客至www.cnblogs.com
import sys
import xmlrpc.client
class MyCnblogsAPI():
def __init__(self):
self.cnblogs_api = xmlrpc.client.ServerProxy("https://rpc.cnblogs.com/metaweblog/你的博客地址")
self.user = '博客園登錄用戶名'
self.password = '博客園登錄用戶密碼'
self.blogid = self.__get_user_info()[0].get('blogid')
def __get_user_info(self):
return self.cnblogs_api.blogger.getUsersBlogs('',self.user,self.password)
def get_all_blogs(self):
"""
獲取全部文章
"""
blog_id_title = {}
allblogs = self.cnblogs_api.metaWeblog.getRecentPosts(self.blogid,self.user,self.password,0)
for b in allblogs:
blog_id_title.update({b.get('title'):b.get('postid')})
return blog_id_title
def get_post_id(self,post_name):
"""
通過指定的博客名字獲取對應的postid
"""
return self.get_all_blogs().get(post_name)
def edit_post(self,blog_path):
"""
重新編輯和發布
"""
post_name = blog_path.split('/')[-1].split('.')[0]
post_id = self.get_post_id(post_name)
with open(blog_path,'r') as blog:
blog_content = blog.read()
post_info = {
'title':post_name,
'description':blog_content,
'categories':['[]','[Markdown]'],#默認不發布到博客園首頁候選區,默認markdown
}
if post_id:
print("文章已經存在,更新!")
self.cnblogs_api.metaWeblog.editPost(post_id,self.user,self.password,post_info,True)
else:
print("沒有這篇文章,新建!")
self.cnblogs_api.metaWeblog.newPost(self.blogid,self.user,self.password,post_info,True)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("未指定文章")
sys.exit(0)
markdown_file = str(sys.argv[1:][0])#這部分未做更加詳細的解析,請留意
my_blog = MyCnblogsAPI()
my_blog.edit_post(markdown_file)
上面的代碼主要實現了通過參數指定要發布markdown文件,發布該markdown文件內容到博客園的功能。
這個使用,只要在終端執行python3 send_to_cnblogs.py xxx.md
就可把xxx發不到博客園了。
3.1.2 為知筆記的開放API
API在哪里
為知筆記的API地址在這里
官方很貼心地給出了優秀的示例代碼,按照他們給的代碼,很容易實現對自己為知筆記的操作。
如何使用API
該API是需要用js實現交互的。本人js零基礎,只能面向搜索引擎編程了。
首先閱讀一下為知筆記API快速入手(實際上我們只是發布文章,也不需要太過復雜的功能),從快速入手的代碼,很容易就上手了。
沒上手也沒關系,我的代碼改改就行。要改的很少很少,主要是環境部署.....
編寫發布程序
Deepin也很容易使用nodejs,如果沒有安裝,命令行執行安裝就行。
在Deepin 15.11 上,執行sudo apt-get install node npm
在Deepin V20上,執行sudo apt-get install nodejs npm
暫時不需要關注node的版本
下來看看我的代碼段,我命名為send_to_wiz.js
//注意:如果下面三個包沒有的話,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 wiz_api(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, '/Deepin/', noteHtml, null, token);//Deepin表示要上傳筆記到哪個文件夾
} 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>';
}
wiz_api(program.file,str);
}
Deepin 15.11,命令行執行node send_to_wiz.js -f xxx.md
Deepin V20,命令行執行nodejs send_to_wiz.js -f xxx.md
即可把xxx.md發布到為知筆記
3.2 發布方式
3.2.1 命令行
如果使用命令行發布,很簡單,因為上面的代碼均提供了通過參數來指定要發布的markdown博客。
比如要發布"我的博客.md"
發布博客園
終端執行python3 send_to_cnblogs.py 我的博客.md
發布到為知筆記
Deepin 15.11執行node send_to_wiz.js -f 我的博客.md
Deepin V20執行nodejs send_to_wiz.js -f 我的博客.md
3.2.1 快捷鍵
Deepin設置快捷鍵很方便,但是快捷鍵里面的命令是不包含參數的,該如何?
很簡單,通過shell腳步調用粘貼板,就可以輕松實現。
比如要發不到博客園的腳本,可以命名為:send_to_cnblogs.sh,內容如下:
#!/bin/bash
# 本腳步用於發送博客到博客園
# python路徑
PYTHON="/usr/bin/python3"
# 指定程序所處目錄
LOCATION="/home/liwl/.myscripts/cnblogs"
# 指定使用的發送程序
SCRIPT="send_to_cnblogs.py"
# 獲取粘貼板的文章
MARKDOWNBLOG=$(xsel --output --clipboard)
# 發送
${PYTHON} ${LOCATION}/${SCRIPT} ${MARKDOWNBLOG}
send_to_cnblogs.sh保存在任何路徑都可以,設置快捷鍵時,指定該腳步的絕對路徑即可。
注:Deepin系統下執行sudo apt-get install xsel安裝腳步中的xsel工具
要發布到為知筆記的腳本,可以命名為:send_to_wiz.sh,內容如下:
#!/bin/bash
# 本腳本用於發送選中的文件(終端雙擊選中或者文件管理器ctrl+c復制)到為知筆記
# node路徑
NODE="/usr/bin/node"
# 指定程序所處目錄
LOCATION="/home/liwl/.myscripts/wiz"
# 指定使用的發送程序
SCRIPT="send_to_wiz.js"
# 獲取粘貼板的文章
MARKDOWNBLOG=$(xsel --output --clipboard)
# 發送
${NODE} ${LOCATION}/${SCRIPT} -f ${MARKDOWNBLOG}
send_to_wiz.sh保存在任何路徑都可以,設置快捷鍵時,指定該腳本的絕對路徑即可。
注:Deepin設置快捷鍵。全局快捷鍵在“控制中心-鍵盤-快捷鍵”,命令行快捷鍵在“終端-右鍵-自定義命令”
接下來就是發送博客了
如果要發送文檔,也有兩種方式:
- 終端命令行選中文件發送。雙擊文件名,按下快捷鍵。
- 文件管理器選中文件發送。需要按下crtl+c復制,然后按下快捷鍵。
3.2.3 鼠標右鍵
上面兩部分實現了命令行和快捷鍵盤的發送博客到博客園或者為知筆記的功能。
如果此刻你正端着咖啡聊天,或者拿着手機跟女朋友電話,正好空出了無處安放的右手,希望把剛剛寫完的博客發送出去,該怎么辦?
沒錯,右鍵!
Deepin的右鍵拓展,從15.11到V20,有了質一般的飛躍。兩者可能大有不同。
個人感覺還是V20的右鍵擴展更加友好和強大一些。
Deepin 15.11右鍵
根據官方提供的方式,用戶如果需要擴展文件管理器鼠標右鍵的功能,需要在自己的
~/.config/deepin/dde-file-manager
目錄下,
創建一個menuextensions
的目錄,
然后進入到這個目錄,創建任何一個json文件,
比如我的叫做:send_to.json
的文件,我在該文件實現了二級目錄。
關於Deepin 15.11 右鍵擴展可以參照簡書的這篇博客
其內容如下:
[
{
"MenuType":"SingleFile",
"MimeType":"text/md",
"Suffix":"md;txt;",
"Icon":"",
"Text[zh_CN]":"發送到",
"SubMenu":[
{
"Text[zh_CN]":"博客園",
"Exec":"/home/liwl/.myscripts/cnblogs/send_to_cnblogs.sh"
},
{
"Text[zh_CN]":"為知筆記",
"Exec":"/home/liwl/.myscripts/wiz/send_to_wiz.sh"
}
]
}
]
具體含義大概解釋一下吧:
MenuType,右鍵擴展菜單生效的類型:單個文件,單個目錄,多個文件,多個目錄,空白區域
MimeType,右鍵擴展菜單生效的文件:text的markdown或者txt類型
Icon,圖標
Text,顯示的名稱
Exec,執行的命令
SubMenu,表示產生二級菜單
特別注意:Deepin 15.11 通過右鍵發送時,必須按下crtl+c或者右鍵選擇復制,先把博客名字粘貼到剪切板!
Deepin V20的右鍵擴展
Deepin V20提供了更加友好的右鍵拓展,這里給深度工程師點贊。
終端執行su - root
,切換到root用戶
cd /usr/share/deepin/dde-file-manager/oem-menuextensions
,進入到該目錄
創建一個desktop的后綴文件,touch deepin-liwl-send.desktop
,內容如下
[Desktop Entry]
Type=Application
Name=發送到
Actions=SendToCnlogs;SendToWiz
X-DFM-MenuTypes=SingleFile
MimeType=text/markdown
[Desktop Action SendToCnblogs]
Name=博客園
Exec=python3 /home/liwl/.myscripts/cnblogs/send_to_cnblogs.py %U
Icon=text-x-markdown.svg
[Desktop Action SendToWiz]
Name=為知筆記
Exec=nodejs /home/liwl/.myscripts/wiz/send_to_wiz.js -f %U
Icon=text-x-markdown.svg
# %U 就是右鍵選中的文件,在Deepin V20中,不需要按ctrl+c復制文件了...
注:更加詳細的字段說明,請參照這里的官方文檔說明
截止到這里,基本完成了全部內容。感覺博客內容已經很詳細了,希望對大家有所幫助。
以后就可以愉快地在Linux下進行開發運維工作,以及及時記錄與分享所學所得。