Python django框架 web端视频加密的实例详解


Posted in Python onNovember 20, 2020

视频加密流程图:

Python django框架 web端视频加密的实例详解

后端获取保利威的视频播放授权token,提供接口api给前端

参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play/create-playsafe-token/

在utils下创建polyv.py,编写token生成工具函数,path:utils/polyv.py
utils 是多个模块的公共函数库的文件夹里面存放自己开发的组件

from django.conf import settings
import time
import requests
#pip install requests
import hashlib



class PolyvPlayer(object):
  def __init__(self,userId,secretkey,tokenUrl):
    """初始化,提供用户id和秘钥"""
    self.userId = userId
    self.secretKey = secretkey
    self.tokenUrl = tokenUrl


  def tomd5(self, value):
    """取md5值"""
    return hashlib.md5(value.encode()).hexdigest()

  # 获取视频数据的token
  def get_video_token(self, videoId, viewerIp, viewerId=None, viewerName='', extraParams='HTML5'):
    """
    :param videoId: 视频id
    :param viewerId: 看视频用户id
    :param viewerIp: 看视频用户ip
    :param viewerName: 看视频用户昵称
    :param extraParams: 扩展参数
    :param sign: 加密的sign
    :return: 返回点播的视频的token
    """
    ts = int(time.time() * 1000) # 时间戳
    plain = {
      "userId": self.userId,
      'videoId': videoId,
      'ts': ts,
      'viewerId': viewerId,
      'viewerIp': viewerIp,
      'viewerName': viewerName,

    }

    # 按照ASCKII升序 key + value + key + value... + value 拼接
    plain_sorted = {}
    key_temp = sorted(plain)
    for key in key_temp:
      plain_sorted[key] = plain[key]

    plain_string = ''
    for k, v in plain_sorted.items():
      plain_string += str(k) + str(v)

    # 首尾拼接上秘钥
    sign_data = self.secretKey + plain_string + self.secretKey

    # 取sign_data的md5的大写
    sign = self.tomd5(sign_data).upper()

    # 新的带有sign的字典
    plain.update({'sign': sign})
    # python 提供的发送http请求的模块
    result = requests.post(

      url=self.tokenUrl,
      headers={"Content-type": "application/x-www-form-urlencoded"},
      data=plain     # 平台所需要携带的数据
    ).json() # json.loads 把那拿到的数据序列化
    token = {} if isinstance(result, str) else result.get("data", {})  # 如果保利威视频平台返回的的字符串 token={} 否则
    if token == '':
      return result
    return token

在 项目开发时的本地配置 配置参数:
配置文件settings/dev.py,代码:

# 保利威视频加密服务
POLYV_CONFIG = {
  "userId":"62dc475e3f",
  "secretkey":"h6FiaEBRMU",
  "tokenUrl":"https://hls.videocc.net/service/v1/token",
}

保利威文档地址:https://my.polyv.net/secure/setting/apiPython django框架 web端视频加密的实例详解
保利威api参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play/create-playsafe-token/

Python django框架 web端视频加密的实例详解

urls.py,主路由代码:

path(r'polyv/',include('polyv.urls')),

在项目主应用文件夹下创建app
命令:
cd 主应用文件夹下
python3 …/…/manage.py startapp polyv

urls.py,子路由代码:

from django.urls import path,re_path
from . import views

urlpatterns = [
  path('video/',views.Video.as_view(),)

]

polyv/views.py,视图代码:

from django.shortcuts import render

# Create your views here.
from rest_framework import status
from lyapi.utils.polyv import PolyvPlayer
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from django.conf import settings
from rest_framework.response import Response


class VideoView(APIView):
  # vid = '348e998797383060cb19620b1c600203_3'
  # permission_classes = [IsAuthenticated, ]       #from rest_framework.permissions import IsAuthenticated 登录认证
  def get(self,request):
    polyv_obj = PolyvPlayer(settings.POLYV_CONF['userid'],settings.POLYV_CONF['secretKey'],settings.POLYV_CONF['tokenUrl'])   # 调用polyv文件下的polyv_obj类
    # vid = 'cee1047a76927eb43774263cd93bb69f_c'    # 存在保利威平台的视频ID
    # vid = '348e998797383060cb19620b1c600203_3'     # 存在保利威平台的视频ID
    vid = request.query_params.get('vid')				# 需要把保利威平台的视频ID存在数据库里或者直接或者在前段直接在的Params加 vid cee1047a76927eb43774263cd93bb69f_c
    viewerIp = request.META.get('REMOTE_ADDR')     # 获取用户访问的IP地址
    viewerId = request.user.id             # 获取用户的id
    viewerName = request.user.username         # 获取用户的账号名

    token_dict = polyv_obj.get_video_token(vid,viewerIp,viewerId,viewerName)    # 调用polyv文件下的polyv_obj类下的get_video_token方法
    print(token_dict)

    if 'code' in list(token_dict) and token_dict['code'] != 200:            # 返回请求失败的信息
      return Response(token_dict, status=status.HTTP_403_FORBIDDEN)
    '''
    返回结果:
    {
      "code": 403,
      "status": "error",
      "message": "invalid userId or videoId.",
      "data": ""
    }
    
    '''

    return Response(token_dict)             # 返回请求成功的信息

    '''
    返回结果:
      {
        "token": "43883858-92a3-4f25-a6e8-701d10d88cde-f2",
        "userId": "cee1047a76",
        "appId": null,
        "videoId": "cee1047a76927eb43774263cd93bb69f_c",
        "viewerIp": "127.0.0.1",
        "viewerId": "2",
        "viewerName": "root",
        "extraParams": null,
        "ttl": 600000,
        "createdTime": 1605614888570,
        "expiredTime": 1605615488570,
        "iswxa": 0,
        "disposable": false
      }
    '''

