js脚本必备–图片验证码识别
如何解决,下来一起看看吧
1. 介绍
- 想必做自动化脚本的都遇到过图片验证码识别的问题,今天发现一个比较牛的工具—百度智能云,它提供了一些免费的api可以来帮助识别各种文字、验证码等等等、功能下面介绍
2. 准备
- 注册百度智能云
- 依次点击,进入文字识别页面,可以看到有很多功能
-
然后去领取免费的资源
这里按需领取,你全勾选也ok, 这里我就选择通用文字识别了
领取完成后,点击应用列表,我们去创建一个应用
- 点击创建应用
ok, 这个就是你的应用了, 复制你的appid 和 api key,后面请求接口会用到,然后点击API在线调试
将刚才复制的搞到这里,懂得都懂
- 可以选择语言,这里选node.js
-
我们就以这样验证码为例
-
将图片的url放到这,点击调试, 可以看到结果
-
发现多了一个空格,我们js处理一下str.replace(/\s/g, ''); # 将空格替换掉
-
众所周知, 图片验证码使用url的时候会再请求一次,导致验证码变化
-
所以这里我们将图片转为base64位编码来(后面有代码演示)
-
放到这里
-
-
所以我们需要将验证码图片保存到本地(可使用
html2canvas
库来实现。html2canvas
可以将任意HTML元素转换为Canvas对象,然后可以将Canvas对象转换为图片。)
-
3. js使用
这里我就直接将验证码图片下载下来方便演示
- base64方式
- 这里我使用axios
const axios = require('axios');
const fs = require('fs');
const API_KEY = "NGcY7njMWblMEMGDGUGaNCWs"
const SECRET_KEY = "iw9wAAmBUPZk72GXAzvcA0rq1uyLp6LR"
// 获取access_token
function getAccessToken() {
return new Promise(function (resolve, reject) {
let url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY
axios.post(url).then(function (response) {
data = response.data.access_token
resolve(data);
}).catch(function (error) {
console.log(error);
});
})
}
async function main() {
let url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + await getAccessToken()
let headers = {
"headers": {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
}
}
// 这里我就直接用本地图片了,方便演示
let data = {
'image': 'data:image/png;base64,' + await convertImageToBase64('./js_es6/js/result.png')
}
axios.post(url, data, headers).then(response => {
console.log(response.data.words_result[0].words)
}).catch(err => {
console.log(err, "err")
})
}
// 将图片转为转base64编码
function convertImageToBase64(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, function (error, data) {
if (error) {
reject(error);
} else {
const base64String = data.toString('base64');
resolve(base64String);
}
});
});
}
main()
// ok解决
总结
- 这个接口是一个月1000次免费,平民玩家足以
- 百度智能云功能强大,要想识别率高—>充钱使你强大
- 喜欢三连