海康视频播放,包含h5和web插件

自行下载
海康开放平台
在这里插入图片描述
demo 都写得很清楚,不多描述

1.视频web插件

在这里插入图片描述

vue2写法,公共vue文件写法,调用文件即可

开始时需要以下配置,不知道的找对接平台数据的人,必须要,否则播不了

getParameterData: {
    port: 443,
    ip: "10.10.1.12",
    appKey: "20294202",
    appSecret: "ndqCAFyke4t1jHY2r8Uy",
    enableHTTPS: 1,
}, //海康数据
<!-- 海康插件组件 -->
<template>
    <div class="video-center" ref="videoCenter">
        <div :id="playWnd" class="playWnd"></div>
    </div>
  </template>
  <script>
  const control = require("../video/jsWebControl-1.0.0.min.js");
  const jsencrypt = require("../video/jsencrypt.min.js");
  export default {
    data() {
        return {
            oWebControl: null,
            pubKey: "",
            initCount: 0,
            w: 0,
            h: 0,
            winId: 1,
        };
    },
    props: {
        playWnd: {
          type: String,
          default: 'playWnd',
        },
        //播放类型  0预览 1回放
        playMode: {
            type: Number,
            default: 0,
        },
        //初始化数据
        initData: {
            type: Object,
            default() {
                return {
                    enableHttps: 1,
                    encryptedFields: "secret",
                    layout: "1x1",
                    btIds: "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769",
                    showSmart: 1,
                    showToolbar: 1,
                    snapDir: "D:\\SnapDir",
                    videoDir: "D:\\VideoDir",
                };
            },
        },
    },
    created: function () {
        this.initPlugin();
    },
    mounted: function () {
        this.$nextTick(()=>{
          this.h = this.$refs["videoCenter"].clientHeight;
          this.w = this.$refs["videoCenter"].clientWidth;
        })
        window.addEventListener("resize",() => {
            if (this.$refs["videoCenter"]) {
                this.h = this.$refs["videoCenter"].clientHeight;
                this.w = this.$refs["videoCenter"].clientWidth;
                this.resetFun();
            }
        });
    },
    computed: {},
    methods: {
        // 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
        setWndCover() {
            var iWidth = window.width;
            var iHeight = window.height;
            var oDivRect = document
                .querySelector("#"+this.playWnd)
                .getBoundingClientRect();
            var iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;
            var iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;
            var iCoverRight =
                oDivRect.right - iWidth > 0
                    ? Math.round(oDivRect.right - iWidth)
                    : 0;
            var iCoverBottom =
                oDivRect.bottom - iHeight > 0
                    ? Math.round(oDivRect.bottom - iHeight)
                    : 0;

            iCoverLeft = iCoverLeft > this.w ? this.w : iCoverLeft;
            iCoverTop = iCoverTop > this.h ? this.h : iCoverTop;
            iCoverRight = iCoverRight > this.w ? this.w : iCoverRight;
            iCoverBottom = iCoverBottom > this.h ? this.h : iCoverBottom;

            this.oWebControl.JS_RepairPartWindow(0, 0, this.w + 1, this.h); // 多1个像素点防止还原后边界缺失一个像素条
            if (iCoverLeft != 0) {
                this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.h);
            }
            if (iCoverTop != 0) {
                this.oWebControl.JS_CuttingPartWindow(
                    0,
                    0,
                    this.w + 1,
                    iCoverTop
                ); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
            }
            if (iCoverRight != 0) {
                this.oWebControl.JS_CuttingPartWindow(
                    this.w - iCoverRight,
                    0,
                    iCoverRight,
                    this.h
                );
            }
            if (iCoverBottom != 0) {
                this.oWebControl.JS_CuttingPartWindow(
                    0,
                    this.h - iCoverBottom,
                    this.w,
                    iCoverBottom
                );
            }
        },
        // 初始化
        init() {
            this.getPubKey(() => {
                let { appSecret, ...hkData } = this.$store.state.getParameterData;//海康提供的认证信息
                this.oWebControl.JS_RequestInterface({
                        funcName: "init",
                        argument: JSON.stringify({
                            appkey: hkData.appKey,                            //API网关提供的appkey
                            secret: this.setEncrypt(appSecret),            //API网关提供的secret
                            ip: hkData.ip,                                    //API网关IP地址
                            playMode: this.playMode,                        //播放模式(决定显示预览还是回放界面)
                            port: hkData.port,                                //端口
                            snapDir: this.initData.snapDir,                    //抓图存储路径
                            videoDir: this.initData.videoDir,                      //紧急录像或录像剪辑存储路径
                            layout: this.initData.layout,                    //布局
                            enableHTTPS: hkData.enableHTTPS,                  //是否启用HTTPS协议
                            encryptedFields: this.initData.encryptedFields,          //加密字段
                            showToolbar: this.initData.showToolbar,                  //是否显示工具栏
                            showSmart: this.initData.showSmart,                      //是否显示智能信息
                        })
                    }).then((oData) => {
                        // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
                        this.oWebControl.JS_Resize(this.w, this.h);
                    });
            });
        },
        /* 视频预览业务功能 */
        startPreviewFun(val) {
            this.oWebControl.JS_RequestInterface({
                funcName: "startPreview",
                argument: JSON.stringify({
                    cameraIndexCode: val,
                    streamMode: 0,
                    transMode: 1,
                    gpuMode: 0,
                    wndId: this.winId,
                }),
            }).then((oData) => {
                console.log('播放成功',oData)
            });
        },
        /* 视频回放业务功能 */
        startPlaybackFun(val, start, end, streamMode = 1) {
            this.oWebControl.JS_RequestInterface({
                funcName: "startPlayback",
                argument: JSON.stringify({
                    cameraIndexCode: val,                   //监控点编号
                    startTimeStamp: start,  //录像查询开始时间戳,单位:秒
                    endTimeStamp: end,      //录像结束开始时间戳,单位:秒
                    streamMode: streamMode,
                    recordLocation: 0,                     //录像存储类型:0-中心存储,1-设备存储
                    transMode: 1,                               //传输协议:0-UDP,1-TCP
                    gpuMode: 0,                                   //是否启用GPU硬解,0-不启用,1-启用
                    wndId: this.wndId                                     //可指定播放窗口
                })
            }).then((oData) => {
                console.log('回放',oData)
            });
        },
        // RSA加密
        setEncrypt(value) {
            var encrypt = new jsencrypt.JSEncrypt();
            encrypt.setPublicKey(this.pubKey);
            return encrypt.encrypt(value);
        },
        // 推送消息
        cbIntegrationCallBack(oData) {
            // 窗口选中
            if (oData.responseMsg.type === 1) {
                this.winId = oData.responseMsg.msg.wndId
            }
            
        },
        // 设置窗口控制回调
        setCallbacks() {
            this.oWebControl.JS_SetWindowControlCallback({
                cbIntegrationCallBack: this.cbIntegrationCallBack,
            });
        },
        /* 获取公钥 */
        getPubKey(callback) {
            this.oWebControl.JS_RequestInterface({
                funcName: "getRSAPubKey",
                argument: JSON.stringify({
                    keyLength: 1024,
                }),
            }).then((oData) => {
                if (oData.responseMsg.data) {
                    this.pubKey = oData.responseMsg.data;
                    callback();
                }
            });
        },
        // 加载插件
        initPlugin() {
            let _this = this;
            this.oWebControl = new control.WebControl({
                szPluginContainer: this.playWnd,
                iServicePortStart: 15900,
                iServicePortEnd: 15909,
                szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
                cbConnectSuccess: function () {
                    _this.setCallbacks();
                    _this.oWebControl
                        .JS_StartService("window", { dllPath: "./VideoPluginConnect.dll"}).then(() => {
                            _this.oWebControl.JS_CreateWnd(_this.playWnd, _this.w, _this.h).then(() => {
                                _this.init();
                            });
                        },
                        function () {}
                    );
                },
                cbConnectError: function () {
                    _this.oWebControl = null;
                    initCount ++;
                    if (initCount < 3) {                             
                        setTimeout(function () {
                            initPlugin();
                        }, 3000)
                    } else {
                        console.log('插件启动失败,请检查插件是否安装!')
                    }
                },
                cbConnectClose: function (bNormalClose) {
                    console.log("cbConnectClose");
                    _this.oWebControl = null;
                },
            });
        },
        // 重置窗口大小
        resetFun() {
            if (this.oWebControl != null) {
                this.oWebControl.JS_Resize(this.w, this.h);
                this.setWndCover();
            }
        },
    },

    destroyed() {
        this.oWebControl.JS_HideWnd();
        this.oWebControl.JS_DestroyWnd().then(
            function () {
                console.log("销毁插件窗口成功");
            },
            function () {
                console.log("销毁插件窗口失败");
            }
        );
    },
  };
  </script>
  <style scoped="scoped">
  .video-center {
    width: 100%;
    height: 100%;
  }
  </style>

