node辨認驗證碼

相識考證碼

什麼是考證碼?

所謂考證碼,就是將一串隨機發生的数字或標記,天生一幅圖片,圖片里加上一些滋擾象素(防備OCR),由用戶肉眼辨認其中的考證碼信息,輸入表單提交網站考證,考證勝利后才運用某項功用,淺顯說就是一種辨別用戶是計算機和人的大眾全自動順序

考證碼的作用

能夠防備歹意破解暗碼、刷票、論壇注水,有用防備某個黑客對某一個特定註冊用戶用特定順序暴力破解體式格局舉行不停的上岸嘗試,所運用考證碼手藝是如今許多網站通行的體式格局(比方招商銀行的網上個人銀行,百度社區)。

沒有考證碼上岸,黑客會越發輕易破解你的賬號,經由過程組合碼刷機等黑客手藝來破取你的暗碼,有了考證碼相當於加了一層很厚的屏蔽,安全係數很高。

罕見的考證碼

  1. 隨機的四位数字的組合,這是最原始的考證碼
  2. 隨機数字圖片考證碼,圖片上的字符比較中規中矩,考證作用比上一個好
  3. 隨機数字+隨機大小寫英文字母圖片考證碼,每革新一次,每一個字符還會變位置
  4. 隨機数字+隨機大小寫英文字母+隨機滋擾像素+隨機位置圖片考證碼,比上一個考證作用更好,不容易辨認

怎樣辨認考證碼的內容?

所須要的東西:

Tesseract

辨認東西,現在由Google保護,支撐中文,默許的辨認率很低,特別是中文,然則能夠本身供應樣本,練習進步辨認率。

裝置:

brew install tesseract --all-languages // MAC裝置
npm install node-tesseract // // windows裝置

在DOS窗口輸入:tesseract,顯現如圖則證實裝置勝利

《node辨認驗證碼》

敕令行運用要領:

tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile…]

imagename為目的圖片文件名,需加花樣後綴;outputbase是轉換結果文件名;lang是言語稱號(在Tesseract-OCR中tessdata文件夾可看到以eng開首的言語文件eng.traineddata),如不標-l eng則默許為eng;pagesegmode則是天生結果顯現相干設置。

比方:

tesseract 1.jpg result -psm 7 

tesseract code.jpg result -l chi_sim -psm 7 //  -l chi_sim 示意用簡體中文字庫, -psm 7 示意通知tesseract code.jpg圖片是一行文本,這個參數能夠削減辨認錯誤率,默許為3

node運用要領(官方示例):

var tesseract = require('node-tesseract');

// Recognize text of any language in any format
tesseract.process(__dirname + '/path/to/image.jpg',function(err, text) {
    if(err) {
        console.error(err);
    } else {
        console.log(text);
    }
});

// Recognize German text in a single uniform block of text and set the binary path

var options = {
    l: 'deu',
    psm: 6,
    binary: '/usr/local/bin/tesseract'
};

tesseract.process(__dirname + '/path/to/image.jpg', options, function(err, text) {
    if(err) {
        console.error(err);
    } else {
        console.log(text);
    }
});

運轉結果:

《node辨認驗證碼》《node辨認驗證碼》

《node辨認驗證碼》《node辨認驗證碼》

嘗試挪用此要領後會在當地文件天生一個對應的txt文件,內容即為辨認內容。能夠看出來,關於簡樸清晰的考證碼辨認還比較正確,然則關於帶有噪點或許其他影響的辨認結果的就很坑,完整辨認不出來,所以我們須要對圖片舉行一些處置懲罰,比方進步圖片的閾值,比方設置為55%,能夠用ps等軟件完成,然則node中已經有響應的包graphicsmagick,能夠對圖象舉行這類處置懲罰,比較輕易。

graphicsmagick

異常有用的圖象處置懲罰東西,平常背景想要處置懲罰圖片就須要下載
graphicsmagick,能夠輕易完成比方:製造縮略圖、頭像剪切等功用。

考證碼的辨認勝利率跟圖片質量關係密切,平常拿到后的考證碼都得經由灰度化,二值化,去噪,應用graphicsmagick就能夠很輕易的做到。

裝置:

brew install imagemagick
brew install graphicsmagick // Mac裝置

npm install gm // windows裝置

敕令行運用要領:

gm convert 1.jpg -thumbnail "100x100!" output_1.jpg  // 非等比縮圖,天生的圖片大小是:100x100

gm convert 1.jpg 1.pdf  // 花樣轉換

node運用要領(官方示例):

var fs = require('fs')
  , gm = require('gm');

