Deepin15和20使用命令列快捷鍵滑鼠右鍵釋出部落格至部落格園和為知筆記

運維筆記發表於2020-04-28

本部落格具備很強的推廣性,不限於博主使用的這些作業系統和部落格平臺

1. 引言

​ 在win10系統上,本人比較喜歡用為知筆記創作markdown部落格,並通過其“分享到部落格”的功能,釋出部落格到部落格園。最近比較喜歡用Deepin系統作為主力作業系統,平時自己一些學習和實踐的內容,很希望通過部落格的方法釋出出去,並儲存在個人筆記中。

​ 但是為知筆記的Linux客戶端勸退了我,同時又不希望使用部落格園自帶編輯器。因此花了點時間,做了一個替代方案,就是這篇部落格的主要內容了。

​ 主要的思路分為兩步:創作,釋出。通過什麼方式創作,和怎樣釋出。

2. 創作

在Linux下建立markdown文件,是非常容易的。比如在deepin系統,你可以通過以下三種方式:

  1. vim編輯器
  2. typora編輯器
  3. 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設定快捷鍵。全域性快捷鍵在“控制中心-鍵盤-快捷鍵”,命令列快捷鍵在“終端-右鍵-自定義命令”

接下來就是傳送部落格了

如果要傳送文件,也有兩種方式:

  1. 終端命令列選中檔案傳送。雙擊檔名,按下快捷鍵。
  2. 檔案管理器選中檔案傳送。需要按下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下進行開發運維工作,以及及時記錄與分享所學所得。

相關文章