// ==UserScript==
// @name NGA优化摸鱼体验插件-信息加强
// @namespace https://github.com/DelCrona/NGA_checkInfo
// @version 1.1.1
// @author DelCrona
// @description 修复属地显示,成分查询(仅1页)
// @license MIT
// @require https://cdn.staticfile.net/jquery/3.4.0/jquery.min.js
// @require https://cdn.staticfile.net/spectrum/1.8.0/spectrum.js
// @require https://cdn.staticfile.net/localforage/1.10.0/localforage.min.js
// @require https://cdn.staticfile.net/echarts/5.4.2/echarts.min.js
// @match *://bbs.nga.cn/*
// @match *://ngabbs.com/*
// @match *://nga.178.com/*
// @match *://g.nga.cn/*
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant unsafeWindow
// @run-at document-start
// @inject-into content
// ==/UserScript==
(function (registerPlugin) {
'use strict';
registerPlugin({
name: 'checkInfo', // 插件唯一KEY
title: '信息增强', // 插件名称
desc: '修复查询端口被封的问题', // 插件说明
settings: [{
key: 'textInput',
title: '占位符',
desc: '描述信息\n描述信息',
}],
requestTasks: [],
currentUserInfo: {},
queryTimer: null,
$el: null,
pageInfo: {},
beforeSaveSettingFunc(setting) {
//console.log(setting)
// return 值则不会保存,并抛出错误
//return '拦截'
},
preProcFunc() {
console.log('已运行: preProcFunc()')
},
initFunc() {
console.log('已运行: initFunc()')
console.log('插件ID: ', this.pluginID)
console.log('插件配置: ', this.pluginSettings)
console.log('主脚本: ', this.mainScript)
console.log('主脚本引用库: ', this.mainScript.libs)
},
postProcFunc() {
},
renderThreadsFunc($el) {
},
renderFormsFunc($el) {
var _this = this;
const uid = parseInt($el.find('[name="uid"]').text());
const userInfo = unsafeWindow.commonui.userInfo.users[uid];
//console.log(userInfo);
$el.find('.hld__qbc').append('<button id=repair>1页主题回复</button>');
//点击按钮执行
$el.find('.hld__qbc > #repair').click(() => {
if($el.find('.postcontent > .checkInfo_record').length) return;
//给全局变量赋值,方便调用
this.$el = $el;
this.currentUserInfo = userInfo;
this.pageInfo = {
post: {
label: '发布主题',
pages: 0,
status: '',
earliestPostdate: new Date().getTime() / 1000
},
reply: {
label: '回复主题',
pages: 0,
status: '',
earliestPostdate: new Date().getTime() / 1000
}};
// 一页主题+一页回复
_this.checkRecord(uid, 'post', 1);
_this.queryRecord('on');
});
//调用获取信息的函数,异步使用
_this.getUserInfo(uid)
.then(userInfo =>{
this.$el = $el;
//覆盖本体属地信息
_this.displayLoc(userInfo);
})
},
checkRecord(uid, type, page){
return new Promise((resolve, reject) => {
var url = `https://${window.location.host}/thread.php?authorid=${uid}&page=${page}`
if (type == 'reply') url += '&searchpost=1';
$.ajax({url})
.then(postInfo =>{
var _this = this;
var parser = new DOMParser();
var htmlDoc = parser.parseFromString(postInfo, "text/html");
var scriptTags = htmlDoc.querySelectorAll('.titleadd2')
var contentCount = {};
//全局变量翻页
if (page > this.pageInfo[type].pages) {
this.pageInfo[type].pages = page;
}
//获取成分
if (scriptTags.length) {
scriptTags.forEach(element =>{
//console.log(element.textContent);
var content = element.textContent.trim();
if (contentCount[content]) {
contentCount[content]++;
} else {
contentCount[content] = 1;
}
})
}
//打印+合并
_this.displayRecord(uid, contentCount);
resolve(contentCount);
})
})
.catch(error => {
// 请求失败,将错误传递给reject
reject(error);
console.log(error);
});
},
async queryRecord(status){
if(status != 'end'){
var _this = this;
//定时任务,启动!
this.queryTimer = setInterval(async() => {
try {
/*
if(this.pageInfo.post.pages < 3){
console.log(this.pageInfo.post.pages + 1);
await _this.checkRecord(this.currentUserInfo.uid, 'post', this.pageInfo.post.pages + 1)
}
else*/
if(this.pageInfo.reply.pages < 1){
//console.log(this.pageInfo.reply.pages + 1);
await _this.checkRecord(this.currentUserInfo.uid, 'reply', this.pageInfo.reply.pages + 1);
this.queryRecord('end');
}
if(this.pageInfo.post.pages >= 3 && this.pageInfo.reply.pages >= 3) this.queryRecord('end');
} catch(err) {
console.log(err)
this.queryRecord('end');
} finally {
}
}, 3000);
} else {
if (this.queryTimer) {
clearInterval(this.queryTimer)
this.queryTimer = null
}
}
},
displayLoc(userInfo){
var _this = this;
//调用本体函数显示属地
var flag = _this.mainScript.getModule('UserEnhance').getCountryFlag(userInfo.ipLoc);
this.$el.find('.hld__user-location').attr('title', `IP属地: ${userInfo.ipLoc}`)
this.$el.find('.hld__user-location > span').replaceWith(flag);
},
displayRecord(uid, contentCount){
//查找是否生成过
var insert = this.$el.find('.postcontent > .checkInfo_record').length;
if(!insert){
//生成第一页
this.$el.find('.postcontent').prepend(`<div class = checkInfo_record><span>${JSON.stringify(contentCount,null,2)}</span></div>`);
}else{
//原值和新值合并
var reply = this.$el.find('.postcontent > .checkInfo_record').text();
var replyJson = JSON.parse(reply);
//轮询每个键,相同则+1,不同则新增
Object.keys(contentCount).forEach(key =>{
replyJson[key] = (replyJson[key] || 0) + contentCount[key];
})
this.$el.find('.postcontent > .checkInfo_record').text(`${JSON.stringify(replyJson,null,2)}`)
//console.log(replyJson);
}
},
//访问个人页获取uid和信息字符串
getUserInfo(uid){
return new Promise((resolve, reject) => {
$.ajax(`https://${window.location.host}/nuke.php?func=ucp&uid=${uid}`)
.then(html => {
var parser = new DOMParser();
var htmlDoc = parser.parseFromString(html, "text/html");
// 查找包含__UCPUSER项的<script>标签
var scriptTags = htmlDoc.querySelectorAll("script");
scriptTags.forEach(scr =>{
//获取标签里的内容
var scrText = scr.textContent;
if (scrText.includes("__UCPUSER")){
//获取用户信息的json文件并以正则提取
var match = scrText.match(/var __UCPUSER =(\{.*\});/);
var userInfo = JSON.parse(match[1]);
// 解析成功,将用户信息传递给resolve
resolve(userInfo);
}
})
})
.catch(error => {
// 请求失败,将错误传递给reject
reject(error);
});
});
},
asyncStyle() {
return `#ngascript_plugin_${this.pluginID} {color: red}`
},
style: `
#ngascript_plugin_test {color: red}
`
})
})(function(plugin) {
plugin.meta = GM_info.script
unsafeWindow.ngaScriptPlugins = unsafeWindow.ngaScriptPlugins || []
unsafeWindow.ngaScriptPlugins.push(plugin)
});