// ==UserScript==
// @name 京东云无线宝积分查询
// @namespace http://blog.gobyte.cn/
// @version 0.32
// @description 京东云无线宝路由器积分统计、积分兑换、积分查询脚本
// @author [email protected] 山岚
// @match *://router-app-api.jdcloud.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
/**
使用教程:
1.安装油猴子,或者复制JS代码到浏览器控制台运行:
京东云无线宝积分查询
https://gf.qytechs.cn/zh-CN/scripts/416281-%E4%BA%AC%E4%B8%9C%E4%BA%91%E6%97%A0%E7%BA%BF%E5%AE%9D%E7%A7%AF%E5%88%86%E6%9F%A5%E8%AF%A2
2.抓包获取Key
需要通过抓包“京东云无线宝”App获取。在header内,链接是:https://router-app-api.jdcloud.com/v1/开头的链接,具体请自行修改代码。
3.打开网址查看效果
https://router-app-api.jdcloud.com/v1
4.抓包工具
Android 系统 : HttpCanary
iOS 系统 :Stream
*/
let wskey = "";
let jdmt_sign = "";
let jdmt_appkey = "";
localStorage.setItem('wskey',wskey);
localStorage.setItem('jdmt_sign',jdmt_sign);
localStorage.setItem('jdmt_appkey',jdmt_appkey);
//start
let mac_arr = [];
let sum = 0 ,exchanged = 0,thisDevice = 0,bodyStr="",todayPoint = null;
let todayPointCount = 0;
let allPointnts = 0;
//所有未兑换的积分统计
let allAmount = 0;
// let wskey = localStorage.getItem('wskey');
// let jdmt_sign = localStorage.getItem('jdmt_sign');
// let jdmt_appkey = localStorage.getItem('jdmt_appkey');
//今日所有设备总积分
fetch(`https://router-app-api.jdcloud.com/v1/regions/cn-north-1/todayPointDetail?sortField=today_point&sortDirection=DESC&pageSize=15¤tPage=1&time=${new Date().getTime()}`, {
"credentials": "omit",
"headers": {
"content-type": "application/json",
"jdmt-rx-appkey": jdmt_appkey,
"jdmt-rx-sign": jdmt_sign,
"wskey": wskey,
"jdmt-rx-time": new Date().getTime(),
"User-Agent": "Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 (JBOX-APP; Android/2.0.4/8)",
},
"referrerPolicy": "no-referrer-when-downgrade",
"body": null,
"method": "GET",
"mode": "cors"
})
.then(res => {
return res.json();
})
.then(data => {
// console.log(`今日总积分:`,JSON.stringify(data));
if(JSON.stringify(data).indexOf('权限') > -1){
alert("抓包的Key值可能失效,请重新抓包!!!");
console.error("抓包的Key值可能失效,请重新抓包!!!");
}
let pointInfos = data.result.pointInfos;
//遍历所有设备
for( let i = 0; i < pointInfos.length; i++ ){
let mac = pointInfos[i].mac;
//保存mac备用
mac_arr.push(mac);
//获取备注名;默认mac地址
let name = localStorage.getItem(mac) ? localStorage.getItem(mac) : mac;
todayPointCount += pointInfos[i].todayPointIncome;
allPointnts += pointInfos[i].allPointIncome;
// 所有的值以mac为id前缀,后面再添加不同值的名字。如:未兑换的积分id为:mac_amount,这样就会让id变得唯一且容易修改dom
bodyStr += `<tr>
<td>备注:${name}</td>
<td style="display:none" name="${mac}">MAC:${mac}</td>
<td style="color: #03A9F4;" >${data.result.todayDate} 日积分:${pointInfos[i].todayPointIncome}</td>
<td style="display:none">缓存:<span id=''></span></td>
<td>未兑换:<span id='${mac}_amount'></span></td>
<td>总积分:${pointInfos[i].allPointIncome}</td>
<td><button id='${mac}_exchangeButton' class="exchangeButton" onClick="exchangePoint(this,'${mac}',${mac})">兑换</button></td>
<td><button onClick="markName(this,'${mac}')">备注</button></td>`;
};
document.querySelector("body").innerHTML = `<table cellpadding="10"> <tr> ${bodyStr} <td><button onClick="allExchangePoint(this)">全部兑换</button></td> </tr>
<tr><td></td><td><b>统计:</b>今日总积分:<span style="color:red;">${todayPointCount}</span></td> <td class="所有未兑换总积分">总计:<span style="color:blue;" id="allAmountId">${allAmount}</span></td><td class="所有总积分">总计:<span style="color:blue;">${allPointnts}</span></td></tr>
</table>`;
//显示未兑换的积分
//查询所有账户信息和积分
mac_arr.map(
mac =>{
let routerAccountInfo_url = `https://router-app-api.jdcloud.com/v1/regions/cn-north-1/routerAccountInfo?mac=${mac}`;
fetch(routerAccountInfo_url, {
"headers": {
"content-type": "application/json",
"jdmt-rx-appkey": jdmt_appkey,
"jdmt-rx-sign": jdmt_sign,
"wskey": wskey,
"Referer": "http://guanli.luyou.360.cn/new_index.htm"
},
"referrerPolicy": "no-referrer-when-downgrade",
"body": null,
"method": "get",
"mode": "cors"
})
.then(res => {
return res.json();
}).then( data => {
//统计未兑换的设备积分
allAmountFun(data.result.accountInfo.amount);
document.getElementById(`${mac}_amount`).textContent = data.result.accountInfo.amount;
document.getElementById(`${mac}_exchangeButton`).attributes.onclick.value = `exchangePoint(this,'${mac}',${data.result.accountInfo.amount})`;
});
}
);
});
// ==========================
//给所有未兑换积分统计dom赋值
//统计未兑换总积分函数
function allAmountFun(n){
allAmount += n;
document.getElementById('allAmountId').textContent = allAmount;
}
//兑换积分函数
window.exchangePoint= function (obj,mac,point) {
console.log("外部调用",mac,point);
point = window.prompt("请输入需要兑换的积分",point);
if(!point) return;
//构造请求体
const pointExchangeBody = {
"pointExchangeReqVo": {
"deviceId": mac,
"pointAmount": point,
"source": 3
},
"regionId": "cn-north-1"
};
fetch("https://router-app-api.jdcloud.com/v1/regions/cn-north-1/point:exchange", {
"headers": {
"content-type": "application/json",
"wskey": wskey,
"User-Agent": "",
},
"body": JSON.stringify(pointExchangeBody),
"method": "POST",
"mode": "cors"
})
.then(res => {
return res.json();
})
.then(data => {
if(data.code === 200){
alert("兑换成功!");
}else{
alert("失败!请按下F12 - console (控制台)内截图给开发者");
console.error(data);
}
});
}
//备注函数
window.markName=(obj,mac)=>{
let name = window.prompt("请输入备注名","")
if(!name) return;
localStorage.setItem(mac,name);
window.location.reload();
}
//-1
})();