不完整,自行补充

<template>
	<PreviewVideo
	   ref="webVideo"
	   :playMode="0"
	   :initData="initData"
	/>
</template>
<script>
export default {
  data() {
    return {
         initData: {
		    enableHttps: 0,
		    encryptedFields: "secret",
		    layout: "2x2", // 4个窗口
		    showSmart: 1,
		    showToolbar: 1,
		    snapDir: "D:SnapDir",
		    videoDir: "D:VideoDir",
		},
    }
  },
  method () {
  	//播放时调用
	videoPlayFun() {
		//预览
		//第三方标识,由海康提供,后端传回
		this.$refs['webVideo'].startPreviewFun(data.deviceNameEn)
		//回放,需要回放时间,若使用element的时间戳,需要/1000,变为秒单位
		//playMode传1
		this.$refs['webVideo'].startPlaybackFun(
	        data.deviceNameEn,
	        startTime,
	        endTime
	     )
  	}
  }
}
</script>
vue3+vite

playVideo传第三方标识,请自行修改以下变量值如上
可直接复制使用vue,点击播放
能直接使用,测试如下,可测试第三方标识能否使用
在这里插入图片描述

在这里插入图片描述

<template>
 <div class="video-center" ref="videoCenter">
  <div @click="playVideo('1005ede4f95a4447897b8fd1fa8cd6f7', 1)">"1005ede4f95a4447897b8fd1fa8cd6f7"</div>
  <div @click="playVideo('933d67747cb248ba93e0a65b5ac751ac', 2)">"933d67747cb248ba93e0a65b5ac751ac"</div>
  <div @click="playVideo('e77fa1c7d9f04c9b893a74d441d5a53b', 3)">"e77fa1c7d9f04c9b893a74d441d5a53b"</div>
    <div id="playWnd" class="playWnd"></div>
  </div>
