├── README.md ├── bilibili-oversea-search.user.js └── bilibili-oversea-search_new.user.js /README.md: -------------------------------------------------------------------------------- 1 | # bilibili海外区域搜索 2 | 首先安装Tampermonkey等脚本管理工具,然后点击[这里](https://github.com/gamekingv/bilibili-oversea-search/raw/main/bilibili-oversea-search.user.js)安装脚本(旧版搜索页面)。 3 | 4 | 如使用B站新版搜索页面的请点击[这里](https://github.com/gamekingv/bilibili-oversea-search/raw/main/bilibili-oversea-search_new.user.js)安装。 5 | 6 | 在搜索页面选中番剧标签,设置好代理服务器,代理服务器相关详见[这里](https://github.com/yujincheng08/BiliRoaming/wiki/%E5%85%AC%E5%85%B1%E8%A7%A3%E6%9E%90%E6%9C%8D%E5%8A%A1%E5%99%A8)。 7 | 8 | 设置好代理服务器后在下拉框选择相应的服务器点击“搜索”按钮即可搜索。 9 | 10 | # 港澳台搜索代理 11 | 港澳台可通过部署阿里云函数香港节点 HTTP 函数实现,下面为部署代码,代理服务器填写除了 `https://` 外的完整路径。另外部分公共服务器可能不支持港澳台搜索,请自行选择使用。 12 | 13 | ```javascript 14 | var getRawBody = require('raw-body'); 15 | var getFormBody = require('body/form'); 16 | var body = require('body'); 17 | 18 | exports.handler = (req, resp, context) => { 19 | 'use strict'; 20 | 21 | const params = { 22 | path: req.path, 23 | queries: req.queries, 24 | headers: req.headers, 25 | method: req.method, 26 | requestURI: req.url, 27 | clientIP: req.clientIP, 28 | } 29 | const https = require('https'); 30 | let queries = []; 31 | for (const key in req.queries) { 32 | queries.push(`${key}=${encodeURIComponent(req.queries[key])}`); 33 | } 34 | const options = { 35 | hostname: 'api.bilibili.com', 36 | port: 443, 37 | path: req.path + '?' + queries.join('&'), 38 | method: 'GET', 39 | headers: { 40 | 'Referer': 'https://search.bilibili.com/bangumi', 41 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52' 42 | } 43 | }; 44 | const httpsRequest = https.request(options, (res) => { 45 | console.log('statusCode:', res.statusCode); 46 | let responseText = ''; 47 | res.on('data', (d) => { 48 | responseText += d.toString(); 49 | }); 50 | res.on('end', function() { 51 | resp.send(responseText); 52 | }); 53 | }); 54 | 55 | httpsRequest.on('error', (error) => { 56 | resp.send(error.toString()); 57 | }); 58 | httpsRequest.end(); 59 | } 60 | ``` 61 | -------------------------------------------------------------------------------- /bilibili-oversea-search.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name bilibili海外区域搜索 3 | // @homepage https://github.com/gamekingv/bilibili-oversea-search 4 | // @version 0.1.12 5 | // @author gameking 6 | // @include https://search.bilibili.com/* 7 | // @grant GM_xmlhttpRequest 8 | // @grant GM_setValue 9 | // @grant GM_getValue 10 | // @grant unsafeWindow 11 | // ==/UserScript== 12 | 13 | (function () { 14 | 'use strict'; 15 | function searchTH(page) { 16 | if (!page) page = 1; 17 | window.oversea_search_mode = 'TH'; 18 | switchToSearch(); 19 | const list = document.querySelector('#bangumi-list.inject-node'), 20 | keyword = document.querySelector('#search-keyword').value, 21 | query = { 22 | appkey: '7d089525d3611b1c', 23 | build: '1001310', 24 | c_locale: 'zh_SG', 25 | keyword, 26 | lang: 'hans', 27 | mobi_app: 'bstar_a', 28 | platform: 'android', 29 | pn: page, 30 | ps: '20', 31 | s_locale: 'zh_SG', 32 | type: '7', 33 | area: 'th' 34 | }; 35 | list.querySelector('ul').innerHTML = ''; 36 | list.querySelector('.total-wrap .total-text').innerHTML = '共0条数据'; 37 | list.querySelector('.flow-loader-state').innerHTML = '
正在加载...
'; 38 | list.querySelector('.page-wrap').innerHTML = ''; 39 | GM_xmlhttpRequest({ 40 | method: 'GET', 41 | url: `https://${GM_getValue('th_search_proxy_server')}/intl/gateway/v2/app/search/type?${Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')}`, 42 | responseType: 'json', 43 | onload: e => { 44 | if (!e.response || !e.response.data) { 45 | list.querySelector('.flow-loader-state').innerHTML = '

代理服务器无法连接或存在限制

'; 46 | return; 47 | } 48 | const result = e.response.data, 49 | countNode = list.querySelector('.total-wrap .total-text'); 50 | if (!result.items) { 51 | list.querySelector('.flow-loader-state').innerHTML = '

没有相关数据

'; 52 | return; 53 | } 54 | else list.querySelector('.flow-loader-state').innerHTML = ''; 55 | countNode.innerHTML = `共${result.items.length}条数据`; 56 | for (let item of result.items) { 57 | const resultNode = document.createElement('li'), 58 | title = item.title.replace(/<\/?em[^>]*>/g, ''); 59 | resultNode.className = 'bangumi-item inject-node'; 60 | resultNode.innerHTML = `
\ 61 |
\ 62 |
\ 63 | \ 64 | \ 65 |
\ 66 |
\ 67 |
`; 68 | list.querySelector('ul').appendChild(resultNode); 69 | resultNode.querySelector('#pgc-navigate-wrap .ep-item').addEventListener('click', () => follow(item.season_id, resultNode.querySelector('.score > .score-num'))); 70 | } 71 | pager(page, result.total); 72 | }, 73 | onerror: () => { 74 | list.querySelector('.flow-loader-state').innerHTML = '

代理服务器无法连接或存在限制

'; 75 | } 76 | }); 77 | } 78 | function searchTHM(page) { 79 | if (!page) page = 1; 80 | window.oversea_search_mode = 'THM'; 81 | switchToSearch(); 82 | const list = document.querySelector('#bangumi-list.inject-node'), 83 | area = list.querySelector('#proxy-area').value, 84 | keyword = document.querySelector('#search-keyword').value, 85 | query = { 86 | search_type: 'media_bangumi', 87 | page, 88 | keyword, 89 | __refresh__: true, 90 | highlight: '1', 91 | single_column: 0, 92 | area 93 | }; 94 | list.querySelector('ul').innerHTML = ''; 95 | list.querySelector('.total-wrap .total-text').innerHTML = '共0条数据'; 96 | list.querySelector('.flow-loader-state').innerHTML = '
正在加载...
'; 97 | list.querySelector('.page-wrap').innerHTML = ''; 98 | GM_xmlhttpRequest({ 99 | method: 'GET', 100 | url: `https://${GM_getValue(area + '_search_proxy_server') || 'api.bilibili.com'}/x/web-interface/search/type?${Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')}`, 101 | cookie: document.cookie, 102 | onload: e => { 103 | const response = e.response ? JSON.parse(e.response) : {}; 104 | if (!e.response || !response.data) { 105 | list.querySelector('.flow-loader-state').innerHTML = '

