时间戳防盗链对接教程

强烈建议和TS加密功能一起使用,TS加密的key文件会自动加入到播放验证环节,从而防盗链会更有效。
提示:可通过自行对接 或 直接使用解析接口获取可访问的m3u8链接,按需求选择即可。

对接之前请先了解下时间戳+播放次数防盗链的原理及设置 ⇒ 传送门,目前M3U82种调用方法,如下:

1、使用自适应M3U8,格式为:/movie/auto/61f68205eeeec878ae3fe3d5.m3u8
2、使用具体分辨率的M3U8,如1080P,格式为:/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8

可在视频管理复制M3U8,或者通知接口获取对应的链接,由于通知接口没直接推送自适应M3U8,需要自行组装,组装格式为/movie/auto/ + 视频id + .m3u8,且对自适应M3U8还不了解的可看 ⇒ 传送门

解析接口使用

解析接口需要前往转码相关 ⇒ 防盗链/图片加密设置,找到设置时间戳防盗链的json解析接口功能项,可填入指定参数组合开启该功能,留空则关闭。

且单个接口配置为:y或n过期时间$自定义接口key值$ip白名单,多个接口配置需使用英文冒号:分开,参数详解:

y为切片广告功能有效,n为切片广告功能无效,即如果你设置切片广告,则不会给你播放切片广告;后面接过期时间,如y2024-10-23,不填则一直有效
key值为任意字母数字组合,如kll323,那么接口地址为/api/m3u8?key=kll323&url=
ip白名单可不设置,如不设置则任何人都可以使用该解析接口,如你只想让某个ip请求,则填入该ip即可

设置参考:

#该配置为切片广告功能有效,接口地址为/api/m3u8?key=kll323&url=,由于没设置ip白名单,则任何人都能使用该接口
y$kll323

#该配置为切片广告功能无效,即不播放切片广告,接口地址为/api/m3u8?key=ksi44ks&url=,由于没设置ip白名单,则任何人都能使用该接口
n$ksi44ks

#该配置为切片广告功能无效,即不播放切片广告,接口地址为/api/m3u8?key=z8kjs&url=,由于设置ip白名单,则只有178.23.4.12能使用该接口
n$z8kjs$178.23.4.12

#我需要上面3个接口同时使用,则把上面3个配置使用英文冒号:分开,再填入设置即可
y$kll323:n$ksi44ks:n$z8kjs$178.23.4.12

且接口不限制数量,可自行设置无数个,且接口默认永久生效,如果你想加个有效时间,则参考:

#过期时间在y/n后面添加,格式年-月-日,如2024-10-23,即超过2024-10-23后,接口就用不了了
y2024-10-23$kll323
n2024-10-23$ksi44ks
n2024-10-23$z8kjs$178.23.4.12
y2024-10-23$kll323:n2024-10-23$ksi44ks:n2024-10-23$z8kjs$178.23.4.12

设置好了后,就可直接通过接口获取可访问的m3u8链接了,如:

#直接请求 解析接口 + m3u8链接 就可以获取了,且同时适用于自适应M3U8和分辨率M3U8
http://127.0.0.1:3000/api/m3u8?key=kll323&url=http://127.0.0.1:3000/movie/auto/61f68205eeeec878ae3fe3d5.m3u8

#返回字段
{
    "code": 200,
    "url": "http://127.0.0.1:3000/movie/auto/61f68205eeeec878ae3fe3d5.m3u8?counts=2&timestamp=1717515649572&key=c67058e8c650e6136dda594f46d45265&a=y",
    "expirytime": "2024-08-14 11:40:49",
    "requestlimit": 2
}

url为获取的可使用的m3u8链接,expirytime为链接过期时间,默认2分钟后过期,requestlimit为链接读取限制次数。

可自行编辑controller/cms.js,搜索expirytime关键词,定位到相关地方修改过期时间和次数,都有注释,然后使用pm2 reload efvcms重启生效。

自适应M3U8对接步骤

首先点击EFV后台左侧 ⇒ 转码相关 ⇒ 防盗链/图片加密设置,开启时间戳+播放次数防盗链并设置KEY值,且值为efvtoken

比如我想播放如下链接:

http://127.0.0.1:3000/movie/auto/61f68205eeeec878ae3fe3d5.m3u8

这个链接不需要域名及/movies及后缀.m3u8,只需要这个/auto开始的部分链接,比如:

