Skip to content

💻作者 : 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文件夹内,运行命令:

shell
npm run dev

正常情况下,你的服务启动后,在ip:port/config端点能够看到你的站点:

1734421090676

以瓜子app为例,通过调用ip:port/spider/gzapp/3/test接口,可以测试站点的5个常用接口。可以看到瓜子的接口注册配置如下:

javascript
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

接口为单一接口,通过入参不同执行不同的具体接口,我将参数整理如下:

序号参数说明接口
1sites站点所有接口
2timeout超时所有接口
3t分类id分类
4pg页码分类
5acdetail,固定分类|详情
6ext分类
7ids视频的url详情
8wd搜索字段搜索
9quick快搜搜索
10flag线路播放
11play播放地址播放

通过接口特性分析,某个参数存在即执行某个对应的接口。

再对比每个接口的入参及返回值,仔细对比发现猫影视源接口的返回值结构字段,和TVBox的接口返回值是兼容的。但是入参不一样,这就需要包装接口时做转换。我将转换的过程包装到一个共用的工具类中:

文件:util/utils.js

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接口,例如:

js
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上使用即可:

json
{
  "spider": "",
  "sites": [
    {
      "key": "gzapp",
      "name": "瓜子",
      "type": 4,
      "api": "http://catvod.soeasy.love/spider/gzapp/3/vod",
      "searchable": 1,
      "quickSearch": 0,
      "filterable": 1
    }
  ]
}

1734422640159