到这里后端的api接口就已经写好啦!
前段 vue界面 简写:
在src下的components下新建一个Player.vue

# Player.vue

<template>
  <div class="player">
   <div id="player">

   </div>
  </div>
</template>

<script>
export default {
 name:"Player",
 data () {
  return {

  }
 },


 mounted() { //如果需要对标签进行一些加工处理,然后再放数据时,需要用mounted这个钩子函数,如果单纯的是获取数据,添加到数据属性中
        // 那么用created方法

  this.get_video_data();

 },

 methods: {
    get_video_data(){
     let user_name = localStorage.username || sessionStorage.username; //token认证
    let token = localStorage.token || sessionStorage.token;				//token认证
    console.log(this.$route.params.vid)
     let self = this;
    var player = polyvPlayer({
     wrap: '#player',
     width: document.documentElement.clientWidth - 300,
     height: document.documentElement.clientHeight,
     vid: this.$route.params.vid,
     // forceH5: true,

     // code: user_name,
     playsafe: (vid, next) =>{
      console.log(self)
      self.$axios.get(`${self.$settings.Host}/polyv/video/?vid=${self.$route.params.vid}`,{
       headers:{
       'Authorization':'jwt ' + token
       }
      }).then((res)=>{
       // {‘token':'asasfd'}
       next(res.data.token);

      }).catch((error)=>{

      })


     }
    });
   }
 },
 computed: {
 }
}
</script>

<style scoped>
</style>

src下的router的index.js配置url:

import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/components/Home'
import Login from '@/components/Login'
import Register from "@/components/Register";
import Course from "@/components/Course"
import Detail from "@/components/Detail";
import Cart from "@/components/Cart";
import Order from "@/components/Order";
import Player from "@/components/Player";	//Player组件的url 需要复制这里,其他的url忽略
import Myorder from "@/components/Myorder";	 
Vue.use(Router)

export default new Router({
 mode:'history',
 routes: [
  {
   path: '/',
   //name: 'heme',
   component: Home
  },
    {
   path: '/home',
   //name: 'heme',
   component: Home
  },
    {
   path: '/user/login',
   //name: 'heme',
   component: Login
  },
    {
   path: '/register',
   //name: 'heme',
   component: Register
  },
    {
   path: '/courses',
   //name: 'heme',
   component: Course

  },
  {
   path: '/courses/detail/:id',
   //name: 'heme',
   component: Detail
  },
  {
   path: '/cart',
   //name: 'heme',
   component: Cart
  },
  {
   path: '/order',
   //name: 'heme',
   component: Order
  },
  {
   path: '/myorder',
   //name: 'heme',
   component: Myorder
  },
  {//Player组件的url 需要复制这个括号里的,其他的url忽略
   path: '/polyv/player/:vid',
   //name: 'heme',
   component: Player
  },

 ]
})

自己配置的 访问路径http://www.luffycity.cn:8080/polyv/player/cee1047a76927eb43774263cd93bb69f_c```

到此这篇关于Python django框架 web端视频加密的文章就介绍到这了,更多相关Python django框架视频加密内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现查询苹果手机维修进度
Mar 16 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
Python中XlsxWriter模块简介与用法分析
Apr 24 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Face++ API实现手势识别系统设计
Nov 21 Python
Python3标准库总结
Feb 19 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
cookies应对python反爬虫知识点详解
Nov 25 Python
Python max函数中key的用法及原理解析
Jun 26 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 Python
总结python 三种常见的内存泄漏场景
Nov 20 #Python
Python偏函数实现原理及应用
Nov 20 #Python
python与idea的集成的实现
Nov 20 #Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 #Python
python3 re返回形式总结
Nov 20 #Python
python 实现图片修复(可用于去水印)
Nov 19 #Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 #Python
You might like
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
javascript forEach通用循环遍历方法
2010/10/11 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
Python中的异常处理学习笔记
2015/01/28 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
银行开业庆典方案
2014/02/06 职场文书
黄金搭档广告词
2014/03/21 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
考试保密承诺书
2014/08/30 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
Python列表的索引与切片
2022/04/07 Python