2017-02-08 8 views
1

Мое приложение автоматически заполняет почти 30 полей и оставляет только несколько для пользователя и captcha для заполнения.GET Изображение с URL-адреса с SSL/TSL

Мне нужно получить и отобразить captcha с URL-адреса.

Я пробовал по-другому, но никто не работает, как мне нужно.

URL является captcha link

с хромом вы получите изображение непосредственно с IE вы получите файл для загрузки.

Первая попытка

Открыть URL с контролем WebBrowser , если вы пытаетесь открыть URL с WebBrowser вы получите начать с загрузки файла если вы сохраните его как cap.gif или JPG вы получите правильное изображение ,

В этот момент я пытаюсь выполнить автоматическую загрузку, чтобы избежать отображения диалогового окна загрузки для пользователей.

Как и другие SO ответить Download file and automatically save it to folder я стараюсь обрабатывать WebBrowser навигацию

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    e.Cancel = true; 
    WebClient client = new WebClient(); 

    client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted); 
    client.DownloadDataAsync(e.Url); 
} 

или непосредственно с WebClient

WebClient webClient = new WebClient(); 
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
webClient.DownloadFileAsync(new Uri(url), filepath); 

на обратный вызов результатов профайлинга вы получите файл изображения пустой (0 байт);

Если вы посмотрите на AsyncCompletedEventArgs e, это порождает ошибки в отношении SSL/TSL.

The request was aborted: Could not create SSL/TLS secure channel. 
in System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
in System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
in System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result) 

Вторая попытка

Включить стек SSL/TSL для WebClient в качестве SO ответ The request was aborted: Could not create SSL/TLS secure channel

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AllwaysGoodCertificate); 
ServicePointManager.Expect100Continue = true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

WebClient webClient = new WebClient(); 
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
webClient.DownloadFileAsync(new Uri(captchaUrl), filepath); 

это вернет ту же ошибку на обратный вызов

Третья попытка Получить изображение из WebBrowser управляет и конвертирует тег в PictureBox

Если я пытаюсь извлечь изображение на главной форме содержимого страницы, это позволит мне получить изображение последует SO ответить How to copy the loaded image in webbrowser to picturebox

[DllImport("user32.dll")] 
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags); 

public Bitmap CaptureWindow(Control ctl) 
{ 
    //Bitmap bmp = new Bitmap(ctl.Width, ctl.Height); // includes borders 
    Bitmap bmp = new Bitmap(ctl.ClientRectangle.Width, ctl.ClientRectangle.Height); // content only 
    using (Graphics graphics = Graphics.FromImage(bmp)) 
    { 
     IntPtr hDC = graphics.GetHdc(); 
     try { PrintWindow(ctl.Handle, hDC, (uint)0); } 
     finally { graphics.ReleaseHdc(hDC); } 
    } 
    return bmp; 
} 

//Methods to get Co-ordinates Of an Element in your webbrowser 
public int getXoffset(HtmlElement el) 
{ 
    int xPos = el.OffsetRectangle.Left; 
    HtmlElement tempEl = el.OffsetParent; 
    while (tempEl != null) 
    { 
     xPos += tempEl.OffsetRectangle.Left; 
     tempEl = tempEl.OffsetParent; 
    } 
    return xPos; 
} 

public int getYoffset(HtmlElement el) 
{ 
    int yPos = el.OffsetRectangle.Top; 
    HtmlElement tempEl = el.OffsetParent; 
    while (tempEl != null) 
    { 
     yPos += tempEl.OffsetRectangle.Top; 
     tempEl = tempEl.OffsetParent; 
    } 
    return yPos; 
} 

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    // get captcha 
    HtmlElement el = webBrowser1.Document.GetElementById("imgCaptcha"); 
    IHTMLImgElement img = (IHTMLImgElement)el.DomElement; 
    Bitmap bmp = new Bitmap(img.width, img.height); 

    int CaptchaWidth = getXoffset(el); 
    int CaptchaHeight = getYoffset(el); 
    Rectangle rect = new Rectangle(CaptchaWidth, CaptchaHeight, img.width, img.height); 

    // with this image il always blank 
    //webBrowser1.DrawToBitmap(bmp, rect); 

    Bitmap bitmap = CaptureWindow(webBrowser1); 
    Bitmap croppedImage = bitmap.Clone(rect, System.Drawing.Imaging.PixelFormat.Undefined); 
    pictureBox1.BackgroundImage = croppedImage; 
} 

Этих отлично работает, но к сожалению, это работает только если у вас есть контроль WebBrowser видимые ... :(

Любое предложение будет оценено.

ответ

1

После некоторой работы я обнаружил одну проблему на SSL, протокол протокола TSL 1 сервера.2 вместо SSL3

просто заменить

//ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

и теперь WebClient хорошо работать, но, прежде чем дать себе правильный ответ, я жду, если кто-то еще есть другие реализации.

1

изменение я бы должен был бы использовать асинхр/ОЖИДАНИЕ, поэтому я бы не придется беспокоиться о настройке DownloadFileCompleted из WebClient

Эта часть, как вы делали,

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

использовать асинхр метод

public async Task DownloadIt(string url ,string filename) 
{ 
    using (var client = new WebClient()) 
    { 
     await client.DownloadFileTaskAsync(new Uri(url), filename); 
    } 
} 

называть его так, как только это необходимо.

await DownloadIt("https://www.com", @"C:\Path\To\Save"); 
Смежные вопросы