</template>
<script setup lang="ts">
import { onMounted, ref, reactive, unref } from 'vue'
var initCount = 0;
var oWebControl = null
var pubKey = '';
// 创建播放实例
const initPlugin = () => {
      oWebControl = new WebControl({
      szPluginContainer: "playWnd",                       // 指定容器id
			iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
			iServicePortEnd: 15900,                             
			szClassId:"23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",   // 用于IE10使用ActiveX的clsid
			cbConnectSuccess: function () {                     // 创建WebControl实例成功											
				oWebControl.JS_StartService("window", {         // WebControl实例创建成功后需要启动服务
					dllPath: "./VideoPluginConnect.dll"         // 值"./VideoPluginConnect.dll"写死 
				}).then(function () {                           // 启动插件服务成功
					oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
						cbIntegrationCallBack: cbIntegrationCallBack
					});
					
					oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () { //JS_CreateWnd创建视频播放窗口,宽高可设定
						init();  // 创建播放实例成功后初始化
					});
				}, function () { // 启动插件服务失败
				});
			},
			cbConnectError: function () { // 创建WebControl实例失败
				oWebControl = null;
				WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序
				initCount ++;
				if (initCount < 3) {                             
					setTimeout(function () {
						initPlugin();
					}, 3000)
				} else {
          console.log('插件启动失败,请检查插件是否安装!')
					// $("#playWnd").html("插件启动失败,请检查插件是否安装!");
				}
			},
			cbConnectClose: function (bNormalClose) {            
				// 异常断开:bNormalClose = false
				// JS_Disconnect正常断开:bNormalClose = true	
				console.log("cbConnectClose");
				oWebControl = null;
        console.log('插件未启动,正在尝试启动,请稍候...')
				// $("#playWnd").html("插件未启动,正在尝试启动,请稍候...");
				WebControl.JS_WakeUp("VideoWebPlugin://");
				initCount ++;
				if (initCount < 3) {
					setTimeout(function () {
						initPlugin();
					}, 3000)
				} else {
          console.log('插件启动失败,请检查插件是否安装!')
					// $("#playWnd").html("插件启动失败,请检查插件是否安装!");
				}	
			}
		});
}
// 推送消息
const cbIntegrationCallBack = (oData) => {
  console.log(JSON.stringify(oData.responseMsg))
}
const init = () => 
    {
    getPubKey(function () {
  
  // 请自行修改以下变量值			
        var appkey = "20294202";                           //综合安防管理平台提供的appkey,必填
        var secret = setEncrypt("ndqCAFyke4t1jHY2r8Uy");   //综合安防管理平台提供的secret,必填
        var ip = "10.10.1.12";                           //综合安防管理平台IP地址,必填
        var playMode = 0;                                  //初始播放模式:0-预览,1-回放
        var port = 443;                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
        var snapDir = "D:\\SnapDir";                       //抓图存储路径
        var videoDir = "D:\\VideoDir";                     //紧急录像或录像剪辑存储路径
        var layout = "2x2";                                //playMode指定模式的布局
        var enableHTTPS = 1;                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
        var encryptedFields = 'secret';					   //加密字段,默认加密领域为secret
  var showToolbar = 1;                               //是否显示工具栏,0-不显示,非0-显示
  var showSmart = 1;                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
  var buttonIDs = "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769";  //自定义工具条按钮
  // 请自行修改以上变量值	

        oWebControl.JS_RequestInterface({
            funcName: "init",
            argument: JSON.stringify({
                appkey: appkey,                            //API网关提供的appkey
                secret: secret,                            //API网关提供的secret
                ip: ip,                                    //API网关IP地址
                playMode: playMode,                        //播放模式(决定显示预览还是回放界面)
                port: port,                                //端口
                snapDir: snapDir,                          //抓图存储路径
                videoDir: videoDir,                        //紧急录像或录像剪辑存储路径
                layout: layout,                            //布局
                enableHTTPS: enableHTTPS,                  //是否启用HTTPS协议
                encryptedFields: encryptedFields,          //加密字段
      showToolbar: showToolbar,                  //是否显示工具栏
      showSmart: showSmart,                      //是否显示智能信息
      buttonIDs: buttonIDs                       //自定义工具条按钮
            })
        }).then(function (oData) {
    oWebControl.JS_Resize(1000, 600);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
        });
    });
}

 //获取公钥
