Html5网页中用JavaScript调用本地手机摄像头扫描识别微信二维码、条形码:postMessage跨域https传递扫码结果消息


发布者 ourjs  发布时间 1590639140637
关键字 JavaScript  Html5  Node.JS 

QR Scanner

qr-scanner是一个支持HTML5网页扫描条形码、二维码的开源库。

轻量级:〜48.7 kB(〜12.4 kB压缩后)。
性能优内存占用少。
在WebWorker中运行,不阻塞主进程
在彩色QR码上获得性能优
根据我们的基准测试,该项目较jsqrcode提升约2-3倍。
错误识别率低。
支持扫描网络摄像头的以及扫描图片文件。

项目地址:https://github.com/nimiq/qr-scanner
项目示例:https://nimiq.github.io/qr-scanner/demo

效果:

 

使用摄像头扫描时需要使用HTTPS连接。

 

QR Code Scanner

这是另一个在HTML5网页中利用摄像头扫码的示例,使用全屏扫码,并带有动画效果,同样只支持HTTPS。

https://github.com/code-kotis/qr-code-scanner

 

BarCode 一维码扫描

QuaggaJS是完全用JavaScript编写的条形码扫描器,支持实时定位和解码各种类型的条形码,例如EAN,CODE 128,CODE 39,EAN 8,UPC-A,UPC-C,I2of5、2of5,CODE 93和 CODABAR。 

https://github.com/serratus/quaggaJS

 

本地调用摄像头扫码解决思路

postMessage [放弃]

出于安全考虑,网页只允许在HTTPS连接的情况下,打开摄像头。如果是本地域名,可以使用如下解决调用摄像头扫码:

1) 架设一台HTTPS扫码服务器,为https域名

2) 本地网页i用frame嵌套一个HTTPS页面,将本域名 origin 参数传递给 https 页面

3) 本地网页侦听事件: window.addEventListener('message', function() { console.log('message', arguments) }, false)

4) https 页面扫码后发送事件并带orgian域名,如: parent.window.postMessage('areyou ok', 'http://192.168.2.105:8064') 

注意* 以上步骤仅支持嵌套的 iframe 向父级 postMessage。使用 window.open 打开的页面仅在同域名情况下能 postMessage 传递消息,否则会报错:

parent.window.postMessage('areyou ok', 'http://192.168.2.105:8064')
undefined
VM739:1 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('http://192.168.2.105:8064') does not match the recipient window's origin ('https://abcdeefdXXX.com').

 此方法消息机制正常,但在手机上测试发现,最新版的手机不允许http嵌套的https页面打开摄像头,此方案己不可行。

 

localStorage

与上文方法类似:

1)制作一个后端页面,用来生成写locaStorage的script代码

2) 本地页面点击扫码后,将回调地址给 https 扫码页面,启动timer检查

 $idScan.on('click', function(e) {
e.preventDefault()
var callbak = window.origin + '/oncedb-extension/json/data/scanqr/'
var url = $idScan.attr('href') + '?callbak=' + encodeURIComponent(callbak)

window.open(url)
setQRTimer()
})

3)https完成扫码完成后将值写入回调地址并跳转

4)回调页面在后台输出写入 localStorage 的脚本到前端执行,代码采用 onceio 编写

app.get('/oncedb-extension/json/data/scanqr/:value$', function(req, res) {
var value = req.params.value
var msgInfo = { type: 'qrscan', result: value }

var script = `<script>
window.localStorage.setItem("qrcode", "${value}");
window.close();
</script>`

res.send(script)
})

5) 扫码发起页面刷新检测 localStorage,有值则停止检测,将扫码结果填入输入框

var qrCodeTimer
var setQRTimer = function() {
if (qrCodeTimer) {
return
}

qrCodeTimer = setInterval(function() {
var qrcode = localStorage.getItem('qrcode')
if (!qrcode) {
return
}

clearInterval(qrCodeTimer)
qrCodeTimer = null
localStorage.removeItem('qrcode')

$id.val(qrcode)
gotoByID()
}, 1000)
}

 









 热门文章 - 分享最多
  1. JavaScript设置对象属性只读不可修改、不可枚举、不可删除:Object.defineProperty
  2. CSS教程:图片使用混合模式和颜色叠加filter滤镜,改变PNG图标颜色
  3. CSS教程:如何设置自动显示隐藏scrollbar滚动条,自定义外观样式/宽度,附demo示例大全
  4. node.js通过Error.prepareStackTrace获取上层调用函数的文件名地址和行数位置
  5. JavaScript判断字符串是否为数字类型:Number.isInteger、isNaN、正则表达式比较
  6. webpack前端项目调试环境安装入门:webpack.config.js禁用UglifyJs只合并JavaScript不压缩混淆代码
  7. node.js创建aria2代理服务器:使用net.socket转发rpc或http request请求,替换websocket
  8. request停止维护:用node.js实现http网页爬虫抓取,模拟ajax\post请求,大文件上传下载
  9. 用node.js在Windows或Linux平台上高性能解压/压缩zip、tar大文件,输出到文件或Stream流
  10. OnceDB:使用Redis全文字符串模糊搜索,多条件查询,创建索引搜索等使用帮助教程

 相关阅读
  1. Node.JS如何按顺序调用async函数,如何判断是否为async函数,在mocha中自动化测试async/await代码
  2. node.js将回调函数嵌套,用promise改造成async/await顺序执行:异常处理和返回多个参数
  3. 使用node.js和oAuth2协议集成Github/LinkedIn第三方登录以OnceOA模块源码为例
  4. JavaScript在Array数组中按指定位置删除或添加元素对象
  5. node.js含有%百分号时,发送get请求时浏览器地址自动编码的问题
  6. 让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
  7. Facebook发布全新JavaScript引擎Hermes:越来越像Java字节码,JS要统一全端?
  8. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  9. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  10. JavaScript求一个字符串的字节长度

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA