import { DOMUtils, addStyle, httpx, log, pops, utils } from "@/env"; import { BaiduHook } from "@/hook/BaiduHook"; import { BaiduRouter } from "@/router/BaiduRouter"; import { Panel } from "@components/setting/panel"; import Qmsg from "qmsg"; import { tieba_add_request_params_sign } from "./api/sign"; import { TiebaSmallAppApi } from "./api/TiebaSmallAppApi"; import { TiebaBaNei } from "./ba-nei/TiebaBaNei"; import { TiebaCollectionCenter } from "./collection-center/TiebaCollectionCenter"; import { TiebaUrlHandler } from "./handler/TiebaUrlHandler"; import { TiebaData } from "./home/data"; import { TiebaHome } from "./home/TiebaHome"; import { TiebaHotTopic } from "./hot-topic/TiebaHotTopic"; import { TiebaHybridUsergrowBaseCommentFocus } from "./hybrid-usergrow-base/TiebaHybridUsergrowBaseCommentFocus"; import { TiebaHybrid } from "./hybrid/TiebaHybrid"; import { TiebaMsgTab } from "./msgtab/TiebaMsgTab"; import { TiebaPost } from "./post/TiebaPost"; import TieBaShieldCSS from "./shield.css?raw"; import { TiebaCore } from "./TiebaCore"; import { TiebaSearch } from "./TiebaSearch"; import { TiebaTopicTemplate } from "./topic-template/TiebaTopicTemplate"; import { TiebaUniAppPost } from "./uni-app-post/TiebaUniAppPost"; import UniTieBaShieldCSS from "./uni-app-shield.css?raw"; import { TiebaCheckUrl } from "./utils/TiebaCheckUrl"; /** * 百度贴吧 * document.querySelector("div.app-view").__vue__ * + disablePbGuide 是否隐藏顶部导航栏 * + loading 是否隐藏整个页面的内容(清空) * + isVideoThread 该帖子是否是个视频,是的话把帖子变成视频样式 * + isErrorThread 该帖子是否发生错误(被禁用),是的话全屏变成显示【贴子不存在或者已被删除】 * + isNoForumThread 该帖子是否是来自动态 * + isShowLoginWakeModal 是否显示需要登录的弹窗【继续操作需要登录贴吧账号】 * + isHitMedicalPost 是否是精选回复的帖子,是的话隐藏顶部的工具栏,且修改帖子主内容的背景(淡蓝色),修改回复的标识为【精选回复】 * + isPornographicComment 是否隐藏评论 * + isGreyPage 页面是否变成灰色,包括文字 * + isFromFengchaoAd 是否是点击广告进的帖子,是的话整个页面被广告提示覆盖【打开贴吧APP,继续浏览】 * + isAutoInvoke 猜测是自动调用各种唤醒 * + isShowResourceFixedCard 是否显示底部悬浮的工具栏【资源合集】卡片 * + slientUpNewConfig 里面应该是各种静默弹窗的配置,存储自localStorage * * * document.querySelector("div.tb-mobile-viewport").__vue_ * + isShowModal 是否显示需要登录的弹窗【继续操作需要登录贴吧账号】 */ export const BaiduTieBa = { init() { httpx.interceptors.request.use((config) => { if (config.url.includes("tieba.baidu.com")) { if (!config.headers) { config.headers = {}; } if (typeof config.headers.Cookie === "string") { if (!config.headers.Cookie.trim().endsWith(";")) { config.headers.Cookie = config.headers.Cookie.trim() + "; "; } } // 处理cookie config.headers.Cookie = config.headers.Cookie || "" + "TIEBA_NEW_PC=0; "; // 处理sign if (config.url.includes("tieba.baidu.com/c/") || config.url.includes("tieba.baidu.com/mo/q/search/thread")) { const urlInst = new URL(config.url); if (config.method === "POST") { // 处理data if (typeof config.data === "object" && config.data) { config.data = tieba_add_request_params_sign(config.data, "pc"); } else { if (typeof config.data === "string") { const params = {}; const searchParams = new URLSearchParams(config.data); searchParams.forEach((value, key) => { Reflect.set(params, key, value); }); tieba_add_request_params_sign(params); config.data = utils.toSearchParamsStr(params); } } } else { const params = {}; urlInst.searchParams.forEach((value, key) => { Reflect.set(params, key, value); }); if (urlInst.searchParams.size) { tieba_add_request_params_sign(params); urlInst.search = utils.toSearchParamsStr(params); config.url = urlInst.toString(); } } } } return config; }); addStyle(TieBaShieldCSS); addStyle(UniTieBaShieldCSS); addStyle(/*css*/ ` /* 由于lzl弹窗的z-index是99999,所以,回复框、toast、登录弹窗的z-index要大于99999 */ /* 底部回复框 */ .comment-box-wrap-lzl{ z-index: calc(99999 + 10) !important; } /* 登录弹窗 */ .login-wake-modal-mask{ z-index: calc(99999 + 20) !important; } /* 消息toast */ .tb-toast{ z-index: calc(99999 + 100) !important; } `); log.info("插入CSS规则"); // Panel.execMenu( // "baidu_tieba_clickOnTheOwnerSAvatarToCorrectlyRedirectToTheHomepage", // () => { // TiebaCore.addAuthorClickEvent(); // } // ); Panel.execMenu("baidu_tieba_autoJumpToMainHost", () => { TiebaCore.autoJumpToMainHost(); }); Panel.execMenu("baidu_tieba_clientCallMasquerade", () => { TiebaCore.clientCallMasquerade(); }); BaiduHook.elementAppendChild(); Panel.execMenuOnce("baidu_tieba_hijack_wake_up", () => { BaiduHook.windowWebpackJsonp_tieba(); }); if (BaiduRouter.isTieBaIndex()) { /* 首页 */ log.success("Router: 首页"); Panel.execMenu("baidu_tieba_index_openANewTab", () => { TiebaBaNei.repairCardClickJump(); }); Panel.execMenu("baidu_tieba_index_add_msgtab", () => { if (window.location.pathname.startsWith(TiebaMsgTab.pathname)) { log.info(`Router: 魔改自定义的消息页面`); TiebaMsgTab.init(); } else { DOMUtils.waitNode(".tb-index-navbar .navbar-box li:nth-child(2)", 10000).then(($navbarBox) => { if (!$navbarBox) { return; } if ($navbarBox.nextElementSibling && $navbarBox.nextElementSibling.matches(".navbar-item-msgtab")) { return; } DOMUtils.after( $navbarBox, /*html*/ ` ` ); }); } }); } else if (BaiduRouter.isTieBaPost()) { /* 帖子 */ log.success("Router: 帖子"); // TiebaPost.init(); TiebaUniAppPost.init(); } else if (BaiduRouter.isTieBaNewTopic()) { /* 话题热议 */ log.success("Router: 话题热议"); TiebaTopicTemplate.init(); } else if (BaiduRouter.isTieBaHottopic()) { /* 热搜榜 */ log.success("Router: 热搜榜"); TiebaHotTopic.init(); } else if (BaiduRouter.isTieBaHybrid()) { /* 搜索综合 */ log.success("Router: 搜索综合"); TiebaHybrid.init(); } else if (BaiduRouter.isTieBaCollectionCenter()) { /* 合辑 */ log.success("Router: 合辑"); TiebaCollectionCenter.init(); } else if (BaiduRouter.isTieBaNei()) { /* 吧内 */ log.success("Router: 吧内"); TiebaBaNei.init(); } else if (BaiduRouter.isTieBaHybridUserGrowBase()) { log.success(`Router: 评论聚合页`); TiebaHybridUsergrowBaseCommentFocus.init(); } else if (BaiduRouter.isTieBaHome()) { /* 主页 */ log.success("Router: 用户主页"); TiebaHome.init(); return; } else if (BaiduRouter.isTieBaCheckUrl()) { /* 验证链接中间页 */ log.success(`Router: 验证链接中间页`); TiebaCheckUrl.init(); return; } else { log.error("Router: 未知"); } // Panel.execMenu("baidu_tieba_add_scroll_top_button_in_forum", () => { // TiebaCore.addScrollTopButton(); // }); Panel.execMenu("baidu_tieba_add_search", () => { TiebaSearch.init(); }); DOMUtils.onReady(() => { Panel.execMenu("baidu_tieba_checkSkeleton", () => { TiebaCore.checkSkeleton(); }); this.initTiebaData(); this.addTopLeftMenu(); }); }, /** * 初始化贴吧数据 * * 例如:吧名,高清图片 */ initTiebaData() { DOMUtils.waitAnyNode([".tb-mobile-viewport", ".main-page-wrap", ".forum-name .name"]).then( async () => { let interval = setInterval(() => { TiebaData.forumName = TiebaCore.getCurrentForumName(); TiebaData.forumId = TiebaCore.getCurrentForumId(); if (TiebaData.forumName) { log.info("当前吧:" + TiebaData.forumName); if (Panel.getValue("baidu_tieba_optimize_image_preview")) { TiebaPost.initPostImageInfo(); } clearInterval(interval); } }, 250); } ); }, /** * 替换顶部左侧贴吧按钮为菜单按钮 */ addTopLeftMenu() { addStyle(/*css*/ ` .logo-wrapper{ display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; margin: 0px 0.13rem; } `); DOMUtils.waitAnyNode( [".nav-bar-top .logo-wrapper", "uni-app .frs-wise-nav-bar .logo-wrapper", ".tbm-status .left-area"], 10000 ).then(($ele) => { if (!$ele) { return; } let $parent = DOMUtils.parent($ele); $ele.outerHTML = /*html*/ `
`; let $logoWrapper = $parent.querySelector(".logo-wrapper")!; function getHelloText() { var myDate = new Date(); var i = myDate.getHours(); if (i < 12) return "早上好!"; else if (i >= 12 && i < 14) return "中午好!"; else if (i >= 14 && i < 18) return "下午好!"; else if (i >= 18) return "晚上好!"; } let menuListInfo = [ { "data-to": "home", icon: '', text: "首页", clickCallBack(event: MouseEvent | PointerEvent) { window.location.href = window.location.origin; }, }, { "data-to": "posting", icon: '', text: "发帖", clickCallBack(event: MouseEvent | PointerEvent) { Qmsg.warning("暂未实现该功能"); }, }, { "data-to": "search", icon: '', text: "搜索", clickCallBack(event: MouseEvent | PointerEvent) { let userInput = prompt("请输入需要搜索的内容"); if (userInput) { window.location.href = TiebaUrlHandler.getHybridSearch(userInput); } }, }, { "data-to": "got-to-forum", icon: '', text: "进吧", clickCallBack(event: MouseEvent | PointerEvent) { window.location.href = TiebaUrlHandler.getGoToForum(); }, }, { "data-to": "mine", icon: '', text: "我的", clickCallBack(event: MouseEvent | PointerEvent) { window.location.href = TiebaUrlHandler.getMine(); }, }, ]; if (Panel.getValue("baidu_tieba_index_add_msgtab")) { menuListInfo.splice(4, 0, { "data-to": "msgtab", icon: '', text: "消息", clickCallBack(event: MouseEvent | PointerEvent) { window.location.href = TiebaMsgTab.pathname; }, }); } DOMUtils.on( $logoWrapper!, "click", (evt) => { DOMUtils.preventEvent(evt); const $drawer = pops.drawer({ title: { enable: true, text: /*html*/ `

登录后更精彩...

`, html: true, style: "", }, content: { text: '
    ', html: true, style: "", }, btn: { ok: { enable: false, }, cancel: { enable: false, }, close: { enable: false, }, }, only: true, size: "66%", direction: "left", mask: { enable: true, clickEvent: { toClose: true, }, }, style: /*css*/ ` .pops{ --avatar-size: 60px; --user-info-font-color: #ffffff; --container-title-height: auto; } .pops-drawer-title{ background: url(https://imgapi.xl0408.top/index.php); // background-size: cover; background-size: 100% 100%; background-position: center; background-repeat: no-repeat; } .tieba_account_exit{ display: none; } .tieba_user{ position: relative; display: block; padding: 18px 15px 12px; overflow: hidden; width: 100%; height: 175px; text-decoration: none; } .tieba_user em{ display: block; width: 64px; height: 64px; margin-bottom: 23px; background: rgba(255, 255, 255, 0.4); border-radius: 50%; position: relative; } .tieba_account_avatar{ width: var(--avatar-size); height: var(--avatar-size); margin: 2px; border-radius: 50%; } .tieba_user_nologin_tip_center{ font-size: 20px; float: left; font-weight: 400; margin-right: 6px; text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4); color: var(--user-info-font-color); } .tieba_user_nologin_tip_bottom{ display: block; width: 100%; height: 24px; line-height: 24px; overflow: hidden; color: var(--user-info-font-color); text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4); font-size: 13px; margin-top: 5px; } .pops-drawer-content{ padding: 10px; } .tieba-menu-list{ } .tieba-menu-item{ display: flex; align-items: center; height: 38px; line-height: 38px; font-size: 17px; margin: 3px 0px; } .tieba-menu-item:first-child{ margin-top: 0px; } .tieba-menu-icon{ display: flex; align-items: center; font-size: 22px; margin-right: 8px; } .tieba-menu-icon svg{ width: 20px; height: 20px; } .teba-menu-text{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } `, }); let isLogin = false; let $tieba_user = $drawer.$shadowRoot.querySelector(".tieba_user"); let $menuList = $drawer.$shadowRoot.querySelector(".tieba-menu-list")!; let $avatar = $drawer.$shadowRoot.querySelector(".tieba_account_avatar")!; let $userInfo = $drawer.$shadowRoot.querySelector(".tieba-user-info")!; let $tieba_user_nologin_tip_center = $drawer.$shadowRoot.querySelector( ".tieba_user_nologin_tip_center" )!; let $tieba_user_nologin_tip_bottom = $drawer.$shadowRoot.querySelector( ".tieba_user_nologin_tip_bottom" )!; menuListInfo.forEach((menuItemInfo) => { let $menuItem = document.createElement("li"); $menuItem.classList.add("tieba-menu-item"); $menuItem.setAttribute("data-to", menuItemInfo["data-to"]); $menuItem.innerHTML = ` ${menuItemInfo.icon}

    ${menuItemInfo.text}

    `; DOMUtils.on($menuItem, "click", (event) => { menuItemInfo.clickCallBack(event); }); $menuList.appendChild($menuItem); }); // 填充当前已登录的用户的信息 TiebaSmallAppApi.userInfo(false).then((userInfo) => { if (!userInfo) { return; } $avatar.src = TiebaUrlHandler.getUserAvatar("null"); if (typeof userInfo.user?.is_login === "boolean" && !userInfo.user?.is_login) { // 未登录 } else { isLogin = true; // 已登录 let showName = userInfo.user.show_nickname || userInfo.user.name_show || userInfo.user.user_nickname || userInfo.user.user_name; let portrait = userInfo.user.portrait; $avatar.src = TiebaUrlHandler.getUserAvatar(portrait); $tieba_user_nologin_tip_center.innerText = showName; DOMUtils.hide($tieba_user_nologin_tip_bottom); } }); DOMUtils.on($tieba_user, "click", () => { if (isLogin) { return; } window.open(TiebaUrlHandler.getLoginUrl(), "_blank"); }); }, { capture: true } ); }); }, };