Curl и отправка postfields

Тема в разделе "PHP", создана пользователем svk__wlad, 24 мар 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    dirdir, ответ как раз, который я искал. Из данного ответа возник еще один вопрос: в чем заключается разница, как отправлять данные? Меньше же писать просто ассоциативный массив и не указывать параметр (для чего-то же был создан вариант с кодированием массива и указанием параметра post и когда какой вариант лучше применять). В манах такой информации не видел
     
  2. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    111
    Симпатии:
    12
    Только что проверил отправляемые заголовки при установке метода отправки curl_setopt($ch3, CURLOPT_POST, 1); и без него

    В обоих случаях отправляется методом POST

    Проверить отправляемые заголовки можно так
    PHP:
    curl_setopt($ch3CURLINFO_HEADER_OUTtrue);
    $res1 curl_exec($ch3);
    print_r(curl_getinfo($ch3CURLINFO_HEADER_OUT));
     
  3. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    111
    Симпатии:
    12
    Разница будет в отправляемых заголовках. Сервер должен знак как придут данные. А заголовки автоматически уже проставит этот CURL - он для этого и нужен.
    Либо (года массив отправляется, а точне данные разделённые на блоки)
    Content-Type: multipart/form-data;

    Либо заголовок будет
    application/x-www-form-urlencoded

    Это когда строкой поедет на сервер.

    (Как заголовки посмотреть написал выше).
     
  4. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    478
    Симпатии:
    352
    Да конечно... код не тестил... делал копипаст вот и пролетел.
    [​IMG]
    Вообще не проверял но надеюсь более ошибок нет :)

    Проглядел...
    Есть по этому поводу информация..
    CURLOPT_POST - Этот параметр говорит мол данные "application/x-www-form-urlencoded" и не ипет. Данный тип данных говарит о том что это простой пост запрос.
    То есть если использовать CURLOPT_POSTFIELDS и передать в него масив и при этом CURLOPT_POST - true то будит и удобно задавать параметры POST запроса и его тип будит "application/x-www-form-urlencoded".
    А вот если CURLOPT_POST параметра нет то будит "multipart/form-data"
    Подозреваю что мой код неработает потому как там скорее всего требуется именно "multipart/form-data" и связано это с тем что там файлы можно в форме постить за счет этого тип другой.

    Вот в этом и ошибка...
    Использовать готовое это отлично но сначало нужны азы. И именно по этому сначала нужно самому тону говнокода перенаписать для того что бы потом были низкоуровневые знания.
    Знать как пользоваться оберткой и знать как она работает это разные вещи.

    PS. В принципе тоже самое вам сказал dirdir но я постарался немного развернуть ответ для ясности.
     
    svk__wlad нравится это.
  5. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    Inviseble_Demon, полностью согласен с вами, если бы начал писать на сокетах то данного вопроса не возникло бы. А ответ очень подробный.
    Немного отойду от темы:
    Inviseble_Demon, но почему многие считают что если только начал разбираться с php то не знаю как работает класс и для чего он нужен? Логика написания кода во всех языках примерно одинаковая, разница в синтаксисе.
    А посмотреть чужой код и разобраться в нем ...это полезно когда изучаешь новый язык.
    Класс для работы с curl писал сам (не люблю пользоваться чужим кодом, когда можно написать самому). Если бы я не знал как работает, то не смог бы написать класс.
    Как доберусь до своего компа выложу код с классом, может и вправду где то накосячил и не понимаю как работает.
     
  6. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    Нашел у себя на флешке. Вот класс для работы с curl, по мере необходимости дописываю / переделываю


    PHP:
    <?php
    define 
    ('DS',DIRECTORY_SEPARATOR);
    class 
    curl
    {
        var 
    $url;
        var 
    $post;
        var 
    $useragent;
        var 
    $agenti = Array(
            
    'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/10.10',
            
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2',
            
    'Opera 10.00');
        var 
    $postfields;
        var 
    $cookiejar;
        var 
    $cookiefile;
        var 
    $returntransfer ;
        var 
    $http_header;
        var 
    $header;
        var 
    $refer;
        var 
    $close=true;
        var 
    $followlocation;
     
        function 
    connect ()
        {
            
    $ch=curl_init();
            
    curl_setopt ($chCURLOPT_URL$this->url); 
     
            if (!empty(
    $this->useragent))
            {
                
    curl_setopt ($chCURLOPT_USERAGENT,  $this->useragent);
            }
     
            if (!empty(
    $this->header))
            {
                
    curl_setopt($chCURLOPT_HEADER$this->header);
            }
     
            if (!empty(
    $this->followlocation))
            {
                
    curl_setopt ($chCURLOPT_FOLLOWLOCATION$this->followlocation);
            }
     
            if (!empty(
    $this->refer))
            {
                
    curl_setopt ($chCURLOPT_REFERER$this->refer);
            }
     
            if (!empty(
    $this->postfields))
            {
                
    curl_setopt ($chCURLOPT_POSTFIELDS,  $this->postfields);     
            }
     
            if (!empty(
    $this->post))
            {
                
    curl_setopt ($chCURLOPT_POST$this->post);
            }
     
            if (!empty(
    $this->http_header))
            {
                
    curl_setopt ($chCURLOPT_HTTPHEADER$this->http_header);
            }
               
            if (!empty(
    $this->cookiejar))
            {
                
    curl_setopt($ch,CURLOPT_COOKIEJAR,getcwd().DS.$this->cookiejar);
            }
            if (!empty(
    $this->cookiefile))
            {
                
    curl_setopt($chCURLOPT_COOKIEFILEgetcwd().DS.$this->cookiefile);
            }
     
            if (!empty(
    $this->returntransfer))
            {
                
    curl_setopt ($chCURLOPT_RETURNTRANSFER$this->returntransfer);
            }
     
            
    $result curl_exec($ch);
     
            if (!
    $result)
            {
                echo 
    curl_errno($ch).'<br>';
                echo 
    curl_error($ch).'<br>';
            }
            if (
    $this->close)
            {
                
    //echo '<br>закрытие сессии<br>';
                
    curl_close($ch);
            }
             
            return 
    $result;
        }
    }
    ?>
    [/spoil]



    И вот сам мой код. Лишние данные убрал (логин, пароль, сайт:(


    PHP:
    <?php
    header
    ("Content-Type: text/html;charset=utf-8");
    define ('DS',DIRECTORY_SEPARATOR);
    require (
    DS.'class'.DS.'myclass.php');
     
    $login='';
    $passwd=;
     
    $avtorizacia = new curl();
    $avtorizacia->url='http://сайт/index/sub/';
    $avtorizacia->post=1;
    $avtorizacia->postfields='user='.$login.'&password='.$passwd.'&rem=1'.'&a=2'.'&ajax=1'.'&_tp_=xml&'.rand(100,999);
    $avtorizacia->cookiejar='coockie.txt';
    $avtorizacia->cookiefile='coockie.txt';
    $avtorizacia->useragent=$avtorizacia->agenti[2];
    $avtorizacia->returntransfer=1;
    $avtorizacia->connect();
     
     
    $for_ssid = new curl;
    $for_ssid->url='http://сайт/news/0-0-0-0-1';
    $for_ssid->returntransfer 1;
    $for_ssid->cookiefile='coockie.txt';
    $for_ssid->useragent $for_ssid->agenti[2];
    $for_ssid->post=0;
    $stranica_for_ssid $for_ssid->connect();
     
    if (
    preg_match_all(
            
    '#<input type="hidden" name="ssid" value="(.+)" />#i',
            
    $stranica_for_ssid,
            
    $res))
    {
        
    $ssid=$res[1][0];
    }
    else
    {
        echo 
    'ssid не получен';
    }
    $filecsv fopen ('infa.csv','r');
    /*
    while (($infa = fgetcsv($filecsv,0,';'))!==FALSE)
    {
        print_r($infa);
    }
    */
    $infa fgetcsv($filecsv,0,';');
     
    $title $infa[1];
    $message $infa[3];
    $filename$infa[2];
     
    $message html_entity_decode($message);
    $material = array (
        
    'a'=>2,
        
    'jkd428'=>1,
        
    'jkd498'=>1,
        
    'title'=>$title,
        
    'format_brief' => 1,
        
    'html_brief=' => 1,
        
    'message'=>$message,
        
    'format' => '1',
        
    'format_message'=>1,
        
    'html_message'=>1,
        
    'ssid'=>$ssid,
        );
     
     
     
     
    $add_material = new curl;
    $add_material->url ='http://сайт/news/0-0-0-0-1';
    $add_material->cookiefile='coockie.txt';
    //$add_material->post = 1;
    $add_material->useragent $add_material->agenti[2];
    $add_material->postfields $material;
    $add_material->returntransfer =1;
    $cudo=$add_material->connect();
    print_r($cudo);
     
    echo 
    '<br>'.$ssid.'<br>';
     
    ?>
     
  7. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
  8. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    478
    Симпатии:
    352
    http://www.phpclasses.org/search.html?words=curl&x=12&y=2&go_search=1
    Бери любой и все на PHP
    Проблемы в поиске этого нет.

    Да согласен выводы в познаниях сделал поспешные...

    Это всегда полезно, бОльшую часть знаний мы получаем именно от туда а не из манов.

    Все хорошо но только суть обертки как таковая утерена... Слишком многое нужно задавать...
    Попробуйте либо поковырять другие класы либо переделать свой... Вам просто работать будит удобнее.
    Сама прелесть обекта это то что можно задавать параметры на сесию работы. То есть изначально можно задать такие параметры как таймаут локатион печеньки и подобное. Дополнительные параметры можно делать интуетивно если масив в запросе значит порт запрос.
    Более интелектуальный и удобный нужно делать... Просто задавать столько параметров для простого гет запроса это не очень удобно у вас в итоге от простой функции отличие только тем что вы задаете тону параметрои и потом используя их делаете запрос.

    Это равносильно
    Если просто задавать переменные и потом в функции поличить их из global
    Это немного не то что вам понадобится...
     
Статус темы:
Закрыта.