C# сохранение капчи ( помогите )

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by zoke, 25 Oct 2011.

  1. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    Приведите пример сохранение капчи (картинки) с помощью HttpWebRequest или же как-то по другому, но чтобы работало с https протоколом и прокси.

    Зарание спасибо!
     
  2. Albertik

    Albertik New Member

    Joined:
    9 Oct 2011
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Отправка капчи на распознавание через сервис anti-captcha.net
    БЕЗ СОХРАНЕНИЯ КАРТИНКИ В ФАЙЛ! :)
    Картинка берётся из URL и сразу отправляется на распознавание

    Code:
    	
    	public static string MultiFormData(string Key, string Value, string Boundary)
            {
                string output = "--" + Boundary + "\r\n"; output += "Content-Disposition: form-data; name=\"" + Key + "\"\r\n\r\n";
                output += Value + "\r\n";
                return output;
            }
    
            public static string MultiFormDataFile(string Key, string Value, string FileName, string FileType, string Boundary)
            {
                string output = "--" + Boundary + "\r\n";
                output += "Content-Disposition: form-data; name=\"" + Key + "\"; filename=\"" + FileName + "\"\r\n";
                output += "Content-Type: " + FileType + " \r\n\r\n";
                output += Value + "\r\n";
                return output;
            }
    
            public static System.Drawing.Imaging.ImageFormat DetectImageFormat(string fmt)
            {
                switch (fmt.ToLower())
                {
                    case "image/jpg": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    case "image/jpeg": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    case "image/gif": return System.Drawing.Imaging.ImageFormat.Gif;
                    case "image/png": return System.Drawing.Imaging.ImageFormat.Png;
                    case "image/bmp": return System.Drawing.Imaging.ImageFormat.Bmp;
                    case "image/tiff": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    case "jpg": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    case "jpeg": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    case "gif": return System.Drawing.Imaging.ImageFormat.Gif;
                    case "png": return System.Drawing.Imaging.ImageFormat.Png;
                    case "bmp": return System.Drawing.Imaging.ImageFormat.Bmp;
                    case "tiff": return System.Drawing.Imaging.ImageFormat.Jpeg;
                    default: return null;
                }
            }
    
            public static byte[] imageToBytes(Image imageIn, System.Drawing.Imaging.ImageFormat imgFormat)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, imgFormat);
                return ms.ToArray();
            }
    
    	public string Upload(string url, string cap_ext, out long id)
            {
                id = -1;
                ua = browser("http://anti-captcha.net/in.aspx");
                ua.Method = "POST";
                ua.Timeout = 60000;
                ua.ReadWriteTimeout = 60000;
    
                string sBoundary = DateTime.Now.Ticks.ToString("x");
                ua.ContentType = "multipart/form-data; boundary=" + sBoundary;
                string sPostMultiString = "";
                sPostMultiString += MultiFormData("method", "post", sBoundary);
                sPostMultiString += MultiFormData("key", this.key, sBoundary);
                sPostMultiString += MultiFormData("softkey", "c06b73466", sBoundary);
                sPostMultiString += MultiFormData("file", url, sBoundary);
                sPostMultiString += MultiFormData("is_russian", "1", sBoundary);
                sPostMultiString += MultiFormData("phrase", "0", sBoundary);
                sPostMultiString += MultiFormData("regsense", "1", sBoundary);
                sPostMultiString += MultiFormData("numeric", "0", sBoundary);
                sPostMultiString += MultiFormData("calc", "0", sBoundary);
                sPostMultiString += MultiFormData("min_len", "4", sBoundary);
                sPostMultiString += MultiFormData("max_len", "30", sBoundary);
    
                string sFileContent = "";
    
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.AllowAutoRedirect = true;
                req.Method = "GET";
                //WebProxy myProxy = new WebProxy("");
                //req.Proxy = myProxy;
                req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.590; .NET CLR 3.5.20706)";
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
    
                Image image = System.Drawing.Image.FromStream(stream);
    
                byte[] bi = imageToBytes(image, DetectImageFormat(cap_ext));
                sFileContent = Encoding.Default.GetString(bi);
    
                stream.Close();
    
                string filename = "captcha." + cap_ext;
                sPostMultiString += MultiFormDataFile("file", sFileContent, filename, "image/" + cap_ext, sBoundary);
                sPostMultiString += "--" + sBoundary + "--\r\n\r\n";
                byte[] byteArray = Encoding.Default.GetBytes(sPostMultiString);
                ua.ContentLength = byteArray.Length;
                try
                {
                    ua.GetRequestStream().Write(byteArray, 0, byteArray.Length);
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)ua.GetResponse();
                    StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
                    result_page = myStreamReadermy.ReadToEnd();
                    //result_headers = myHttpWebResponse.Headers.ToString();
    
                    string[] pars = result_page.Split(new char[1] { '|' }, StringSplitOptions.RemoveEmptyEntries);
    
                    if (pars[0] == "OK")
                        id = Convert.ToInt64(pars[1]);
                    return result_page;
                }
                catch (WebException ex)
                {
                    Console.WriteLine(ex.Message);
                    return "";
                }
            }
    
    	public string get(long cap_id)
            {
                if (this.req("http://anti-captcha.net/res.aspx?key=" + key + "&action=get&id=" + cap_id + "&"))
                {
                    try
                    {
                        string[] result = result_page.Split(new char[1] { '|' });
                        return result[1];
                    }
                    catch
                    {
                        return result_page;
                    }
                }
                return "";
            }
    
            public string get_balance(string key)
            {
                if (this.req("http://anti-captcha.net/res.aspx?key=" + key + "&action=getbalance"))
                {
                    return result_page;
                }
                return "-1";
            }
    
            public bool reportbad(long cap_id)
            {
                if (this.req("http://anti-captcha.net/res.aspx?key=" + key + "&action=reportbad&id=" + cap_id))
                {
                    if (result_page.IndexOf("ERROR") >= 0)
                    {
                        return false;
                    }
                    return true;
                }
                return false;
            }
    
    	private bool req(string url)
            {
                ua = browser(url);
                ua.Method = "GET";
                ua.KeepAlive = true;
                try
                {
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)ua.GetResponse();
                    StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
                    result_page = myStreamReadermy.ReadToEnd();
                    result_headers = myHttpWebResponse.Headers.ToString();
                    return true;
                }
                catch (WebException ex)
                {
                    //Console.WriteLine(ex);
                    return false;
                }
            }
    
    Использование:
    Code:
    long capid = 0;
    string img_url = "http://vkontakte.ru/captcha.php?sid=" + sid + "&s=1";
    string ans = Upload(img_url, "jpg", out capid);
    
    if (!ans.StartsWith("ERROR") && answer != "NO_DATA")
    {
    	int tries = 0;
    	DateTime capStarted = DateTime.Now;
    	while (/*AppStarted && Started &&*/ ans != "" && capid > 0 && tries < 150 )
    	{
    		tries++;
    		System.TimeSpan diffResult = DateTime.Now.Subtract(capStarted);
    		if (diffResult.Seconds > 60)
    	        {
    			break;	
    		}
    		ans = get(capid);
    	        if (ans == "CAPCHA_NOT_READY")
            		Thread.Sleep(500);
    		else
            	break;
    	}
    }
    
     
    1 person likes this.
  3. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5

    на antigate.com, капча с твиттера
     
  4. Albertik

    Albertik New Member

    Joined:
    9 Oct 2011
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    А чем антикапча не нравится? те же 1000 за 1$, и скорость распознавания отличная.
     
  5. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    Респект, Альбертик. Отлично работает.
    Жаль, репу не могу поднять :(
     
  6. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    на том сервисе 50$
     
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Посмотри этот пост и сделай необходимые правки в коде, который скинули выше.
     
  8. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    С работой через cURL проблем должно не возникнуть.
     
  9. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Зачем всякие курлы на шарпе юзать?

    Как жизнь кста?