Cách submit recaptcha v2 invisible không có nút submit bằng selenium

Discussion in 'Hỏi Đáp Kỹ Thuật' started by Hoa Mãn Lâu, Aug 1, 2021.

Tags:
  1. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Tình hình là mình đang gặp 1 site khá là khoai, nó có recaptcha v2 invisible bảo vệ, Dùng selenium để vượt qua thì ko có cái nút submit để gửi đi mỗi khi lấy dc token giải mã về, xài data-callback="handleCaptcha" thì nó chỉ load lại cái form recaptcha. Vậy mần sao mới submit form lên nhỉ, ae có ai gặp rồi chỉ giúp với
    [​IMG]
     
    Newbie88 likes this.
  2. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    recaptcha invisible nó tạo ra token rồi gửi cho server. Server sẽ quyết định là human hay bot dựa vào score của cái token mà recaptcha sinh ra (score từ 0.1-0.9) . Vì vậy không có nút submit. Cách đơn giản nhất để vượt qua recaptcha loại này là login vào 1 tk gmail có độ trust cao, tự động score sẽ cao và server sẽ nghĩ rằng ko phải bot và tự động cho qua.
    Bác mở selenium, mở link này https://antcpt.com/eng/information/demo-form/recaptcha-3-test-score.html mà score được 0.7 trở lên là ngon.
     
    Last edited: Aug 1, 2021
    Nai likes this.
  3. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Mình xài tài khoản gmail chính chủ 10 năm nó báo 0.3 score. Chắc ko đủ trust cmnr.
     
  4. firefox

    firefox Bang Chúng

    dùng puppeteer extra stealth để né vài case, hoặc xài dịch vụ 2capcha bẻ, giá $3/1k captcha :D
     
  5. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    Nó còn phụ thuộc vào IP, vào trình duyệt và profile trình duyệt bác dùng nữa. Thường thì 0.3 cũng đủ để vượt qua cái recaptcha invisible rồi.
    2captcha không vượt qua được recaptcha invisible, vì nó tính điểm , điểm thấp là server nó báo bot luôn. Còn puppeteer extra stealth mục đích chính là tạo ra vùng click chuột ngẫu nhiên, chứ không phải click vào chính giữa element. Nên cũng không giúp ích gì trong trường hợp này.
     
    Nai and firefox like this.
  6. thitgaluoc

    thitgaluoc Hương Chủ

    khong phu thuoc vao gmail lam dau, no la 1 cai chi so trong rat nhieu chi so thoi, bac dung cai browser ma thuong ngay bac dung score len cao ngay
     
  7. firefox

    firefox Bang Chúng

    nếu đúng giống trên hình của bác Hoa Mãn lâu (g v2) thì em nghĩ là 2captcha chiến ngon.
    Còn nếu invisible (g v3) thì extra stealth cộng thêm vài yếu tố nữa vẫn dư sức > 0.7, nhiều lúc em thấy còn ra được 0.9 :D
     
  8. Nai

    Nai MiddleMan Staff Member

    Của em 0.9 luôn, :D
    [​IMG]
     
  9. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    E đang dùng cái 2captcha để giải mã và trả về token giải mã rồi, chỉ là méo biết làm sao để submit lên cho nó by pass qua đó thím. Nó ko có cái form hay gì để báo là đã hoàn thành luôn.
     
  10. sincos

    sincos Bang Chúng

    Tự tạo 1 form với các fields như của nó rồi submit thôi.
     
  11. Phan Thị

    Phan Thị Bang Chúng

    Bắt cái request khi nó gửi request rồi giả lập gửi lên server rồi reload lại page
     
  12. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Site mình gặp vấn đề là site nầy
    Code:
    zazzle.com/lgn/signin
    Thật sự ko hiểu làm sao để submit nó lên sau khi đã có token giải mã từ 2captcha luôn. Nhờ ae có kn chỉ giáo giúp với
     
  13. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    recaptcha sẽ sinh ra 1 cái token rồi tự động POST tới url này 'https://www.zazzle.com/svc/recaptcha/validate' . Từ cái token mà recaptcha sinh ra, server www.zazzle.com sẽ quyết định client có phải là bot hay không (dựa vào việc tính score của token) . 2captcha không giúp ích gì cho recaptcha invisible cả. Cách duy nhất bác có thể vượt qua là làm cho cái trình duyệt đủ "uy tín" để recaptcha tính điểm cao hơn thôi. Còn muốn làm cho trình duyệt đủ uy tín thì phải kết hợp nhiều yếu tố : IP, login acc gmail, profile trình duyệt đã có lịch sử duyệt web chứ không trống trơn ...

    Để trị những site dùng recapcha invisible, mình không dùng selenium hay puppetter vì cả 2 cái này đều phải sử dụng webdrive, recaptcha sẽ dễ dàng nhận diện được. Cách của mình là dùng trình duyệt thật, kết hợp với pyautogui, Pyperclip, chụp màn hình và image search để tìm được vị trí cần click ....

    Hoặc là b load thêm cái extension của 2 captcha khi chạy selenium, nó sẽ tự xử lý cho mà không cần phải làm thêm gì cả.
     
    Last edited: Aug 2, 2021
    bui cong and EDM like this.
  14. automan

    automan Hương Chủ

     
  15. firefox

    firefox Bang Chúng

    Tối dịch quá không ra ngoài cf được, mình code tạm 1 cái auto login vào site đó, sử dụng 2captcha, nếu trả về true thì username / password đúng.
    Đoạn code này không cần dùng headless browser gì, cứ native c# mà phang thôi.
    Về cơ bản thì nó gồm vài bước:
    - Ngó qua cái site, để lấy cái google captcha site key của nó, dùng CTRL U cũng có thể dễ nhìn thấy key là chuỗi sau
    Code:
    6Lc64wwTAAAAAN_VadOkTL4pNo2PgWk008qpz1jp
    - Dùng 2captcha get sẵn 1 google verify token XXXX
    - Vào đại trang chủ, request đại 1 nháy để lấy csrf token
    - Gọi đến trang verify của nó với tham số là csrf, google verify token để lấy zazzle validate token
    - Gọi hàm login với username, password, csrf và tất nhiên là cả zazzle validate token

    Kết quả chạy:
    [​IMG]



    Code mẫu, các bác tự ném token 2captcha của mình vào là chạy thôi
    Sau khi nó login xong, thì CookieContainer đã giữ phiên đăng nhập, làm gì sau đó tùy ý tưởng {smile}
    PHP:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using Newtonsoft.Json.Linq;
    using RestSharp;

    namespace 
    ZazzleBypass
    {
        
    internal class Program
        
    {
            private static 
    async Task Main(string[] args)
            {
                var 
    twoCaptchaToken "";
                var 
    zazzleEmail "[email protected]";
                var 
    zazzlePassword "[email protected]";
       
                
    Console.Write("Please enter your 2captcha token: ");
                
    twoCaptchaToken Console.ReadLine()?.Trim();

                var 
    twoCaptClient = new TwoCaptClient(twoCaptchaToken);
                var 
    googlekey "6Lc64wwTAAAAAN_VadOkTL4pNo2PgWk008qpz1jp";
                var 
    tcTokenId await twoCaptClient.RequestTokenId(googlekey"https://www.zazzle.com");
                var 
    tcResponseToken await twoCaptClient.GetResponse(tcTokenId);
                
    Console.WriteLine(tcResponseToken);


                var 
    zClient = new ZazClient();
                
    await zClient.Init();
                var 
    zResponseToken await zClient.ValidateCaptcha(tcResponseToken);

                
    await zClient.Login(zazzleEmailzazzlePasswordzResponseToken);
            }
        }


        
    internal abstract class BaseClient
        
    {
            protected 
    BaseClient(string url)
            {
                
    RestClient = new RestClient(url) {CookieContainer = new CookieContainer(), UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"};
            }

            protected 
    RestClient RestClient getset; }
        }

        
    internal class ZazClient BaseClient
        
    {
            private 
    string _csrf;

            public 
    ZazClient() : base("https://www.zazzle.com")
            {
            }
            public 
    async Task Init()
            {
                var 
    request = new RestRequest("/");
                var 
    response await RestClient.ExecuteGetAsync(request);
                var 
    html response.Content;
                var 
    csrfMatch Regex.Match(html, @"""csrf"":""(?<csrf>[a-f0-9]+)""");
                
    _csrf csrfMatch.Groups["csrf"].Value;
            }


            public 
    async Task<stringValidateCaptcha(string captchaToken)
            {
                var 
    request = new RestRequest("svc/recaptcha/validate");
                var 
    obj = new Dictionary<stringstring> {["client"] = "js", ["csrf"] = _csrf, ["responseToken"] = captchaToken};
                
    request.AddJsonBody(obj);

                var 
    response await RestClient.ExecutePostAsync(request);
                var 
    json response.Content;
                var 
    jsonObject JObject.Parse(json);
                var 
    zToken jsonObject?["data"]?["reCaptcha"]?["ValidationToken"]?.Value<string>();
                return 
    zToken;
            }

            public 
    async Task<boolLogin(string emailstring passwordstring validationToken)
            {
                
    Console.WriteLine($"Login to  {email} : {password}");
                var 
    request = new RestRequest("svc/z3/auth/login");
                var 
    obj = new Dictionary<stringobject>
                {
                    [
    "email"] = email,
                    [
    "password"] = password,
                    [
    "isCheckingOut"] = false,
                    [
    "recaptchaToken"] = validationToken,
                    [
    "returnUserData"] = false,
                    [
    "showedCaptcha"] = false,
                    [
    "client"] = "js",
                    [
    "csrf"] = _csrf
                
    };
                
    request.AddJsonBody(obj);


                var 
    response await RestClient.ExecutePostAsync(request);
                var 
    json response.Content;
                var 
    jsonObject JObject.Parse(json);
                var 
    success jsonObject?["success"]?.Value<bool>() ?? false;

                if (
    success)
                    
    Console.WriteLine("Login success");
                else
                    
    Console.WriteLine("Login failed");

                return 
    success;
            }
        }

        
    internal class TwoCaptClient BaseClient
        
    {
            private 
    readonly string _token;

            public 
    TwoCaptClient(string token) : base("https://2captcha.com")
            {
                
    _token token;
            }

            public 
    async Task<stringRequestTokenId(string googlekeystring pageurl)
            {
                
    Console.WriteLine("2captcha getting token");
                var 
    request = new RestRequest("in.php");
                
    request.AddQueryParameter("key"_token);
                
    request.AddQueryParameter("method""userrecaptcha");
                
    request.AddQueryParameter("googlekey"googlekey);
                
    request.AddQueryParameter("pageurl"pageurl);
                var 
    restResponse await RestClient.ExecuteGetAsync(request);

                var 
    response restResponse.Content.Split('|'StringSplitOptions.RemoveEmptyEntries);
                
    Console.WriteLine("2captcha response: " response[0]);
                return 
    response.Last();
            }

            public 
    async Task<stringGetResponse(string tokenId)
            {
                
    Console.WriteLine("2captcha getting response");

                var 
    request = new RestRequest("res.php");
                
    request.AddQueryParameter("key"_token);
                
    request.AddQueryParameter("action""get");
                
    request.AddQueryParameter("id"tokenId);

                for (var 
    0100i++)
                {
                    var 
    restResponse await RestClient.ExecuteGetAsync(request);
                    var 
    response restResponse.Content.Split('|'StringSplitOptions.RemoveEmptyEntries);
                    
    Console.WriteLine($"2captcha response [{i}]: {response[0]}");
                    if (
    response[0] == "OK")
                        return 
    response[1];

                    
    await Task.Delay(2_500);
                }

                return 
    null;
            }
        }
    }
    Code này mới chỉ thử trên các "happy cases", muốn xài được còn phải gõ nhiều nhưng chung quy là nó chạy, theo em thì selenium và các giải pháp trình duyệt chỉ nên dùng khi hết cách {lmao}
     
  16. sincos

    sincos Bang Chúng

    @firefox sướng nhất là khi code không vì tiền. Thú vui tao nhã dân coder {cheers}
     
    firefox likes this.
  17. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Cảm ơn thím nhiều. Dùng cách request vầy thì có vẻ tiện hơn nhiều nhỉ.
     
    firefox likes this.
  18. firefox

    firefox Bang Chúng

    Uhm cũng tùy trường hợp. Có vài trường hợp ưu tiên dùng request hơn như: đa luồng, ram bé, xài proxy trả phí theo băng thông. . . Nhược điểm là lâu lâu phải update vì chủ site họ đổi code :))
     
  19. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Bàn về học thuật, nâng cao thêm kiến thức, nếu dùng js để submit token kết quả lên thì làm thế nào nhỉ? Mình thử dùng hàm handleCaptcha thì nó lại đi load lại cái recaptcha luôn.
     
  20. firefox

    firefox Bang Chúng

    Như bác Cái Bang có nhắc ở trên, site này nó không validate theo cách truyền thống mà dùng riêng api www.zazzle.com/svc/recaptcha/validate để đẩy google captcha token lên nó tự validate trước, xong nó nhả 1 token khác về kèm vào thông tin đăng nhập. Vì thế nên sự kiện handleCaptcha sẽ không chạy được theo cách thông thường.
    Nếu ở selenium thì mình cần inject thêm 1 đoạn js xhr cho nó gửi token lên cái api đấy, rồi lấy chuỗi token trả về làm tiếp