// ==UserScript==
// @name 咕咕镇数据采集
// @namespace https://gf.qytechs.cn/users/448113
// @version 0.4.6
// @description 咕咕镇数据采集,目前采集技能率、暴击率
// @author paraii
// @include https://www.lv999max.com/*
// @grant GM_xmlhttpRequest
// @connect notes.orga.cat
// @connect www.lv999max.com
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @license MIT License
// ==/UserScript==
function submitData(){
var npc = document.getElementById('pklist').children;
for(let i = 2;i<12;i++){
//console.log(npc[o].innerText[0]);
if(npc[i].innerText[0]!='已'){
localStorage.setItem('over', 0); //未与全部npc战斗
alert('未与全部npc战斗,请与全部npc完成战斗后提交')
break;
}
else{
localStorage.setItem('over', 1);
}
}
if(localStorage.length>4&&localStorage.getItem('over')=='1'){
var meURL = `https://notes.orga.cat/${encodeURI(localStorage.getItem('title')).replace(/%/g, '')}`;
console.log(meURL);
GM_xmlhttpRequest({
method: 'GET',
url: meURL,
timeout: 30000,
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
onload: response => {
var text = response.responseText.match(/content">([\s\S]*)<\/text/)[1];
if(text.length==0){
text='{"1-50":{"MU":[0],"ZHU":[0],"DENG":[0],"SHOU":[0]},"51-100":{"MU":[0],"ZHU":[0],"DENG":[0],"SHOU":[0]},"101-":{"MU":[0],"ZHU":[0],"DENG":[0],"SHOU":[0]}}'
}else{
text=text.replace(/"/g,'"');
}
var json = JSON.parse(text);
let pk_i = 0;
while(localStorage.getItem(`pk${pk_i}`)!=null){
var a = localStorage.getItem(`pk${pk_i}`).split(',');
var n = a.shift();
for(let j = 1; j<a.length; j++){
a[j] = +a[j];
}
if(a[3]<51){
json['1-50'][n].push(a);
}
else if(a[3]<101&&a[3]>50){
json['51-100'][n].push(a);
}
else{
json['101-'][n].push(a);
}
pk_i++;
}
text = JSON.stringify(json);
GM_xmlhttpRequest({
method: 'POST',
url: meURL,
timeout: 30000,
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
data: `text=${text}`,
onload: response => {
let atrr = localStorage.getItem('attribute');
let na = localStorage.getItem('cardName');
localStorage.clear();
localStorage.setItem('attribute',atrr);
localStorage.setItem('cardName',na);
alert('数据已提交,第一次使用记得把用户名站内发给thewzmath');
return 1;
}
})
}
})
}else{
return 0;
}
}
(function() {
'use strict'
if(localStorage.getItem('attribute'==null)&&localStorage.getItem('cardName'==null)){
localStorage.setItem('attribute',0);
localStorage.setItem('cardName',0);
}
var attribute = new Array();
if(window.location.pathname=='/fyg_card.php'){
let btn2 = document.createElement('button');
let span2 = document.createElement('span');
let btnc1 = document.createElement('button');
let cardNameNode = 0;
function updateCard(){
span2.innerHTML = '读取中...';
attribute.splice(0,attribute.length);
for(let i=1;i<7;i++){
attribute.push(document.getElementById(`sjj${i}`).innerText);
}
localStorage.setItem('attribute',attribute.join(','));
localStorage.setItem('cardName',cardNameNode.innerText);
if(localStorage.getItem('cardName')==''){localStorage.setItem('cardName',null);}
span2.innerHTML = ` 当前卡片:${localStorage.getItem('cardName')}(${localStorage.getItem('attribute')})`;
}
span2.innerHTML = ` 当前卡片:${localStorage.getItem('cardName')}(${localStorage.getItem('attribute')})`;
btn2.innerHTML = '手动读取';
btn2.onclick = updateCard;
btnc1.innerHTML = '导出计算器';
btnc1.onclick = ()=>{
$('.pop_main').show()
$('.pop_con').css({'top':0,'opacity':0})
$('.pop_con').animate({'top':'50%','opacity':1})
let text = $('.pop_text');
switch(localStorage.getItem('cardName')){
case '琳':
text[0].innerText = `LIN ${cardNameNode.parentNode.children[1].innerText.substr(3)} ${cardNameNode.parentNode.children[3].innerText[0]}`;
text[1].innerText = `${localStorage.getItem('attribute').replace(/,/g,' ')}`;
break;
case '艾':
text[0].innerText = `AI ${cardNameNode.parentNode.children[1].innerText.substr(3)} ${cardNameNode.parentNode.children[3].innerText[0]}`;
text[1].innerText = `${localStorage.getItem('attribute').replace(/,/g,' ')}`;
break;
case '默':
text[0].innerText = `MO ${cardNameNode.parentNode.children[1].innerText.substr(3)} ${cardNameNode.parentNode.children[3].innerText[0]}`;
text[1].innerText = `${localStorage.getItem('attribute').replace(/,/g,' ')}`;
break;
case '梦':
text[0].innerText = `MENG ${cardNameNode.parentNode.children[1].innerText.substr(3)} ${cardNameNode.parentNode.children[3].innerText[0]}`;
text[1].innerText = `${localStorage.getItem('attribute').replace(/,/g,' ')}`;
break;
}
}
let p = document.getElementsByClassName('panel panel-primary')[1];
p.insertBefore(span2,p.children[0]);
p.insertBefore(btn2,p.children[0]);
p.insertBefore(btnc1,p.children[0]);
let d = document.createElement('div');
d.id = 'alert';
d.innerHTML = '<div class="pop_main">\n<div class="pop_con">\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<a href="#">×</a>\n</div>\n<div class="mask"></div>\n</div>';
p.insertBefore(d,p.children[0]);
$('.pop_main').hide();
$('.pop_con a').click(()=>{
$('.pop_con').animate({'top':0,'opacity':0},()=>{
$('.pop_main').hide()
})
})
let load1=0,load2=0;
let observer1 = new MutationObserver(()=>{
load1=1;
document.getElementsByClassName('btn btn-block btn-lg btn-warning')[0].addEventListener('click', updateCard);
if(load1&&load2){
updateCard();
load1=0;load2=0;
}
});
observer1.observe(document.getElementById('mystata'), {childList: true, characterData: true});
let observer2 = new MutationObserver(()=>{
load2=1;
cardNameNode = document.getElementById('carding').children[0].children[0];
if(load1&&load2){
updateCard();
load1=0;load2=0;
}
});
observer2.observe(document.getElementById('carding'), {childList: true});
}
else if(window.location.pathname=='/fyg_equip.php'){
let btnc1 = document.createElement('button');
let span1 = document.createElement('span');
span1.innerText = ' *暂不支持神秘,默认无神秘';
btnc1.innerText = '导出计算器';
btnc1.onclick = ()=>{
try{
$('.pop_main').show()
$('.pop_con').css({'top':0,'opacity':0})
$('.pop_con').animate({'top':'50%','opacity':1})
let text = $('.pop_text');
let data = new Array();
let bagdata = new Array();
let equip = document.getElementsByClassName('content');
for(let i=0;i<4;i++){
let name = equip[i].children[0].children[0].innerText;
let lv = equip[i].children[0].children[1].innerText.substr(3);
let atrr = equip[i].children[1].children;
let mys = 0;
switch(name[name.length-1]){
case '杖':name='STAFF';break;
case '弓':name='BOW';break;
case '剑':name='SWORD';break;
case '刃':name='BLADE';break;
case '套':name='GLOVES';break;
case '环':name='BRACELET';break;
case '袍':name='CLOAK';break;
case '巾':name='SCARF';break;
default:
switch(name[name.length-2]){
case '布':name='CLOTH';break;
case '皮':name='LEATHER';break;
case '铁':name='PLATE';break;
case '重':name='THORN';break;
}
}
data.push(new Array(name,lv,atrr[0].innerText.replace('%',''),atrr[2].innerText.replace('%',''),atrr[4].innerText.replace('%',''),atrr[6].innerText.replace('%',''),mys));
}
let bag = document.getElementById('backpacks').children;
if(bag.length>0){
for(let i=0;i<bag.length;i++){
let con = bag[i].getAttribute("data-content");
let tt = bag[i].innerText.split(']');
let lv = tt[0].substr(4);
let name = tt[1];
let mys = 0;
switch(name[name.length-1]){
case '杖':name='STAFF';break;
case '弓':name='BOW';break;
case '剑':name='SWORD';break;
case '刃':name='BLADE';break;
case '套':name='GLOVES';break;
case '环':name='BRACELET';break;
case '袍':name='CLOAK';break;
case '巾':name='SCARF';break;
default:
switch(name[name.length-2]){
case '布':name='CLOTH';break;
case '皮':name='LEATHER';break;
case '铁':name='PLATE';break;
case '重':name='THORN';break;
}
}
let attr = con.match(/>[0-9]+%</g);
bagdata.push(new Array(name,lv,attr[0].substr(1).replace('%<',''),attr[1].substr(1).replace('%<',''),attr[2].substr(1).replace('%<',''),attr[3].substr(1).replace('%<',''),mys));
}
}
text[0].innerText = `${data[0].join(' ')}`;
text[1].innerText = `${data[1].join(' ')}`;
text[2].innerText = `${data[2].join(' ')}`;
text[3].innerText = `${data[3].join(' ')}`;
for(let i =0;i<bagdata.length;i++){
text[5+i].innerText =`${bagdata[i].join(' ')}`;
}
}catch(err){console.log(err);}
}
let p = document.getElementsByClassName('panel panel-primary')[0];
p.insertBefore(span1,p.children[0]);
p.insertBefore(btnc1,p.children[0]);
let d = document.createElement('div');
d.id = 'alert';
d.innerHTML = '<div class="pop_main">\n<div class="pop_con">\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">Bag:</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<div class="pop_text">0</div>\n<a href="#">×</a>\n</div>\n<div class="mask"></div>\n</div>';
p.insertBefore(d,p.children[0]);
$('.pop_main').hide();
$('.pop_con a').click(()=>{
$('.pop_con').animate({'top':0,'opacity':0},()=>{
$('.pop_main').hide()
})
})
}
else if(window.location.pathname=='/fyg_halo.php'){
let btnc1 = document.createElement('button');
btnc1.innerText = '导出计算器';
btnc1.onclick = ()=>{
try{
$('.pop_main').show()
$('.pop_con').css({'top':0,'opacity':0})
$('.pop_con').animate({'top':'50%','opacity':1})
let text = $('.pop_text');
let aura = document.getElementsByClassName('btn btn-primary');
let data = new Array();
data.push(aura.length);
for(let i=0;i<aura.length;i++){
let t = aura[i].innerText;
//console.log(t);
switch(t[0]){
case '启':
switch(t[3]){
case '誓':data.push('SHI');break;
case '心':data.push('XIN');break;
case '风':data.push('FENG');break;
}
break;
case '破':
switch(t[1]){
case '壁':data.push('BI');break;
case '魔':data.push('MO');break;
}
break;
case '伤':data.push('SHANG');break;
case '精':data.push('SHEN');break;
case '铁':data.push('CI');break;
case '沸':data.push('FEI');break;
case '波':data.push('BO');break;
case '飓':data.push('JU');break;
}
}
text[0].innerText = `${data.join(' ')}`;
}catch(err){
console.log(err);
}
}
let p = document.getElementsByClassName('panel panel-primary')[1];
p.insertBefore(btnc1,p.children[0]);
let d = document.createElement('div');
d.id = 'alert';
d.innerHTML = '<div class="pop_main">\n<div class="pop_con">\n<div class="pop_text">0</div>\n<a href="#">×</a>\n</div>\n<div class="mask"></div>\n</div>';
p.insertBefore(d,p.children[0]);
$('.pop_main').hide();
$('.pop_con a').click(()=>{
$('.pop_con').animate({'top':0,'opacity':0},()=>{
$('.pop_main').hide()
})
})
}
else if(window.location.pathname=='/fyg_pk.php'){
let btn1 = document.createElement('button');
let btn2 = document.createElement('button');
btn1.innerHTML = '正在读取卡片...';
btn1.onclick = ()=>{
if(btn1.innerHTML[0]=='提'){
btn1.innerHTML = '提交中...';
try{
if(submitData()){
btn1.innerHTML = '提交数据';
return;
}
}
catch(err){
console.log(err);
alert('数据提交失败,请重试');
}
btn1.innerHTML = '提交数据';
}
};
btn2.innerText = '清空数据';
btn2.onclick = ()=>{
console.log(1);
if(confirm('确定要清空数据吗?\n*确定后会刷新页面')){
localStorage.clear();
window.location.reload();
}
}
let p = document.getElementsByClassName('panel panel-primary')[0];
p.insertBefore(btn1,p.children[0]);
p.insertBefore(btn2,p.children[0]);
try{
GM_xmlhttpRequest({
method: 'POST',
url: `https://www.lv999max.com/fyg_read.php`,
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
data: 'f=9',
onload: response => {
try{
var n = response.responseText.match(/>[\u4e00-\u9fa5]</u)[0];
localStorage.setItem('cardName',n.substr(1,n.length-2));
}catch(err){localStorage.setItem('cardName','null');}
GM_xmlhttpRequest({
method: 'POST',
url: `https://www.lv999max.com/fyg_read.php`,
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
data: 'f=4',
onload: response => {
//console.log(response.responseText);
attribute.splice(0,attribute.length);
response.responseText.match(/>(\d+)</g).forEach(item => {
attribute.push(item.substr(1,item.length-2));
});
attribute.shift();
localStorage.setItem('attribute',attribute.join(','));
if(localStorage.getItem('cardName')!='0'&&localStorage.getItem('attribute')!='0'){
//alert('卡片读取完成');
btn1.innerHTML = '提交数据';
console.log(localStorage);
var targetNode = document.getElementById('pk_text');
var config = {childList: true};
// 当节点发生变化时的需要执行的函数
var callback = function(mutationsList, observer) {
var isPk = 0;
for(let mutation of mutationsList) {
if (mutation.type == 'childList') {
//console.log('new pk');
isPk = 1;
//console.log(targetNode.firstChild);
}
}
if(isPk){
var infoList = targetNode.firstChild.children;
//infoList: [0]名字,[1]初始血盾,[2]第一回合{左方信息,右方信息,左方血盾,右方血盾},[3]第二回合{..} ...[end]结果
var npcTitle = '';
var npcName = '';
var npcLv = '';
var npcRate = 0;
var npcSKL = '';
var meName = 'null';
var meSKL = 'null';
var isNpc = 1;
try{
localStorage.setItem('title',infoList[0].getElementsByClassName('fyg_mp0 fyg_tc')[0].innerText);
npcTitle = infoList[0].getElementsByClassName('fyg_mp0 fyg_tc')[1].innerText;
}catch(err){return;}
switch(npcTitle[npcTitle.length-1]){
case '人':npcSKL = '三连击';npcName='MU';break;
case '蛛':npcSKL = '剧毒蛛网';npcName='ZHU';break;
case '灵':npcSKL = '灵魂爆燃';npcName='DENG';break;
case '兽':npcSKL = '肉球嘲讽';npcName='SHOU';break;
default: isNpc = 0; //只统计NPC
}
var meProba = {'CRT':0,'SKL':0,'SUM':0};
var npcProba = {'CRT':0,'SKL':0,'SUM':0};
if(isNpc){
switch(localStorage.getItem('cardName')){
case '琳':meSKL = '爆裂双刃';meName='LIN';break;
case '艾':meSKL = '烈焰宝石';meName='AI';break;
case '默':meSKL = '魔力压制';meName='MO';break;
case '梦':meSKL = '星轮逆转';meName='MENG';break;
}
switch(npcTitle[0]){
case '超':npcRate = 3;;break;
case '大':npcRate = 2;break;
case '强':npcRate = 1;break;
default:npcRate = 0;
}
npcLv = npcTitle.match(/.?(\d+)./)[1];
//console.log(npcLv);
for(let i=2;i<infoList.length-1;i++){
var left=infoList[i].children[0].innerText;
//console.log(left);
var right=infoList[i].children[1].innerText;
//console.log(right);
if(left.indexOf('暴击')!=-1){
meProba.CRT++;
}
if(right.indexOf('暴击')!=-1){
npcProba.CRT++;
}
if(left.indexOf(meSKL)!=-1){
meProba.SKL++;
}
if(right.indexOf(npcSKL)!=-1){
npcProba.SKL++;
}
}
meProba.SUM = targetNode.firstChild.getElementsByClassName('icon icon-arrow-right text-success').length;
npcProba.SUM = targetNode.firstChild.getElementsByClassName('icon icon-arrow-left text-success').length
//[卡片名,智力,敏捷,NPC等级,NPC倍率,我方技能数,我方暴击数,我方攻击数,NPC技能数,NPC暴击数,NPC攻击数]
var attr = localStorage.getItem('attribute').split(',');
var probaArray = new Array(npcName,meName,attr[2],attr[1],npcLv,npcRate,
meProba.SKL,meProba.CRT,meProba.SUM,npcProba.SKL,npcProba.CRT,npcProba.SUM);
localStorage.setItem('over', 0);
let pk_i = 0;
while(localStorage.getItem(`pk${pk_i}`)!=null){
pk_i++;
}
localStorage.setItem(`pk${pk_i}`, probaArray.join(','));
console.log(`${localStorage.getItem('cardName')}(${localStorage.getItem('attribute')}) vs ${npcTitle}: 该次战斗已保存`);
}
}
};
// 创建一个observer示例与回调函数相关联
var observer = new MutationObserver(callback);
//使用配置文件对目标节点进行观测
observer.observe(targetNode, config);
// 停止观测
//observer.disconnect();
}
else{
alert(`卡片读取失败,请刷新重试或前往卡片页面手动读取\n当前卡片为:${localStorage.getItem('cardName')}(${localStorage.getItem('attribute')}) 若无误请忽略`);
btn1.innerHTML = '提交数据';
}
}
})
}
})
}
catch(err){
console.log(err);
alert(`卡片读取失败,请刷新重试或前往卡片页面手动读取\n当前卡片为:${localStorage.getItem('cardName')}(${localStorage.getItem('attribute')}) 若无误请忽略`);
btn1.innerHTML = '提交数据';
}
}
})();