столкнулся с такой проблемой, не могу залогиниться на сайте... хочу чтобы прога сама логинелась на моей страничке, но по моему получается полная чушь... вот код, что я делаю не так? int main(int argc, char* argv[]) { CURL* curl; char url[] = "http://love.ngs.ru/login/"; char proxy[] = "92.50.163.114"; long port = 8085; char error[200]; char referer[] = "http://love.ngs.ru/"; struct curl_httppost* post = NULL; struct curl_httppost* last = NULL; char postdata[] = "send=ok&l=8j4w4w4w@rambler.ru&p=8j4w4w4w&remember_me=1"; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_REFERER, referer); curl_easy_setopt(curl, CURLOPT_PROXY, "117.102.91.6:8080"); //curl_easy_setopt(curl, CURLOPT_PROXYPORT, port); //curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_HEADER, 0); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"); // printf("\nTrying proxy [%s:%d]:\n", proxy, port); curl_easy_setopt(curl, CURLOPT_HTTPPOST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 54); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 7); curl_easy_perform(curl); // printf("Cannot perform\nError:%s\n", error); int i; std::cin >> i; return 0; } в итоге в консоль выводиться только хедер, а html кода нету и вообще не понятно залогинелся я или нет)
попробуй поставить это curl_easy_setopt(curl, CURLOPT_POST, true); перед этим curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata); типа сказать курлу что есть пост данные
попробывал так: int main(int argc, char* argv[]) { CURL* curl; char url[] = "http://love.ngs.ru/login/"; char proxy[] = "92.50.163.114"; long port = 8085; char error[200]; char referer[] = "http://love.ngs.ru/"; struct curl_httppost* post = NULL; struct curl_httppost* last = NULL; char postdata[] = "send=ok&l=8j4w4w4w%40rambler.ru&p=8j4w4w4w&remember_me=1"; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); //curl_formadd(&post, &last, CURLFORM_COPYNAME, "method", CURLFORM_COPYCONTENTS, "post", CURLFORM_END); // curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, "c:/2.jpg", CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_REFERER, referer); curl_easy_setopt(curl, CURLOPT_PROXY, "117.102.91.6:8080"); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_HEADER, 0); curl_easy_setopt(curl, CURLOPT_NOBODY, 1); curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt"); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt"); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"); curl_easy_setopt(curl, CURLOPT_HTTPPOST, 1); curl_easy_setopt(curl, CURLOPT_POST, true); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); curl_easy_perform(curl); int i; std::cin >> i; return 0; } и вроде все нормально))) спасибо за совет) но я не пойму как сделать так чтобы он еще и тело сайта вывел в консоль, а то так выводит только хедер и то что прокси и рефер установлены?? и еще один вопросик, куда сохраняются куки?? я прописал cookie.txt и создал текстовой файл возле экзэшника, но там пустота)) хотелось бы посмотреть куда он их сохраняет) или он после использования сразу их стерает из файла?)
и вообще я все правильно с куками делаю или нет?) их так находят в коде или может чего то еще не хватает?
блин, ну все, вывел уже не в консоль, а в GUI, теперь то точно видно что стал логиниться))) большое спасибо за помощь)))
прописал путь: curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "c:/cookie.txt"); но файл все равно пустой как не странно...
но без этих двух строчек нифига не логиниться как не странно)) curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt"); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt");
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt"); - файл, куда сохраняются куки curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt"); - файл, из которого они загружаются. если нет необходимости хранить куки в файлах, а нужно только автоматически их использовать, то: curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); или curl_easy_setopt(curl, CURLOPT_COOKIELIST, "");
сталкнулся со странной проблемкой, сделал многопоточную программку, она с каждого акка запускает свой поток, но так как я курлом сохраняю куки вот так: то почему то мне кажется что там дофига куков для одного сайта с каждого акка сохраняется и получается каша или я не прав??? помогите разобраться плиз... может лучше в переменную как то сохранять куки???
Не уверен, что ты делаешь то, что хотел. CURLOPT_COOKIEJAR - имя файла, в который сохраняются куки CURLOPT_COOKIEFILE - имя файла, из которого загружаются куки В либкурле много возможностей для работы с куками, но для твоих целей должно хватить и этого: p.s.: не забудь, для каждого потока - свой curl
НУ вы блин гении реальные. 1) Выводит хидер. Ну да, а что ты хочешь еще видеть? Даю 99% что код ответа 302 Moved и в теле заголовка есть Location: **** 2) Коль любите юзать всякую авторизацию и тому подобные вещи, то полюбите юзать авторедирект
В некоторых случаях авторедирект заметно увеличивает время авторизации. Он не нужен, если для авторизации и определения ее результата достаточно наличия редиректа в заголовке. Если это параллельные потоки, как они еще должны выводить страницы? Потока у тебя 2, а экран 1 -> гугл -> "синхронизация потоков"
2 M_script я говорю про случаи когда данных в заголовке недостаточно для точного знания залогинелся или нет. ПО этому авторедирект помогает хорошо, вместо того чтобы делать еще один запрос А вообще зачем выводить в консоль? не проще ли сразу делать вывод в буфер?
На всякий случай для eldar85 и всех, кто использует курл - авторедирект включается одной строкой: curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
ну и желательно еще добавлять curl_easy_setopt(ret->curl, CURLOPT_AUTOREFERER, 1); чтобы реферер сам вбивался при редиректах и следующих запросах