利用现代浏览器所提供的强大 API 录制,回放并保存任意界面中的用户操作
English | 简体中文
利用现代浏览器的强大api
(MediaDevices.getDisplayMedia()) 录制并回放用户任意界面(不限于浏览器中)的操作,并提供主动上报的功能以及管理系统。
- 🧱 开发:
- 前端库使用webpack打包为 umd。
- 后端使用NestJS,全链路开发和设计工具体系。
- 后端前端页使用Vue 3+Element Plus更现代。
- 📦 开箱即用。
- 🌀 无依赖。
- 🛡 100% TypeScript 开发,尽量规避愚蠢错误。
- ⚙️ 提供管理系统,并可独立使用。
- 所有现代浏览器。
IE / Edge | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|
IE 全版本不支持, Edge 79 及以上 | 66 及以上 | 72 及以上 | 13 及以上 | 60 及以上 |
使用 yarn
$ yarn add op-rec
使用 npm
$ npm install op-rec --save
在浏览器中
使用CDN
<script type="text/javascript" src="//unpkg.com/op-rec@latest"></script>
或
<script type="text/javascript" src="op-rec.js"></script>
或
<script type="text/javascript" src="op-rec.min.js"></script>
在Release中下载并解压,配置.env
里面的参数。
安装依赖
$ yarn
# 或
$ npm i
启动
$ node main.js
-
vue
<template> <video controls autoplay ref="video"></video> </template> <script> import OpRec from "op-rec"; export default { data() { return {}; }, mounted() { const or = new OpRec(); or.on("startREC", this.startREC); }, methods: { startREC(stream) { this.$refs.video.srcObject = stream; }, }, }; </script>
-
react
import React from "react"; import ReactDOM from "react-dom"; import OpRec from "op-rec"; class App extends React.Component { componentDidMount() { const or = new OpRec(); or.on("startREC", this.startREC); } startRec(stream) { ReactDOM.findDOMNode(this.refs.video).srcObject = stream; } render() { return ( <div> <video ref="video" controls autoplay></video> </div> ); } } ReactDOM.render(<App />, document.getElementById("container"));
-
原生
<script type="text/javascript" src="op-rec.js"></script> <body> <video controls autoplay></video> </body> <script> const video = document.querySelector("video"); const or = new OpRec(); or.on("startREC", function (stream) { video.srcObject = stream; }); </script>
$ git clone clone https://github.com/asdjgfr/operationRecord.git
# 开发前端库
$ cd operationRecord/src/op-rec
$ yarn
$ yarn dev
# 开发服务端
$ cd operationRecord/src/server
$ yarn
$ yarn dev
# 开发服务端前端页面
$ cd operationRecord/src/server-client
$ yarn
$ yarn dev
日志等级
- emerg: 0
- alert: 1
- crit: 2
- err: 3
- warning: 4
- notice: 5
- info: 6
- debug: 7
LoggerItem
记录对象
-
level: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
等级
-
content: string
日志内容
-
timestamp: number
生成日志时的时间戳
OpRec()
创建一个新的录制实例。
url 可选
完成后上传的地址,默认为 local,地址为 local 的时候会本地生成并下载。
fetchConfig 可选
fetch 的配置。
mediaConstraints 可选
mimeType 可选
mime 类型,默认会选择最佳类型。
lang 可选
语言,默认 zh,暂时只有 zh。
hotKeys 可选,预留,尚未支持
快捷键。
dom 可选
自动生成的 dom 配置。
- show: boolean
- style:{key:value}
dom 为 false 或 dom.show 为 false 的时候将不会生成操作的标签。
onStartREC 可选
开始录制时的回调,可使用**OpRec.prototype.on("startREC",cb)**替代。
onStopREC 可选
结束录制时的回调,可使用**OpRec.prototype.on("stopREC",cb)**替代。
onPauseREC 可选
暂停录制时的回调,可使用**OpRec.prototype.on("pauseREC",cb)**替代。
onResumeREC 可选
继续录制时的回调,可使用**OpRec.prototype.on("resumeREC",cb)**替代。
CSP 可选
用于设置style
的nonce
属性。由于在内部配置DOM
的时候创建了inline-style
标签,这与CSP产生了冲突,配置此项的与meta
中的style-src
配合使用。
OpRec.prototype.DOM (HTMLElement | undefined)
用于 ui 操作的 dom,当DomOptions.show
为false
的时候返回undefined
。
OpRec.prototype.startTime (number)
录制开始时的时间戳,默认为 0。
OpRec.prototype.status ("recording" | "stop" | "paused" | "inactive")
当前状态,默认为 stop。
OpRec.prototype.recordedChunks (Blob[])
包含媒体数据的Blob
,默认为 []。
OpRec.prototype.logs (LoggerItem[])
记录集合,默认为 []。
OpRec.prototype.logs (LoggerItem[])
记录集合,默认为 []。
OpRec.prototype.mediaRecorder (MediaRecorder | undefined)
MediaRecorder 实例。
OpRec.prototype.stream (MediaStream | undefined)
MediaStream。
OpRec.prototype.mimeType (string | undefined)
mime 类型。
OpRec.prototype.startREC()
开始录制,这是一个异步方法。
OpRec.prototype.stopREC()
结束录制。
OpRec.prototype.toggleREC()
切换录制状态。
OpRec.prototype.on(type,cb)
event 事件。
OpRec.prototype.logger(loggerLever,ErrorEvent|string)
- loggerLever:"emerg" | "alert" | "crit" | "err" | "warning" | "notice" | "info" | "debug" | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
主动提交记录,第一个参数为记录等级,第二个参数为日志信息。
OpRec.prototype.getSupportedMimeTypes()
获取当前运行环境支持的 Mime 类型。
OpRec.prototype.getBlob()
获取录制后的 Blob。
OpRec.prototype.getExtname()
获取录制的后缀。
OpRec.prototype.reset()
重置状态。
由于mysql
的库并不支持mysql 8
新版的加密方式,所以使用8.x
需要修改默认的加密方式:
$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
然后刷新:
$ flush privileges;
或者切换为5.x
版本。
欢迎PR