К основному контенту

Использование curl в C#

Для того что бы скачать страницу какого-либо сайта в основном используют код следующего вида:

string page;
using(var client = new WebClient()) {
    page = client.DownloadString("http://www.example.com/");
}

Конечно, это простейший код, но в большинстве случаев он работает. Но бывают случаи, когда при "парсинге" возникает ошибка:  500 Internal Server Error.  В основном, она возникает в случае, если сервер не может получить от нас http-заголовок при запросе данных. (Конечно, это может быть и ошибка на сервере, но мы будет обсуждать случай, когда сайт защищен подобным способом)
В данном случае нам необходимо отправлять http-заголовок на сервер, таким образом мы маскируемся под браузер. Для этого и служит библиотека curl.

Программа cURL может автоматизировать передачу файлов или последовательность таких операций. Например, это хорошее средство для моделирования действий пользователя в веб-обозревателе. (wikipedia)

Для использования данной функции необходимо скачать библиотеку libcurl: http://sourceforge.net/projects/libcurl-net/

Из полученного архива нам понадобятся три файла: libcurl.dll, LibCurlNet.dll, LibCurlShim.dll в папке bin. Их нужно поместить в папку в проектом и подключить к нему LibCurlNet.dll.

Далее нужно создать класс для curl.

Файл http.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SeasideResearch.LibCurlNet;
using System.IO;
 
namespace namespace
{
    class http
    {
        private static Easy easy;
        private static Random rand = new Random();
        private static string SockBuff;
        private static string CookieFile = AppDomain.CurrentDomain.BaseDirectory + "cookie" + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + ".txt";
        public static string UserAgent = "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko";
        public static string Proxy = "";
        public string referer = "";
 
        public void Dispose()
        {
            ClearCookies();
        }
        public string getCookieFile()
        {
            return CookieFile;
        }
 
        public void CurlInit()
        {
            Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
        }
 
        public void ClearCookies()
        {
            if (File.Exists(CookieFile))
            {
                File.Delete(CookieFile);
            }
 
        }
 
        public string HTTPGet(string URL, string Proxy)
        {
            easy = new Easy();
            SockBuff = "";
 
            try
            {
                Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
 
                easy.SetOpt(CURLoption.CURLOPT_URL, URL);
                easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
                easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
                easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
                easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
                easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
                easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
 
                if (URL.Contains("https"))
                {
                    easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
                    easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
                }
 
                if (Proxy != "")
                {
                    easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
                    easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
                }
 
                easy.Perform();
                easy.Cleanup();
 
            }
            catch
            {
                Console.WriteLine("Get Request Error");
            }
 
            return SockBuff;
        }
 
        public string HTTPPost(string URL, string http_headers, string Content)
        {
            easy = new Easy();
            SockBuff = "";
            String proxy;
 
            try
            {
                Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
 
                easy.SetOpt(CURLoption.CURLOPT_URL, URL);
                easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
                easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
                easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
                easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
                easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
                easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, http_headers);
                easy.SetOpt(CURLoption.CURLOPT_REFERER, referer);
                //easy.SetOpt(CURLoption.CURLOPT_POSTFIELDSIZE, Content.Length); 
                easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
                easy.SetOpt(CURLoption.CURLOPT_STDERR, "test.txt");
 
                easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, 1);
 
                easy.SetOpt(CURLoption.CURLOPT_POST, true);
                easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, Content);
 
 
                if (URL.Contains("https"))
                {
                    easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
                    easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
                }
 
                if (Proxy != "")
                {
                    easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
                    easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
                }
 
                easy.Perform();
                easy.Cleanup();
 
            }
            catch
            {
 
            }
            return SockBuff;
 
        }
 
        public string SafeString(string data)
        {
            return Curl.Escape(data, data.Length);
        }
 
        public string UnSafeString(string data)
        {
            return Curl.Unescape(data, data.Length);
        }
 
        public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
        {
            // Console.Write(System.Text.Encoding.UTF8.GetString(  buf)); 
            SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf);
 
            return size * nmemb;
        }
    }
}

Далее в коде программы:

Файл Form1.cs:

http httpVar = new http();
httpVar.CurlInit(); // cURL init
httpVar.ClearCookies();
 
String
http_headers = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
http_headers = http_headers + "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36";
http_headers = http_headers + "Accept-Encoding: gzip,deflate,sdch";
http_headers = http_headers + "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4";
 
string htmlCode = httpVar.HTTPGet(tbAdress.Text, "");

Комментарии

Популярные сообщения из этого блога

Почему нельзя наследовать структуры в C# ?

Введение - зачем используются структуры? Все мы сильно любим структуры (идея, чуждая Java, не считая примитивных типов). Структуры, когда они не упакованы, зачастую, предоставляют прекрасную возможность обрабатывать динамические данные относительно небольшого размера. Размещение и освобождение типов данных в целом проще, чем размещение и освобождение ссылочных типов. Это связано тем, что структуры размещаются в стеке, либо встроены в содержащиеся типы и освобождаются, при очищении стека либо когда встроенные типы перераспределяются, в то время, как ссылочные типы размещаются в куче и очищаются сборщиком мусора (garbage-collected) Хм... Структуры не хотят наследоваться. Объектно-Ориентированное Программирование дает нам возможность делать много полезных вещей. И основной коцепт - это, конечно же, наследование. Многие из нас, когда либо, пытались наследовать структуру только для того, что бы понять, что C# не позволит нам этого сделать. Для примера рассмотрим код: /

Проблемы с SSL при использовании VK API

При реализации одного из проектов, связанных с API VK я столкнулся с одной крайне интересной проблемой. У меня просто перестал работать скрипт, при этом выдавая следующую ошибку: Traceback ( most recent call last ) : File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\contrib\pyopenssl.py" , line 441 , in wrap_socket cnx.do_handshake ( ) File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\SSL.py" , line 1806 , in do_handshake self._raise_ssl_error ( self._ssl , result ) File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\SSL.py" , line 1546 , in _raise_ssl_error _raise_current_error ( ) File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\_util.py" , line 54 , in exception_from_error_queue raise exception_type ( errors ) OpenSSL.SSL.Error: [ ( 'SSL routines&