// ==UserScript==
// @name huPuTopicZone
// @version 1.1.0
// @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
// @license MIT
// @namespace http://tampermonkey.net/
// @downloadURL none
// ==/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 = ""
let unSelectZoneArray = GM_getValue("unselectZoneArray", [])
console.log(url)
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
let t_zoneId = String(each_data.zoneId)
if (zoneId == "0" && unSelectZoneArray.includes(t_zoneId)) {
continue
}
// 在标题中标识子分区
if (zoneId == "0" && t_zoneId != "0") {
let zoneName = each_data.zoneName
title = zoneName + " | " + title
}
list_tmp += `
${replies}/${recommends}
${post_time}
`
}
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 = `
`
let prePageBar = `
`
let nextPageBar = `
`
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")
let unSelectZoneArray = GM_getValue("unselectZoneArray", [])
console.log(oldSelectZoneId)
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
zoneId = zoneId ? String(zoneId) : zoneId
let checked = "checked"
if (unSelectZoneArray.includes(zoneId)) {
checked = ""
}
let zoneName = each_zone.zoneName
cur_div += `${zoneName}
`
}
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.onchange = function (event) {
if (event.type != "change") {
return
}
oldSelectZoneId = GM_getValue("clickZoneId")
let selectZoneId = event.target.getAttribute("value")
selectZoneId = selectZoneId ? String(selectZoneId) : selectZoneId
if (event.target.checked && unSelectZoneArray.includes(selectZoneId)) {
unSelectZoneArray = unSelectZoneArray.filter((x) => x !== selectZoneId)
}
if (!event.target.checked && !unSelectZoneArray.includes(selectZoneId)) {
unSelectZoneArray.push(selectZoneId)
}
console.log(unSelectZoneArray, oldSelectZoneId)
GM_setValue("unselectZoneArray", unSelectZoneArray)
if (oldSelectZoneId == "0") {
let page = 1
let size = 20
// 最新回复页面默认zoneId为0
createHTML(topicId, "0", page = 1)
}
}
tf.onclick = function (event) {
if (event.type != "click" || !event.target.className.includes("bbs-sl-web-type") || event.target.className.includes("bbs-sl-web-type-wrap")) {
return
}
oldSelectZoneId = GM_getValue("clickZoneId")
let zoneName = event.target.innerText
let clickZoneId = event.target.getAttribute("value")
// 最新回复默认为0
if (zoneName == "最新回复") {
clickZoneId = "0"
}
clickZoneId = clickZoneId ? String(clickZoneId) : clickZoneId
console.log(clickZoneId, oldSelectZoneId)
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");
}
}
// 当选中添加的标签时,记住该标签,以便于初始化时直接跳转到该标签
GM_setValue("clickZoneId", clickZoneId)
let page = 1
let size = 20
createHTML(topicId, clickZoneId, page = 1)
} else {
GM_deleteValue("clickZoneId")
let href = ""
if (zoneName == "最新发布") {
href = topicId + "-postdate"
} 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].innerText == "最新回复") {
selector[i].click();
return
}
}
}
}
)
}
function imResource() {
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.src = "https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js";
document.documentElement.appendChild(script);
let cssLink = document.createElement('link');
cssLink.setAttribute('rel', 'stylesheet');
cssLink.setAttribute('type', 'text/css');
cssLink.href = "https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css";
document.documentElement.appendChild(cssLink);
}
// 同步emoji,未实现
function createEmoji() {
// imResource()
// 在评论框旁边添加同步emoji的按钮,并展开以供选择,选择后填入评论框中文字后
// todo 用户的sign不知道怎么算的,无法实现该功能
//let btn = document.createElement("button")
//btn.classList = ["btn btn-primary"]
//btn.setAttribute("data-bs-toggle", "popover")
//btn.setAttribute("title", "aaaa")
//btn.setAttribute("data-bs-content", "bbbbb")
//btn.innerText = "表情"
//let container = document.createElement("div")
//container.classList = ["container"]
//container.appendChild(btn)
//let replySelector = document.querySelector("#hupu-compact-editor")
//replySelector.parentElement.insertBefore(container, replySelector)
let top_gif = `https://bbs.mobileapi.hupu.com/1/8.0.34/bbsreplyapi/user/emoji/v1/emojiTab`
let user_gif = `https://bbs.mobileapi.hupu.com/1/8.0.34/bbsreplyapi/user/emoji/v1/getUserEmojiCollectList`
console.log("emoji同步未实现!")
}
(function () {
let href = window.location.href
let hrefArray = href.split("/")
console.log(hrefArray)
// 只对形如https://bbs.hupu.com/788的地址加载该脚本
if (hrefArray.length - 1 > 3) {
return
}
// 默认取第三个值作为topicId
let hrefTail = hrefArray[3]
if (!isNaN(Number(hrefTail, 10))) {
let topicId = hrefTail
createZone(topicId)
} else if (hrefTail.includes("-") && !hrefTail.includes("html")) {
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)
}
)
}
// 只有在帖子内才会加载emoji
if (hrefTail.includes("html")) {
console.log("load btn resource")
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();
}
}));
}