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&quot;:&quot;(.*?)&quot;/)[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);
    //下面是转义,例如&lt;转为<
    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));

 

版权声明:本文为ydf0509原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ydf0509/p/8360176.html