您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)大數(shù)據(jù)中自動(dòng)化“滑板驗(yàn)證”實(shí)現(xiàn)賬密登錄的解決思路是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
很早以前只要使用賬號(hào)和密碼,就可以實(shí)現(xiàn)網(wǎng)站自動(dòng)化登錄。但是后來(lái)網(wǎng)站的登錄驗(yàn)證逐步升級(jí),出現(xiàn)了滑塊驗(yàn)證。實(shí)際上更多更復(fù)雜的新驗(yàn)證方法不斷出現(xiàn)(滑塊驗(yàn)證已經(jīng)屬于比較傳統(tǒng)的驗(yàn)證方法了)。但是對(duì)圖像處理的思路還可以借鑒一下。
首先,我們使用賬密登錄。
然后頁(yè)面會(huì)彈出滑板掩碼的圖片如下。
在早期,網(wǎng)站會(huì)給出兩幅圖片,一副是有滑塊的圖像,一副是沒(méi)有滑塊的圖像。
請(qǐng)注意這里“滑板”和“滑塊”的區(qū)別:
“滑板”是整個(gè)圖片,
“滑塊”是下圖中左側(cè)的小方塊,
驗(yàn)證方法是拖動(dòng)滑塊到右側(cè)顏色空缺的位置。
但是到了后期,為了增加登錄難度,只給出一副圖像,就是包含了滑塊的滑板圖像。
所以,為了實(shí)現(xiàn)圖像識(shí)別,首先我們不得不消除滑塊。方法是:設(shè)置滑塊元素的隱藏。
我們使用node.js的puppeteer包。這個(gè)包能夠?qū)?yè)面元素進(jìn)行操作。
隱藏滑塊的代碼是:
await frame_slider.$eval('.tcaptcha-jpp', (el, value)=> el.setAttribute('style', value), 'visibility: hidden');
然后圖像就變成下面的樣子了(左側(cè)的滑塊消失了)。
為了將滑塊移動(dòng)到缺口位置,首先我們要計(jì)算缺口位置的坐標(biāo)。
圖像由像素點(diǎn)組成。每個(gè)像素點(diǎn)包含三個(gè)顏色:紅色(Red)、綠色(Green)、藍(lán)色(Blue)。就是通常所說(shuō)的RGB。后來(lái)又增加了一個(gè)透明度的標(biāo)識(shí)Alpha。于是每個(gè)像素點(diǎn)就有四個(gè)值:RGBA。
我們使用getPixels得到圖片的像素集合,再轉(zhuǎn)化成Buffer。
const pixels = await util.promisify(getPixels)(path).catch((e) => {console.log('----->e is: ', e)})const buf = Buffer.from(pixels.data);
于是我們就等到了整幅圖像的RGBA數(shù)據(jù)。
本文關(guān)鍵的解決思路如下:
1、取每行每列的RGB值;
2、將每列的RGB值,與其前一列的RGB值比較(得到RGB的差);
3、觀察差值的范圍,然后取一個(gè)可識(shí)別出缺口位置的閾值,我取了50;
4、取閾值為50的含義是:當(dāng)差值大于50的時(shí)候,設(shè)置標(biāo)識(shí)為1,否則設(shè)置標(biāo)識(shí)為0;
5、然后將所有的列的標(biāo)識(shí)(1或 0)相加,得到每列標(biāo)識(shí)的合計(jì)數(shù);
6、排名第一和第二的列的列數(shù),就是缺口的左邊和右邊的位置;
7、列數(shù)小的為缺口的左側(cè),列數(shù)大的為缺口的右側(cè)。
8、獲得了缺口的位置,將滑塊拖動(dòng)到這個(gè)位置,就實(shí)現(xiàn)了滑塊驗(yàn)證。如下圖:
到此,滑板驗(yàn)證完成了,即實(shí)現(xiàn)了自動(dòng)化登錄。
參考了很多確定圖像缺口的代碼中,比較多的方法都很難實(shí)現(xiàn)近乎100%的準(zhǔn)確性。但是上述方法幾乎實(shí)現(xiàn)。所以這種解決方法值得參考。
完整代碼如下:
const getPixels = require("get-pixels");
const util = require('util');
(async ()=> {
path = 'images/origin.png';
const pixels = await util.promisify(getPixels)(path).catch((e) => {console.log('----->e is: ', e)})
const buf = Buffer.from(pixels.data);
let bl = buf.toJSON().data.length/4
let btoj = buf.toJSON().data
let buf1 = []
for (var i=0; i<bl; i++) {
var j = i*4
buf1.push(btoj.slice(j,j+4))
}
let slider_bkg_width = 340
let slider_bkg_height = 195
let buf2 = []
for (var i=0; i<slider_bkg_height; i++) {
var j = i*slider_bkg_width
buf2.push(buf1.slice(j,j+slider_bkg_width))
}
let slider_block_height = 68 // 滑塊的高度
let slider_bkg_end = 339 // =340-1, 滑板的寬度,從最右側(cè)開始進(jìn)行掃描
let slider_bkg_top = 64 // 滑板的頂部
let slider_bkg_bottom = 259 // 滑板的底部
let sliger_bkg_height = 195 // 259 - 64
let slider_bkg_half_width = 169 // =340/2-1, 缺口位置一般都是滑板的右半部分,所以掃描結(jié)束位置,定在滑板的中線
let col_compu = []
for (var rgba=0; rgba<3; rgba++) { // 一個(gè)RGBA單元包含4個(gè)元素,循環(huán)取前 3 個(gè)
for (var t=0; t<sliger_bkg_height; t++) { // t 代表每一行,從滑塊的 top 位置開始,一共掃描 68 行,也就是滑塊的高度
for (var w=slider_bkg_end; w>slider_bkg_half_width; w--) { // w 代表每一列,從340列開始到170列為止,一共170列,代表從右向左數(shù)的滑板寬度的一半
col_compu.push({'col':w,'count':(buf2.slice(t,t+1)[0][w-1][rgba] - buf2.slice(t,t+1)[0][w][rgba])>50?1:0})
}
}
}
var result = {}
// 計(jì)算每一列的合計(jì)數(shù)
col_compu.map(i => result[i.col] = (result[i.col] || 0) + i.count)
// 排序
var keys = Object.keys(result).sort();
var comp = 0
var comp_col = 0
for (var ttt=0; ttt<keys.length; ttt++) {
[comp_col, comp] = result[keys[ttt]] > comp ? [keys[ttt], result[keys[ttt]]] : [comp_col, comp]
}
console.log('----->comp is: ', comp)
console.log('----->comp_col is: ', comp_col)
var result2 = result
result2[comp_col] = 0
var keys2 = Object.keys(result2).sort();
var comp2 = 0
var comp_col2 = 0
for (var tttt=0; tttt<keys2.length; tttt++) {
[comp_col2, comp2] = result2[keys2[tttt]] > comp2 ? [keys2[tttt], result2[keys2[tttt]]] : [comp_col2, comp2]
}
let realcol = comp_col<comp_col2?comp_col:comp_col2
console.log('=====----->realcol is: ', realcol)
})();
以上就是大數(shù)據(jù)中自動(dòng)化“滑板驗(yàn)證”實(shí)現(xiàn)賬密登錄的解決思路是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。