"Đánh bật" captcha với Headless browser

Sử dụng 2Captcha và Puppeteer giúp tự động hóa "vượt tường" CAPTCHA

Trong khoảng hơn một thập kỷ trở lại đây, Captcha đã trở nên quen thuộc ở khắp mọi nơi trên mạng internet. Những dòng, từ hoặc các con số nguệch ngoạc sẽ xuất hiện khi bạn cố gắng đăng nhập, đăng ký hoặc đăng bình luận ở bất cứ đâu.

Amazon

CAPTCHA (hay Hệ thống Tự động Phân biệt Con người và Máy tính) được thiết kế như một cánh cổng giúp phân biệt con người và robot. Trong khi con người có thể dễ dàng giải mã captcha thì robot và các phần mềm độc hại lại rất khó để “bước chân” qua cánh cổng này.

Cùng với sự phát triển của công nghệ, các dòng ký tự nguệch ngoạc đã và đang được thay thế bằng phiên bản 2 của Google là reCAPTCHA. Đây là dạng mã Captcha dưới dạng hộp kiểm và nếu thấy dấu tích màu xanh lá nghĩa là bạn đã vượt qua bài kiểm tra để tiếp tục làm việc.

recaptcha

Nếu bạn không đạt đến ngưỡng mà Google xác định đó là con người, thì reCAPTCHA gửi cho bạn yêu cầu làm một thử thách khác, và điều này sẽ làm bạn cảm thấy phiền toái, khó chịu hơn là giải mã một vài từ.

recaptcha v2

Việc Captcha xuất hiện thường xuyên đã khiến cho nhiều người chấp nhận và nghĩ đây là việc cần làm, tuy nhiên bạn hoàn toàn có thể sử dụng các dịch vụ để tự động hóa việc giải mã chúng hơn là cố gắng chứng minh rằng bạn là con người.

2Captcha hoạt động như thế nào?

2Captcha giải mã được nhiều kiểu CAPTCHA khác nhau với sự tương đồng của 2 API có thể truy cập thông qua các Enpoint. Chuyển giao dữ liệu là yêu cầu đầu tiên và cần thiết để giải mã Captcha và trả về ID theo request đã gửi. Trong trường hợp captcha bằng hình ảnh, dữ liệu sẽ được chuyển đổi từ ảnh sang dạng Base64 và bạn sẽ nhận được một giá trị dưới dạng Text.

how work

Khi có ID request, 2Captcha sẽ báo cáo thông qua một URL Endpoint, gửi yêu cầu liên tục và lặp lại cho đến khi hệ thống sẵn sàng

how work 2

Đối với reCAPTCHA v2, câu chuyện có một chút khác biệt. Vẫn là quy trình 2 bước như trên nhưng lại có sự khác nhau trong phương thức gửi dữ liệu. Trong trường hợp này, bạn cần gửi sitekey - là tham số "k" từ trang có captcha, hay nói cách khác, key này xác định xem bạn sử dụng reCaptcha nào trong danh sách reCaptcha; để tìm tham số này, bạn có thể nhấp vào "Kiểm tra phần tử" trên captcha và tìm thấy một phần mã bắt đầu bằng "www.google.com.vn/recaptcha/api2/anchor". Ngay sau mã đoạn mã này chính là tham số "k" ngay sau đó. Ngoài ra, bạn cũng có thể gửi tham số "data-sitekey" thay cho tham số "k".

before solve

Phản hồi bạn nhận được là một mã token kèm submit form và cần được nhập vào một hidden text field (g-recaptcha-response) của form. Hình ảnh bên dưới hiển thị vị trí của nó và đã được tắt tính năng : không có thuộc tính CSS nào được hiển thị trên trang. Việc có thể chỉnh sửa giúp bạn dễ dàng kiểm tra phản hồi 2Captcha bằng tay để giảm thiểu biến trong giai đoạn kiểm thử tích hợp.

solve