// resize and remove EXIF profile data
gm('/path/to/my/img.jpg')
.resize(240, 240)
.noProfile()
.write('/path/to/resize.png', function (err) {
  if (!err) console.log('done');
});

// some files would not be resized appropriately
// http://stackoverflow.com/questions/5870466/imagemagick-incorrect-dimensions
// you have two options:
// use the '!' flag to ignore aspect ratio
gm('/path/to/my/img.jpg')
.resize(240, 240, '!')
.write('/path/to/resize.png', function (err) {
  if (!err) console.log('done');
});

運轉結果:
《node辨認驗證碼》《node辨認驗證碼》《node辨認驗證碼》

能夠看出,gm勝利將這個圖片舉行裁剪或許轉換為pdf花樣,運用很輕易。

運用node辨認考證碼示例

新建項目目次

在適宜的磁盤目次下建立項目目次
node-orc

初始化項目

1.進入
node-orc文件夾下

2.實行
npm init,初始化
package.json文件

裝置依靠包

1.
npm install gm

2.
npm install node-tesseract

新建index.js,寫入代碼以下:

var fs        = require('fs');
var tesseract = require('node-tesseract');
var gm        = require('gm');

/**
 * 對圖片舉行閾值處置懲罰(默許55)
 */
function disposeImg (imgPath, newPath, thresholdValue) {
  return new Promise((resolve, reject) => {
    gm(imgPath)
      .threshold(thresholdValue || 55)
      .write(newPath, (err)=> {
        if (err) return reject(err);
        resolve(newPath);
      });
  });
}

/**
 * 辨認閾值化後圖片內容
 */
function recognizeImg (imgPath, options) {
  options = Object.assign({psm: 8}, options);
  // options = Object.assign({l: 'chi_sim'}, options); // 辨認中文

  return new Promise((resolve, reject) => {
    tesseract
      .process(imgPath, options, (err, text) => {
        if (err) return reject(err);
        resolve(text.replace(/[\r\n\s]/gm, '')); // 去掉辨認結果中的換行回車空格
      });
  });
}

async function recognize(imgPath, newPath, thresholdValue) {
  try {
    const newImgPath = await disposeImg(imgPath, newPath, thresholdValue)
    const result = await recognizeImg(newImgPath)
    console.log(`辨認結果:${result}`)
  } catch (err) {
    console.error(`辨認失利:${err}`);
  }
}

recognize('1.jpg', 'test_1.jpg')

運轉代碼

進入當前目次,運轉
node index即可直接打印出當前辨認的結果

辨認結果
《node辨認驗證碼》《node辨認驗證碼》

《node辨認驗證碼》《node辨認驗證碼》

《node辨認驗證碼》《node辨認驗證碼》

能夠看到比之前的辨認率高許多,然則照樣細節輕易辨認不夠好,不夠完美,感興趣的能夠看看tesseract練習,練習一個本身的辨認庫,精確度會進步許多

注重:
windows直接運轉代碼會提醒Could not execute GraphicsMagick/ImageMagick: gm "convert",這是由於Windows體系找不到gm中的convert敕令,所以須要我們裝置個客戶端東西GraphicsMagick(下載的時刻要下載Q8版本的),然後,由於convert這個敕令實行須要特定的環境,所以我們須要在電腦的環境變量中加gm.exe的地點目次

關於中文的辨認

現在這個庫只能辨認英文,中文直接是亂碼,怎樣辨認中文呢?

我們能夠下載一其中文庫,下載地點以下:
https://pan.baidu.com/s/13DCN…,並下載
Tesseract-OCR裝置包,
tesseract裝置目次的
tessdata文件是寄存言語庫的,能夠將解壓后的文件放入這個文件夾下,字庫文件擴大名為.
raineddata 簡體中文字庫文件名為
chi_sim.traineddata,運用的時刻帶上言語範例即可,比方:
tesseract 7.jpg result -l chi_sim

中文辨認結果:

《node辨認驗證碼》《node辨認驗證碼》

末了總結

  1. 關於簡樸的考證碼直接用Tesseract辨認
  2. 關於一些有噪點或許其他影響的考證碼能夠經由過程graphicsmagick舉行圖象處置懲罰,再用Tesseract辨認
  3. 關於中文或許其他言語的辨認須要零丁下載相干的言語庫並放到tessData文件夾下,並在Tesseract辨認代碼中設置一下

全部辨認結果照樣不夠完美,想要辨認結果的正確度更高,能夠對代碼舉行Tesseract練習,由於這個輕微複雜點,之後會繼承相識,願望人人多多交換斧正!

相干代碼

本文相干代碼和圖片github地點:

https://github.com/fighting12…

    原文作者:soEasy
    原文地址: https://segmentfault.com/a/1190000015134802
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