const getPubKey = (callback) => {
    oWebControl.JS_RequestInterface({
        funcName: "getRSAPubKey",
        argument: JSON.stringify({
            keyLength: 1024
        })
    }).then(function (oData) {
        console.log(oData);
        if (oData.responseMsg.data) {
            pubKey = oData.responseMsg.data;
            callback()
        }
    })
}

    //RSA加密
const setEncrypt = (value) => {
      var encrypt = new JSEncrypt();
      encrypt.setPublicKey(pubKey);
      return encrypt.encrypt(value);
}
onMounted(() => {
  initPlugin()
  window.addEventListener('unload', () => {
    if (oWebControl != null){
      oWebControl.JS_HideWnd();
    }
  })
  window.addEventListener('resize', () => {
    if (oWebControl != null) {
        oWebControl.JS_Resize(1000, 600);
        setWndCover();
    }
  })
  window.addEventListener('scroll', () => {
    if (oWebControl != null) {
        oWebControl.JS_Resize(1000, 600);
        setWndCover();
    }
  })
})
const setWndCover = () => {
    var iWidth = window.innerWidth;
    var iHeight = window.innerHeight;
    var oDivRect = document.querySelector("#playWnd").getBoundingClientRect();
    console.log('oDivRect', oDivRect)
      var iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left): 0;
      var iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top): 0;
      var iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0;
      var iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0;

      iCoverLeft = (iCoverLeft > 1000) ? 1000 : iCoverLeft;
      iCoverTop = (iCoverTop > 600) ? 600 : iCoverTop;
      iCoverRight = (iCoverRight > 1000) ? 1000 : iCoverRight;
      iCoverBottom = (iCoverBottom > 600) ? 600 : iCoverBottom;

  oWebControl.JS_RepairPartWindow(0, 0, 1001, 600);    // 多1个像素点防止还原后边界缺失一个像素条
      if (iCoverLeft != 0) {
    oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, 600);
      }
      if (iCoverTop != 0) {
          oWebControl.JS_CuttingPartWindow(0, 0, 1001, iCoverTop);    // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
      }
      if (iCoverRight != 0) {
          oWebControl.JS_CuttingPartWindow(1000 - iCoverRight, 0, iCoverRight, 600);
      }
      if (iCoverBottom != 0) {
          oWebControl.JS_CuttingPartWindow(0, 600 - iCoverBottom, 1000, iCoverBottom);
      }
}
const playVideo = (val:string, i) => {
  oWebControl.JS_RequestInterface({
      funcName: "startPreview",
      argument: JSON.stringify({
          cameraIndexCode:val,                //监控点编号
          streamMode: 0,                         //主子码流标识
          transMode: 1,                           //传输协议
          gpuMode: 0,                               //是否开启GPU硬解
          wndId:  i                                    //可指定播放窗口
      })
  })
}

