LoginSignup
0
0

More than 1 year has passed since last update.

C#コードでrecaptchaを突破するための2captchaサービス統合

Posted at

2captchaサービスを統合するためのC#のコード。

2captchaサービスを利用する際の詳細については、こちらhereのPython コードを参照してください。

using System.IO;
using System;
using System.Net; 
using System.Text; 

class Recaptcha2captcha
{     
    private static string captcha_service_key;
    private string site_key;
    private string page_url; 
     
    public void setServiceKey(string service_key)
    {        
        Recaptcha2captcha.captcha_service_key = service_key;
    }
    public void setSiteKey(string site_key)
    {
        this.site_key = site_key; 
    }
    public void setPageUrl(string page_url)
    {
        this.page_url = page_url; 
    }
  
    public string SendRequest() // HTTP POST
    { 
        try
        {
            System.Net.ServicePointManager.Expect100Continue = false;
            var request = (HttpWebRequest)WebRequest.Create("http://2captcha.com/in.php");
           
            var postData = "key="+ Recaptcha2captcha.captcha_service_key +"&method=userrecaptcha&googlekey=" + this.site_key + "&page_url=" + this.page_url;
            var data = Encoding.ASCII.GetBytes(postData);

            request.Method = "POST";

            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;

            using (var stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            var response = (HttpWebResponse)request.GetResponse();

            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
 
            response.Close();
 
            if (responseString.Contains("OK|"))
            {
                return responseString;
            }
            else
            {
                return "2captcha service return error. Error code:" + responseString;
            }
        }
        catch (Exception e)
        { 
            return e.Message;
        }

    }
    public string SubmitForm(string RecaptchaResponseToken)  // HTTP POST
    { 
        // var page_url = "http://testing-ground.scraping.pro/recaptcha"; 
        try
        {
            System.Net.ServicePointManager.Expect100Continue = false;
            var request = (HttpWebRequest)WebRequest.Create(this.page_url);
           
            var postData = "submit=submin&g-recaptcha-response="  + RecaptchaResponseToken;
            var data = Encoding.ASCII.GetBytes(postData);

            request.Method = "POST";

            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;

            using (var stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            var response = (HttpWebResponse)request.GetResponse();

            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
 
            response.Close();
 
            return responseString;
        }
        catch (Exception e)
        { 
            return e.Message;
        }

    }
    
    // the request to retrieve g-recaptcha-response token from 2captcha service
    public string getToken(string captcha_id)  // HTTP GET
    {
        WebClient webClient = new WebClient();
        webClient.QueryString.Add("key", Recaptcha2captcha.captcha_service_key);
        webClient.QueryString.Add("action", "get");
        webClient.QueryString.Add("id", captcha_id);
        
        return webClient.DownloadString("http://2captcha.com/res.php");
    }
    // validate site with returned token thru proxy.php  
    public string getValidate(string token)
    {
        WebClient webClient = new WebClient();
        webClient.QueryString.Add("response", token); 
        return webClient.DownloadString("http://testing-ground.scraping.pro/proxy.php");
    }
}

class Program
{
    static void Main(string[] args)
    {  
        if (args.Length != 1)
        {
            System.Console.WriteLine("Usage: main.exe <2captcha_service_key>");
            return;
        }
        string service_key = args[0];
        // Console.WriteLine("2captcha service key: " + service_key); 
        
        Recaptcha2captcha service = new Recaptcha2captcha();
        
        // we set 2captcha service key and target google site_key
        service.setServiceKey(service_key);
        service.setSiteKey("6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8");
        serivce.service.setPageUrl("http://testing-ground.scraping.pro/recaptcha"); 
        
        var resp = service.SendRequest();
        var gcaptchaToken = "";
        Console.WriteLine(resp.Substring( 3, resp.Length-3));
        if (resp.Contains("OK|")){
            // loop till the service solves captcha and gets g-recaptcha-response token
            var i=0;
            while (i++ <= 20) 
            {
                System.Threading.Thread.Sleep(5000); // sleep 5 seconds
                Console.WriteLine("Captcha is being solved for {0} seconds", i*5);
                gcaptchaToken = service.getToken(resp.Substring( 3, resp.Length-3)); 
                if (gcaptchaToken.Contains("OK|"))
                { 
                    break;
                }
            }
            
            
            if (gcaptchaToken.Contains("OK|"))
            { 
                var RecaptchaResponseToken = gcaptchaToken.Substring(3, gcaptchaToken.Length-3);
                Console.WriteLine("g-recaptcha-response token:  " + RecaptchaResponseToken );
                
                // make google to validate g-recaptcha-response token 
                var iSvalid = service.getValidate(RecaptchaResponseToken); 
                Console.WriteLine("Token is validated by google: " + iSvalid );
                
                // submit form to the target site
                var SubmitFormResp = service.SubmitForm(RecaptchaResponseToken);
                Console.WriteLine("Submit form return: " + SubmitFormResp );
                
            } else {
                Console.WriteLine("Captcha has not been solved. Error code: " + gcaptchaToken);
                //Environment.Exit(0);
            }
            
        } else {
            Console.WriteLine("Error: " + resp);
            //Environment.Exit(0);
        }
        Console.Read();
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0