时间戳防盗链对接教程
提示:可通过自行对接 或 直接使用解析接口获取可访问的m3u8链接,按需求选择即可。
对接之前请先了解下时间戳+播放次数防盗链
的原理及设置 ⇒ 传送门,目前M3U8
有2
种调用方法,如下:
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×tamp=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×tamp=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×tamp=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 + '×tamp=' + dutestamp + tokenKey;
const md5 = crypto.createHash('md5');
const md5token = md5.update(tokenurl).digest('hex');
const outurl = '/movie' + newurl + '.m3u8' + '?counts=' + 2 + '×tamp=' + 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×tamp=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×tamp=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 + '×tamp=' + dutestamp + tokenKey;
const md5 = crypto.createHash('md5');
const md5token = md5.update(tokenurl).digest('hex');
const outurl = url + '?counts=' + 2 + '×tamp=' + dutestamp + '&key=' + md5token;
console.log(outurl);
}
//2个参数为分辨率M3U8链接和时间戳KEY值
getKey("/videos/202201/31/61f68205eeeec878ae3fe3d5/217g7g/index.m3u8", "efvtoken");
相关提示
强烈建议切片开启TS
加密功能,可在转码设置
开启该功能,开启后切片的key
文件会自动加入到时间戳验证环节,从而时间戳会更有效。
且时间戳间隔可以尽量改短点,比如5s
、10s
,只需要让用户播放获取到m3u8
后几秒就失效,根据自己服务器网络读取速度决定。
counts
次数最少设置为2
,或者3
次,有些手机浏览器会替换播放器,导致需要多加载1
次,甚至2
次才能播放,自行调整即可。