Greasy Fork

Greasy Fork is available in English.

huPuTopicZone

这是一个为虎扑崩版编写的脚本,主要为了网页端的各个分区,本人不懂前端与油猴,代码稀烂

目前为 2023-02-05 提交的版本。查看 最新版本

// ==UserScript==
// @name         huPuTopicZone
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  这是一个为虎扑崩版编写的脚本,主要为了网页端的各个分区,本人不懂前端与油猴,代码稀烂
// @author       孤独的海浪
// @match        https://*.hupu.com/*
// @icon         https://i1.hoopchina.com.cn/newsPost/22621-2u62scrc-upload-1655706446630-7.png?x-oss-process=image/resize,m_fill,w_72,h_72
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @connect      hupu.com
// @run-at       document-start
// @license      MIT
// ==/UserScript==

// 用来让虎扑网页查看剧场帖子的脚本

// 创建 HTML 结构
// 获取并创建各个子分区的内容
function createHTML(topicId, zoneId, page=1) {
// 将title回复/浏览改为 回复/推荐
    let titleSelector = document.querySelector("#container > div > div.bbs-sl-web-holder > div > div.bbs-sl-web-topic-wrap > div.bbs-sl-web-post > div > div:nth-child(2)")
    titleSelector.innerText = "回复/推荐"
    let url = `https://bbs.mobileapi.hupu.com/1/8.0.34/topics/getTopicThreads?topic_id=${topicId}&tab_type=2&page=${page}&zoneId=${zoneId}`
    let list_tmp = ""
    getURL_GM(url).then(
        (result) => {
            result = JSON.parse(result)
            let data = result.data.list
            let hasNextPage = result.data.next_page
            for (let each_data of data) {
                let tid = each_data.tid
                let post_time = each_data.time
                let title = each_data.title
                let replies = each_data.replys
                let recommends = each_data.recommends
                let userName = each_data.user_name
                list_tmp += `
                <li class="bbs-sl-web-post-body">
                    <div class="bbs-sl-web-post-layout">
                        <div class="post-title">
                            <a href="/${tid}.html" target="_blank" class="p-title" style="color:;font-style:normal">${title}</a>
                        </div>
                        <div class="post-datum">${replies}/${recommends}</div>
                        <div class="post-auth">
                            <a href="https://my.hupu.com/">${userName}</a>
                        </div>
                        <div class="post-time">${post_time}</div>
                    </div>
                </li>`
            }
            let logo = document.querySelector("#container > div > div.bbs-sl-web-holder > div > div.bbs-sl-web-topic-wrap > div.bbs-sl-web-post > ul")
            logo.innerHTML = list_tmp

            // 创建翻页标签
            createPageBar(topicId, zoneId, page, hasNextPage)
        }
      )
};


// 分页
function createPageBar(topicId, zoneId, curPage, hasNextPage){
    let pageBar = `
    <li class="hupu-rc-pagination-item hupu-rc-pagination-item-active">
        <a id="curPage">${curPage}</a>
    </li>`

	let prePageBar = `
    <li class="hupu-rc-pagination-prev">
        <div class="iconContainer_2ZI3F ">
            <i class="iconfont iconxialax icon_1Q115 leftIcon_Wccrv" id="prePage"></i>
            <span class="text_MtRno" id="prePage">上一页</span>
        </div>
    </li>`

    let nextPageBar = `
    <li class="hupu-rc-pagination-next">
        <div class="iconContainer_2ZI3F">
            <span class="text_MtRno" id="nextPage">下一页</span>
            <i class="iconfont iconxialax icon_1Q115 rightIcon_11DFD" id="nextPage"></i>
        </div>
    </li>
    `
    if(hasNextPage){
        pageBar += nextPageBar
	}
    if(curPage != 1) {
        pageBar = prePageBar + pageBar
	}
    let pageSelector = document.querySelector("#container > div > div.bbs-sl-web-holder > div > div.bbs-sl-web-topic-wrap > div:nth-child(5) > div > ul")
    pageSelector.innerHTML = pageBar

    pageSelector.onclick=function(event){
        let pageId = event.target.id
        let page = curPage
        if (pageId == "curPage"){
            page = curPage
        }else if (pageId == "nextPage") {
            page = curPage + 1
        } else if (pageId == "prePage"){
            page = curPage - 1
        } else {
            return
        }
        createHTML(topicId, zoneId, page)
        //返回页面顶部
        let topBtn = document.querySelector("#container > div > section.hp-pc-footer > div.backToTop_2mZa6 > div:nth-child(3) > a")
        topBtn.click()
    }
}


