這其實是乙個求助的文章

2021-09-11 10:00:36 字數 3392 閱讀 1764

。。。。最一開始我只是想弄個幫女朋友自動清購物車的指令碼順帶嘗試一下puppeteer,but噩夢開始了

文件在這裡

對我這種英語差的人實在是心累,好在api簡潔明瞭。。。雖然有些地方還不完善,沒關係幹的就是盲人摸象的工作。

入門教程網上還是很多的我隨便貼乙個puppeteer 與 chrome headless —— 從入門到爬蟲

然後是開啟**的基礎**(太簡單了,沒啥要看的)

puppeteer.launch().then(async browser => );

await page.goto('');

console.log('進入**登陸頁');

});複製**

一開始我覺的掃碼多麻煩,還要把弄到本地啥的,果斷用賬號+密碼+驗證碼來擼,

puppeteer.launch().then(async browser => );

密碼也是這樣

console.log('輸入完畢');

const loginbutton = await page.$('#j_submitstatic');

await loginbutton.click();

console.log('登陸成功');

});複製**

// 使用者輸入賬號密碼的函式,可以不用看

const inputlogindata = async () => ;

await readsyncbyrl('輸入**賬號: ').then((msg) => );

await readsyncbyrl('輸入**密碼: ').then((msg) => );

return result;

}function

readsyncbyrl(tips) );

rl.question(tips, (answer) => );

});}複製**

好,這樣其實是可以了。。。。但是有幾個問題:

1. 輸入文字時間間隔

輸入文字不能太快,這個其實調整delay在一定程度上可以解決

2. 如果你的賬號存在嫌疑,需要滑動驗證

我一開始覺得只要拖過去就可以了= =,事實證明我太天真,網上找找看到了這傳送門,大概就是說盡量模擬人的操作。。。。然後我嘗試了

await page.$('#nc_1_n1z').then(async (element) => ).catch(() => );複製**
// 滑動驗證

async

function

moveslide(point, page) );

await sleep(1000);

// 果然高中物理都還給老師了,下面模擬乙個16加速度,時長為2的滑動

const mouse = page.mouse;

const x = point.x + math.round(math.random() * point.width / 4) + point.width / 3;

const y = point.y + math.round(math.random() * point.height / 4) + point.height / 3;

await mouse.move(x, y);

await mouse.down();

await sleep(200);

for (let i = 2; i > 0; i--) );

}for (let i = 8; i > 0; i--) );

}await mouse.up();

// 判斷驗證s是否通過

let ncresult = await

promise.race([

page.waitforselector('#nocaptcha .btn_ok', ).then(() => ),

page.waitforselector('#nocaptcha', ).then(() => ),

]);// 失敗重新滑動

if (!ncresult) );

await sleep(1000);

const nocaptcha = await page.$('#nocaptcha a');

await nocaptcha.click();

await sleep(1000);

await moveslide(point, page);

}}複製**

本來這樣有3成的概率能過。。。。但是一段時間後,我發現一直都是失敗,我就人工試了試,發現我的賬號只要出現滑動嚴重人工都不能驗證通過,不然就是直接可以登陸進去(t_t)

這條路就此斷絕,但是我還沒有放棄

嘛。。。掃就掃。。。

await page.waitforselector('#j_qrcodeimg');

await page.$('#j_qrcodeimg').then(async (element) => );

});複製**

想想太不好了,顯得太傻。。。突然想到了把轉成ascii字元圖,還挺好的,就只有黑白都不用做灰度處理。

let img = new image();

var result = '';

img.src = document.getelementbyid('j_qrcodeimg').childnodes[0].src + '?t=123';

img.crossorigin = "anonymous";

img.onload = async () => ) / (2*2*4));}}

let arr = ['██', ' '];

data.foreach((item, index) =>

})}複製**

怎麼執行呢?

executioncontext這個就是exec在瀏覽器內部的物件

const qrcode = await executioncontext.evaluate(async () =>  catch (e) 

}, delay);

});};

});複製**

其實乍一看效果還是不錯的,就是有點大,在chrome上這個特殊字元寬高比是1:2

但是在cmd上就不是這回事了

在cmd中寬高是1:1所以

// 不適用

// let arr = ['██', ' '];

let arr = ['█', ' '];複製**

這個問題其實是字符集對於這個特殊字元的定義不同,這個就很難辦了。。。。。總不能讓別人都用一種字型

」operator 」其實是乙個函式名

1.以前,一直不太明白,過載運算子,今天看了 c 高階程式設計,第8章 終於明白了。operator 其實是乙個函式,關於拷貝建構函式,之前的部落格已經寫過,當時以為是乙個套路。現在終於明白,其實是乙個函式,而這個函式 返回了乙個 類型別的引用,這個函式的引數是類型別的引用。例子如下 spreads...

2020 03 26 人其實是乙個系統

08 00 流言這東西,比流感蔓延的速度更快,比流星所蘊含的能量更巨大,比流氓更具惡意,比流產更能讓人心力憔悴。錢鍾書 時至今日,我並不能做到毫無阻力地暢寫日記,我會停頓,我會思考。但由於需要用腦,身體的第乙個反應就是抗拒,這也是我最原始的阻力和不適。這五十萬字的背後遠遠不止於五十萬個文字,而是我克...

CEO做什麼其實是在傳達乙個訊號

今天晚上在大學街的義大利煎餅果子鋪,我們幾個人在聊facebook的高管在做什麼。幾個細節引起了我的注意。ceo zuck每年還是要checkin一行 的 顯然這是乙個象徵性的動作 coo sandberg每天都自己盯著解決幾個使用者的問題。這個小動作其實大有值得借鑑的地方。每個人做任何事情其實都有...