</script>
<style>
 .playWnd {
        width: 1000px;                  /*播放容器的宽和高设定*/
        height: 600px;
        border: 1px solid red;
    }
</style>

2.H5视频播放器

vue3写法,将下载的文件复制到public下
在index.html 引入

<script src="/js/h5player.min.js"></script>

在这里插入图片描述

<!-- 海康插件 -->
<template>
  <div :id="props.playId" class="w-full"></div>
</template>
<script setup lang="ts">
const message = useMessage() // 消息弹窗
const props = defineProps({
  playId: {
    require: true,
    type: String,
    default: () => {
      return 'player'
    }
  }
})
const player = ref()
onMounted(() => {
  initPlayer()
  // 设置播放容器的宽高并监听窗口大小变化
  window.addEventListener('resize', () => {
    player.value.JS_Resize()
  })
})
const emit = defineEmits(['error'])
const initPlayer = () => {
  // @ts-ignore
  player.value = new JSPlugin({
    szId: props.playId,
    szBasePath: '/js',
    bSupporDoubleClickFull: true,
    // 当容器div#play_window有固定宽高时,可不传iWidth和iHeight,窗口大小将自适应容器宽高
    // iWidth: props.iWidth,
    // iHeight: props.iHeight,
    // 分屏播放,默认最大分屏4*4
    iMaxSplit: 4,
    iCurrentSplit: 1
  })
  // 事件回调绑定
  player.value.JS_SetWindowControlCallback({
    //插件选中窗口回调
    windowEventSelect: (iWndIndex) => {
      console.log('windowSelect callback: ', iWndIndex)
      wndIndex.value = iWndIndex
    },
    // @ts-ignore 取流失败,流中断等错误都会触发该回调函数
    pluginErrorHandler: (index, iErrorCode, oError) => {
      // 取流失败
      if (iErrorCode === '0x12f910011') emit('error')
    }
  })
}
const wndIndex = ref(0)
const createPlayer = (url: string, i = wndIndex.value) => {
  console.log('视频流地址:', url, props.playId)
  if (!url) return
  player.value.JS_Play(url, { playURL: url, mode: 0 }, i).then(
    () => {
      console.log('play success=============')
    },
    (err) => {
      // message.warning('播放失败!')
      console.info('JS_Play failed:', err)
    }
  )
}
// 分屏
const splitPlayer = (num) => {
  if (num === 1) wndIndex.value = 0
  player.value.JS_ArrangeWindow(num)
}
// 全屏
const fullScreen = (isFull) => {
  player.value.JS_FullScreenDisplay(isFull)
}
// 回放
const replayFun = (data) => {
	player.value
    .JS_Play(data.url, { playURL: data.url, mode: 0 }, 0, data.startTime, data.endTime)
     .then(
       () => {
         console.log('playbackStart success')
       },
       (err) => {
         console.info('JS_Play failed:', err)
       }
     )
}
// 设置窗口大小
const resizeFun = (iWidth, iHeight) => {
  player.value.JS_Resize(iWidth, iHeight)
}
const stopAllPlay = () => {
  player.value.JS_StopRealPlayAll().then(() => {
    console.info('JS_StopRealPlayAll success')
  })
}
const playerFun = {
  createPlayer,
  splitPlayer,
  fullScreen,
  replayFun,
  resizeFun,
  stopAllPlay
}
defineExpose({ playerFun })
</script>

