Привет всем. Снова прошу помощи. На этот раз пишу авторегер аккаунтов одной системы. Алгоритм регистрации в той системе прост. Вводишь в поле e-mail, на следующей странице ты уже зарегестрирован, получаешь логин и пароль. Только вот данные из поля отправляются методом POST. Итак я отснифил запрос, который отправляется в сценарий обработчик: Запрос: Code: http://www.site.ru/registration_confirm/ POST /registration_confirm/ HTTP/1.1 Host: www.site.ru User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Referer: http://www.site.ru/ Cookie: PHPSESSID=bjdc5cs8cvg0glh22ig3quefq2; visit_id=10170365; __utma=86016519.2130053710.1340697550.1340697550.1340697550.1; __utmb=86016519.1.10.1340697550; __utmc=86016519; __utmz=86016519.1340697550.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _ym_visorc=b Content-Type: multipart/form-data; boundary=---------------------------41184676334 Content-Length: 539 -----------------------------41184676334 Content-Disposition: form-data; name="action" registration -----------------------------41184676334 Content-Disposition: form-data; name="email" [email protected] -----------------------------41184676334 Content-Disposition: form-data; name="ad_create" 1 -----------------------------41184676334 Content-Disposition: form-data; name="x" 115 -----------------------------41184676334 Content-Disposition: form-data; name="y" 23 -----------------------------41184676334-- Ответ от сервера: Code: HTTP/1.1 302 Found Server: nginx/1.0.11 Date: Tue, 26 Jun 2012 08:02:21 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive X-Powered-By: PHP/5.3.8 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Location: http://www.site.ru/registration_ok/ Content-Length: 0 В случае удачной регистрации получаем ответ, и редирект на http://www.site.ru/registration_ok/. Написал функцию, которая генерирует все данные (+ ко всему e-mail, который мы вводим может быть с потолка, т. к. на него подтверждение не приходит). PHP: function get($url, $proxy, $user_agent, $post = 0, $postdata = 0, $headers = 0) { global $cookie_file; $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); // задаем URL curl_setopt($c, CURLOPT_PROXY, $proxy); // задаем прокси curl_setopt($c, CURLOPT_USERAGENT, $user_agent); // задаем юзер агент if ($post) { curl_setopt($c, CURLOPT_POST, 1); // работаем с методом POST curl_setopt($c, CURLOPT_POSTFIELDS, $postdata); // POST данные curl_setopt($c, CURLOPT_HTTPHEADER, $headers); // HTTP данные curl_setopt($c, CURLOPT_REFERER, 'http://www.site.ru/'); // реферер } curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_HEADER, 1); curl_setopt($c, CURLOPT_COOKIEFILE, realpath($cookie_file)); // задаем файл куки curl_setopt($c, CURLOPT_COOKIEJAR, realpath($cookie_file)); // задаем файл куки curl_setopt($c, CURLOPT_TIMEOUT, 5); // Перспективная функция таймаута curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // возврат результата в переменную return curl_exec($c); } В итоге регистрация все равно не происходит. Я обращаюсь сначала к главной странице, там получаю куки и записываю в файл. Затем обращаюсь к сценарию http://www.site.ru/registration_confirm/ с POST запросом и POST данными. Вот как выглядит один из моих запросов. Code: POST http://www.site.ru/registration_confirm/ HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 Host: www.site.ru Referer: http://www.site.ru/ Proxy-Connection: Keep-Alive Cookie: PHPSESSID=ga9deieeq1d3c7rloqlm515972; visit_id=10177850 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Content-Length: 529 Content-Type: application/x-www-form-urlencoded -----------------------------70769166796 Content-Disposition: form-data; name="action" registration -----------------------------70769166796 Content-Disposition: form-data; name="email" [email protected] -----------------------------70769166796 Content-Disposition: form-data; name="ad_create" 1 -----------------------------70769166796 Content-Disposition: form-data; name="x" 123 -----------------------------70769166796 Content-Disposition: form-data; name="y" 5 -----------------------------70769166796-- И вот ответ сервера: Code: HTTP/1.0 200 OK Server: nginx/1.0.11 Date: Tue, 26 Jun 2012 14:41:53 GMT Content-Type: text/html; charset=utf-8 X-Powered-By: PHP/5.3.8 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache X-Cache: MISS from ruroprx-srv02 X-Cache-Lookup: MISS from ruroprx-srv02:3128 Via: 1.0 ruroprx-srv02 (squid/3.0.STABLE19) Proxy-Connection: close Как видим не 302 ответ, как нужно с редиректом на страницу успеха регистрации, а 200. На самой же странице говорится, что я ввел e-mail в неправильном формате. Т. е. что то не так все таки. Хотя если сравнить нормальный запрос, и запрос, который у меня генерируется, то по формату они одинаковы, и я не пойму, что не нравится серверу. Или не одинаковы, и есть ошибка в синтаксисе HTTP заголовков ? Подскажите, как можно решить, или что предпринять ?
Правильный запрос "Content-Type: multipart/form-data; boundary=---------------------------41184676334" Твой запрос "Content-Type: application/x-www-form-urlencoded" upd: PHP: struct curl_httppost *post = NULL; struct curl_httppost *last = NULL; curl_formadd(&post, &last, CURLFORM_COPYNAME, "action", CURLFORM_COPYCONTENTS, "registration", CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "email", CURLFORM_COPYCONTENTS, "[email protected]", CURLFORM_END); ... curl_easy_setopt(curl, CURLOPT_URL, "http://www.site.ru/registration_confirm/"); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); curl_easy_perform(curl);
M_script, тупанул я, потерял куда то боундари, сейчас добавил, к сожалению результат не изменился, мой запрос принял вид: Code: POST http://www.site.ru/registration_confirm/ HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 Host: www.site.ru Referer: http://www.site.ru/ Proxy-Connection: Keep-Alive Cookie: PHPSESSID=37vrss9nmt8gvnad0svbh1gog5; visit_id=10179154 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Content-Type: multipart/form-data; boundary=-----------------------------86286074977 Content-Length: 532 -----------------------------86286074977 Content-Disposition: form-data; name="action" registration -----------------------------86286074977 Content-Disposition: form-data; name="email" [email protected] -----------------------------86286074977 Content-Disposition: form-data; name="ad_create" 1 -----------------------------86286074977 Content-Disposition: form-data; name="x" 151 -----------------------------86286074977 Content-Disposition: form-data; name="y" 14 -----------------------------86286074977-- krypt3r а можете конкретней, что мне следует сделать ? Не передавать в виде массива, или закодировать элементы массива с помощью urlencode() ? Я передаю массив, значит он закодируется в multipart/form-data. У меня объявлено: Code: Content-Type: multipart/form-data; boundary=-----------------------------86286074977 Значит все правильно ?
Есть, всем огромное спасибо. На самом деле нужно было не генерировать строку сложно POST данных, а передать массив, где ключи - это параметры, а значения - значения параметров.