Đối với CAPTCHA dựa trên hình ảnh, kết quả gần như trả về ngay lập tức. Đối với reCAPTCHA v2, thời gian phản hồi từ 15 - 30 giây.

Tự động hóa với Puppeteer

Trước khi lo lắng về CAPTCHA, bạn cần phải lựa chọn "vũ khí" đi kèm. Trong bài đăng này, chúng tôi sẽ sử dụng Google Chrome.

Đừng lo ngại và e dè nếu bạn không muốn cài Chrome vì Puppeteer đi kèm với mọi thứ bạn cần bao gồm cả cài đặt Chromium (trình duyệt web mã nguồn mở, là nền tảng để xây dựng nên Google Chrome).

Hãy chắc chắn rằng tất cả mọi thứ đã sẵn sàng. Hãy bắt đầu bằng tự động trang đăng ký Reddit. Vì sao lại là Reddit? Đơn giản vì đây là trang đầu tiên tôi bắt gặp sử dụng reCAPTCHA.

Trong mã này, tôi chỉ định hai thuộc tính cấu hình khi khởi chạy, “headless: false” để thấy những gì đang làm và “defaultViewport: null” cho một vài sự gián đoạn nơi không thể hiển thị khung hình viewport . Không quan trọng đối với headless operation (browser chạy mà không cần giao diện) - đơn giản là chúng chỉ giúp dễ nhìn hơn và quan trọng hơn là có thể chụp ảnh màn hình. Ví dụ như:

reddit

Điều đó thật dễ dàng! Tiếp theo, chúng ta sẽ tự động hóa việc đăng ký như không hề có sự xuất hiện của Captcha. Đây là nơi mà toggle button có khả năng tắt và bật vì chúng có thể điều khiển trình duyệt như một con người khi cần. Đầu tiên chúng ta cần hiểu để truy cập các phần từ trên trang cần thao tác như thế nào. Để trình duyệt của bạn chạy và kiểm tra trang được tải thông qua các devtools của Chrome (Phím tắt: F12). Tiếp theo, tìm các trường văn bản cần thao tác (Phím tắt: + Shift + C trên Mac và Ctrl + Shift + C trên Windows). Với Reddit, các trường bắt buộc là tên người dùng, 2 trường mật khẩu và click vào nút "Đăng ký". Trường email là tùy chọn nên chúng ta có thể bỏ qua nó. API của Puppeteer sẽ giúp bạn nhập các trường văn bản một cách trực quan, thế là bạn đã xuất sắc vượt qua Selector - chức năng xác định phần tử và phương thức dạng chuỗi .type ().

Thao tác với nút chỉ là trực quan, ngoại trừ nút trong trang Reddit, không có ID nào được liên kết với nó, vì vậy chúng ta cần phải có Selector phức tạp hơn một chút. Nếu bạn không quen với CSS Selector, hãy làm quen với Mozilla Developer Network.

Khi bạn hoàn thành đoạn script, hãy kiểm tra và để đảm bảo rằng thông tin đăng nhập đang được gửi. Nó không làm việc, đó là điều hiển nhiên, vì vướng phải "người gác cổng" captcha. Tuy nhiên bạn có thể kiểm tra xem hook (các hàm mà cho phép bạn “hook into (móc vào)” trạng thái của React và các tính năng vòng đời từ các hàm components) có hoạt động tốt không.

reddit 2

Đợi một chút! Chúng ta thậm chí không thấy CAPTCHA và bảng điều khiển JavaScript báo lỗi. Chuyện gì đã xảy ra? Khi tự động hóa các trang web, Captcha không phải là rào cản duy nhất và một trong số chúng diễn ra quá nhanh khiến trang bị lỗi. Khi các trình duyệt được tự động hóa, chúng bị nhiều threads truy cập cùng lúc và cùng muốn thay đổi, điều đó dẫn đến việc mã được thực thi theo thứ tự nằm ngoài tầm kiểm soát của các nhà phát triển (hay còn được gọi là Race Condition).

