nodejs利用http模塊實(shí)現(xiàn)銀行卡所屬銀行查詢和騷擾電話驗(yàn)證示例
http模塊內(nèi)部封裝了http服務(wù)器和客戶端,因此Node.js不需要借助Apache、IIS、Nginx、Tomcat等傳統(tǒng)HTTP服務(wù)器,就可以構(gòu)建http服務(wù)器,亦可以用來做一些爬蟲。下面簡單介紹該模塊的使用,其具體API,大家可以自行去nodejs官方文檔查看。
1、http.Server服務(wù)器
使用http.createServer([requestListener])方法創(chuàng)建一個(gè)http服務(wù)器,該方法返回一個(gè)新的http.Server實(shí)例,如果指定了requestListener,則會(huì)自動(dòng)添加request事件。http.Server繼承于net.Server,故默認(rèn)擁有很多的屬性、方法和事件,如下圖所示(只給出部分):

使用如下所示:
const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
res.writeHead(200, {
'content-type': 'text/plain'
});
res.end('hello world');
});
server.on('listening', () => {
console.log(`Server is lintening on ${server.address().address}:${server.address().port}`);
});
server.listen(3000);
代碼中的request事件監(jiān)聽的參數(shù)req,res分別是http.IncomingMessage,http.ServerResponse的實(shí)例,IncomingMessage對象是由 http.Server 或 http.ClientRequest 創(chuàng)建,并且被自動(dòng)添加到'request' and 'response' 事件監(jiān)聽函數(shù)的第一個(gè)參數(shù),是一個(gè)可讀流,主要包括一些狀態(tài)信息,請求信息,屬性如下所示:

ServerResponse對象是HTTP server內(nèi)部創(chuàng)建,并作為request事件監(jiān)聽函數(shù)的第二個(gè)參數(shù),實(shí)現(xiàn)了可寫流,決定返回給客戶端的內(nèi)容,屬性如下所示:

創(chuàng)建一個(gè)http服務(wù)器,并監(jiān)聽3000端口,用瀏覽器打開http://127.0.0.1:3000瀏覽,即可看到hello world。
我們還可以創(chuàng)建一個(gè)簡易的路由,對用戶的請求進(jìn)行處理,如下所示:
//router.js
module.exports = router;
function router(req,res,pathname,handle){
if(typeof handle[pathname] === 'function'){
return handle[pathname](req,res);
}else{
res.writeHead(200,{'Content-Type':'text/html'});
res.end('The request is not found!');
}
}
//handle.js
const dns = require('dns');
const fs = require('fs');
const qs = require('querystring');
function showIndex(req,res){
...
}
function lookup(req,res){
...
}
exports['/'] = showIndex;
exports['/dnslookup'] = lookup;
2、http.ClientRequest客戶端
該對象通過http.request()或http.get()方法創(chuàng)建,可以作為一個(gè)向服務(wù)器發(fā)起請求的客戶端,該對象的屬性(只列出部分)如下:

