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));