// ==UserScript== // @name bilibili时间线筛选——分组查看b站动态 // @namespace hi94740 // @author hi94740 // @version 2.0.3 // @license MIT // @description 这个脚本能帮你通过关注分组筛选b站时间线上的动态 // @include https://t.bilibili.com/* // @run-at document-idle // @noframes // @grant unsafeWindow // @grant GM.getResourceUrl // @require https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js // @require https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js // @require https://cdn.jsdelivr.net/npm/vant@2.8/lib/vant.min.js // @resource css https://cdn.jsdelivr.net/npm/vant@2.8/lib/index.css // @downloadURL https://update.greasyfork.icu/scripts/396032/bilibili%E6%97%B6%E9%97%B4%E7%BA%BF%E7%AD%9B%E9%80%89%E2%80%94%E2%80%94%E5%88%86%E7%BB%84%E6%9F%A5%E7%9C%8Bb%E7%AB%99%E5%8A%A8%E6%80%81.user.js // @updateURL https://update.greasyfork.icu/scripts/396032/bilibili%E6%97%B6%E9%97%B4%E7%BA%BF%E7%AD%9B%E9%80%89%E2%80%94%E2%80%94%E5%88%86%E7%BB%84%E6%9F%A5%E7%9C%8Bb%E7%AB%99%E5%8A%A8%E6%80%81.meta.js // ==/UserScript== if (document.URL == "https://t.bilibili.com/" || document.URL.startsWith("https://t.bilibili.com/?")) { var vmTab var vmBWList var validTagIDs var tagged var selectedUp var cardObserver var tabObserver const darkStyle = '' const filterDynamicWithTags = function(selections,excluded) { cardObserver.disconnect() if (selections == "shamiko"){ clearFilters() autoPadding() } else { selections = _.castArray(selections).filter(t => validTagIDs.includes(t)) excluded = _.castArray(excluded).filter(t => validTagIDs.includes(t)) let excludedUp = excluded.map(t => (tagged[t] || {list:[]}).list).flat() let newSelectedUp = _.difference(_.uniq(selections.map(t => (tagged[t] || {list:[]}).list).flat()),excludedUp) if (newSelectedUp.length > 0) { selectedUp = newSelectedUp console.log(selections) new Promise(res => { let siid = setInterval(function () { if ($(".bili-dyn-item").length > 0) { clearInterval(siid) res() } }) }).then(function() { clearFilters() filterWorker() cardObserver.observe($(".bili-dyn-item").parent().parent()[0],{childList:true,subtree:true}) }) } } } function filterWorker() { $(".bili-dyn-item").toArray().forEach(c => { let author = c.__vue__.author if (!(selectedUp.some(up => up.mid == author.mid || author.label == "番剧"))) $(c)[0].hidden = true }) loadMoreDynamics() autoPadding() } function loadMoreDynamics() { if ($(window).height()/($(document).height() - $(document).scrollTop()) > 0.2) { $(".load-more").click() setTimeout(loadMoreDynamics,100) } else { if ($(".skeleton").length > 0) { if (($($(".skeleton")[0]).offset().top - $(document).scrollTop()) < ($(window).height() + 1000)) { forceLoad() setTimeout(loadMoreDynamics,100) } } } } function forceLoad() { let currentY = $(document).scrollTop() $(document).scrollTop($(document).height()) $(document).scrollTop(currentY) } function clearFilters() { $(".bili-dyn-item").toArray().forEach(c => c.hidden = false) } function autoPadding() { $("#btf-tab-area").css("padding",($(".bili-dyn-item")[0] && $(".new-notice-bar").length == 0) ? ($(".bili-dyn-item")[0].hidden ? "0px 0px 0px 0px" : "0px 0px 8px 0px") : "0px 0px 8px 0px") } function isBangumiTimeline() { if ($(".selected").text().includes("番") || $(".selected").text().includes("剧")) { $("#btf-tab-area")[0].hidden = true $("#btf-bwlist-area")[0].hidden = true cardObserver.disconnect() clearFilters() } else { $("#btf-tab-area")[0].hidden = false $("#btf-bwlist-area")[0].hidden = false vmTab.activeName = "shamiko" if (vmTab.complexMode) vmBWList.changed() } } const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step)) function ajaxWithCredentials(url) { return new Promise((res,rej) => { $.ajax({ url:url, xhrFields: { withCredentials: true }, success:res, error:rej }) }) } function fetchTags(requestWithCredentials) { let tags = {} return requestWithCredentials("https://api.live.bilibili.com/User/getUserInfo") .then(data => { let uid = data.data.uid console.log("uid: " + uid) let followingsRequests = requestWithCredentials("https://api.bilibili.com/x/relation/followings?vmid=" + uid + "&pn=1&ps=50") .then(data => { let gf = range(2,Math.ceil(data.data.total/50),1) .map(i => { return requestWithCredentials("https://api.bilibili.com/x/relation/followings?vmid=" + uid + "&pn=" + i + "&ps=50") }) gf.unshift(Promise.resolve(data)) return gf }) return requestWithCredentials("https://api.bilibili.com/x/relation/tags?vmid=" + uid) .then(data => { let tagsList = data.data tagsList.map(tag => { tag.list = [] return tag }).forEach(tag => tags[tag.tagid] = tag) return { tags:tagsList, tagged:followingsRequests.then(gf => { return Promise.all(gf.map(request => { return request.then(data => { let followings = data.data.list followings.forEach(f => { if (f.tag) { let noAliveTag = true f.tag.forEach(t => { if (tags[t]) { tags[t].list.push(f) noAliveTag = false } else console.log("迷之tag:" + t) }) if (noAliveTag) tags[0].list.push(f) } else { tags[0].list.push(f) } }) }) })).then(() => tags) }) } }) }) } Promise.all([ fetchTags(ajaxWithCredentials), GM.getResourceUrl("css") .then(u => $("head").append([ '', '' ].join("\n"))), new Promise(res => { cardObserver = new MutationObserver(filterWorker) tabObserver = new MutationObserver(isBangumiTimeline) Vue.use(vant.Tab) Vue.use(vant.Tabs) let siid = setInterval(function () { if ($(".bili-dyn-list-tabs").length == 1 && $(".bili-dyn-live-users").length == 1) { clearInterval(siid) res() } }) }).then(function() { $(".bili-dyn-list-tabs").after('