js提取新浪邮箱的信用卡
js提取用户新浪邮箱中的信用卡信息,是js非nodejs。
对比py,之前就做不好,出现了复杂点选验证码。js的开发速度只需要py的三分之一,甚至十分之一。
js在客户端执行,py在后端执行,py要实现实时高并发,在应对2000个并发时候,需要买几百台服务器。js节约这些钱。如果某一步使用了selenium需要上千台服务器。
可以登录后打开邮箱页面时候,执行这个来测试。就能获取到别人的信息了。实际是app。
一定是要在新浪邮箱页面打开console控制台,不能在别的网站打开console执行下面的代码,否则是跨域的,请求不到,要不然开发者在自己网站的js脚本写个ajax,请求淘宝 支付宝的网站api,然后把结果传到后台,你的信息都被别人知道了,这是不可能做到的。
//消除空格 String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }; //正则防止出错 String.prototype.match2 = function(regObj) { var matchArray = this.match(regObj); if (matchArray && matchArray.length == 2){ return matchArray[1]; } else{ return \'\'; } }; function getInnerText( cssselector){ var element = document.querySelector(cssselector); if(element){ return element.innerText; } else { console.error("没有找到 " + cssselector + " 的元素"); return ""; } } //获取元素 function myParseFunction(domObj, cssselector){ var obj = domObj.querySelector(cssselector); if(obj){ return obj.innerText; } else{ console.error("没有找到 " + cssselector + " 的元素"); return ""; } } // 定义全局变量 //var sid = window.location.href.match(/sid=(\S+)#/)[1]; var KEYWORD_DICK = { "jiaotong":"交通银行信用卡电子账单", "jianshe": "中国建设银行信用卡电子账单", "zhaoshang":"招商信用卡月账单", "guangfa":"广发信用卡电子账单", "pingan":"平安信用卡月对账单", "zhongxin": "中信信用卡月账单" }; //存放每个银行的邮件id midObj = {}; for (var key in KEYWORD_DICK){ midObj[key] = []; } function searchMail(keyword){ console.debug(\'开始搜索\' + KEYWORD_DICK[keyword] +\'的所有邮件id\'); var content = KEYWORD_DICK[keyword]; var url = \'https://mail.aliyun.com/alimail/ajax/mail/queryMailList.txt?_timestamp_=1517642178006\'; var data = { showFrom:1, query:\'{"keywordFields":5,"keywords":["\' + content +\'"],"advancedSearch":true}\', fragment:-1, offset:0, length:25, _csrf_token_:$.cookie(\'_csrf_token_\'), _root_token_:$.cookie(\'_root_token_\'), _refer_hash_:window.location.href.match(/#(.*)/)[1], _tpl_:\'DEFAULT\' }; var res = $.ajax({ type: "POST", url:url, data: data, async: false }); var htmlStr = res.responseText; console.debug(\'搜索邮件的源码是:\' + htmlStr); var midsMatch = htmlStr.match(/mailId":".*?"/g) || []; //console.debug(midsMatch); for (var index=0; index<midsMatch.length; index++){ var mid = midsMatch[index].match(/mailId":"(.*?)"/)[1]; midObj[keyword].push(mid); } //console.debug(midObj); } // searchMail(\'jianshe\') function readMail(mid) { // url https://mail.163.com/js6/read/readhtml.jsp?mid=364:xtbBbBqIbVc6-6WyKQAAs-_30c7:bdc2:h:b:8&font=15&color=064977 var url = "https://mail.aliyun.com/alimail/ajax/mail/loadMail.txt?_timestamp_=1517645971062"; var data = { mailId:mid, charset:\'\', full:1, allowAutoQuote:1, _csrf_token_:$.cookie(\'_csrf_token_\'), _root_token_:$.cookie(\'_root_token_\'), _refer_hash_:h=window.location.href.match(/#(.*)/)[1], _tpl_:\'DEFAULT\' }; console.debug(\'请求邮件详情的url是: \' + url); var res = $.ajax({ type: "POST", url:url, data: data, async: false }); //console.debug(res.responseText); var content = res.responseText.match2(/({[\s\S]*})/);//.match2(/<string name="content">([\s\S]*?)<\/string>/); // console.debug(\'获取的邮件详情是:\'); // console.debug(content); //下面是转义,例如<转为< var ifame = document.createElement("ifame"); ifame.innerHTML = content; var resText0 = ifame.innerText; //console.debug(\'resText\',resText); var contentObj = JSON.parse(resText0); var resText1 = contentObj[\'data\'][\'body\']; var ifame = document.createElement("ifame"); ifame.innerHTML = resText1; var resText = ifame.innerHTML; console.debug(\'resTextstart\n\',resText,\'resTextend\n\'); return resText; } function parseZhaoShang(resText) { var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data[\'username\'] = resText.match2(/尊敬的\s?(\S+)\s?[先|生|女|士]{2}/); data["bill_month"] = resText.match2(/以下是您的招商银行信用卡(\d+月)账单/); data["bank"] = "招商银行"; if (RegExp("尊敬的").test(resText)){ //详细账单 data["due_date"] = myParseFunction(ifame, "#fixBand42 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["need_pay"] = myParseFunction(ifame, "#fixBand40 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["min_need_pay"]=myParseFunction(ifame, "#fixBand40 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["card_limit"] = myParseFunction(ifame, "#fixBand38 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["cash_limit"] = ""; data["bill_peroid"] = myParseFunction(ifame, "#fixBand38 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["avb_point"] = myParseFunction(ifame, "#fixBand23 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["card_number"] = ""; data["last_bill"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["bill_new"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["bill_paid"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr > td > table > tbody > tr > td:nth-child(4) > div > font"); // data["bill_left"] = document.querySelector().innerText; data["bill_adjust"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr > td > table > tbody > tr > td:nth-child(6) > div > font"); data["cycle_interest"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font "); } else{//简约账单 data["due_dae"] = myParseFunction(ifame, "#fixBand18 > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td:nth-child(2) > div > font"); data["nend_pay"] = myParseFunction(ifame, "#fixBand57 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["min_need_pay"] = myParseFunction(ifame, "#fixBand46 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); } return data } function parseGuangFa(resText) { var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data[\'username\'] = resText.match2(/尊敬的\s?(\S+)\s?[先|生|女|士]{2}/); data["bill_month"] = resText.match2(/(\d+年\d+月)/); data["bank"] = "广发银行"; if (RegExp("感谢您使用广发银行信用卡").test(resText)) { //2015年12月(含)以后的账单 data["bill_peroid"] = resText.match2(/账单周期:([\s\d\/至]+)/); if (RegExp("积分明细").test(resText)) { //详细账单,2016年8月(含)以后邮件不再显示账单明细 data["due_date"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["need_pay"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["min_need_pay"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(4) > div > font"); data["card_limit"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font"); // data["cash_limit"] = ""; data["avb_point"] = myParseFunction(ifame, "#fixBand7 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font"); data["card_number"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["last_bill"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["bill_new"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(6) > div > font"); data["bill_paid"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font"); // data["bill_adjust"] = myParseFunction(ifame, ""); // data["cycle_interest"] = myParseFunction(ifame, ""); } else { //2016年8月以后的账单 data["due_date"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["need_pay"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["min_need_pay"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(4) > div > font"); data["card_limit"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font"); // data["cash_limit"] = ""; // data["avb_point"] = myParseFunction(ifame, ""); data["card_number"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["last_bill"] = myParseFunction(ifame, "#reportPanel2 #fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); data["bill_new"] = myParseFunction(ifame, "#reportPanel2 #fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(6) > div > font"); data["bill_paid"] = myParseFunction(ifame, "#reportPanel2 #fixBand4 > table > tbody > tr > td > table > tbody > tr > td:nth-child(7) > div > font"); // data["bill_adjust"] = myParseFunction(ifame, ""); // data["cycle_interest"] = myParseFunction(ifame, ""); }; } else{ //2015年11月以前的账单 data["bill_peroid"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["due_date"] = myParseFunction(ifame, "#fixBand7 > table > tbody > tr > td:nth-child(4) > div > font"); data["need_pay"] = myParseFunction(ifame, "#fixBand7 > table > tbody > tr > td:nth-child(2) > div > font"); data["min_need_pay"]=myParseFunction(ifame, "#fixBand7 > table > tbody > tr > td:nth-child(3) > div > font"); data["card_limit"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(4) > div > font"); data["avb_point"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td:nth-child(9) > div > font"); data["card_number"] = myParseFunction(ifame, "#fixBand7 > table > tbody > tr > td:nth-child(1) > div > font"); data["last_bill"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td:nth-child(3) > div > font"); data["bill_new"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td:nth-child(5) > div > font"); data["bill_paid"] = myParseFunction(ifame, "#fixBand4 > table > tbody > tr > td:nth-child(7) > div > font"); } return data } function parsePingAn(resText) { var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data[\'username\'] = resText.match2(/尊敬的\s?(\S+)\s?[先|生|女|士]{2}/); data["bill_month"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(8) > td > table > tbody > tr > td > table > tbody > tr > td:nth-child(1) > table > tbody > tr:nth-child(2) > td").match2(/以下是您(.+)的信用卡对账单/); data["bank"] = "平安银行"; data["due_date"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(9) > td > table > tbody > tr > td:nth-child(1) > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(2) > td:nth-child(2) > span > strong"); data["need_pay"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(9) > td > table > tbody > tr > td:nth-child(3) > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td:nth-child(2) > table > tbody > tr:nth-child(1) > td "); data["min_need_pay"]=myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(9) > td > table > tbody > tr > td:nth-child(3) > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td:nth-child(2) > table > tbody > tr:nth-child(3) > td"); data["card_limit"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(9) > td > table > tbody > tr > td:nth-child(1) > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(3) > td:nth-child(2)"); data["cash_limit"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(9) > td > table > tbody > tr > td:nth-child(1) > table > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(4) > td:nth-child(2)"); // data["bill_peroid"] = myParseFunction(ifame, ""); data["avb_point"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(13) > td > table > tbody > tr:nth-child(3) > td:nth-child(1)"); // data["card_number"] = ""; data["last_bill"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(21) > td > table > tbody > tr:nth-child(2) > td:nth-child(2)"); data["bill_new"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(21) > td > table > tbody > tr:nth-child(2) > td:nth-child(4)"); data["bill_paid"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(21) > td > table > tbody > tr:nth-child(2) > td:nth-child(3)"); data["bill_adjust"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(21) > td > table > tbody > tr:nth-child(2) > td:nth-child(5)"); data["cycle_interest"] = myParseFunction(ifame, "#mailContentContainer > table > tbody > tr:nth-child(21) > td > table > tbody > tr:nth-child(2) > td:nth-child(6)"); return data } function parseZhongXin(resText) { //var resText = document.documentElement.outerHTML; var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data["bank"] = "中信银行"; data[\'username\'] = resText.match2(/尊敬的\s?(\S+)\s?[先|生|女|士]{2}/); data["bill_month"] = resText.match2(/(\d+年\d+月)账单已产生/); data["bill_peroid"] = resText.match2(/记录了您(\S+)账户变动信息/); data["due_date"] = resText.match2(/到期还款日:([\d年月日]+)/); data["need_pay"] = myParseFunction(ifame, "#fixBand16 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["min_need_pay"]=myParseFunction(ifame, "#fixBand11 > table > tbody > tr > td > table > tbody > tr > td:nth-child(3) > div > font"); data["card_limit"] = myParseFunction(ifame, "#fixBand12 > table > tbody > tr:nth-child(1) > td > table > tbody > tr > td:nth-child(3) > div > font"); data["cash_limit"] = myParseFunction(ifame, "#fixBand13 > table > tbody > tr:nth-child(1) > td > table > tbody > tr > td:nth-child(3) > div > font"); // data["avb_point"] = myParseFunction(ifame, ""); data["card_number"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(2) > div > font"); data["last_bill"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(4) > div > font"); data["bill_new"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(6) > div > font"); data["bill_paid"] = myParseFunction(ifame, "#fixBand5 > table > tbody > tr > td > table > tbody > tr > td:nth-child(5) > div > font"); // data["bill_adjust"] = myParseFunction(ifame, ""); // data["cycle_interest"] = myParseFunction(ifame, ""); return data } function parseJiaoTong(resText){ //var resText = document.documentElement.outerHTML; var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data[\'bank\'] = \'交通银行\'; data[\'username\'] = resText.match2(/尊敬的 (\S+)您好!<\/p>/); data["bill_month"] = resText.match2(/以下是您(\S+?月)份的信用卡电子账单。/); data["bill_peroid"] = resText.match2(/账单周期:(.*?)<\/p>/); data["due_date"] = myParseFunction(ifame,\'#billInfo1 > table > tbody > tr:nth-child(1) > td:nth-child(2)\'); data["need_pay"] = myParseFunction(ifame, \'#billInfo1 > table > tbody > tr:nth-child(2) > td:nth-child(2)\'); data["min_need_pay"]= myParseFunction(ifame, \'#billInfo1 > table > tbody > tr:nth-child(3) > td:nth-child(2)\'); data["card_limit"] = myParseFunction(ifame, \'#billInfo1 > table > tbody > tr:nth-child(4) > td:nth-child(2)\'); data["cash_limit"] = myParseFunction(ifame, \'#billInfo1 > table > tbody > tr:nth-child(5) > td:nth-child(2)\'); data["card_number"] = resText.match2(/卡号:(\S+?)<\/p>/); data[\'last_bill\'] = myParseFunction(ifame, \'#container > div:nth-child(6) > table > tbody > tr:nth-child(2) > td:nth-child(3)\'); data[\'bill_paid\'] = myParseFunction(ifame, \'#container > div:nth-child(6) > table > tbody > tr:nth-child(2) > td:nth-child(4)\'); data[\'bill_new\'] = myParseFunction(ifame, \'#container > div:nth-child(6) > table > tbody > tr:nth-child(2) > td:nth-child(5)\'); data[\'avb_point\'] = myParseFunction(ifame, \'#billInfo20 > table > tbody > tr:nth-child(2) > td:nth-child(2)\'); return data; } function parseJianShe(resText){ //var resText = document.documentElement.outerHTML; var ifame = document.createElement("ifame"); ifame.innerHTML = resText; var data = {}; data[\'bank\'] = \'建设银行\'; data[\'username\'] = resText.match2(/尊敬的(.*?),您好!<\/font>/); data["bill_month"] = resText.match2(/<br>至(.*?月).*?日<\/font><\/b>信用卡账户变动情/); //data["bill_peroid"] = resText.match2(/sans-serif">(.*?)<br>至.*?<\/font>/) + resText.match2(/sans-serif">.*?<br>(至.*?)<\/font>/); data["bill_peroid"] = resText.match2(/(\d+年\d+月\d+日)<br>至\d+年\d+月\d+日/) + resText.match2(/\d+年\d+月\d+日<br>(至\d+年\d+月\d+日)/); data["due_date"] = myParseFunction(ifame,\'td[width="34%"] > table > tbody > tr:nth-child(3) > td:nth-child(2) > font > b\'); data["need_pay"] = myParseFunction(ifame, \'td[width="62%"] > table > tbody > tr:nth-child(3) > td:nth-child(2) > font > b\'); data["min_need_pay"]= myParseFunction(ifame, \'td[width="62%"] > table > tbody > tr:nth-child(3) > td:nth-child(3) > font\'); data["card_limit"] = myParseFunction(ifame, \'td[width="34%"] > table > tbody > tr:nth-child(4) > td:nth-child(2) > font > a\').trim(); data["cash_limit"] = myParseFunction(ifame,\'td[width="34%"] > table > tbody > tr:nth-child(5) > td:nth-child(2) > font\'); //data["card_number"] = resText.match2(/卡号:(\S+?)<\/p>/); data[\'last_bill\'] = myParseFunction(ifame, \'table[width="875"] > tbody > tr:nth-child(4) > td:nth-child(3) > font\'); //data[\'bill_paid\'] = myParseFunction(ifame, "#table4 > tbody > tr:nth-child(2) > td:nth-child(4)"); //data[\'bill_new\'] = myParseFunction(ifame, "#table4 > tbody > tr:nth-child(2) > td:nth-child(5)"); //data[\'avb_point\'] = myParseFunction(ifame, "#table5 > tbody > tr:nth-child(2) > td:nth-child(2)"); return data; } // 定义解析函数映射字典 var MAP_PARSER_FUNCTION = { "zhaoshang": parseZhaoShang, "guangfa": parseGuangFa, "pingan": parsePingAn, "zhongxin": parseZhongXin, "jiaotong": parseJiaoTong, "jianshe": parseJianShe }; var datas = []; function extractBank(keyword){ searchMail(keyword); console.debug(keyword+ \'的mids是:\'); console.debug(midObj[keyword]); for (var indexi=0;indexi< midObj[keyword].length; indexi++){ var read_res = readMail(midObj[keyword][indexi]); var data = MAP_PARSER_FUNCTION[keyword](read_res); datas.push(data); console.debug(\'提取的 \' + KEYWORD_DICK[keyword] + \' 单个信息是:\'); console.debug(data); } } function runAll(){ for (var key in KEYWORD_DICK){ extractBank(key); } console.debug(\'完成提取\'); console.debug(datas); console.debug(JSON.stringify(datas)); return JSON.stringify(datas); } //runAll(); // extractBank(\'guangfa\'); // extractBank(\'jiaotong\'); // extractBank(\'jianshe\'); // // console.debug(\'完成提取\'); // console.debug(datas); // // console.debug(JSON.stringify(datas));