"irest" 一個 nodejs 命令列工具的製作過程

Jon-Millent發表於2018-01-31

為什麼是 irest

臨近年末,多出了一些空餘時間,突發奇想想做一個用來"休閒"的命令列工具,剛開始的時候想用python,後來決定了用nodejs實踐一下 , 專案GitHub地址 github.com/Jon-Millent… 歡迎 !!start!!

功能分析

初步計劃,實現以下幾個功能

  • 檢視天氣
  • 看笑話
  • 看新聞
  • 搜尋瀏覽圖片

動手開始做

初始化專案

首先建立資料夾 irest cd 到資料夾裡面,使用 npm init 初始化 package.json

目錄結構

    |- irest
        |- bin // 放置命令列操作的資料夾
        |- config // 存放配置檔案
        |- module // 存放自己實現的模組
        |- tool // 自己要使用到的工具
        |- package.json
        |- README.MD
複製程式碼

操作命令列

我是用的 commander 包來操作獲取命令列輸入的,很方便,api介紹也很詳細
首先在 bin 下面建立 irest 檔案,這裡的檔案我沒有寫字尾
然後在 package.json 裡面新增

    "bin": {
        "irest": "bin/irest"
    }
複製程式碼

bin/irest

#!/usr/bin/env node

require('commander')
  .version(require('../package').version)
  .usage('<command> [options]')
  .command('news', '看今天的頭條新聞')
  .command('joke', '來條笑話')
  .command('weather [arguments]', '看看今天的天氣')
  .command('image [arguments]', '搜張圖片看看')
  .parse(process.argv)
複製程式碼

可能你會注意到頭部那句註釋了,這個註釋目的就是指出,你想要你的這個檔案中的程式碼用什麼可執行程式去執行它,後面的是輸出幫助
執行 node bin/irest 輸出下面這句話就說明成功了

    news                 看今天的頭條新聞
    joke                 來條笑話
    weather [arguments]  看看今天的天氣
    image [arguments]    搜張圖片看看
    help [cmd]           display help for [cmd]
複製程式碼

實現新聞模組

bin 下面建立 irest-news 檔案,因為當使用者輸入 irest news 的時候,會找到 irest-news 檔案並執行

bin/irest-news

#!/usr/bin/env node

const program = require('commander')
const news = require('../module/news')

program
  .usage('<command> [options]')
  .parse(process.argv)

let template = program.args // 獲取使用者 irest news xxx  後面的引數

news.consoleNews();
複製程式碼

新聞模組的功能是靠 superagent 爬取網頁程式碼, 然後用 cheerio 解析程式碼,之後可以通過類似於jquery 的操作方法去獲取新聞

module/news.js

let Bower = require('./bower')
let config = require('../config/index').news
let tool = require('../tool/index')
let cheerio = require('cheerio');  

class News{
	constructor(){
		this.bower = new Bower();
	}

	getNews(){
		this.bower.openPage(
			config.url,
            data=>{

                var $=cheerio.load(data);
                var list = $(config.page.listName);


                console.log('+------------------------------------------------------------+')

                list.each((key, value)=>{
                    console.log('(: '+tool.trim($($(value).find(config.page.listTitle)).text())+'\n')
                    console.log(''+tool.trim($($(value).find(config.page.listContent)).text())+'\n')

				})

                console.log('+-----------------------------------------------------------+')

			},
			err=>{
                console.log(config.error)
			}
		)
	}
}


module.exports = {
    consoleNews: function () {
        new News().getNews()
	}
}
複製程式碼

這樣就實現了新聞模組,測試使用 node bin/irest news 就會如下輸出