不完整,自行补充

 <player class="w-full h-400px" ref="playRef" />

在这里插入图片描述
这是我本地的地址,需要后端返回类似的
ws和hls都试过可以播放,ws基本没延迟,优先使用

 unref(playRef).playerFun.createPlayer(item, index)
 
 回放时间格式要转为 format('YYYY-MM-DDTHH:mm:ss.SSSZ')
 unref(playRef).playerFun.replayFun({ ... })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/762318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.Android逆向协议-详解二次打包失败解决方案

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;3.Android逆向协议-APP反反编译及回编译 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…

前端学习笔记(2406261):jquery使用checkbox控制页面自动刷新

文章目录 需求登录页面主页面 API用户登录login获取数据getdata 代码登录页面主页面 关于后端 需求 这是一个物联网的演示项目&#xff0c;web端能够实时显示后台数据的变化&#xff0c;其流程非常简单&#xff1a; 用户登录登录成功后显示主界面面主界面进入后自动显示数据数…

为什么网络爬虫广泛使用HTTP代理?

一、引言 网络爬虫作为自动抓取互联网信息的重要工具&#xff0c;在现代社会中发挥着不可或缺的作用。然而随着网络环境的日益复杂&#xff0c;网站反爬虫技术的不断进步&#xff0c;网络爬虫在获取数据的过程中面临着越来越多的挑战。为了应对这些挑战&#xff0c;HTTP 代理成…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这篇文章带大家…

创建一个Django用户认证系统

目录 1、Django2、Django用户认证系统User 模型&#xff1a;Authentication 视图&#xff1a;认证后端 (Authentication Backends)&#xff1a;Form 类&#xff1a;中间件 (Middleware)&#xff1a;权限和组 (Permissions and Groups)&#xff1a; 3、创建一个django用户认证系…

科普文:一文搞懂jvm原理(二)类加载器

概叙 科普文&#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 前面我们介绍了jvm&#xff0c;jvm主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff0c;Execution engine(执行引擎) 子系统&#xff1b;Runtime data area (运行时数据区域)组件&am…

“一带一路”再奏强音!秘鲁总统博鲁阿尔特参访苏州金龙

6月27日下午&#xff0c;首次访华的秘鲁共和国总统博鲁阿尔特一行到苏州金龙参观访问&#xff0c;受到了苏州金龙总经理黄书平的热情接待。 黄书平&#xff08;左二&#xff09;向博鲁阿尔特&#xff08;右一&#xff09;介绍苏州金龙发展情况 从苏州金龙发展历程、产品技术研…

【UE5.1】Chaos物理系统基础——02 场系统的应用