Reddit đã từng trải qua tình huống Race Condition khi mà reCAPTCHA của Google chỉ được hiển thị sau khi khi người dùng nhập xong trường mật khẩu thứ hai. Script của chúng tôi hoạt động trước khi reCAPTCHA sẵn sàng. Có nhiều giải pháp để khắc phục vấn đề này nhưng đơn giản nhất là thêm độ trễ tối thiểu. Chúng ta có thể thêm hook và trình lắng nghe (listener) để đảm bảo chúng chỉ hoạt động sau khi reCAPTCHA đã được tải. Tuy nhiên, bản thân các nhà phát triển Reddit có vẻ không dành nhiều sự quan ngại cho tình huống Race condition vì vậy, chúng ta không nhất thiết phải biến Puppeteer trở nên quá thông minh. Việc khởi chạy Puppeteer trên trình duyệt và lựa chọn công cụ SlowMo sẽ làm giảm tốc độ tất cả các hoạt động của Puppeteer.

Sau khi thêm tùy chọn, chúng tôi thấy CAPTCHA và mọi thứ đã đi đúng hướng. Để có một thử nghiệm thú vị, bạn cũng có thể thử giải CAPTCHA ngay bây giờ và xem điều gì sẽ xảy ra. Vì chúng tôi sử dụng phiên bản Chromium thực thể (instance) nên Puppeteer hoàn toàn mở và chúng tôi đang điều khiển nó một cách tự động, sau đó reCAPTCHA sẽ cố gắng hết sức để chứng minh rằng chúng tôi không phải là con người. Bạn có thể sẽ trải qua nhiều cấp độ của thử thách ngay cả khi bạn đã giải mã được tất cả các hình ảnh. Khi tôi kiểm tra điều này, tôi đã phải trải qua 10 lần khác nhau trước khi đạt đến dấu kiểm màu xanh lá cây.

May mắn thay, chúng ta có thể làm điều này bằng một cách dễ hơn.

Kết nối với 2Captcha

Để kết nối tới 2Captcha, bạn cần phải có API key - cổng kết nối mà bạn nhận được khi đăng ký. Mà một sự thật hiển nhiên là bạn phải trả một khoản phí vì không có thứ gì trên đời là miễn phí hoàn toàn.

2captcha login

API của 2Captcha sẽ hoạt động thông qua 2 bước trong đó bạn gửi dữ liệu CAPTCHA và sau đó gửi yêu cầu kết quả liên tục với ID request được trả về. Vì đang xử lý reCAPTCHA v2 nên chúng tôi sẽ cần gửi sitekey cho Reddit. Chúng tôi cần đảm bảo rằng mình đã đặt phương thức tới userrecaptcha và cung cấp URL trang mà reCAPTCHA này được đặt trên đó.

http://2captcha.com/in.php?key=YOUR_CAPTCHA_KEY&method=userrecaptcha&googlekey=6LeTnxkTAAAAAN9QEuDZRpn90WwKk_R1TRW_g-JC&pageurl=https://www.reddit.com/register/

Sau khi thực hiện request và nhận được ID, bạn cần gửi yêu “res.php” của URL cùng API key và ID request để nhận được phản hồi:

http://2captcha.com/res.php?key=YOUR_CAPTCHA_KEY&action=get&id=YOUR_CAPTCHA_ID

Nếu CAPTCHA chưa sẵn sàng thì bạn sẽ nhận được phản hồi “CAPTCHA_NOT_READY”, cho biết bạn cần thử lại sau một hoặc hai giây. Khi nó sẵn sàng, phản hồi sẽ là dữ liệu phù hợp cho phương thức bạn đã gửi. Đối với CAPTCHA dựa trên hình ảnh, nó là một giải pháp, cho reCAPTCHA v2, đó là dữ liệu mà bạn sẽ cần gửi với giao thức form inputs.

