Помогите с curl при отправке POST данных

Discussion in 'PHP' started by Edward, 26 Jun 2012.

  1. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Привет всем. Снова прошу помощи. На этот раз пишу авторегер аккаунтов одной системы. Алгоритм регистрации в той системе прост. Вводишь в поле 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($cCURLOPT_URL$url); // задаем URL 
        
    curl_setopt($cCURLOPT_PROXY$proxy); // задаем прокси
        
    curl_setopt($cCURLOPT_USERAGENT$user_agent); // задаем юзер агент
        
    if ($post) {
            
    curl_setopt($cCURLOPT_POST1); // работаем с методом POST
            
    curl_setopt($cCURLOPT_POSTFIELDS$postdata); // POST данные
            
    curl_setopt($cCURLOPT_HTTPHEADER$headers); // HTTP данные
            
    curl_setopt($cCURLOPT_REFERER'http://www.site.ru/'); // реферер
        
    }
        
    curl_setopt($cCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($cCURLOPT_HEADER1); 
        
    curl_setopt($cCURLOPT_COOKIEFILErealpath($cookie_file)); // задаем файл куки
        
    curl_setopt($cCURLOPT_COOKIEJARrealpath($cookie_file)); // задаем файл куки
        
    curl_setopt($cCURLOPT_TIMEOUT5); // Перспективная функция таймаута
        
    curl_setopt($cCURLOPT_RETURNTRANSFER1); // возврат результата в переменную
        
    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 заголовков ? Подскажите, как можно решить, или что предпринять ?
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Правильный запрос
    "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(curlCURLOPT_URL"http://www.site.ru/registration_confirm/");
    curl_easy_setopt(curlCURLOPT_HTTPPOSTpost);
    curl_easy_perform(curl);
     
    #2 M_script, 26 Jun 2012
    Last edited: 26 Jun 2012
    1 person likes this.
  3. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    1234
     
    1 person likes this.
  4. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    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
    Значит все правильно ?
     
  5. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Есть, всем огромное спасибо. На самом деле нужно было не генерировать строку сложно POST данных, а передать массив, где ключи - это параметры, а значения - значения параметров.