目录 步骤 一、运用临时场&#xff08;外部张力&#xff09;破裂几何体集 二、使用构造场固定几何体集 步骤 在上一篇中&#xff08;【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体&#xff09;我们已经创建了可被破碎的几何体集&#xff0c;在最后我们防止几何体集…

基于K线最短路径构造的非流动性因子

下载地址https://download.csdn.net/download/SuiZuoZhuLiu/89492221

暴雨来袭,陈赫家变“水帘洞”网友:赫哥滴滴打船吗?

在魔都上海&#xff0c;一场突如其来的暴雨 不仅让街道变成了河流&#xff0c;还悄悄上演了一场现实版的“水帘洞”奇遇 而这场奇遇的主角&#xff0c;竟然是喜剧界的明星——陈赫&#xff01; 这天&#xff0c;乌云密布&#xff0c;电闪雷鸣 魔都的天空仿佛被捅了个窟窿 雨…

通过源码抽丝剥茧理解enable_shared_form_this/shared_ptr/weak_ptr智能指针实现原理

源码解析 首先先看如下简单代码,我们通过代码的顺序逐步解析 #include <iostream> #include <memory> using namespace std;class C :public enable_shared_from_this<C>{ public:C(){ std::cout<<"construct"<<endl; }~C(){ cout&l…

mqtt介绍和环境安装

Mqtt介绍 MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xff0c;是专为受限设备和低带宽、高延迟或不可靠的网络而设计。 下载一个开源的emqx服务器和…

ARM功耗管理软件之时钟电源树

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; 目录 一、时钟&电源树简介 二、时钟树示例 三、电源树示例 一、时钟&电源树简介 时钟门控与自…

iPhone苹果手机iOS18如何隐藏打开APP怎么找出来恢复隐藏APP?

iPhone苹果手机如何隐藏APP&#xff1f; 1、iPhone苹果手机上一些APP不想让别人看到可以设置为隐藏APP&#xff0c;请长按要设置隐藏的APP&#xff0c;选择需要面容ID&#xff1b; 2、然后再接着选择隐藏并需要面容ID&#xff0c;选择后手机桌面将不在显示该APP&#xff1b; i…

短剧挂载推广教程,短剧项目怎么分销推广?如何入驻平台当推广达人?达人推广的方式是怎么样的

目录 一、短剧怎么做&#xff1f; 二、在哪找资源挂?怎么挂? 1、在哪找资源挂? 2、怎么挂? 三、有哪些短剧看剧平台或者分销平台? 1&#xff1a;短剧看剧小程序怎么入驻当达人? 2&#xff1a;短剧cps分销小程序怎么入驻当达人? 一、短剧怎么做&#xff1f; 想要当…

[leetcode]minimum-absolute-difference-in-bst 二叉搜索树的最小绝对差

. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(null…

Meta低头,库克认错,XR回归第一性原理

图片&#xff5c;Photo by Maxim Hopman on Unsplash ©自象限原创 作者丨罗辑 2024年&#xff0c;XR的故事应该怎么讲&#xff1f; 如果从数据上看&#xff0c;这应该是个沉重的话题。 根据 IDC 报告&#xff0c;2023 年全球 VR 市场出货量下滑了 10.7%。2024 年第一…

安全为基、创新驱动,Soul App创始人张璐团队大力筑牢社交平台发展之基

随着技术的不断进步,AIGC在各个领域的应用日益广泛。在社交领域,AIGC社交为用户带来了更加高质量、个性化的社交体验,但同时也伴随着数据隐私泄露、网络诈骗和不良信息误导等风险。因此,社交平台在抓住AIGC技术发展机遇的同时,也要警惕技术所带来的风险。新型社交平台Soul App坚…

离线应用PWA-service work

1.有时候希望没有网络的时候,也可以正常的访问对应的页面,就需要用到service work 进行对应的配置,可以当页面的配置 也可以多页面的配置,单页面配置比较麻烦 就以uniapp框架为基础 来配置service work 一 配置 manifest 文件 (此manifest和uniapp 的 manifest.不是同…