时间戳防盗链对接教程

强烈建议和TS加密功能一起使用,TS加密的key文件会自动加入到播放验证环节,从而防盗链会更有效。

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

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

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

自适应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次才能播放,自行调整即可。