起因
因為有這樣一件事情,需要獲取身份證正面照中的姓名和身份證號,如果全部通過眼看手敲的話,很費事,而且浪費時間,當時能想如果能自動化執行就好了。
實現
影像識別Api
圖片識別暫時還沒有接觸過,所以就去找了能夠提供影像識別的第三方應用,這邊我是用的是Face++
- 登陸註冊並完善相關資訊後,提供了
AppKey
和AppSecret
來呼叫提供的Api - 在使用
Postman
簡單測試後,發現可行,post請求後,提供的介面會返回一組身份的資訊JSON資料
Postman 是通過能強大的網頁除錯與傳送網頁HTTP請求,並能執行測試用例的的Chrome外掛,現在提供了客戶端。只要在GUI介面裡,填寫相應的URl和資料,選擇相應的方法,
POST
、GET
、PUT
、DELETE
,就能夠將結果返回回來,不需要編寫程式碼。官網連結
Nodejs實現
我是在mac的終端下開發的,如果是window環境系,部分命令不適用,需要替換合適的命令。
- 目錄結構
/**
* images 資原始檔
* package.json 執行npm init 後會自動生產
* index.js 實現的邏輯檔案
*/
- idCard
- index.js
- images
- ***.jpg
- ***.png
- ....
- package.json
複製程式碼
-
安裝
shelljs
包npm install shelljs
因為需要簡單的shell命令執行 -
index.js實現(比較簡單)
var shell = require('shelljs')
var images = shell.exec('ls ./images/*', {silent: true}).toString()
var arr = images.split('\n')
var api_key = 'xxx' // 自己申請的apikey
var api_secret = 'xxx' // 自己申請的api_secret
var result = []
for (var item in arr) {
(function(item) {
setTimeout(function() {
var tmp = '@' + arr[item]
if (tmp == '@') {
return
}
var cmd = 'curl -X POST "https://api-cn.faceplusplus.com/cardpp/v1/ocridcard" -F "api_key="' + api_key + '" -F "api_secret="' + api_secret + '" -F "image_file=' + tmp + '"'
var res = shell.exec(cmd, {silent: true}).toString()
result.push(res)
if (item == arr.length - 2) {
for (var index in result) {
var res = JSON.parse(result[index])
if (typeof res.cards == 'object') {
console.log(res.cards[0].name + ' ' + res.cards[0].id_card_number)
} else {
console.log(result[item])
}
}
}
}, item * 1000)
}(item))
}
複製程式碼
為什麼要寫成setTimeout,而不是直接執行?是因為如果一次請求過多,api介面會返回一個error_message
,說當前介面請求過多,所以每次延時執行,保證不會丟失資料
- 執行
node index
,即會列印出姓名 + 身份證號
主要就是用到了閉包,很簡單=_=||