Đối với reCAPTCHA v2, thời gian phản hồi nhanh nhất là 15 giây và chậm nhất là 45 giây.

Sau khi bạn có dữ liệu phản hồi:

OK|03AOLTBLQjETrnL6Wp9qNzJoYs8yAbz3hmTgeqUbkX-3x7z7R3uVdIiGMqCITr4kLj1tSyfrFEuvROxajhQtQhnKD8bqzIQ4tMqUABIgMsDvRpkTdxMVY5fgT4ph-RojnPiM56Dxm87Smgi9zkeXXxMjBdnqg-eo0k7yMoXuHc6lWBkr4eKfZYW9CxeY8T6lk7ubyym0lV4dlQsWIWGR0cab3Nx1ko65r2cO9vJ9Fb5bDNd-_2J5QuwYchd2luBaNMMC4V-5acIutNecZDZSpvT0FVVgfJUI9P7lCJPpeI53-ehsgLb2WUKzeJ7y4xhTc_b_zOBMBKNA4adtJ_5mmlI8ZQu_kEquKc10hqRXXpezk59b02A8_2aqGUbvJ5jw1cPxWo1nONgwYCNUtD4--x78WxcVoiT-COCVCoHN53QF6OlWQs1Z3uTgYBuIiOarJ3qoy6iMuKdM3gI9zG4NF82jycMAlTl_phskNbB3S53BsUllmVkiXtNFYb_KtED2owhKdl4bTabEcQu17IO6zFtByyJlF9_jLI1ZbBZndfUfFR5B-pTDj-bvHbWAM9dDSx-auGT7c4Nagj

bạn cần đưa kết quả (các ký tự sau “OK|”) vào dạng hidden g-recaptcha-response thẻ textarea trong mẫu đăng ký của Reddit. Cách này không dễ dàng như việc sử dụng phương thức Puppeteer.type () vì đây là phần tử ẩn và không nhận được sự chú ý. Bạn có thể làm cho nó hiển thị và sau đó sử dụng .type () hoặc dùng JavaScript để đưa giá trị vào trang. Để đưa JavaScript vào một trang bằng Puppeteer, chúng ta có phương thức .evaluate() bằng cách lấy một hàm hoặc một chuỗi (nếu bạn gửi một hàm thì nó chỉ đơn giản là .toString()s) và chạy nó trong ngữ cảnh trang (page context).

Khi đưa giá trị đó vào thì đăng ký sẽ được hoàn thành!

Vậy sau khi đọc hết bài viết này, bạn có thể làm gì?

Bài viết có hai mục đích chính:

  1. Cho bạn thấy có rất nhiều cách để giải mã CAPTCHA

  2. Cho bạn thấy rằng CAPTCHA không hề muốn mang đến cho bạn sự khó chịu và phiền toái

CAPTCHA được phát triển để ngăn chặn thường các hành vi lừa đảo hoặc mã độc hại phát tán trên mạng internet.

2captcha 12-12-2019

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Alex

6 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
3 0
Một câu chuyện rất đỗi quen thuộc và thường diễn ra như sau: Sam cần phải điền vào các biểu mẫu tự động. Nó có thể dành cho các mục đích khác nhau...
Alex viết 1 tháng trước
3 0
White
1 0
Đúng như tên gọi của mình, Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) được sử dụng để phân biệt Con người...
Alex viết 7 ngày trước
1 0
White
1 0
Machine Learning (Học máy) đã tiến xa như thế nào trong lĩnh vực giải mã Captcha? Trong thời gian gần đây, Machine Learning là một trong những cụm...
Alex viết 11 ngày trước
1 0
Bài viết liên quan
White
2 0
Chrome Dev Function definition Suy nghĩ mãi chả biết viết cái gì, hôm này cũng không biết có gì mới, như hôm qua là ngon rồi :D. May mà có cái nhỏ...
Dinh Duong viết hơn 3 năm trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!