http.request(options[, callback])方法使用
參數(shù)options可以是一個(gè)對象或字符串,如果是字符串則會(huì)自動(dòng)調(diào)用url.parse()進(jìn)行解析,包涵以下屬性(部分):
- protocol,協(xié)議,默認(rèn)為http:
- host,主機(jī)地址
- hostname,主機(jī)名
- family,IP版本
- port,端口
- method,請求方法
- path ,路徑
- headers ,請求頭
- timeout ,超時(shí)時(shí)間
callback會(huì)自動(dòng)添加給reponse事件監(jiān)聽,返回值為http.ClientRequest,下面利用該知識(shí)寫一個(gè)利用支付寶接口查詢銀行卡號(hào)所屬銀行,不過http換成了https,接口一致,代碼如下:
const https = require('https');
const banknames = require('./bankname.js');
const btypes = {
DC: '借記卡',
CC: '信用卡'
};
var baseUrl = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardBinCheck=true&cardNo=';
var cardNo = process.argv.slice(2)[0];
if (!/^\d{16,}$/.test(cardNo)) {
console.log(`參數(shù)錯(cuò)誤,請輸入16位以上銀行卡號(hào)。例如:node http-get.js 6228430120000000000`);
process.exit(0);
}
baseUrl = baseUrl + cardNo;
const client = https.get(baseUrl, (res) => {
const status = res.statusCode;
const type = res.headers['content-type'];
let msg = '';
let data = '';
if (status !== 200) {
msg = '發(fā)送請求失敗 code:' + statusCode;
} else if (!/^application\/json/.test(type)) {
msg = '返回的數(shù)據(jù)格式不正確,應(yīng)返回JSON';
}
if (msg != '') {
console.log(msg);
process.exit(0);
}
res.setEncoding('utf8');
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
try {
let bankObj = JSON.parse(data);
dealBankObj(bankObj);
} catch (e) {
console.log(e.message);
}
});
});
client.on('error', (err) => {
console.log(err.message);
});
function dealBankObj(obj) {
const bname = banknames[obj['bank']];
const btype = obj['cardType'];
const cardId = obj['key'];
console.log(`卡號(hào):${cardNo}\r\n銀行:${bname}\r\n類型:${btypes[btype]}`);
}
bankname.js
const banknames = {
"SRCB": "深圳農(nóng)村商業(yè)銀行",
"BGB": "廣西北部灣銀行",
"SHRCB": "上海農(nóng)村商業(yè)銀行",
"BJBANK": "北京銀行",
"WHCCB": "威海市商業(yè)銀行",
"BOZK": "周口銀行",
"KORLABANK": "庫爾勒市商業(yè)銀行",
"SPABANK": "平安銀行",
"SDEB": "順德農(nóng)商銀行",
"HURCB": "湖北省農(nóng)村信用社",
"WRCB": "無錫農(nóng)村商業(yè)銀行",
"BOCY": "朝陽銀行",
"CZBANK": "浙商銀行",
"HDBANK": "邯鄲銀行",
"BOC": "中國銀行",
"BOD": "東莞銀行",
"CCB": "中國建設(shè)銀行",
"ZYCBANK": "遵義市商業(yè)銀行",
"SXCB": "紹興銀行",
"GZRCU": "貴州省農(nóng)村信用社",
"ZJKCCB": "張家口市商業(yè)銀行",
"BOJZ": "錦州銀行",
"BOP": "平頂山銀行",
"HKB": "漢口銀行",
"SPDB": "上海浦東發(fā)展銀行",
"NXRCU": "寧夏黃河農(nóng)村商業(yè)銀行",
"NYNB": "廣東南粵銀行",
"GRCB": "廣州農(nóng)商銀行",
"BOSZ": "蘇州銀行",
"HZCB": "杭州銀行",
"HSBK": "衡水銀行",
"HBC": "湖北銀行",
"JXBANK": "嘉興銀行",
"HRXJB": "華融湘江銀行",
"BODD": "丹東銀行",
"AYCB": "安陽銀行",
"EGBANK": "恒豐銀行",
"CDB": "國家開發(fā)銀行",
"TCRCB": "江蘇太倉農(nóng)村商業(yè)銀行",
"NJCB": "南京銀行",
"ZZBANK": "鄭州銀行",
"DYCB": "德陽商業(yè)銀行",
"YBCCB": "宜賓市商業(yè)銀行",
"SCRCU": "四川省農(nóng)村信用",
"KLB": "昆侖銀行",
"LSBANK": "萊商銀行",
"YDRCB": "堯都農(nóng)商行",
"CCQTGB": "重慶三峽銀行",
"FDB": "富滇銀行",
"JSRCU": "江蘇省農(nóng)村信用聯(lián)合社",
"JNBANK": "濟(jì)寧銀行",
"CMB": "招商銀行",
"JINCHB": "晉城銀行JCBANK",
"FXCB": "阜新銀行",
"WHRCB": "武漢農(nóng)村商業(yè)銀行",
"HBYCBANK": "湖北銀行宜昌分行",
"TZCB": "臺(tái)州銀行",
"TACCB": "泰安市商業(yè)銀行",
"XCYH": "許昌銀行",
"CEB": "中國光大銀行",
"NXBANK": "寧夏銀行",
"HSBANK": "徽商銀行",
"JJBANK": "九江銀行",
"NHQS": "農(nóng)信銀清算中心",
"MTBANK": "浙江民泰商業(yè)銀行",
"LANGFB": "廊坊銀行",
"ASCB": "鞍山銀行",
"KSRB": "昆山農(nóng)村商業(yè)銀行",
"YXCCB": "玉溪市商業(yè)銀行",
"DLB": "大連銀行",
"DRCBCL": "東莞農(nóng)村商業(yè)銀行",
"GCB": "廣州銀行",
"NBBANK": "寧波銀行",
"BOYK": "營口銀行",
"SXRCCU": "陜西信合",
"GLBANK": "桂林銀行",
"BOQH": "青海銀行",
"CDRCB": "成都農(nóng)商銀行",
"QDCCB": "青島銀行",
"HKBEA": "東亞銀行",
"HBHSBANK": "湖北銀行黃石分行",
"WZCB": "溫州銀行",
"TRCB": "天津農(nóng)商銀行",
"QLBANK": "齊魯銀行",
"GDRCC": "廣東省農(nóng)村信用社聯(lián)合社",
"ZJTLCB": "浙江泰隆商業(yè)銀行",
"GZB": "贛州銀行",
"GYCB": "貴陽市商業(yè)銀行",
"CQBANK": "重慶銀行",
"DAQINGB": "龍江銀行",
"CGNB": "南充市商業(yè)銀行",
"SCCB": "三門峽銀行",
"CSRCB": "常熟農(nóng)村商業(yè)銀行",
"SHBANK": "上海銀行",
"JLBANK": "吉林銀行",
"CZRCB": "常州農(nóng)村信用聯(lián)社",
"BANKWF": "濰坊銀行",
"ZRCBANK": "張家港農(nóng)村商業(yè)銀行",
"FJHXBC": "福建海峽銀行",
"ZJNX": "浙江省農(nóng)村信用社聯(lián)合社",
"LZYH": "蘭州銀行",
"JSB": "晉商銀行",
"BOHAIB": "渤海銀行",
"CZCB": "浙江稠州商業(yè)銀行",
"YQCCB": "陽泉銀行",
"SJBANK": "盛京銀行",
"XABANK": "西安銀行",
"BSB": "包商銀行",
"JSBANK": "江蘇銀行",
"FSCB": "撫順銀行",
"HNRCU": "河南省農(nóng)村信用",
"COMM": "交通銀行",
"XTB": "邢臺(tái)銀行",
"CITIC": "中信銀行",
"HXBANK": "華夏銀行",
"HNRCC": "湖南省農(nóng)村信用社",
"DYCCB": "東營市商業(yè)銀行",
"ORBANK": "鄂爾多斯銀行",
"BJRCB": "北京農(nóng)村商業(yè)銀行",
"XYBANK": "信陽銀行",
"ZGCCB": "自貢市商業(yè)銀行",
"CDCB": "成都銀行",
"HANABANK": "韓亞銀行",
"CMBC": "中國民生銀行",
"LYBANK": "洛陽銀行",
"GDB": "廣東發(fā)展銀行",
"ZBCB": "齊商銀行",
"CBKF": "開封市商業(yè)銀行",
"H3CB": "內(nèi)蒙古銀行",
"CIB": "興業(yè)銀行",
"CRCBANK": "重慶農(nóng)村商業(yè)銀行",
"SZSBK": "石嘴山銀行",
"DZBANK": "德州銀行",
"SRBANK": "上饒銀行",
"LSCCB": "樂山市商業(yè)銀行",
"JXRCU": "江西省農(nóng)村信用",
"ICBC": "中國工商銀行",
"JZBANK": "晉中市商業(yè)銀行",
"HZCCB": "湖州市商業(yè)銀行",
"NHB": "南海農(nóng)村信用聯(lián)社",
"XXBANK": "新鄉(xiāng)銀行",
"JRCB": "江蘇江陰農(nóng)村商業(yè)銀行",
"YNRCC": "云南省農(nóng)村信用社",
"ABC": "中國農(nóng)業(yè)銀行",
"GXRCU": "廣西省農(nóng)村信用",
"PSBC": "中國郵政儲(chǔ)蓄銀行",
"BZMD": "駐馬店銀行",
"ARCU": "安徽省農(nóng)村信用社",
"GSRCU": "甘肅省農(nóng)村信用",
"LYCB": "遼陽市商業(yè)銀行",
"JLRCU": "吉林農(nóng)信",
"URMQCCB": "烏魯木齊市商業(yè)銀行",
"XLBANK": "中山小欖村鎮(zhèn)銀行",
"CSCB": "長沙銀行",
"JHBANK": "金華銀行",
"BHB": "河北銀行",
"NBYZ": "鄞州銀行",
"LSBC": "臨商銀行",
"BOCD": "承德銀行",
"SDRCU": "山東農(nóng)信",
"NCB": "南昌銀行",
"TCCB": "天津銀行",
"WJRCB": "吳江農(nóng)商銀行",
"CBBQS": "城市商業(yè)銀行資金清算中心",
"HBRCU": "河北省農(nóng)村信用社"
};
module.exports = banknames;
執(zhí)行結(jié)果如下所示:
E:\developmentdocument\nodejsdemo>node http-get.js 6228430120000000000
卡號(hào):6228430120000000000
銀行:中國農(nóng)業(yè)銀行
類型:借記卡
下面再舉一個(gè)爬蟲例子,利用百度和360搜索的數(shù)據(jù),驗(yàn)證電話號(hào)碼是否騷擾電話,需要cheerio庫,該庫類似jquery,語法大部分一致,使用npm安裝:
npm install cheerio
我們對兩個(gè)搜索引擎搜索指定電話號(hào)碼的結(jié)果進(jìn)行分析,如果是騷擾號(hào)碼則打印出被標(biāo)記多少次,否則打印其歸屬地,實(shí)現(xiàn)如下所示:
const https = require('https');
const http = require('http');
const url = require('url');
const cheerio = require('cheerio');
const args = process.argv.slice(2);
const num = args[0];
var optionsBD = {
host: 'www.baidu.com',
port: 80,
path: '/s?wd=' + num,
method: 'GET'
};
var options360 = {
host: 'www.so.com',
port: 443,
path: '/s?q=' + num,
method: 'GET'
};
if (!/^\d+$/.test(num)) {
console.log(`參數(shù)錯(cuò)誤,請輸入正確電話號(hào)碼或查詢平臺(tái)。\r\n例如:node phoneMark.js 15949566632`);
process.exit(0);
}
function request(protocol, options, cb) {
return new Promise((resolve, reject) => {
var req = protocol.request(options, (res) => {
var html = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
html += chunk;
});
res.on('end', () => {
resolve(cb(html));
});
});
req.on('error', (err) => {
reject(err);
});
req.end();
});
}
Promise
.all([request(http, optionsBD, AnalysizeByBD), request(https, options360, AnalysizeBy360)])
.then((vals) => {
summary(vals);
}, (err) => {
console.log(err);
});
function summary(vals) {
if ((/\d+/g).test(vals[0])) {
console.log(`號(hào)碼${num}:為騷擾號(hào)碼,分別被百度、360標(biāo)記${vals[0]}、${vals[1]}次`);
} else {
console.log(`號(hào)碼${num}:${vals[0]}`);
}
}
function AnalysizeByBD(html) {
var $ = cheerio.load(html);
var arr = $('.op_fraudphone_word').text().trim().replace(/\s+/g, "").match(/(\d+)/g)
return arr ? arr[0] : $('.op_mobilephone_r').find('span').eq(1).text().replace(/\s*/g, "");
}
function AnalysizeBy360(html) {
var $ = cheerio.load(html);
return $('.mohe-tips').find('b').text();
}
執(zhí)行結(jié)果如下:
E:\developmentdocument\nodejsdemo>node number.js 15656069453
號(hào)碼15656069453:為騷擾號(hào)碼,分別被百度、360標(biāo)記12、8502次
http模塊便介紹到這。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- NodeJS學(xué)習(xí)筆記之Http模塊
- nodejs使用http模塊發(fā)送get與post請求的方法示例
- 深入淺析Nodejs的Http模塊
- nodejs實(shí)現(xiàn)HTTPS發(fā)起POST請求
- 詳解nodejs通過代理(proxy)發(fā)送http請求(request)
- 使用nodejs、Python寫的一個(gè)簡易HTTP靜態(tài)文件服務(wù)器
- NodeJS搭建HTTP服務(wù)器的實(shí)現(xiàn)步驟
- 搭建簡單的nodejs http服務(wù)器詳解
- NodeJS創(chuàng)建最簡單的HTTP服務(wù)器
- nodejs 使用http進(jìn)行post或get請求的實(shí)例(攜帶cookie)
- 深入解析nodejs HTTP服務(wù)
- NodeJS http模塊用法示例【創(chuàng)建web服務(wù)器/客戶端】
相關(guān)文章
nodejs將JSON字符串轉(zhuǎn)化為JSON對象報(bào)錯(cuò)的解決
這篇文章主要介紹了nodejs將JSON字符串轉(zhuǎn)化為JSON對象報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
NodeJs環(huán)境中NODE_ENV介紹和設(shè)置方法
這篇文章主要給大家介紹了關(guān)于NodeJs環(huán)境中NODE_ENV介紹和設(shè)置的相關(guān)資料,NODE_ENV其實(shí)就是環(huán)境變量之一,用于設(shè)置nodejs當(dāng)前的運(yùn)行環(huán)境,需要的朋友可以參考下2024-07-07
WebSocket+node.js創(chuàng)建即時(shí)通信的Web聊天服務(wù)器
這篇文章主要為大家詳細(xì)介紹了WebSocket+node.js創(chuàng)建即時(shí)通信的Web聊天服務(wù)器的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08
Node.js利用Net模塊實(shí)現(xiàn)多人命令行聊天室的方法
Node.js Net 模塊提供了一些用于底層的網(wǎng)絡(luò)通信的小工具,包含了創(chuàng)建服務(wù)器/客戶端的方法,下面這篇文章主要給大家介紹了Node.js利用Net模塊實(shí)現(xiàn)命令行多人聊天室的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12