代理服务器无法连接或存在限制

'; 106 | return; 107 | } 108 | const result = response.data, 109 | countNode = list.querySelector('.total-wrap .total-text'); 110 | if (result.numResults === 0) { 111 | list.querySelector('.flow-loader-state').innerHTML = '

没有相关数据

'; 112 | return; 113 | } 114 | else list.querySelector('.flow-loader-state').innerHTML = ''; 115 | countNode.innerHTML = `共${result.numResults}条数据`; 116 | for (let item of result.result) { 117 | const ep = item.eps ? item.eps.map(ep => `
  • ${Number(ep.title) ? ep.title : `
    ${ep.title}
    `}
  • `) : []; 118 | const score = item.media_score ? `
    ${item.media_score.score}
    ${item.media_score.user_count}人点评
    ` : ''; 119 | const resultNode = document.createElement('li'); 120 | const title = item.title.replace(/<\/?em[^>]*>/g, ''); 121 | resultNode.className = 'bangumi-item inject-node'; 122 | resultNode.innerHTML = `
    \ 123 |
    \ 124 |
    \ 125 | \ 126 |
    \ 127 |
    \ 128 |
    风格:${item.styles}
    \ 129 |
    地区:${item.areas}
    \ 130 |
    \ 131 |
    \ 132 |
    开播时间:${new Date(item.pubtime*1000).toLocaleString()}
    \ 133 |
    声优:${item.cv}
    \ 134 |
    \ 135 |
    ${item.desc}
    \ 136 |
    \ 137 |
      ${ep.join('')}
    \ 138 |
    ${score}
    \ 139 |
    `; 140 | list.querySelector('ul').appendChild(resultNode); 141 | } 142 | pager(page, result.numResults); 143 | }, 144 | onerror: () => { 145 | list.querySelector('.flow-loader-state').innerHTML = '

    代理服务器无法连接或存在限制

    '; 146 | } 147 | }); 148 | } 149 | function pager(page, total) { 150 | if (total <= 20) return; 151 | const totalPage = Math.ceil(total / 20); 152 | let pagesNodes = ''; 153 | if (page !== 1) pagesNodes += ''; 154 | if (page - 1 <= 4) { 155 | for (let i = 1; i < page; i++) { 156 | pagesNodes += `
  • `; 157 | } 158 | } 159 | else { 160 | pagesNodes += '
  • ...'; 161 | for (let i = page - 3; i < page; i++) { 162 | pagesNodes += `
  • `; 163 | } 164 | } 165 | pagesNodes += `
  • `; 166 | if (totalPage - page <= 4) { 167 | for (let i = page + 1; i <= totalPage; i++) { 168 | pagesNodes += `
  • `; 169 | } 170 | } 171 | else { 172 | for (let i = page + 1; i <= page + 3; i++) { 173 | pagesNodes += `
  • `; 174 | } 175 | pagesNodes += `...
  • `; 176 | } 177 | if (page !== totalPage) pagesNodes += ''; 178 | 179 | const newNode = document.createElement('div'); 180 | document.querySelector('#bangumi-list.inject-node > .page-wrap').appendChild(newNode); 181 | newNode.outerHTML = `
    `; 182 | document.querySelectorAll('#bangumi-list.inject-node .page-item:not(.active):not(.next):not(.prev)').forEach(node => node.addEventListener('click', () => { 183 | if (window.oversea_search_mode === 'TH') searchTH(parseInt(node.innerHTML.replace(/<[^>]*>/g, ''))); 184 | else if (window.oversea_search_mode === 'THM') searchTHM(parseInt(node.innerHTML.replace(/<[^>]*>/g, ''))); 185 | document.querySelector('.rocket-con').click(); 186 | })); 187 | document.querySelectorAll('#bangumi-list.inject-node .page-item.prev').forEach(node => node.addEventListener('click', () => { 188 | if (window.oversea_search_mode === 'TH') searchTH(page - 1); 189 | else if (window.oversea_search_mode === 'THM') searchTHM(page - 1); 190 | document.querySelector('.rocket-con').click(); 191 | })); 192 | document.querySelectorAll('#bangumi-list.inject-node .page-item.next').forEach(node => node.addEventListener('click', () => { 193 | if (window.oversea_search_mode === 'TH') searchTH(page + 1); 194 | else if (window.oversea_search_mode === 'THM') searchTHM(page + 1); 195 | document.querySelector('.rocket-con').click(); 196 | })); 197 | } 198 | function switchToNormal() { 199 | window.oversea_search_mode = ''; 200 | const list = document.querySelector('#bangumi-list:not(.inject-node)'), 201 | injectList = document.querySelector('#bangumi-list.inject-node'); 202 | list.style.display = ''; 203 | if (injectList) injectList.style.display = 'none'; 204 | } 205 | function switchToSearch() { 206 | const list = document.querySelector('#bangumi-list:not(.inject-node)'), 207 | injectList = document.querySelector('#bangumi-list.inject-node'); 208 | list.style.display = 'none'; 209 | if (injectList) injectList.style.display = ''; 210 | else { 211 | const injectNewList = document.createElement('div'); 212 | list.parentNode.appendChild(injectNewList); 213 | injectNewList.outerHTML = '

    共0条数据

    '; 214 | injectButton(true); 215 | } 216 | } 217 | function follow(season_id, infoNode) { 218 | infoNode.innerHTML = '处理中'; 219 | if (document.cookie.match(/bili_jct=([^;]*);/)) { 220 | GM_xmlhttpRequest({ 221 | method: 'POST', 222 | url: 'https://api.bilibili.com/pgc/web/follow/add', 223 | headers: { 224 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 225 | 'Referer': 'https://www.bilibili.com' 226 | }, 227 | responseType: 'json', 228 | data: `season_id=${season_id}&csrf=${document.cookie.match(/bili_jct=([^;]*);/)[1]}`, 229 | onload: e => { 230 | if (!e.response) infoNode.innerHTML = '操作失败'; 231 | else if (e.response.code === 0) infoNode.innerHTML = '追番成功'; 232 | else infoNode.innerHTML = '操作失败'; 233 | setTimeout(() => (infoNode.innerHTML = ''), 2000); 234 | } 235 | }); 236 | } 237 | else infoNode.innerHTML = '未登陆'; 238 | } 239 | function injectButton(injected) { 240 | const injectNode = document.querySelector(injected ? '#bangumi-list.inject-node .total-wrap' : '#bangumi-list .total-wrap'), 241 | notInjectNode = document.querySelector(!injected ? '#bangumi-list.inject-node .total-wrap' : '#bangumi-list .total-wrap'), 242 | th_proxyNode = document.createElement('span'), 243 | th_proxy = GM_getValue('th_search_proxy_server'), 244 | hk_proxyNode = document.createElement('span'), 245 | hk_proxy = GM_getValue('hk_search_proxy_server'), 246 | tw_proxyNode = document.createElement('span'), 247 | tw_proxy = GM_getValue('tw_search_proxy_server'), 248 | cn_proxyNode = document.createElement('span'), 249 | cn_proxy = GM_getValue('cn_search_proxy_server'), 250 | proxy_area = document.createElement('span'), 251 | buttonNode = document.createElement('span'), 252 | areaNode = document.querySelector('#proxy-area'); 253 | th_proxyNode.innerHTML = `海外服务器:`; 254 | th_proxyNode.style = 'margin-left: 20px;'; 255 | hk_proxyNode.innerHTML = `港澳服务器:`; 256 | hk_proxyNode.style = 'margin-left: 20px;'; 257 | tw_proxyNode.innerHTML = `台湾服务器:`; 258 | tw_proxyNode.style = 'margin-left: 20px;'; 259 | cn_proxyNode.innerHTML = `大陆服务器:`; 260 | cn_proxyNode.style = 'margin-left: 20px;'; 261 | proxy_area.innerHTML = ''; 262 | proxy_area.style = 'margin-left: 20px;'; 263 | buttonNode.innerHTML = '搜索'; 264 | buttonNode.style = 'cursor: pointer; color: #00A1D6; margin-left: 20px;'; 265 | buttonNode.addEventListener('click', () => { 266 | const area = injectNode.querySelector('#proxy-area').value; 267 | if (area === 'th') searchTH(); 268 | else searchTHM(); 269 | }); 270 | injectNode.appendChild(th_proxyNode); 271 | injectNode.appendChild(hk_proxyNode); 272 | injectNode.appendChild(tw_proxyNode); 273 | injectNode.appendChild(cn_proxyNode); 274 | injectNode.appendChild(proxy_area); 275 | injectNode.appendChild(buttonNode); 276 | if (areaNode) { 277 | const newAreaNode = proxy_area.querySelector('#proxy-area'); 278 | newAreaNode.value = areaNode.value; 279 | newAreaNode.addEventListener('input', e => { 280 | areaNode.value = newAreaNode.value; 281 | }); 282 | areaNode.addEventListener('input', e => { 283 | newAreaNode.value = areaNode.value; 284 | }); 285 | } 286 | injectNode.querySelector('#th-proxy-server').addEventListener('change', e => { 287 | if (notInjectNode) notInjectNode.querySelector('#th-proxy-server').value = e.target.value; 288 | GM_setValue('th_search_proxy_server', e.target.value); 289 | }); 290 | injectNode.querySelector('#hk-proxy-server').addEventListener('change', e => { 291 | if (notInjectNode) notInjectNode.querySelector('#hk-proxy-server').value = e.target.value; 292 | GM_setValue('hk_search_proxy_server', e.target.value); 293 | }); 294 | injectNode.querySelector('#tw-proxy-server').addEventListener('change', e => { 295 | if (notInjectNode) notInjectNode.querySelector('#tw-proxy-server').value = e.target.value; 296 | GM_setValue('tw_search_proxy_server', e.target.value); 297 | }); 298 | injectNode.querySelector('#cn-proxy-server').addEventListener('change', e => { 299 | if (notInjectNode) notInjectNode.querySelector('#cn-proxy-server').value = e.target.value; 300 | GM_setValue('cn_search_proxy_server', e.target.value); 301 | }); 302 | } 303 | function injectObserver() { 304 | const observer = new MutationObserver(mutationsList => { 305 | for (let mutation of mutationsList) { 306 | if (mutation.type === 'attributes' && mutation.target.className.includes('is-active')) injectButton(); 307 | const injectNode = document.querySelector('#bangumi-list.inject-node'); 308 | if (injectNode) injectNode.style.display = 'none'; 309 | } 310 | }), config = { attributes: true, childList: true }; 311 | let observeNode; 312 | document.querySelectorAll('#navigator .v-switcher-header-tabs > ul > li').forEach(node => node.innerHTML.includes('番剧') && (observeNode = node)); 313 | observer.observe(observeNode, config); 314 | if (observeNode.className.includes('is-active')) injectButton(); 315 | } 316 | const searchAppObserver = new MutationObserver(mutationsList => { 317 | for (let mutation of mutationsList) { 318 | if (mutation.addedNodes.length > 0 && mutation.addedNodes[0].className === 'contain') { 319 | injectObserver(); 320 | document.querySelector('.suggest-wrap').addEventListener('click', () => switchToNormal()); 321 | document.querySelector('.search-button').addEventListener('click', () => switchToNormal()); 322 | document.querySelector('#search-keyword').addEventListener('keyup', e => e.keyCode === 13 && switchToNormal()); 323 | } 324 | } 325 | }); 326 | searchAppObserver.observe(document.querySelector('#server-search-app'), { childList: true }); 327 | if (document.querySelector('#server-search-app > .contain')) { 328 | injectObserver(); 329 | document.querySelector('.suggest-wrap').addEventListener('click', () => switchToNormal()); 330 | document.querySelector('.search-button').addEventListener('click', () => switchToNormal()); 331 | document.querySelector('#search-keyword').addEventListener('keyup', e => e.keyCode === 13 && switchToNormal()); 332 | } 333 | })(); 334 | -------------------------------------------------------------------------------- /bilibili-oversea-search_new.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name bilibili海外区域搜索_new 3 | // @homepage https://github.com/gamekingv/bilibili-oversea-search 4 | // @version 0.1.1 5 | // @author gameking 6 | // @include https://search.bilibili.com/* 7 | // @grant GM_xmlhttpRequest 8 | // @grant GM_setValue 9 | // @grant GM_getValue 10 | // @grant unsafeWindow 11 | // ==/UserScript== 12 | 13 | (function () { 14 | 'use strict'; 15 | function searchTH(page) { 16 | if (!page) page = 1; 17 | window.oversea_search_mode = 'TH'; 18 | switchToSearch(); 19 | const tag = GM_getValue('search_page_style_tag'), 20 | list = document.querySelector('.search-content.inject-node'), 21 | area = document.querySelector('#proxy-area').value, 22 | keyword = document.querySelector('.search-input-el').value, 23 | query = { 24 | appkey: '7d089525d3611b1c', 25 | build: '1001310', 26 | c_locale: 'zh_SG', 27 | keyword, 28 | lang: 'hans', 29 | mobi_app: 'bstar_a', 30 | platform: 'android', 31 | pn: page, 32 | ps: '20', 33 | s_locale: 'zh_SG', 34 | type: '7', 35 | area: 'th' 36 | }; 37 | // list.querySelector('ul').innerHTML = ''; 38 | // list.querySelector('.total-wrap .total-text').innerHTML = '共0条数据'; 39 | // list.querySelector('.flow-loader-state').innerHTML = '
    正在加载...
    '; 40 | // list.querySelector('.page-wrap').innerHTML = ''; 41 | list.querySelector('.search-page').innerHTML = `

    加载中...

    `; 42 | GM_xmlhttpRequest({ 43 | method: 'GET', 44 | url: `https://${GM_getValue('th_search_proxy_server')}/intl/gateway/v2/app/search/type?${Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')}`, 45 | responseType: 'json', 46 | onload: e => { 47 | if (!e.response || !e.response.data) { 48 | list.querySelector('.search-page').innerHTML = `
    `; 49 | return; 50 | } 51 | const result = e.response.data, 52 | countNode = list.querySelector('.total-wrap .total-text'); 53 | if (!result.items) { 54 | list.querySelector('.search-page').innerHTML = `
    `; 55 | return; 56 | } 57 | // else list.querySelector('.flow-loader-state').innerHTML = ''; 58 | // countNode.innerHTML = `共${result.items.length}条数据`; 59 | const allResultNode = document.createElement('div'); 60 | allResultNode.className = 'row'; 61 | for (let item of result.items) { 62 | const resultNode = document.createElement('div'), 63 | title = item.title.replace(/<\/?em[^>]*>/g, ''); 64 | resultNode.className = 'col_6 mb_x40'; 65 | resultNode.innerHTML = `
    \ 66 |
    \ 67 |
    \ 68 | \ 69 | \ 70 |
    \ 71 |
    \ 72 |
    `; 73 | resultNode.innerHTML = `
    \ 74 | \ 75 | \ 76 | \ 77 | \ 78 | \ 79 |
    \ 80 | \ 81 |
    \ 82 |
    \ 83 |
    \ 84 |
    \ 85 |
    番剧
    \ 86 | ${item.title}\ 87 |
    \ 88 |
    \ 89 | ${item.styles}\ 90 |
    \ 91 |
    `; 92 | allResultNode.appendChild(resultNode); 93 | } 94 | list.querySelector('.search-page').innerHTML = '
    '; 95 | list.querySelector('.search-page .media-list').appendChild(allResultNode); 96 | pager(page, result.total); 97 | }, 98 | onerror: () => { 99 | list.querySelector('.search-page').innerHTML = `
    `; 100 | } 101 | }); 102 | } 103 | function searchTHM(page) { 104 | if (!page) page = 1; 105 | window.oversea_search_mode = 'THM'; 106 | switchToSearch(); 107 | const tag = GM_getValue('search_page_style_tag'), 108 | list = document.querySelector('.search-content.inject-node'), 109 | area = document.querySelector('#proxy-area').value, 110 | keyword = document.querySelector('.search-input-el').value, 111 | query = { 112 | search_type: 'media_bangumi', 113 | page, 114 | page_size: 20, 115 | keyword, 116 | __refresh__: true, 117 | highlight: '1', 118 | single_column: 0, 119 | area 120 | }; 121 | // list.querySelector('.search-page').innerHTML = ''; 122 | // list.querySelector('.total-wrap .total-text').innerHTML = '共0条数据'; 123 | list.querySelector('.search-page').innerHTML = `

    加载中...

    `; 124 | // list.querySelector('.search-page > .mt_x50.mb_lg.flex_center').innerHTML = ''; 125 | GM_xmlhttpRequest({ 126 | method: 'GET', 127 | url: `https://${GM_getValue(area + '_search_proxy_server') || 'api.bilibili.com'}/x/web-interface/search/type?${Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')}`, 128 | cookie: document.cookie, 129 | onload: e => { 130 | const response = e.response ? JSON.parse(e.response) : {}; 131 | if (!e.response || !response.data) { 132 | list.querySelector('.search-page').innerHTML = `
    `; 133 | //

    代理服务器无法连接或存在限制

    '; 134 | return; 135 | } 136 | const result = response.data; 137 | // countNode = list.querySelector('.total-wrap .total-text'); 138 | if (result.numResults === 0) { 139 | list.querySelector('.search-page').innerHTML = `
    `; 140 | return; 141 | } 142 | // else list.querySelector('.flow-loader-state').innerHTML = ''; 143 | // countNode.innerHTML = `共${result.numResults}条数据`; 144 | const allResultNode = document.createElement('div'); 145 | allResultNode.className = 'row'; 146 | for (let item of result.result) { 147 | const ep = item.eps ? item.eps.map(ep => ``) : []; 148 | //
  • ${Number(ep.title) ? ep.title : `
    ${ep.title}
    `}
  • `) : []; 149 | const score = item.media_score && item.media_score.user_count > 0 ? `` : ''; 150 | const resultNode = document.createElement('div'); 151 | const title = item.title.replace(/<\/?em[^>]*>/g, ''); 152 | const date = new Date(item.pubtime*1000); 153 | const dateString = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`; 154 | resultNode.className = 'col_6 mb_x40'; 155 | resultNode.innerHTML = `
    \ 156 | \ 157 | \ 158 | \ 159 | \ 160 | \ 161 |
    \ 162 | \ 163 |
    \ 164 |
    \ 165 |
    \ 166 |
    \ 167 |
    ${item.season_type_name}
    \ 168 | ${item.title}\ 169 |
    \ 170 |
    \ 171 | ${item.styles} · \ 172 | ${dateString} · \ 173 | ${item.index_show}\ 174 |
    \ 175 |
    \ 176 |
    声优:
    "${item.cv}
    \ 177 |
    简介:
    ${item.desc}
    \ 178 |
    \ 179 |
    `; 187 | allResultNode.appendChild(resultNode); 188 | } 189 | list.querySelector('.search-page').innerHTML = '
    '; 190 | list.querySelector('.search-page .media-list').appendChild(allResultNode); 191 | pager(page, result.numResults); 192 | }, 193 | onerror: () => { 194 | list.querySelector('.search-page').innerHTML = `
    `; 195 | } 196 | }); 197 | } 198 | function pager(page, total) { 199 | if (total <= 20) return; 200 | const totalPage = Math.ceil(total / 20); 201 | let pagesNodes = '
    '; 202 | if (page === 1) pagesNodes += ''; 203 | else pagesNodes += ''; 204 | if (page - 1 <= 4) { 205 | for (let i = 1; i < page; i++) { 206 | pagesNodes += ``; 207 | } 208 | } 209 | else { 210 | pagesNodes += '...'; 211 | for (let i = page - 3; i < page; i++) { 212 | pagesNodes += ``; 213 | } 214 | } 215 | pagesNodes += ``; 216 | if (totalPage - page <= 4) { 217 | for (let i = page + 1; i <= totalPage; i++) { 218 | pagesNodes += ``; 219 | } 220 | } 221 | else { 222 | for (let i = page + 1; i <= page + 3; i++) { 223 | pagesNodes += ``; 224 | } 225 | pagesNodes += `...`; 226 | } 227 | if (page !== totalPage) pagesNodes += ''; 228 | else pagesNodes += ''; 229 | pagesNodes += '
    '; 230 | 231 | const newNode = document.createElement('div'); 232 | document.querySelector('.search-content.inject-node .search-page').appendChild(newNode); 233 | newNode.outerHTML = pagesNodes; 234 | document.querySelectorAll('.search-content.inject-node .vui_pagenation .vui_button:not(.vui_button--active):not(.vui_button--disabled)').forEach(node => node.addEventListener('click', () => { 235 | const pageText = node.innerHTML.replace(/<[^>]*>/g, ''); 236 | if (pageText === '上一页') { 237 | if (window.oversea_search_mode === 'TH') searchTH(page - 1); 238 | else if (window.oversea_search_mode === 'THM') searchTHM(page - 1); 239 | } 240 | else if (pageText === '下一页') { 241 | if (window.oversea_search_mode === 'TH') searchTH(page + 1); 242 | else if (window.oversea_search_mode === 'THM') searchTHM(page + 1); 243 | } 244 | else { 245 | if (window.oversea_search_mode === 'TH') searchTH(parseInt(pageText)); 246 | else if (window.oversea_search_mode === 'THM') searchTHM(parseInt(pageText)); 247 | } 248 | document.querySelector('.btn-to-top').click(); 249 | })); 250 | } 251 | function switchToNormal() { 252 | window.oversea_search_mode = ''; 253 | const list = document.querySelector('.search-content:not(.inject-node)'), 254 | injectList = document.querySelector('.search-content.inject-node'); 255 | list.style.display = ''; 256 | if (injectList) injectList.style.display = 'none'; 257 | } 258 | function switchToSearch() { 259 | const list = document.querySelector('.search-content:not(.inject-node)'), 260 | injectList = document.querySelector('.search-content.inject-node'); 261 | list.style.display = 'none'; 262 | if (injectList) injectList.style.display = ''; 263 | else { 264 | const injectNewList = document.createElement('div'); 265 | list.parentNode.appendChild(injectNewList); 266 | injectNewList.outerHTML = '
    '; 267 | // injectButton(true); 268 | } 269 | } 270 | function follow(season_id, infoNode) { 271 | infoNode.innerHTML = '处理中'; 272 | if (document.cookie.match(/bili_jct=([^;]*);/)) { 273 | GM_xmlhttpRequest({ 274 | method: 'POST', 275 | url: 'https://api.bilibili.com/pgc/web/follow/add', 276 | headers: { 277 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 278 | 'Referer': 'https://www.bilibili.com' 279 | }, 280 | responseType: 'json', 281 | data: `season_id=${season_id}&csrf=${document.cookie.match(/bili_jct=([^;]*);/)[1]}`, 282 | onload: e => { 283 | if (!e.response) infoNode.innerHTML = '操作失败'; 284 | else if (e.response.code === 0) infoNode.innerHTML = '追番成功'; 285 | else infoNode.innerHTML = '操作失败'; 286 | setTimeout(() => (infoNode.innerHTML = ''), 2000); 287 | } 288 | }); 289 | } 290 | else infoNode.innerHTML = '未登陆'; 291 | } 292 | function injectButton(injected) { 293 | const injectNode = /*document.querySelector(injected ? '#bangumi-list.inject-node .total-wrap' : '#bangumi-list .total-wrap')*/document.querySelector('.search-header'), 294 | //notInjectNode = document.querySelector(!injected ? '#bangumi-list.inject-node .total-wrap' : '#bangumi-list .total-wrap'), 295 | injectContainer = document.createElement('div'), 296 | th_proxyNode = document.createElement('span'), 297 | th_proxy = GM_getValue('th_search_proxy_server'), 298 | hk_proxyNode = document.createElement('span'), 299 | hk_proxy = GM_getValue('hk_search_proxy_server'), 300 | tw_proxyNode = document.createElement('span'), 301 | tw_proxy = GM_getValue('tw_search_proxy_server'), 302 | cn_proxyNode = document.createElement('span'), 303 | cn_proxy = GM_getValue('cn_search_proxy_server'), 304 | proxy_area = document.createElement('span'), 305 | buttonNode = document.createElement('span'), 306 | areaNode = document.querySelector('#proxy-area'); 307 | th_proxyNode.innerHTML = `海外服务器:`; 308 | //th_proxyNode.style = 'margin-left: 20px;'; 309 | hk_proxyNode.innerHTML = `港澳服务器:`; 310 | hk_proxyNode.style = 'margin-left: 20px;'; 311 | tw_proxyNode.innerHTML = `台湾服务器:`; 312 | tw_proxyNode.style = 'margin-left: 20px;'; 313 | cn_proxyNode.innerHTML = `大陆服务器:`; 314 | cn_proxyNode.style = 'margin-left: 20px;'; 315 | proxy_area.innerHTML = ''; 316 | proxy_area.style = 'margin-left: 20px;'; 317 | buttonNode.innerHTML = '搜索'; 318 | buttonNode.style = 'cursor: pointer; color: #00A1D6; margin-left: 20px;'; 319 | buttonNode.addEventListener('click', () => { 320 | const area = injectNode.querySelector('#proxy-area').value; 321 | if (area === 'th') searchTH(); 322 | else searchTHM(); 323 | }); 324 | injectContainer.style = 'margin: 10px 0 0 64px;'; 325 | injectContainer.className = 'inject-bar'; 326 | injectContainer.appendChild(th_proxyNode); 327 | injectContainer.appendChild(hk_proxyNode); 328 | injectContainer.appendChild(tw_proxyNode); 329 | injectContainer.appendChild(cn_proxyNode); 330 | injectContainer.appendChild(proxy_area); 331 | injectContainer.appendChild(buttonNode); 332 | injectNode.appendChild(injectContainer); 333 | if (areaNode) { 334 | const newAreaNode = proxy_area.querySelector('#proxy-area'); 335 | newAreaNode.value = areaNode.value; 336 | newAreaNode.addEventListener('input', e => { 337 | areaNode.value = newAreaNode.value; 338 | }); 339 | areaNode.addEventListener('input', e => { 340 | newAreaNode.value = areaNode.value; 341 | }); 342 | } 343 | injectNode.querySelector('#th-proxy-server').addEventListener('change', e => { 344 | //if (notInjectNode) notInjectNode.querySelector('#th-proxy-server').value = e.target.value; 345 | GM_setValue('th_search_proxy_server', e.target.value); 346 | }); 347 | injectNode.querySelector('#hk-proxy-server').addEventListener('change', e => { 348 | //if (notInjectNode) notInjectNode.querySelector('#hk-proxy-server').value = e.target.value; 349 | GM_setValue('hk_search_proxy_server', e.target.value); 350 | }); 351 | injectNode.querySelector('#tw-proxy-server').addEventListener('change', e => { 352 | //if (notInjectNode) notInjectNode.querySelector('#tw-proxy-server').value = e.target.value; 353 | GM_setValue('tw_search_proxy_server', e.target.value); 354 | }); 355 | injectNode.querySelector('#cn-proxy-server').addEventListener('change', e => { 356 | //if (notInjectNode) notInjectNode.querySelector('#cn-proxy-server').value = e.target.value; 357 | GM_setValue('cn_search_proxy_server', e.target.value); 358 | }); 359 | } 360 | function injectObserver() { 361 | const observer = new MutationObserver(mutationsList => { 362 | for (let mutation of mutationsList) { 363 | if (mutation.type === 'attributes' && mutation.target.className.includes('-active')) injectButton(); 364 | else if (mutation.type === 'attributes' && !mutation.target.className.includes('-active')) { 365 | const injectNode = document.querySelector('.inject-bar'); 366 | injectNode.parentNode.removeChild(injectNode); 367 | } 368 | // const injectNode = document.querySelector('#bangumi-list.inject-node'); 369 | // if (injectNode) injectNode.style.display = 'none'; 370 | } 371 | }), config = { attributes: true, childList: true }; 372 | let observeNode; 373 | document.querySelectorAll('.search-tabs > .vui_tabs > nav > ul > li').forEach(node => node.innerHTML.includes('番剧') && (observeNode = node)); 374 | observer.observe(observeNode, config); 375 | if (observeNode.className.includes('-active')) injectButton(); 376 | } 377 | const searchAppObserver = new MutationObserver(mutationsList => { 378 | for (let mutation of mutationsList) { 379 | console.log(mutation); 380 | if (mutation.addedNodes.length > 0 && mutation.addedNodes[0].tagName === 'DIV' && mutation.addedNodes[0].querySelector('.search-content')) { 381 | injectObserver(); 382 | document.querySelector('.search-panel-popover').addEventListener('click', () => switchToNormal()); 383 | document.querySelector('.search-button').addEventListener('click', () => switchToNormal()); 384 | document.querySelector('.search-input-el').addEventListener('keyup', e => e.keyCode === 13 && switchToNormal()); 385 | } 386 | } 387 | }); 388 | searchAppObserver.observe(document.querySelector('.search-layout'), { childList: true }); 389 | if (document.querySelector('.search-layout .search-content')) { 390 | injectObserver(); 391 | document.querySelector('.search-panel-popover').addEventListener('click', () => switchToNormal()); 392 | document.querySelector('.search-button').addEventListener('click', () => switchToNormal()); 393 | document.querySelector('.search-input-el').addEventListener('keyup', e => e.keyCode === 13 && switchToNormal()); 394 | } 395 | const styleLink = document.head.innerHTML.match(/\/\/s1\.hdslb\.com\/bfs\/static\/laputa-search\/client\/assets\/index\.([^.]+)\.css/); 396 | if (styleLink && styleLink[1] && styleLink[1] !== GM_getValue('search_page_style_hash')) { 397 | GM_xmlhttpRequest({ 398 | method: 'GET', 399 | url: `https://${styleLink[0]}`, 400 | onload: e => { 401 | const styles = e.response; 402 | if(styles) { 403 | const card = (styles.match(/\.media-card\[(data-v-[^\]]+)\]/) ?? [])[1]; 404 | const loading = (styles.match(/\.search-loading-container\[(data-v-[^\]]+)\]/) ?? [])[1]; 405 | const neterror = (styles.match(/\.search-neterror-container\[(data-v-[^\]]+)\]/) ?? [])[1]; 406 | const nodata = (styles.match(/\.search-nodata-container\[(data-v-[^\]]+)\]/) ?? [])[1]; 407 | const score = (styles.match(/\.score\[(data-v-[^\]]+)\]/) ?? [])[1]; 408 | const tag = (styles.match(/\.tag\[(data-v-[^\]]+)\]/) ?? [])[1]; 409 | const footer = (styles.match(/\.media-footer\[(data-v-[^\]]+)\]/) ?? [])[1]; 410 | const search_page_style_tag = {card, loading, neterror, nodata, score, tag, footer}; 411 | GM_setValue('search_page_style_tag', search_page_style_tag); 412 | GM_setValue('search_page_style_hash', styleLink[1]); 413 | } 414 | } 415 | }); 416 | } 417 | })(); 418 | --------------------------------------------------------------------------------