/auto/61f68205eeeec878ae3fe3d5

然后拼接字符串,拼接如下:

#拼接后的字符串
/auto/61f68205eeeec878ae3fe3d5&counts=2&timestamp=1613982600000efvtoken

#拼接参数
counts为请求多少次就过期
timestamp为过期的13位时间戳+设置的key值,比如现在16:50:16,10分钟后过期,就是17:00:16,就把17:00:16转化为13位时间戳

接下来使用md5加密该字符串,生成32位小写,然后拿到这个32位小写027e1575ff97deaad7cfe223b6cf6001

最后获取能播放的url链接如下:

http://127.0.0.1:3000/movie/auto/61f68205eeeec878ae3fe3d5.m3u8?counts=2&timestamp=1613982600000&key=027e1575ff97deaad7cfe223b6cf6001

注意最后的url链接counts和拼接的值一样;timestamp只要时间戳,后面不需要加设置的KEY值;key值为拼接字符串md5加密的值。

且拼接加密的时候counts前面用的&,而最后的url链接counts前面是?,一定要区分清楚,不然对接会播放不了。

JS演示示例

const crypto = require('crypto');

function getKey(url, tokenKey) {
const nowstamp = Date.now();
const dutestamp = nowstamp * 1 + 60 * 1000 * 60;
const newurl = url.replace('/movie', '').replace('.m3u8', '');
const tokenurl = newurl + '&counts=' + 2 + '&timestamp=' + dutestamp + tokenKey;
const md5 = crypto.createHash('md5');
const md5token = md5.update(tokenurl).digest('hex');
const outurl = '/movie' + newurl + '.m3u8' + '?counts=' + 2 + '&timestamp=' + dutestamp + '&key=' + md5token;
console.log(outurl);
}

//2个参数为视频自适应M3U8链接和时间戳KEY值
getKey("/movie/auto/61f68205eeeec878ae3fe3d5.m3u8", "efvtoken");

分辨率M3U8对接步骤

首先点击EFV后台左侧 ⇒ 转码相关 ⇒ 防盗链/图片加密设置,开启时间戳+播放次数防盗链并设置KEY值,且值为efvtoken

比如我想播放如下链接:

http://127.0.0.1:3000/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8

这个链接不需要域名,只需要/videos开头到m3u8结尾的链接,比如:

/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8

然后拼接字符串,拼接如下:

#拼接后的字符串
/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8&counts=2&timestamp=1613982600000efvtoken

#拼接参数
counts为请求多少次就过期
timestamp为过期的13位时间戳+设置的key值,比如现在16:50:16,10分钟后过期,就是17:00:16,就把17:00:16转化为13位时间戳

接下来使用md5加密该字符串,生成32位小写,然后拿到这个32位小写027e1575ff97deaad7cfe223b6cf6001

最后获取能播放的url链接如下:

http://127.0.0.1:3000/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8?counts=2&timestamp=1613982600000&key=027e1575ff97deaad7cfe223b6cf6001

注意最后的url链接counts和拼接的值一样;timestamp只要时间戳,后面不需要加设置的KEY值;key值为拼接字符串md5加密的值。

且拼接加密的时候counts前面用的&,而最后的url链接counts前面是?,一定要区分清楚,不然对接会播放不了。

JS演示示例

const crypto = require('crypto');

function getKey(url, tokenKey) {
const nowstamp = Date.now();
const dutestamp = nowstamp * 1 + 60 * 1000 * 60;
const tokenurl = url + '&counts=' + 2 + '&timestamp=' + dutestamp + tokenKey;
const md5 = crypto.createHash('md5');
const md5token = md5.update(tokenurl).digest('hex');
const outurl = url + '?counts=' + 2 + '&timestamp=' + dutestamp + '&key=' + md5token;
console.log(outurl);
}

//2个参数为分辨率M3U8链接和时间戳KEY值
getKey("/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8", "efvtoken");

相关提示

强烈建议切片开启TS加密功能,可在转码设置开启该功能,开启后切片的key文件会自动加入到时间戳验证环节,从而时间戳会更有效。

且时间戳间隔可以尽量改短点,比如5s10s,只需要让用户播放获取到m3u8后几秒就失效,根据自己服务器网络读取速度决定。

counts次数最少设置为2,或者3次,有些手机浏览器会替换播放器,导致需要多加载1次,甚至2次才能播放,自行调整即可。