├── 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 |
\
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 |
\
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 = '';
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 |
\
72 |
`;
73 | resultNode.innerHTML = ``;
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 = ``;
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 |
--------------------------------------------------------------------------------