// ==UserScript==
// @name huPuTopicZone
// @version 1.1.3
// @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 https://update.greasyfork.icu/scripts/459452/huPuTopicZone.user.js
// @updateURL https://update.greasyfork.icu/scripts/459452/huPuTopicZone.meta.js
// ==/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 += `
${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
// 加上本身的分区id,用来区分不同的板块
let oldSelectZoneId = GM_getValue("clickZoneId" + topicId)
let unSelectZoneArray = GM_getValue("unselectZoneArray" + topicId, [])
let zoneDict = {}
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
zoneDict[zoneId] = 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
}
let oldSelectZoneId = GM_getValue("clickZoneId" + topicId)
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)
}
GM_setValue("unselectZoneArray" + topicId, unSelectZoneArray)
// 重新加载该页面
if (!oldSelectZoneId) window.location.reload()
}
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
}
let zoneName = event.target.innerText
let clickZoneId = event.target.getAttribute("value")
clickZoneId = clickZoneId ? String(clickZoneId) : clickZoneId
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" + topicId, clickZoneId)
createHTML(topicId, clickZoneId, 1)
} else {
GM_deleteValue("clickZoneId" + topicId)
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();
return
}
}
} else htmlReload(unSelectZoneArray, zoneDict)
}
)
}
function htmlReload(unSelectZoneArray, zoneDict) {
let selector = document.querySelectorAll(`.bbs-sl-web-post-body`)
let ul = ""
for (let i = 0; i < selector.length; i++) {
let postTitle = selector[i].querySelector(".post-title").innerText
let unSelect = false
for (let unSelectZone of unSelectZoneArray) {
let unSelectZoneName = zoneDict[unSelectZone]
if (postTitle.includes(unSelectZoneName + " | ")) {
unSelect = true
break
}
}
if (!unSelect) {
ul += selector[i].outerHTML
}
}
let postList = document.querySelector(`#container > div > div.bbs-sl-web-holder > div > div.bbs-sl-web-topic-wrap > div.bbs-sl-web-post > ul`)
postList.innerHTML = ul
}
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("/")
// 只对形如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();
}
}));
}