nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例


Posted in NodeJs onDecember 30, 2016

http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache、IIS、Nginx、Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫。下面简单介绍该模块的使用,其具体API,大家可以自行去nodejs官方文档查看。

1、http.Server服务器

使用http.createServer([requestListener])方法创建一个http服务器,该方法返回一个新的http.Server实例,如果指定了requestListener,则会自动添加request事件。http.Server继承于net.Server,故默认拥有很多的属性、方法和事件,如下图所示(只给出部分):

nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例

使用如下所示:

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事件监听的参数req,res分别是http.IncomingMessage,http.ServerResponse的实例,IncomingMessage对象是由 http.Server 或 http.ClientRequest 创建,并且被自动添加到'request' and 'response' 事件监听函数的第一个参数,是一个可读流,主要包括一些状态信息,请求信息,属性如下所示:

nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例

ServerResponse对象是HTTP server内部创建,并作为request事件监听函数的第二个参数,实现了可写流,决定返回给客户端的内容,属性如下所示:

 nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例

创建一个http服务器,并监听3000端口,用浏览器打开http://127.0.0.1:3000浏览,即可看到hello world。
 我们还可以创建一个简易的路由,对用户的请求进行处理,如下所示:

//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()方法创建,可以作为一个向服务器发起请求的客户端,该对象的属性(只列出部分)如下:

nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例

http.request(options[, callback])方法使用

参数options可以是一个对象或字符串,如果是字符串则会自动调用url.parse()进行解析,包涵以下属性(部分):

  • protocol,协议,默认为http:
  • host,主机地址
  • hostname,主机名
  • family,IP版本
  • port,端口
  • method,请求方法
  • path ,路径
  • headers ,请求头
  • timeout ,超时时间

