как увидеть содержимое страницы на slil.ru закачанную курлом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by eldar85, 9 Jul 2010.

  1. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    спасибо конечно, но это не курл же, речь шла именно отображение страницы курлом...
     
  2. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Получил страницу с помощью curl. Запрос такой:

    Code:
    
      Browser_curl::SRequest request;
      request.Method = "GET";
      request.Request_URI = "http://slil.ru/29449410";
      request.Host = "slil.ru";
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
      request.Accept_Language = "ru,en-us;q=0.7,en;q=0.3";
      request.Accept_Encoding = "gzip,deflate";
      request.Accept_Charset = "windows-1251,utf-8;q=0.7,*;q=0.7";
      request.Keep_Alive = "115";
      request.Connection = "keep-alive";
    
     Browser_curl mybroz("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6");
    
      std::string answer;
      mybroz.send_request(&request, answer);
      std::cout << answer;
    
    Browser_curl - это класс-обертка для curl, могу скинуть, если надо.
     
    #22 keen6, 10 Jul 2010
    Last edited: 10 Jul 2010
  3. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    дак я же не смогу его в свою прогу воткнуть все равно... мне нужно чтобы именно кодом курла загрузить страничку... а потом парсить ее на то какой в ней находиться файл(точнее просто имя файла и все)...
    а в коде чего то не хватает, так как сайт какой то хитровы...й))
     
  4. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Ну в принципе сможешь, он отдельным модулем как бы. ) Но там ничего особенного, попробуй запрос, который я привел, использовать. Пока я точно не скопировал, что браузер отправляет - у меня тоже не приходило тело. :)
     
    #24 keen6, 10 Jul 2010
    Last edited: 10 Jul 2010
  5. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    если он возращает страницу http://slil.ru , то возможно как то именно хост ему указать нужно, хотя я такого ни раз не делал...
     
  6. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Заметил, что если я добавляю поле Referer, то он не получает тело.
     
  7. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    ну поля referer я не добавляю вообще ... афигеть, что это еще за новая защита такая))))
     
  8. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Да ну, какая нафиг защита? )) Все работает...
     
  9. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    у через браузер то да, а вот если кодом то нифига)
     
  10. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Я могу скинуть код своего класса.
     
  11. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    давай))
     
  12. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Code:
    #include <curl/curl.h>
    #include <string>
    #include <iostream>
    #include <map>
    //#include <boost/regex.hpp>
    
    #define DEFAULT_RECIVE_TIMEOUT  10000
    #define DEFAULT_CONNECT_TIMEOUT 10000
    #define FIELDS_COUNT            9
    
    //libcurl-based Browser class
    class Browser_curl
    {
    public:
      
    	Browser_curl(const std::string& ua) : 
    	  user_agent_ (ua), 
    	  conn_timeout_(DEFAULT_CONNECT_TIMEOUT),
          recive_timeout_(DEFAULT_RECIVE_TIMEOUT)
          {}
      ~Browser_curl() {  } 
    
      struct SRequest 
      {
        // Request headers
        std::string Method;	
        std::string Host;
        std::string Request_URI; // With Host				
        std::string User_Agent;				 
        std::string Accept;					
        std::string Accept_Language;			 
        std::string Accept_Encoding;			
        std::string Accept_Charset;			 
        std::string Keep_Alive;
        std::string Connection;				 
        std::string Referer;		
        std::string X_Requested_With;
        std::string Cookie;
        std::string post_data;
        std::string Content_Type;
        std::string Content_Length;
      };
     
      struct SProxy 
    	{
    	  static enum proxy_type 
    	  { 
    		NONE	=  0x00,
    		HTTP    =  0x01, 
    		SOCKS4  =  0x04,
    		SOCKS5  =  0x05 
    	  };
    	  proxy_type type;
    	  std::string ip;
    	  std::string port;
    	  std::string user;
    	  std::string pass;
    	  SProxy() { type = SProxy::NONE; }
    	  SProxy
    	   (std::string _ip, std::string _port,  
    	    proxy_type _type = HTTP, 
    	    std::string _user = "", 
    		std::string _pass = "" ) 
    	  {
    		ip   = _ip;
    		port = _port;
    		type = _type;
    		user = _user;
    		pass = _pass;
    	  }
    	};
    
      void send_request(SRequest*, std::string&);
    
    private:
     
      // Callback functions
      static int write_proc
    	(char *, size_t , size_t , std::string*);
    
      // Additional functions
      std::string get_domain (const std::string&); 
     
      // tabs_ - CURL handlers 
      std::map<std::string, CURL* > tabs_;
      CURLcode result_;
    
      // Request headers
      struct curl_slist* headers_;
      std::string fields_[FIELDS_COUNT];
    
      // Response body
      std::string response_;
    
      int recive_timeout_;  // Timeouts in 
      int conn_timeout_;    // miliseconds
    
      std::string user_agent_;
     
    };
    
    void Browser_curl::send_request
      (SRequest* request, std::string& answer) 
    {
      headers_ = NULL;
      
      // Get domain and init new cURL instance
      std::string domain = get_domain(request->Host);
      if (tabs_.find(domain) == tabs_.end()) 
      {
         tabs_[domain] = curl_easy_init();
      }
      
      ///////////// Form http headers list ///////////////
      
      fields_[0] = "Accept: " + request->Accept;
      headers_ = curl_slist_append
    	  (headers_, fields_[0].c_str());
    
      fields_[1] = "Accept-Charset: " + request->Accept_Charset;
      headers_ = curl_slist_append
    	  (headers_, fields_[1].c_str());
    
      fields_[2] = "Accept-Language: " + request->Accept_Language;
      headers_ = curl_slist_append
    	  (headers_, fields_[2].c_str());
      
      fields_[3] = "Connection: " + request->Connection;
      headers_ = curl_slist_append
    	  (headers_, fields_[3].c_str());
      
      fields_[4] = "Content-Type: " + request->Content_Type;
      headers_ = curl_slist_append
    	  (headers_, fields_[4].c_str());
     
      // Insert user's cookies and cookies from the manager.
    
      fields_[5] = "Cookie: "; //+  form_cookies(domain);
      headers_ = curl_slist_append
    	  (headers_, fields_[5].c_str());
     
      fields_[6] = "Keep-Alive: " + request->Keep_Alive;
      headers_ = curl_slist_append(
    	  headers_,  fields_[6].c_str());
      
      fields_[7] = "Referer: " + request->Referer;
      headers_ = curl_slist_append
    	  (headers_, fields_[7].c_str());
      
      fields_[8] = "X-Requested-With: " + request->X_Requested_With;
      headers_ = curl_slist_append
    	  (headers_, fields_[8].c_str());
     
      ///////////////////// End of list ////////////////////
    
      CURL* curl = tabs_[domain];
    
      curl_easy_setopt(curl, 
        CURLOPT_URL, request->Request_URI.c_str());
    
      // Set options (and headers list)
      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers_);
      curl_easy_setopt(curl, CURLOPT_HEADER, 1);
      curl_easy_setopt(curl, CURLOPT_ENCODING, request->Accept_Encoding.c_str());
      curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, recive_timeout_);
      curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, conn_timeout_);
      curl_easy_setopt(curl, CURLOPT_USERAGENT, user_agent_.c_str());
    
      // Set write_proc and write buffer
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_proc);
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_);
    
      // Perform network operations
      result_ = curl_easy_perform(curl);
      //  
      // CURLE_OPERATION_TIMEDOUT - timeout error
      //
      // CURLE_COULDNT_CONNECT   - bad socks, may be HTTP 
      //
      // CURLE_RECV_ERROR  - not socks5   CURLE_GOT_NOTHING  - not socks4, may be http
      //
      std::cout << result_;
      answer = response_;
    
      // Parse 'Set-Cookie: ...  '
    //  cookie_manager(domain);
    }
    
    int Browser_curl::write_proc
     (char *data, size_t size, size_t nmemb, std::string *buffer)
    {
      int result = 0;
      if (buffer != NULL)
      {
        buffer->append(data, size * nmemb);
        result = size * nmemb;
      }
      return result;
    }
    
    // Represent the Host in ".domain" form
    std::string Browser_curl::get_domain 
      (const std::string& host)
    {
      if (host.substr(0,3) == "www")
      {
        return host.substr(3);
      }
      else 
      {
        return "." + host;
      }
    }
    
    int main(void)
    {
      curl_global_init(CURL_GLOBAL_ALL); 
    
      Browser_curl::SRequest request;
      request.Method = "GET";
      request.Request_URI = "http://slil.ru/29449410";
      request.Host = "slil.ru";
      request.Accept = "*/*";
      request.Accept_Language = "ru,en-us;q=0.7,en;q=0.3";
      request.Accept_Encoding = "gzip,deflate";
      request.Accept_Charset = "windows-1251,utf-8;q=0.7,*;q=0.7";
      request.Keep_Alive = "300";
      request.Connection = "keep-alive";
    
    
      Browser_curl mybroz("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6");
    
      std::string answer;
      mybroz.send_request(&request, answer);
      std::cout << answer;
      
      return 0;
    }
    
    

    Я его сильно урезал для того, чтобы было понятнее и не было лишних зависимостей.
     
    #32 keen6, 10 Jul 2010
    Last edited: 10 Jul 2010
  13. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    вроди бы в моем классе все это тоже есть, возможно дело вот в этом Transfer-Encoding: chunked
     
  14. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    хотя нет, сейчас загрузил zalil.ru и там в хидере тот же Transfer-Encoding: chunked и он показывает тело...
    твой класс еще и с бустом))
     
  15. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Да, буст для парсинга кук. ) Ты его запускал, работает?
     
  16. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    я понял)
     
  17. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    твой класс? нет, у меня буста нет, в принципе я в свой смотрю что добавить... но пока не пойму чего еще в моем классе нет что есть в твоем...
     
  18. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Так я же вроде специально зависимости от буста убрал...
     
  19. eldar85

    eldar85 New Member

    Joined:
    27 Aug 2009
    Messages:
    126
    Likes Received:
    1
    Reputations:
    0
    нифига я не пойму что у моего класса не хватает что есть в твоем...
     
  20. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Не знаю, что и подсказать... Посмотри, чтобы в снифаке был такой же запрос как и от браузера. В коде на 1 странице не увидел, где формируются все поля, которые есть в запросе браузера.

    + проверь версию курла, у меня - 7.19.5. Мало ли чего. :)

    Кстати как вариант - у тебя может быть собран libcurl без поддержки gzip. Например, я получаю такой хедер:

    Code:
    HTTP/1.1 200 OK
    Server: nginx/0.3.17
    Date: Sat, 10 Jul 2010 18:52:50 GMT
    Content-Type: text/html; charset=windows-1251
    Transfer-Encoding: chunked
    Connection: keep-alive
    Content-Encoding: gzip
     
    #40 keen6, 10 Jul 2010
    Last edited: 10 Jul 2010