💻作者 : SoEasy 📅时间 : 2024年12月17日 🪢个人公众号 : SoEasy同学
猫影视在线源转影视T4接口
1 简介
猫影视源是一个node开发的服务,采用fastify作为web框架开发,项目结构简单,性能高。原版的猫影视是需要打包成js文件,通过node运行的。当然你可以将web应用部署到服务器上,但是猫影视的原版不可用,我开发的Easy影视是可用的。
写了一些猫源的APP站点以后,发现app源稳定好用,而一段时间没维护的TVBox源基本失效了。猫影视又没有TV版,为了将优秀的猫影视源直接用到TVBox上。我将服务进行了一个通用的改造,以能够在TVBox的TV版本上通过T4接口使用猫影视的源。
2 环境准备
打开你的猫影视源的仓库,进入node文件夹。在开发环境可以通过运行package.json里的scripts脚本dev运行。或者在node文件夹内,运行命令:
npm run dev
正常情况下,你的服务启动后,在ip:port/config端点能够看到你的站点:
以瓜子app为例,通过调用ip:port/spider/gzapp/3/test接口,可以测试站点的5个常用接口。可以看到瓜子的接口注册配置如下:
export default {
meta: {
key: 'gzapp',
name: '瓜子app',
type: 3,
}, api: async (fastify) => {
fastify.post('/init', init);
fastify.post('/home', home);
fastify.post('/category', category);
fastify.post('/detail', detail);
fastify.post('/play', play);
fastify.post('/search', search);
fastify.get('/test', test);
},
};
3 改造接口
先学习TVBox的T4接口开发规范:
https://apifox.com/apidoc/shared-284a6632-f5d4-45f8-b796-d85605de5af4
接口为单一接口,通过入参不同执行不同的具体接口,我将参数整理如下:
序号 | 参数 | 说明 | 接口 |
---|---|---|---|
1 | sites | 站点 | 所有接口 |
2 | timeout | 超时 | 所有接口 |
3 | t | 分类id | 分类 |
4 | pg | 页码 | 分类 |
5 | ac | detail,固定 | 分类|详情 |
6 | ext | 分类 | |
7 | ids | 视频的url | 详情 |
8 | wd | 搜索字段 | 搜索 |
9 | quick | 快搜 | 搜索 |
10 | flag | 线路 | 播放 |
11 | play | 播放地址 | 播放 |
通过接口特性分析,某个参数存在即执行某个对应的接口。
再对比每个接口的入参及返回值,仔细对比发现猫影视源接口的返回值结构字段,和TVBox的接口返回值是兼容的。但是入参不一样,这就需要包装接口时做转换。我将转换的过程包装到一个共用的工具类中:
文件:util/utils.js
export async function vod(inReq, outResp) {
try {
const prefix = inReq.server.prefix;
let resp = await inReq.server.inject().post(`${prefix}/init`);
if (inReq.query && inReq.query.t != undefined && inReq.query.ac == 'detail') {
resp = await inReq.server.inject().post(`${prefix}/category`).payload({
id: inReq.query.t,
page: inReq.query.pg,
filters: JSON.parse(Buffer.from(inReq.query.ext, 'base64').toString('utf-8')),
});
return resp.json();
} else if (inReq.query && inReq.query.ids != undefined && inReq.query.ac == 'detail') {
resp = await inReq.server.inject().post(`${prefix}/detail`).payload({
id: inReq.query.ids,
});
return resp.json();
} else if (inReq.query && inReq.query.play != undefined) {
resp = await inReq.server.inject().post(`${prefix}/play`).payload({
flag: inReq.query.flag,
id: inReq.query.play,
});
return resp.json();
} else if (inReq.query && inReq.query.wd != undefined) {
resp = await inReq.server.inject().post(`${prefix}/search`).payload({
wd: inReq.query.wd,
page: inReq.query.pg,
});
return resp.json();
} else {
resp = await inReq.server.inject().post(`${prefix}/home`);
return resp.json();
}
} catch (err) {
console.error(err);
return {err: err.message, tip: 'check debug console output'};
}
}
逻辑很清晰:
- 首先执行init方法,初始化一些url置换等。
- 根据入参条件判断该执行哪个猫影视的方法,并将入参转换好,返回值兼容就不需要处理。例如判断参数t存在而且ac=detail,认为是一个分类接口
- 最终无法匹配默认到home首页上
工具类写好以后,在你的源文件内添加一个注册接口,例如瓜子App,添加一个vod接口,例如:
import * as Utils from "../../util/utils.js";
export default {
meta: {
key: 'gzapp',
name: '瓜子app',
type: 3,
}, api: async (fastify) => {
fastify.post('/init', init);
fastify.post('/home', home);
fastify.post('/category', category);
fastify.post('/detail', detail);
fastify.post('/play', play);
fastify.post('/search', search);
fastify.get('/test', test);
fastify.get('/vod', Utils.vod);
},
};
其它源按照这种格式添加即可。
4.测试接口
将服务部署到vercel或者自己的服务器上,保证ip:port/spider/gzapp/3/vod接口能够调用即可。
以T4结构准备好一个配置文件,托管到gitee上使用即可:
{
"spider": "",
"sites": [
{
"key": "gzapp",
"name": "瓜子",
"type": 4,
"api": "http://catvod.soeasy.love/spider/gzapp/3/vod",
"searchable": 1,
"quickSearch": 0,
"filterable": 1
}
]
}