Получил страницу с помощью 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, могу скинуть, если надо.
дак я же не смогу его в свою прогу воткнуть все равно... мне нужно чтобы именно кодом курла загрузить страничку... а потом парсить ее на то какой в ней находиться файл(точнее просто имя файла и все)... а в коде чего то не хватает, так как сайт какой то хитровы...й))
Ну в принципе сможешь, он отдельным модулем как бы. ) Но там ничего особенного, попробуй запрос, который я привел, использовать. Пока я точно не скопировал, что браузер отправляет - у меня тоже не приходило тело.
если он возращает страницу http://slil.ru , то возможно как то именно хост ему указать нужно, хотя я такого ни раз не делал...
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; } Я его сильно урезал для того, чтобы было понятнее и не было лишних зависимостей.
хотя нет, сейчас загрузил zalil.ru и там в хидере тот же Transfer-Encoding: chunked и он показывает тело... твой класс еще и с бустом))
твой класс? нет, у меня буста нет, в принципе я в свой смотрю что добавить... но пока не пойму чего еще в моем классе нет что есть в твоем...
Не знаю, что и подсказать... Посмотри, чтобы в снифаке был такой же запрос как и от браузера. В коде на 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