callback会自动添加给reponse事件监听,返回值为http.ClientRequest,下面利用该知识写一个利用支付宝接口查询银行卡号所属银行,不过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(`参数错误,请输入16位以上银行卡号。例如: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 = '发送请求失败 code:' + statusCode;
  } else if (!/^application\/json/.test(type)) {
    msg = '返回的数据格式不正确,应返回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(`卡号:${cardNo}\r\n银行:${bname}\r\n类型:${btypes[btype]}`);
}

bankname.js

const banknames = {
 "SRCB": "深圳农村商业银行", 
 "BGB": "广西北部湾银行", 
 "SHRCB": "上海农村商业银行", 
 "BJBANK": "北京银行", 
 "WHCCB": "威海市商业银行", 
 "BOZK": "周口银行", 
 "KORLABANK": "库尔勒市商业银行", 
 "SPABANK": "平安银行", 
 "SDEB": "顺德农商银行", 
 "HURCB": "湖北省农村信用社", 
 "WRCB": "无锡农村商业银行", 
 "BOCY": "朝阳银行", 
 "CZBANK": "浙商银行", 
 "HDBANK": "邯郸银行", 
 "BOC": "中国银行", 
 "BOD": "东莞银行", 
 "CCB": "中国建设银行", 
 "ZYCBANK": "遵义市商业银行", 
 "SXCB": "绍兴银行", 
 "GZRCU": "贵州省农村信用社", 
 "ZJKCCB": "张家口市商业银行", 
 "BOJZ": "锦州银行", 
 "BOP": "平顶山银行", 
 "HKB": "汉口银行", 
 "SPDB": "上海浦东发展银行", 
 "NXRCU": "宁夏黄河农村商业银行", 
 "NYNB": "广东南粤银行", 
 "GRCB": "广州农商银行", 
 "BOSZ": "苏州银行", 
 "HZCB": "杭州银行", 
 "HSBK": "衡水银行", 
 "HBC": "湖北银行", 
 "JXBANK": "嘉兴银行", 
 "HRXJB": "华融湘江银行", 
 "BODD": "丹东银行", 
 "AYCB": "安阳银行", 
 "EGBANK": "恒丰银行", 
 "CDB": "国家开发银行", 
 "TCRCB": "江苏太仓农村商业银行", 
 "NJCB": "南京银行", 
 "ZZBANK": "郑州银行", 
 "DYCB": "德阳商业银行", 
 "YBCCB": "宜宾市商业银行", 
 "SCRCU": "四川省农村信用", 
 "KLB": "昆仑银行", 
 "LSBANK": "莱商银行", 
 "YDRCB": "尧都农商行", 
 "CCQTGB": "重庆三峡银行", 
 "FDB": "富滇银行", 
 "JSRCU": "江苏省农村信用联合社", 
 "JNBANK": "济宁银行", 
 "CMB": "招商银行", 
 "JINCHB": "晋城银行JCBANK", 
 "FXCB": "阜新银行", 
 "WHRCB": "武汉农村商业银行", 
 "HBYCBANK": "湖北银行宜昌分行", 
 "TZCB": "台州银行", 
 "TACCB": "泰安市商业银行", 
 "XCYH": "许昌银行", 
 "CEB": "中国光大银行", 
 "NXBANK": "宁夏银行", 
 "HSBANK": "徽商银行", 
 "JJBANK": "九江银行", 
 "NHQS": "农信银清算中心", 
 "MTBANK": "浙江民泰商业银行", 
 "LANGFB": "廊坊银行", 
 "ASCB": "鞍山银行", 
 "KSRB": "昆山农村商业银行", 
 "YXCCB": "玉溪市商业银行", 
 "DLB": "大连银行", 
 "DRCBCL": "东莞农村商业银行", 
 "GCB": "广州银行", 
 "NBBANK": "宁波银行", 
 "BOYK": "营口银行", 
 "SXRCCU": "陕西信合", 
 "GLBANK": "桂林银行", 
 "BOQH": "青海银行", 
 "CDRCB": "成都农商银行", 
 "QDCCB": "青岛银行", 
 "HKBEA": "东亚银行", 
 "HBHSBANK": "湖北银行黄石分行", 
 "WZCB": "温州银行", 
 "TRCB": "天津农商银行", 
 "QLBANK": "齐鲁银行", 
 "GDRCC": "广东省农村信用社联合社", 
 "ZJTLCB": "浙江泰隆商业银行", 
 "GZB": "赣州银行", 
 "GYCB": "贵阳市商业银行", 
 "CQBANK": "重庆银行", 
 "DAQINGB": "龙江银行", 
 "CGNB": "南充市商业银行", 
 "SCCB": "三门峡银行", 
 "CSRCB": "常熟农村商业银行", 
 "SHBANK": "上海银行", 
 "JLBANK": "吉林银行", 
 "CZRCB": "常州农村信用联社", 
 "BANKWF": "潍坊银行", 
 "ZRCBANK": "张家港农村商业银行", 
 "FJHXBC": "福建海峡银行", 
 "ZJNX": "浙江省农村信用社联合社", 
 "LZYH": "兰州银行", 
 "JSB": "晋商银行", 
 "BOHAIB": "渤海银行", 
 "CZCB": "浙江稠州商业银行", 
 "YQCCB": "阳泉银行", 
 "SJBANK": "盛京银行", 
 "XABANK": "西安银行", 
 "BSB": "包商银行", 
 "JSBANK": "江苏银行", 
 "FSCB": "抚顺银行", 
 "HNRCU": "河南省农村信用", 
 "COMM": "交通银行", 
 "XTB": "邢台银行", 
 "CITIC": "中信银行", 
 "HXBANK": "华夏银行", 
 "HNRCC": "湖南省农村信用社", 
 "DYCCB": "东营市商业银行", 
 "ORBANK": "鄂尔多斯银行", 
 "BJRCB": "北京农村商业银行", 
 "XYBANK": "信阳银行", 
 "ZGCCB": "自贡市商业银行", 
 "CDCB": "成都银行", 
 "HANABANK": "韩亚银行", 
 "CMBC": "中国民生银行", 
 "LYBANK": "洛阳银行", 
 "GDB": "广东发展银行", 
 "ZBCB": "齐商银行", 
 "CBKF": "开封市商业银行", 
 "H3CB": "内蒙古银行", 
 "CIB": "兴业银行", 
 "CRCBANK": "重庆农村商业银行", 
 "SZSBK": "石嘴山银行", 
 "DZBANK": "德州银行", 
 "SRBANK": "上饶银行", 
 "LSCCB": "乐山市商业银行", 
 "JXRCU": "江西省农村信用", 
 "ICBC": "中国工商银行", 
 "JZBANK": "晋中市商业银行", 
 "HZCCB": "湖州市商业银行", 
 "NHB": "南海农村信用联社", 
 "XXBANK": "新乡银行", 
 "JRCB": "江苏江阴农村商业银行", 
 "YNRCC": "云南省农村信用社", 
 "ABC": "中国农业银行", 
 "GXRCU": "广西省农村信用", 
 "PSBC": "中国邮政储蓄银行", 
 "BZMD": "驻马店银行", 
 "ARCU": "安徽省农村信用社", 
 "GSRCU": "甘肃省农村信用", 
 "LYCB": "辽阳市商业银行", 
 "JLRCU": "吉林农信", 
 "URMQCCB": "乌鲁木齐市商业银行", 
 "XLBANK": "中山小榄村镇银行", 
 "CSCB": "长沙银行", 
 "JHBANK": "金华银行", 
 "BHB": "河北银行", 
 "NBYZ": "鄞州银行", 
 "LSBC": "临商银行", 
 "BOCD": "承德银行", 
 "SDRCU": "山东农信", 
 "NCB": "南昌银行", 
 "TCCB": "天津银行", 
 "WJRCB": "吴江农商银行", 
 "CBBQS": "城市商业银行资金清算中心", 
 "HBRCU": "河北省农村信用社"
};
module.exports = banknames;

执行结果如下所示:

E:\developmentdocument\nodejsdemo>node http-get.js 6228430120000000000

卡号:6228430120000000000

银行:中国农业银行

 类型:借记卡

下面再举一个爬虫例子,利用百度和360搜索的数据,验证电话号码是否骚扰电话,需要cheerio库,该库类似jquery,语法大部分一致,使用npm安装:

npm install cheerio

我们对两个搜索引擎搜索指定电话号码的结果进行分析,如果是骚扰号码则打印出被标记多少次,否则打印其归属地,实现如下所示:

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(`参数错误,请输入正确电话号码或查询平台。\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(`号码${num}:为骚扰号码,分别被百度、360标记${vals[0]}、${vals[1]}次`);
 } else {
  console.log(`号码${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();
}

执行结果如下:

E:\developmentdocument\nodejsdemo>node number.js 15656069453

号码15656069453:为骚扰号码,分别被百度、360标记12、8502次

http模块便介绍到这。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
配置nodejs环境的方法
May 13 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 #NodeJs
nodeJS删除文件方法示例
Dec 25 #NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 #NodeJs
详解Nodejs的timers模块
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 #NodeJs
You might like
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
用文本作数据处理
2006/10/09 PHP
Dedecms常用函数解析
2008/02/01 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
js实现无缝轮播图
2020/03/09 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
python 解析html之BeautifulSoup
2009/07/07 Python
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
python简单实现基数排序算法
2015/05/16 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
Python实战购物车项目的实现参考
2019/02/20 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
物理教育专业毕业生推荐信
2013/11/03 职场文书
小学新教师培训方案
2014/02/03 职场文书
2015年统战工作总结
2015/05/19 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
MYSQL 运算符总结
2021/11/11 MySQL
使用CSS实现音波加载效果
2023/05/07 HTML / CSS