为什么是 irest
临近年末,多出了一些空余时间,突发奇想想做一个用来”休闲”的命令行工具,刚开始的时候想用python
,后来决定了用nodejs
实践一下 , 项目GitHub地址 https://github.com/Jon-Millen… 欢迎 !!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-pixels
和 images
实现了此功能。原理就是下面的步骤
- 根据用户输入,搜索后获取一张图片地址下载到本地缓存
- 用
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