Отправка через post curl

Тема в разделе "PHP", создана пользователем iNFiNiTy, 21 мар 2011.

Модераторы: latteo
  1. iNFiNiTy

    iNFiNiTy Создатель

    Регистр.:
    11 апр 2007
    Сообщения:
    37
    Симпатии:
    1
    пытаюсь обновить профиль на сайте через curl.
    Авторизацию сделал, а вот с обновлением профиля проблемы, там данные на сервер передаются в таком виде:
    HTML:
    Content-Type: multipart/form-data; boundary=---------------------------179682735826031
    Content-Length: 2815
    -----------------------------179682735826031
    Content-Disposition: form-data; name="userid"
    4019
    -----------------------------179682735826031
    Content-Disposition: form-data; name="curpassword"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserhideemail"
    1
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserpmnotify"
    0
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserskin"
    green
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserlang"
    ru
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusercountry"
    au
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserlocation"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusertimezone"
    +00
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserwebsite"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruserirc"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusericq"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusermsn"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ryear"
    0
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rmonth"
    0
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rday"
    0
    -----------------------------179682735826031
    Content-Disposition: form-data; name="ruseroccupation"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusergender"
    U
    -----------------------------179682735826031
    Content-Disposition: form-data; name="MAX_FILE_SIZE"
    102400000
    -----------------------------179682735826031
    Content-Disposition: form-data; name="userfile"; filename=""
    Content-Type: application/octet-stream
    -----------------------------179682735826031
    Content-Disposition: form-data; name="MAX_FILE_SIZE"
    8192000
    -----------------------------179682735826031
    Content-Disposition: form-data; name="userphoto"; filename=""
    Content-Type: application/octet-stream
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rusertext"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rnewpass1"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="rnewpass2"
    -----------------------------179682735826031
    Content-Disposition: form-data; name="x"
    C0CECD
    -----------------------------179682735826031--
    пытаюсь отправить запрос так
    PHP:
    post_send($host."/users.php?m=profile&a=update",$postdata);
    $postdata=array(
    'userid' => '4019',
    'curpassword' => '',
    ....
    'userphoto' => '',
    'x' => 'C0CECD'
    )
    При отправке пишет WRONG URL и не обновляется. что я делаю не так? может у кого-то есть рабочий пример, а то я и так и этак, уже какой день (
     
  2. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    Можно больше информации? Хотя бы функцию post_send увидеть. Можно в личку.
    Кстати, это у вас и в коде так - сначала вызов функции, а потом объявление той переменной, которая в эту функцию передается?
    Чему равна переменная $host до момента передачи ее в функцию post_send?
     
  3. Murdok

    Murdok

    Регистр.:
    1 окт 2006
    Сообщения:
    236
    Симпатии:
    84
    Возможно вас перенаправляет скрипт на другую страницу, а вы остаетесь на тойже куда и отсылаете.
    Попробуйте вставить
    Код:
    curl_setopt($ch,FOLLOW_LOCATION,1);
     
    iNFiNiTy нравится это.
  4. iNFiNiTy

    iNFiNiTy Создатель

    Регистр.:
    11 апр 2007
    Сообщения:
    37
    Симпатии:
    1
    $postdata идет в начале функции post_send

    PHP:
    function post_send($url,$post){
    $ch curl_init(); 
    curl_setopt($chCURLOPT_URL,$url); // set url to post to 
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_HEADER0);
        
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
        
    curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
        
    curl_setopt($chCURLOPT_SSL_VERIFYHOST0);
        
    curl_setopt($chCURLOPT_ENCODING"gzip,deflate");
        
    curl_setopt($ch,FOLLOW_LOCATION,1);
    if( 
    is_array$post ) || strlen$post ) > ) {
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDS$post);
        }
    //Настойка опций cookie
    curl_setopt($chCURLOPT_COOKIEJAR'/home/test1.ru/www/parser/cook.txt');//сохранить куки в файл
    curl_setopt($chCURLOPT_COOKIEFILE'/home/test1.ru/www/parser/cook.txt');//считать куки из файла 
    $result curl_exec($ch); // run the whole process 
    curl_close($ch);  
    return 
    $result
    }
    Да Вы правы там идет перенаправление когда профиль обновился (показывает сообщение об успешном обновлении потом опять в профиль), но я поставил код:

    PHP:
    curl_setopt($ch,FOLLOW_LOCATION,1);
    теперь выдает ошибку
    HTML:
    Warning: curl_setopt() expects parameter 2 to be long, string given in Z:\home\test1.ru\www\parser\index.php on line 90
     
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    CURLOPT_FOLLOWLOCATION а не FOLLOW_LOCATION
     
    iNFiNiTy нравится это.
  6. iNFiNiTy

    iNFiNiTy Создатель

    Регистр.:
    11 апр 2007
    Сообщения:
    37
    Симпатии:
    1
    спасибо. но результат тотже (вернее ни какого), профиль не обновляется.
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    1) покажи что в переменной $url хранится.
    2) в CURLOPT_POSTFIELDS попробуй передавать строку,а не массив. Строка вида ключ1=значение&ключ2=значение2...и т.д.
    3) проверь, совпадают ли названия полей в html-коде страницы с ключами в твоем post-запросе.
    4) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    вот это для чего тебе?
     
  8. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    Вот рабочий код вашей авторизации на сайте
    PHP:
    <?php 
    $co
    =ex_curl('http://site.ru/users.php?m=auth&a=check&redirect=',false,true,NULL,'rusername=pastern2&rpassword=232323&rcookiettl=0&x=GUEST''http://site.ru/users.php?m=auth');
    $c get_cookie($co);
    $co=ex_curl('http://site.ru/message.php?msg=104&redirect=',true,true,NULL,'''http://site.ru/users.php?m=auth');
    sleep(2);
    $co=ex_curl('http://site.ru/index.php',true,false,$c'''http://site.ru/users.php?m=auth&a=check&redirect=');
    //Сейчас нужные нам куки в переменной $c, а контент текущей страницы в переменной $co
    die();

    function 
    ex_curl($url,$get=true,$headers=false,$cookie=NULL,$fields=NULL,$referrer=NULL){
        
    $ch=curl_init($url);
        
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        
    curl_setopt($ch,CURLOPT_ENCODING,'gzip, deflate');
        
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6');
        
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,0);

        if(!
    $get){
            
    curl_setopt($ch,CURLOPT_POST,1);
            
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
        }

        if(
    $cookie!='') {
            
    curl_setopt($ch,CURLOPT_COOKIE,$cookie);
            
    curl_setopt($chCURLOPT_COOKIEJAR$cookie);
        }
        if(
    $headerscurl_setopt($ch,CURLOPT_HEADER,1);
        if(
    $referrer!=''curl_setopt($ch,CURLOPT_REFERER,$referrer);
        
    curl_setopt($chCURLINFO_HEADER_OUTtrue);
        
    curl_setopt($chCURLOPT_HTTPHEADER, array('Expect:'));
        
    curl_setopt($chCURLINFO_HEADER_OUTtrue);
        
    $rt curl_exec($ch);
        
    curl_close($ch);
        return 
    $rt;
    }

    function 
    get_cookie($ch){
        
    preg_match_all('/Set-Cookie: (.*)/m',$ch,$ch);
        for(
    $i=0;$i<count($ch[1]);$i++)
        {
            
    $co.=trim($ch[1][$i]).'; ';
        }
        
    $c substr(trim($co),0,-1);
        return 
    $c;
    }
    ?> 
     
  9. iNFiNiTy

    iNFiNiTy Создатель

    Регистр.:
    11 апр 2007
    Сообщения:
    37
    Симпатии:
    1
    $host="http://www.test.ru";

    пробывал тоже так
    проверил не сколько раз.

    для уверенности.

    Сейчас stealthdebuger помогает ... пытаемся разобраться, за что огромное спасибо.
     
  10. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    Вопрос решен, проблема была в неверной попытке отправить данные при Content-Type=multipart/form-data
     
    iNFiNiTy нравится это.