// 创建子分区
function createZone(topicId) {
    let zoneUrl = "https://bbs.hupu.com/pcmapi/pc/bbs/v1/topicZone?topicId=" + topicId
    let oldSelectZoneId = GM_getValue("clickZoneId", null)

    getURL_GM(zoneUrl).then(
        (result) => {
            result = JSON.parse(result)
            let zone_list = result.data
            let cur_div = ""
            for (let each_zone of zone_list) {
                let zoneId = each_zone.id
                let zoneName = each_zone.zoneName

                cur_div += `<div class="bbs-sl-web-type " value="${zoneId}">${zoneName}</div>`
            }
            let tf = document.querySelector("#container > div > div.bbs-sl-web-holder > div > div.bbs-sl-web-topic-wrap > div.bbs-sl-web-type-wrap")
            tf.innerHTML += cur_div

            tf.onclick=function(event){
                let zoneName = event.target.innerText
                let clickZoneId = event.target.getAttribute("value")
                if (clickZoneId) {
                    // 重置选中元素
                    let selector = document.querySelectorAll(`.bbs-sl-web-type`)

                    for (var i=0; i<selector.length;i++) {
                        if(selector[i].innerText == zoneName){
                            selector[i].classList.add("active");
                        }else {
                            selector[i].classList.remove("active");
                        }
                      }

                    clickZoneId = event.target.getAttribute("value")

                    // 当选中添加的标签时,记住该标签,以便于初始化时直接跳转到该标签
                    GM_setValue("clickZoneId", clickZoneId)
                    let page = 1
                    let size = 20
                    createHTML(topicId, clickZoneId, page=1, size=20)
                } else {
                    // 官方标签时删除记录的zoneid
                    GM_deleteValue("clickZoneId")
                    let href = ""
                    if (zoneName == "最新发布") {
                        href = topicId + "-postdate"
                    } else if (zoneName == "最新回复") {
                        href = topicId
                    }else if (zoneName == "24小时榜") {
                        href = topicId + "-hot"
                    }
                    window.location.href = "https://bbs.hupu.com/" + href
                }
            };

            if (oldSelectZoneId) {
                let selector = document.querySelectorAll(`.bbs-sl-web-type`)

                for (var i=0; i<selector.length;i++) {
                    if(selector[i].getAttribute("value") == oldSelectZoneId){
                        selector[i].click();
                    }
                }
            }
        }
    )

};


// 同步emoji,未实现
function createEmoji() {
    // 在评论框旁边添加同步emoji的按钮,并展开以供选择,选择后填入评论框中文字后
    // todo 用户的sign不知道怎么算的,无法实现该功能
    let top_gif = `https://bbs.mobileapi.hupu.com/1/8.0.34/bbsreplyapi/user/emoji/v1/emojiTab?deviceId=BGkQPQyZ1SJyMMDQUYQO5F8AwAoQmw6Em5eQLpjFWHqKo2ujpJJ2XXsqemotifsoyDQx8fKuzgNqVFpE%2FJgwDtw%3D%3D&clientId=135428405&_ssid=ZDJxMWE1M2EyNjQ3NGQ2MjgzOQ%3D%3D&_imei=351564687421818&time_zone=Asia%2FShanghai&client=1a53a26474d62839&night=0&crt=1675537042612&channel=liqucn&android_id=1a53a26474d62839&sign=104682cb2cb93784317e542fa1b10e3a`

    let user_gif = `https://bbs.mobileapi.hupu.com/1/8.0.34/bbsreplyapi/user/emoji/v1/getUserEmojiCollectList?limit=200&deviceId=BGkQPQyZ1SJyMMDQUYQO5F8AwAoQmw6Em5eQLpjFWHqKo2ujpJJ2XXsqemotifsoyDQx8fKuzgNqVFpE%2FJgwDtw%3D%3D&clientId=135428405&_ssid=ZDJxMWE1M2EyNjQ3NGQ2MjgzOQ%3D%3D&_imei=351564687421818&time_zone=Asia%2FShanghai&token=NDQyNDE4MTc%3D%7CMTY3NTUzNzQxMA%3D%3D%7Cf7b2a3b20796bd6f8a193d2f72da6fbf&client=1a53a26474d62839&night=0&crt=1675537435561&channel=liqucn&android_id=1a53a26474d62839&sign=bf553696ed06ef6f649b45b12456ec59`

    console.log("emoji同步未实现!")
}


(function () {
    let href = window.location.href
    let hrefTail = href.split("/")[3]

    if (typeof(hrefTail) == "number") {
        let topicId = hrefTail
        createZone(topicId)

    }else if (hrefTail.indexOf("-")) {
        let paramUrl = "%2F" + hrefTail
        let navUrl = `https://bbs.hupu.com/api/v2/nav?url=` + paramUrl

        getURL_GM(navUrl).then(
            (result) => {
                result = JSON.parse(result)
                let topicId = result.data.anchor.id
                createZone(topicId)
            }
        )

    }else {
        return
    }

    // 只有在帖子内才会加载emoji
    if (hrefTail.indexOf("html") > 0) {
        createEmoji()
    }
})();


//实现接口请求的通用方法
function getURL_GM(url) {
    return new Promise(resolve => GM.xmlHttpRequest({
        method: 'GET',
        url: url,
        onload: function (response) {
            if (response.status >= 200 && response.status < 400) {
                resolve(response.responseText);
            } else {
                console.error(`Error getting ${url}:`, response.status, response.statusText, response.responseText);
                resolve();
            }
        },
        onerror: function (response) {
            console.error(`Error during GM.xmlHttpRequest to ${url}:`, response.statusText);
            resolve();
        }
    }));
}