+------------------------------------------------------------+
(: 又是一年春運?

人民網評:今年的春運和往年相比...

(: 氣象臺釋出寒潮預警中東部氣溫將持續偏低

江南華南等地氣溫較常年偏低5~6℃|降雪影響多地通訊設施

(: 調查:1秒刷火車票網際網路黃牛“開掛”何時休

黃牛用好幾千兆寬頻刷票|最短100毫秒點一次|監管更困難

(: 部分惡搞黃河大合唱視訊下架冼星海之女欲起訴

經典作品不容褻瀆|惡搞經典的現象很普遍|律師:平臺或擔責

+-----------------------------------------------------------+

複製程式碼

難點所在,圖片模組

其他模組就是爬取原網頁的資訊,分析輸出到控制檯,圖片模組就複雜了。需要爬取圖片網站,隨機找一張圖片,用影象分析轉成字元圖片,輸出到控制檯
分別使用 get-pixelsimages 實現了此功能。原理就是下面的步驟

  • 根據使用者輸入,搜尋後獲取一張圖片地址下載到本地快取
  • images 把圖片等比例設定成配置檔案裡的大小
  • get-pixels 分析 rgb 的灰度值,輸出不同的字串標識

關鍵程式碼

class Imager{
    constructor(){
        this.bower = new Bower()
        this.gread = 'MNHQ&OC?7>!:-;.'

        this.jibie = 255 / this.gread.length
    }
    
    toShow(pixels) {
        // 分析圖片的灰度用不同的字串來代替
        var str = ''

        var width = pixels.shape[0]
        var height = pixels.shape[1]
        for(var i=0; i<height; i++){
            for(var j=0; j<width; j++){
                var r = pixels.get(j,i,0)
                var g = pixels.get(j,i,1)
                var b = pixels.get(j,i,2)

                var grr = r * 0.299 + g * 0.587 + b * 0.114
                str += this.gread.charAt(Math.round(grr / this.jibie))
            }
            str+='\n'
        }

        console.log(str) // 輸出到控制檯
    }
    
}

複製程式碼

輸入 node bin/irest image 周星馳 測試效果,就繪製出了周星馳的字元圖片

;;..;--::------;-::ON&H&HHQCC&QH?O7>>C>CO7QOQOC7&QH&&CQO---;;..........;;;;;;;;;.....;;----:-------
;;.;;--::::--:;-;-7QQHQQ?77&H&QOC&CQ??CCQQHHC&&&?O&O&H?>7-;;;...........;;;;;;;;;;;..;;----::::-----
;;.;;--:--:-----!HHHQO&HMNHQQN&&OCC?&OO&OOOCH&HQ&&O&QC&&O>-;;;.........;;;;;;;;;;;;..;;----:::::----
-;;;;--:::::::->HH&&NHHQ&&Q&&&HO&&CQQQQQQHHH&QH&&H&Q&OOOQC>;;;;.........;;;;;;;--;;..;;----:::::----
;;..;--:::-::-7QQQNNHQH&&QO&C&&&OOO&OHQQQQHNHNNHHQO?CH&?&HO:;;..........;;;;;----;;..;;;----::::----
;;..;--:::-:>!CNHHQHHHHHQQQHHQ&O&HNNHHHQ&&&NH&HQHHHNOCQQ&ONO;.........;;;;;;----;;;.;;;---:::::-:--
;;;.;--:::!!C&QHHQH&HHHNHQQ&HQQ&&COOOCOCQH&QCOHNQCQNHQHQNH7HQ;;..........;;;;----;;..;;;---:::::-:--
-;;.;;-::!!C&Q&NMNNNHHHHHNHO?Q&CCO?>>>!7?77CCCNH&&QHQQQCOHN7N>;;.........;;;;--;-;;..;;;---:::::-:--
--;.;--::!7&OHNNHHHHMHO?CQHNHQQ&&&OQC?!>>>CCCCOOQQQHHNHOQQNQHN.;.........;;;;;;;;;;;..;----:::::-:--
--;.;;-;!>7HQHMHMNNNHQ&QQQ?7?&Q&CO7&OC&&&HQ?7O&COOC&QHOHNCNNO&O........;;;;----;-;;;..;;;---::::::--
--;.;;->:7&?HQQNNNHHHQ&OQQQHQHQO7?C&O&QQQQQHHNHQOCCCOQHQQNH&OQH&......;;;;;;;----;;;..;;;---::::::--
--;;;;::>?&HQQCHNQQOOOO&OO?QQHCOCQ?H&Q&COQQQHNHHHHHHH&>CHHQ&QQQ&;.....;;;;;;;----;;;..;;;---::::::--
--;;;-;-?&&Q&NNN&&C?C?CO?C?CO&HO&7&COCCC&&OQHNNHNNMNHHNNO7CNHQQO7...;;;;;;;----;;;..;;;---:::::::-
;--;.;;!&QN&HHQH&QC????C?CC!&CH&OOCQ77OOCOOCHQNHMMMNMHNHHHC7NNHQ!.;...;;;;-------;;;;.;;----:::::::-
--;;;-!C&OCQNMH&C???77>777>?7>C7O7&!O&&??CO&&QQCQOQHNHNHNNHNQ7MNM......;;;--------;;;.;;----:::::::-
--;;;::?&QHHHQQC7>>!>>7>>>!!77>?CO7OC7??&7OOOCQHC&OCQH&HHHNNNNO?M>......;;;-------;;;.;;;--::::::::-
---;;-:HQNQ&NHO?>>!!!:!!>>>>!77?????C7&O7C77&&?&OHQHHQQ&QQHNHQHNOM.....;;;;-------;;;.;;;--::::::::-
--;;-!7CHMHNN&?7!!!!:!!!::::!!>7>77?CC&CCC?&>&&&&O&QQQHNNNM&Q&&&QQ!....;;;;;-----;;;;.;;;--::::::::-
--;;::?QHN&MOC7>!!!:::::::::::!!>>77?O?&OOC7N!OH&7Q&&HH&MHHHQO&&Q&&....;;;;;;-----;;;.;;;--::::::::-
--;;->&QHHOMC?7>!::::::::::--::!>!>!7??QOQ?HCCO?&N?C>HHHQNNOH&7H&&C-;.;;;;;;------;;;..;;--::::::::-
---;-;QNHHHQ?77!:::::::::::-:---!!::!>7?COOCONCO&&OQ&CQHO&QM&H&&&QH7;.;;;;;;------;;;..;;--::::::::-
--;-7>HHHMM&?77!!::::::::::--;;--!-;-:!7??OQC&HHC&H&C&OQQHQHHQQ&&OC&:;;;;;;;------;;;..;;;-::::::::-
;-;.:7QHHNN&77>>!::::::::::-;;;;-:::!!>>?CC??&Q&&Q&Q&HOOMQQQH&NC&C7?N;;;;;;;;;----;;;..;;;-::::::::-
;----?QHQNN&?7>!!::::::::::-;;;;-:>>>>!:!!>777&QHN&H&&C&QC&&QNH&CCCO!?.;;;;;;-----;;;..;;;-::::::::-
;--!-OHNHNMQ?7>!:::-----:----;->7???>>!::::>>77OQNHQHNHOQ&&N&OHHQ?OOC>:;;;;;;-----;;;..;;;-::::::::-
;--:-?HHHHMH?7>>!:------:--:-:>??C?COC77!!::!!>?O&QQHHQQCONQQQHQNOCCCC?-;---------;;;..;;;-:::::::::
;--:-CHHNHMN77>>:::-----:::!!>7??C&&>>?77!::::!7COQQNQH&OQHQHHQ&N&7QO&?--;--------;;;..;;;-:::::::::
---;-&HHNHNN?7>!::-:----:::!7???CC;:!>7:;;:::-::>?&NQ&HHQ?QNNHQO&NCN&QC7;;;-------;;;..;;;--::::::::
;--;:OQNNHMNC7>!:::-::--:::!???77!>CQNHHQO7!-;--:!COHH&NHO&7HNNNOQN?HOQC:----------;;;..;;--::::::::
---:!CQNNHMM&?>!!!!!::::::!!>77>7>QNQNH:!::-;;.;--!7Q&HHM&NQONNHHCHO&QCO7;---------;;;..;;--::::::::
;--::>&HNNNNH?>!>7?7>!!!:::!>>>>7H-OMH!:-;;....;;-::?QQHNNHHQNQ&HH&OQ&HC?----------;;;..;;--::::::::
;;--::ONNMHNMO7C&&&CC?>>!:::!!>7?&!-:::-;.....;;-:!>&QNQNHNMQNQHHHQQ&&OCO----------;;;.;;--::::::::
;---:-&&NNNNNHO&OOOOCC?7>!:--::>C?!!>:--;.....;---:!C&QQHHHQQHNNQQHO&&COO:---------;;..;;--::::::::
;--;:.HCQNNNHH&OCQ&?COC?7>!-;---:!7!::-;;;....;---::!7O&O&NQHNQHNNQH&N&QQC?--------;;;;;;;--::::::::
;----;!7ONNNNM?CH:7>!>>CO>!-.-;.:!!!:::-;;;.;;;-:::!!>?O&HHHHQ&&QNHQHNOO7HC;--------;;;..;;-::::::::
;---;-;??NNNNM7O-?&MHMO!??!;..;.;-:!!!:--;;;;---:::!!>>7&QQHH&N&MNQHHNOO&??>;-------;;;..;;-::::::::
;------77HHNNMN??N:NHM-&!7>-..;...;;--::-------:::::!!!>OHQQNQ&N&NNHHHHH?7O?!-------;;;..;;--:::::::
;;----;;7CCHHNM7CH!>Q>!>!7>-..;...;;;---------:::::::!!>?QQQQNHHHNNQHHQ&C&OCC-;;-----;;..;;--:::::::
;;----.;?:OHHNNOO&>:!!>!!7>;...;;;;-;--------:::::::!!>C&&QQNHHNHNQNHH&Q&>OO--------;;.;;;--:::::::
;;---;;;->HCHNNM!O77>>>!!>>;..;;--;--;;;;;----::-::::!!7O&QH&NHNNNNH&NNQC?HO>-------;;.;;;--:::::::
;;---;;;;:>7QNMN77>!>>!!!>>;.;;;--::---;;;;;-----:-::!!>?OO&Q&HMNNHN&NNCQ?7&&;;-----;;;.;;--:::::::
;;---;;;;-:OCHHNO>>!!!!!!>>-.;;;;;-:::-;;;;;;------::::!7COC&&&NNMHNNH&Q&O>7&C------;;;.;;--:::::::
;;---;;;;-:7>?NNN!>!!!!:!>!-;;-;;--!!:-;-;;;;-----::::!>C&?CO&HNNNHNNNHHQ?CCO-------;;;;;;-:::::::
;;---;;;;-:-?7HNM!!!!!::!>!-;.....;;:--:!-;;;;;-----::::!>?OCCCCHNNNNNNHHHQCO?C>:-----;;;;;;-:::::::
;;---;;;;--:->CHH!>!!!!:!>>:-;;;---:>-;;---;;;;-----::::!>?OCC?C&NNHNNNHNHQHCQ&&------;;;.;;-:::::::
.;---;;;;;:-::?ON?!!!!!!!!>!:--!;N&>?;;;.;---------:::::!>??????ONHNNMMMHQH7H&&??:;---;;..;;--::::::
;;;--;;;;--::::7HH>!>!!!!!!>!!!>&>77;;;;;;-:--:--::::::!>>C??777OHNNNNNNNHH&QOQH?>>--;;;;.;;--::::::
;;;--;;;;--:::!>>N!>!!!!!>!777CC>:-;;;;;;-;-::-::::::::!>7C7>>77&HNNNNMNNNH&QOQQC>!--;;;;;;;--::::::
;;;--;;;;---::!>!HH!!!!!!!>??77?>-;;;----:!:::::-::::!!!>CC>>!>>HNNNNNNNNHHQHO&Q??7---;;;;;;--::::::
;;;--;;;;---::::!!H?>>!!!!>7??7:!------:>>>7>!:-:::!!!!>7O?>!>!!MNMNNNNNNHHO&&&&&-7!---;;;;;--::::::
;;;--;;;;;--::!:!:QM!>7>!>>777>:>:---:--:?H>!!:::::!!!!>CO7>!!:QHQNNNNNNNQ&C?OQ7O7>:---;;;;;--::::::
;;;--;;;;;--::!:!:O&H>!!>>>7777:!:;.;::!CN!-::!!!!:!!:!>CC7>!>?NNNMNNNNNMH&QCCO7C!7!--;;;;;;--::::::
;;;---;;;;--::!::!;&H777>>>>>7>--:7CCOQH?.--:::!!!!!:!!7&?7!!-MHNNNNNNNNNH&HH>7??!7:---;;;;;--::::::
;;;---;;;;---::::!:?&M!7>>>>7>!>77??H7:!;;--:::::::::!!CO?7>!HNNNNNNNNNNMNHN&N?;>!!:--;;;;;;--::::::
;;;---;;;;---:::::!:OHQ!777>777O?OHC!:!;;---::--::::!>>QCC7>?NNNMMMNNNNNNHNQHHHHQ?.:---;;;;;--::::::
;;;---;;;;--::::::::>&&?>?7?C7&HH&7!::--:::::---::!!!7QOO??!NMNNNMNNNNNNNNNHHQQQ&QQHO!;..;;;---:::!:
;;;---;;;;--:::::::::>H?777?C&&C7>>!!!:!!:::---:::>>7O&&OC:MNMMMNNNNNNNMNNHHHHHHQ&&&&&&&QO>;..;::!::
;;;---;;;;;--:::::::::7H>777???777>7?7?!:::-----:!7>OHQQO!NMMNNNMNNNNNNNNNHHQQ&QQQQQQ&&&&O&&&Q&O?>:-
;;;---;;;;;--::::::::::7C:>7>?7777?77>>!!:-----:!>7OHQQ&7MNNNNMMNNNNNNNMNHHQHQHQ&&OQQ&O&&C&&&OO&&C&&
;;;;--;;.;;--:::::::::--C7>>7C7>7777>!!:-------!!7OHNQ&&MNNNMMNNNNNNNNNNNHQQQ&O&&Q&QOQOO&&&O&&C&&&&&
;;;;--;;;;;---:::::::--::>?-:C?7777>>!!------:!!7&NNQ&HNNMNMMNNNNNNNNNMMH&&Q&&&QQOOQQHQ&&&&&&&OQQ&&&
;;;;---;;;;;--::::::::--:::!>!77777>!:::::-:!!>>ONHQHMNNNNMMNNNNNNNNNNMHQQQ&Q&OO&QQQOQQQQQQO&&OQQOQQ
;;;;---;;;;---:::::::::--:-::>!777>>!!!:!!!!!7?&NNNMMNMNNMMNNNNNNNNNMMMNQQ&O&&&&Q&O&QHQQH&QO&&&&Q&&&
;;;;---;;;;;--:::::!:::--:-::::?7>>>!>!!!>>>7?ONMMMMMNNNNMMNNNNNNNNNMMMHHO&Q&QQQ&O&QQOQHH&QQQ&O&&O&Q
;;;;---;;;;;---:::::::-------::7O>7>>7!>77?COONMMMNNMNNNMNNNNNNNNNNMMMNQQQ&&Q&&O&QQ&&QQHH&&&Q&OQQOQQ
;;;;---;;;;;---::::::::------::!?Q7?77?CCOO&QMMMNMNNMMNMMNNNNNNNNNNMNNMQQQO&&&Q&&&OQH&QQH&QQ&QQQQOQQ
;;;;;--;;;;;---:::::::-;......-:O?NC7COOO&HNMMMMMMNMMMMMNNNNNMMNNNNNNNMQO&Q&QQ&O&Q&Q&&Q&&&HQO&QQQOQQ
;;;;;--;;;;;;.;;..........;;-!7?NNMHHHNMMMMMMMMMMMMMNNNNNNNMMMNNNMNNMQ&QQ&O&&QQQOQ&QO&QQH&OQQ&&&QQ
;;.............;..;...;;.-&?HNNMMMNNMMMMMMMMMMMNNNNNNNMMMMNNMNNNNQN&&&Q&QQO&&H&Q&Q&QHHOQQ&Q&QQ
......................;--!!QNNNNMMMMMMMMMMMMMMNNNNMMMMMMMMNNMMMNNQOQ&H&&OQ&QO&QQ&QHONQ&QQOQQHQ
.............;.........;;-;:&HNNNMMMNMMMMMMMMMNNNNMNMMMMMMMMNNMMMMHHOQ&Q&QQ&&&QQ&&QH&MOHQHQOQQQQ
.....................;.;;;.-;;:QNNNNNNNMMMMMMMMMMMNNNNNMMMMMMNNNNNMNNMQHQQC&QH&&Q&Q&Q&QCNH&HQQQ&QQOQ
..............;;;;.....;;-;;;QNHNNNNMNMMMMMMMMMMMNNNMMMMMMMMNNNNNMNMMHOHHO&Q?QQ&&&&Q&OMHH&QH&QQQQ&&
..............;;;;;;;-;;;-;.HNHNNNNNNNMMMMMMMMMMMMMMMMMMMMMMNNNNNMNMNH&&OQQ&QQOHQQ&Q&NOQH&QQ&QQQQOH
....;.....;;;;;;;;;;;;;;;;-NNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMNNNNNNMMNNQHQCQQOHQ&&OQQ&NH&QQQQQ&HH&Q&Q
複製程式碼

大功告成,釋出模組

釋出之前的注意事項

  • 註冊一個npm賬號
  • 然後把 package.json 裡面的 devDependencies 修改成 dependencies,具體參見 devdependencies dependencies區別

使用npm publish釋出就大功告成了 測試 npm install irest-cli -g 成功~~~~~~~~ 之後直接可以在全域性使用 irest joke

總結

我很喜歡韓寒曾說的一句話:對我來說,所有事情的動力就是喜歡 我總結為:我所為之付出的一切都是出於喜歡,不管是人也好,事也好 最後插一句:目前我正在找工作,有意的公司請聯絡我,希望工作地點杭州 millent@126.com

相關文章