Greasy Fork is available in English.
这是一个为虎扑崩版编写的脚本,主要为了网页端的各个分区
当前为
// ==UserScript==
// @name huPuTopicZone
// @version 1.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
// @namespace http://tampermonkey.net/
// ==/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`
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.indexOf("-") > 0) {
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();
}
}));
}