Skip to content

Commit 1bc9198

Browse files
committed
update:增加自动端口,增加hipy嗅探器支持
1 parent 6ab9a19 commit 1bc9198

File tree

6 files changed

+106
-24
lines changed

6 files changed

+106
-24
lines changed

Diff for: README.md

+26
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,29 @@ yarn build
4646
### 20250118
4747

4848
1. 支持通用嗅探
49+
50+
### hipy嗅探器说明
51+
52+
支持参数如下
53+
54+
```text
55+
let init_js = `Object.defineProperties(navigator, {platform: {get: () => 'iPhone'}});`;
56+
input = {
57+
parse: 1,
58+
url: input,
59+
js: `try{location.href = document.querySelectorAll("iframe")[1].src;}catch(err) {}document.querySelector(".line").click()`,
60+
parse_extra: '&init_script=' + encodeURIComponent(base64Encode(init_js)),
61+
}
62+
```
63+
64+
* script 嗅探过程中需要执行的点击操作,传递值为base64编码后的js脚本
65+
66+
parse_extra 额外的自定义query字符串如下
67+
68+
* is_pc
69+
* css
70+
* init_script base64编码的初始化执行脚本
71+
* headers 嗅探请求头
72+
* timeout 嗅探超时
73+
* custom_regex 自定义嗅探规则正则
74+
* sniffer_exclude 嗅探排除规则正则

Diff for: nodejs/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "CatVodOpen nodejs config api server demo.",
55
"type": "module",
66
"scripts": {
7-
"dev": "cross-env DEV_HTTP_PORT=3006 nodemon --config nodemon.json src/dev.js",
7+
"dev": "cross-env DEV_HTTP_PORT=5758 nodemon --config nodemon.json src/dev.js",
88
"_build": "rimraf dist && node esbuild.js && node esbuild-config.js",
99
"build": "cross-env NODE_ENV=production npm run _build && node copyDist.js D:\\soft\\猫影视\\Release\\data\\flutter_assets\\asset\\js",
1010
"build:copy": "cross-env NODE_ENV=production npm run _build && node copyDist.js D:\\soft\\猫影视\\Release\\data\\flutter_assets\\asset\\js",

Diff for: nodejs/src/index.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export default {
55
enable_dspush: 1,
66
enable_home_site: 0,
77
sniffer_rule: 'http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*',
8+
enable_hipy_sniffer: 0,
9+
hipy_sniffer_url: 'http://127.0.0.1:5708/sniffer?url=',
810
},
911
ffm3u8: {
1012
url: 'https://cj.ffzyapi.com/api.php/provide/vod/from/ffm3u8',

Diff for: nodejs/src/index.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fastify from 'fastify';
22
import router from './router.js';
33
import {JsonDB, Config} from 'node-json-db';
44
import axios from 'axios';
5+
import {findAvailablePort} from './util/tool.js';
56

67
let server = null;
78

@@ -58,8 +59,11 @@ export async function start(config) {
5859
// 推荐使用NODE_PATH做db存储的更目录,这个目录在应用中清除缓存时会被清空
5960
server.db = new JsonDB(new Config((process.env['NODE_PATH'] || '.') + '/db.json', true, true, '/', true));
6061
server.register(router);
62+
const startPort = process.env['DEV_HTTP_PORT'] || 5758;
63+
const availablePort = await findAvailablePort(startPort);
6164
// 注意 一定要监听ipv4地址 build后 app中使用时 端口使用0让系统自动分配可用端口
62-
server.listen({port: process.env['DEV_HTTP_PORT'] || 0, host: '::'});
65+
// server.listen({port: process.env['DEV_HTTP_PORT'] || 0, host: '::'});
66+
server.listen({port: availablePort, host: '::'});
6367
}
6468

6569
/**

Diff for: nodejs/src/spider/video/drpyS.js

+47-22
Original file line numberDiff line numberDiff line change
@@ -257,32 +257,57 @@ async function play(_inReq, _outResp) {
257257
if (realUrl && regex.test(realUrl)) {
258258
result.parse = 0;
259259
} else if (realUrl && !regex.test(realUrl)) {
260-
const sniffer = await inReq.server.messageToDart({
261-
action: 'sniff',
262-
opt: {
260+
if (cfg.default.drpyS.enable_hipy_sniffer && cfg.default.drpyS.hipy_sniffer_url) {
261+
const _js = result.js;
262+
const _parse_extra = result.parse_extra;
263+
const _query = {
263264
url: realUrl,
264-
timeout: 10000,
265-
rule: sniffer_rule,
266-
},
267-
});
268-
if (sniffer && sniffer.url) {
269-
const hds = {};
270-
if (sniffer.headers) {
271-
if (sniffer.headers['user-agent']) {
272-
hds['User-Agent'] = sniffer.headers['user-agent'];
273-
}
274-
if (sniffer.headers['referer']) {
275-
hds['Referer'] = sniffer.headers['referer'];
265+
script: _js ? base64Encode(_js) : undefined,
266+
}
267+
let _url = mergeQuery(cfg.default.drpyS.hipy_sniffer_url, _query);
268+
if (_parse_extra) {
269+
_url += _parse_extra;
270+
}
271+
try {
272+
let _result = await request(_url);
273+
console.log(`hipy嗅探器任务执行${_url} 完毕: ${_result.url}`);
274+
return {
275+
parse: 0,
276+
url: _result.url,
277+
header: _result.headers
276278
}
277-
if (sniffer.headers['cookie']) {
278-
hds['Cookie'] = sniffer.headers['cookie'];
279+
} catch (e) {
280+
console.log(`hipy嗅探器嗅探错误: ${e.message}`);
281+
}
282+
283+
} else {
284+
const sniffer = await _inReq.server.messageToDart({
285+
action: 'sniff',
286+
opt: {
287+
url: realUrl,
288+
timeout: 10000,
289+
rule: sniffer_rule,
290+
},
291+
});
292+
if (sniffer && sniffer.url) {
293+
const hds = {};
294+
if (sniffer.headers) {
295+
if (sniffer.headers['user-agent']) {
296+
hds['User-Agent'] = sniffer.headers['user-agent'];
297+
}
298+
if (sniffer.headers['referer']) {
299+
hds['Referer'] = sniffer.headers['referer'];
300+
}
301+
if (sniffer.headers['cookie']) {
302+
hds['Cookie'] = sniffer.headers['cookie'];
303+
}
279304
}
305+
return {
306+
parse: 0,
307+
url: sniffer.url,
308+
header: hds,
309+
};
280310
}
281-
return {
282-
parse: 0,
283-
url: sniffer.url,
284-
header: hds,
285-
};
286311
}
287312
}
288313
}

Diff for: nodejs/src/util/tool.js

+25
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
1+
import net from 'net';
2+
3+
// 检查端口是否被占用
4+
function checkPort(port) {
5+
return new Promise((resolve) => {
6+
const server = net.createServer();
7+
server.once('error', () => {
8+
resolve(false); // 端口被占用
9+
});
10+
server.once('listening', () => {
11+
server.close(() => resolve(true)); // 端口可用
12+
});
13+
server.listen(port);
14+
});
15+
}
16+
17+
// 查找可用端口
18+
export async function findAvailablePort(startPort) {
19+
let port = Number(startPort);
20+
while (!(await checkPort(port))) {
21+
port += 1; // 递增端口
22+
}
23+
return port;
24+
}
25+
126
export function extractTags(filename) {
227
// 正则匹配方括号内的内容
328
const regex = /\[(.*?)\]/g;

0 commit comments

Comments
 (0)