flask基于保利威做视频认证

实现步骤

仅实现视频认证,视频跑马灯不在考虑范围,请自行阅读官方文档:保利威官方文档。

一、管理后台设置

  1. 登录云点播管理后台,点击 【设置】 → 【视频设置】,进入视频设置页面。

  2. 在授权播放和防录屏跑马灯接口设置栏中,填写认证接口路由。

  3. http://127.0.0.1:5000/video/verfy/示例:
    flask基于保利威做视频认证_第1张图片

二、业务方服务端实现

  1. 从官网直接拷这段代码,vid是上传的视频的id,刷新网页就会将这些数据发到咱们自己后端的认证接口。

    <script src='https://player.polyv.net/script/player.js'></script>
    <div id='player'></div>
    <script>
    var player = polyvPlayer({
        wrap: '#player',
        width: 800,
        height: 533,
        vid: '88083abbf5bcf1356e05d39666be527a_8',   
        code: 'myCodeValue'  // 用户可自定义参数值,也可以不设置此参数,那么在请求接口时该参数值为空。参数值为中文时需要做base64URLSafe。
    });
    </script>
    
    @app.route('/video/verfy/')
    def auth():
        query_params = request.args
        t = query_params.get('t')
        vid = query_params.get('vid')
        code = query_params.get('code')
        callback = query_params.get('callback')
    
  2. 返回数据

    {
      "status":1, // status为1则认证通过,为0则认证不通过
      "username":"elvis", //username为你的业务的用户,可以随便写一个
      "sign":"2c2bfb00314da7d768d50a7d1e93bd9f" //认证值
    }
    
  3. sign的生成

    sign的计算规则为:拼接vid、secretkey、username、code、status、t参数做MD5计算:

    sign = str(md5(f"vid={vid}&secretkey={secretkey}&username=general_zy&code={code}&status={1}&t={t}".encode(
            'utf-8')).hexdigest())
    
  4. Flash播放器的跨域配置
    配置方式为:添加crossdomain.xml文件到播放域名的根目录下。

    
    <cross-domain-policy>
        <allow-access-from domain="*"/>
        <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
    cross-domain-policy>
    

    只需要把这段内容返回就行:

    @app.route('/crossdomain.xml&')
    def crossdomain():
        return render_template('crossdomain.xml')
    
  5. callback的用途
    以上操作之后,视频并不能播放,而callback参数也一直没有使用:
    加上callback参数:

    res = {
            'status': 1,
            'username': 'general_zy',
            'sign': sign
        }
       if callback:
           data = f'{callback}({dumps(res)})'
           return data
       else:
           return jsonify(res)
    

三、官网给出的详细返回数据

{
  "status":1,
  "username":"elvis",
  "sign":"6ab63590797e513d1b6c46b407413478",
  "msg":"Errormessage!",
  "fontSize":"40",
  "fontColor":"0xFFE900",
  "speed":"200",
  "filter":"on",
  "setting":"3",
  "alpha":"1",
  "filterAlpha":"1",
  "filterColor":"0x3914AF",
  "blurX":"2",
  "blurY":"2",
  "tweenTime":"1",
  "interval":"5",
  "lifeTime":"3",
  "strength":"4",
  "show":"on"
}

四、接口参数说明

参数名 类型 必填 默认值 说明
status Integer / 是否允许播放:1 允许 2 禁止
username String / 观众名称,也会用于跑马灯显示的文字内容。如果是中文需要做URLEncode
sign String / 接口签名,用于校验返回内容是否被篡改
show String off 当参数值为“on”时表示显示跑马灯,默认不显示
setting Integer 1 跑马灯滚动的样式:1 从右到左滚动 2 随机位置闪烁 3 从右到左闪烁滚动
speed Integer 200 跑马灯文字从右侧移至左侧所需时间,单位:1/10秒
lifeTime Integer 3 跑马灯文字显示时间,单位:秒
interval Integer 5 跑马灯文字隐藏间隔时间,单位:秒
tweenTime Integer 1 跑马灯文字渐隐渐现时间,单位:秒
fontSize Integer 30 跑马灯文字的字体大小
fontColor String 0x000000 跑马灯文字颜色,使用十六进制颜色值表示,如0xFF0000,默认为黑色
alpha Float 1 跑马灯文字透明度,取值范围0.01~1,参数值不能小于0.01
filter String off 跑马灯文字是否描边,on 描边 off 不描边
filterAlpha Float 1 文字描边透明度,取值范围0~1
filterColor String 0x000000 文字描边颜色,使用十六进制颜色值表示,如0xFF0000,默认为黑色
strength Integer 4 描边强度,取值范围0~255
blurX Integer 2 描边水平模糊量,取值范围0~255
blurY Integer 2 描边垂直模糊量,取值范围0~255
msg String / 自定义错误提示信息

五、接口参数说明

传参时,code参数是自定义的,可以写当前用户的id,这样后台就可以基于id做判断,如果当前用户付费了就可以观看。
以下为模拟代码:

@app.route('/video/verfy/')
def auth():
    query_params = request.args
    t = query_params.get('t')
    vid = query_params.get('vid')
    code = query_params.get('code')
    callback = query_params.get('callback')

    secretkey = '请填写你的secretkey'
    sign = str(md5(f"vid={vid}&secretkey={secretkey}&username=general_zy&code={code}&status={1}&t={t}".encode(
        'utf-8')).hexdigest())
	
	# 模仿查验不通过
    allow = False
    
    if allow:
        res = {
            'status': 1,
            'username': 'general_zy',
            'sign': sign
        }
        if callback:
            data = f'{callback}({dumps(res)})'
            return data
        else:
            return jsonify(res)
    else:
    	# status改为2则无权播放
        res = {
            'status': 2,
            'username': 'general_zy',
            'sign': sign,
        }
        if callback:
            data = f'{callback}({dumps(res)})'
            return data
        else:
            return jsonify(res)

你可能感兴趣的:(flask,flask,音视频,python)