Greasy Fork

Greasy Fork is available in English.

NGA优化摸鱼体验插件-信息加强

修复属地显示,成分查询(仅1页)

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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)
});