Curl и отправка postfields

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

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

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    Прошу подсказать по моему вопросу.
    Пишу скрипт для размещения новостей на сайте ucoz. Нашел скрипт, который делает тоже самое, что и мой будет. Немного переделал:
    PHP:
    <?php
    header
    ("Content-Type: text/html;charset=utf-8");
    $login 'тут логин';
    $passwd 'пароль';
    define ('DS',DIRECTORY_SEPARATOR);
    echo 
    getcwd().DS.'cookie.txt';
     
    $ch curl_init();
    curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt');
    curl_setopt($chCURLOPT_COOKIEFILE'cookie.txt');
    curl_setopt($chCURLOPT_USERAGENT'Opera 10.00');
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_URL"http://сайт/index/sub/");
    curl_setopt($chCURLOPT_POSTFIELDS'user='.$login.'&password='.$passwd.'&rem=1'.'&a=2'.'&ajax=1'.'&_tp_=xml&'.rand(100,999));
    $res curl_exec($ch);
    curl_close($ch);
     
    $ch1=  curl_init();
    curl_setopt($ch1CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch1CURLOPT_USERAGENT'Opera 10.00');
    curl_setopt($ch1CURLOPT_COOKIEFILE'cookie.txt');
    curl_setopt($ch1CURLOPT_URL,  "http://сайт/news/0-0-0-0-1");
    curl_setopt($ch1CURLOPT_POST0);
    $stranica_for_ssid curl_exec($ch1);
    curl_close($ch1);
     
    if (
    preg_match_all(
            
    '#<input type="hidden" name="ssid" value="(.+)" />#i',
            
    $stranica_for_ssid,
            
    $res))
    {
        
    $ssid=$res[1][0];
    }
    else
    {
        echo 
    'ssid не получен';
    }
     
    $filds = array( 
        
    'a'=> 2,
        
    'jkd428'=> 1,
        
    'jkd498'=> 1,
        
    'title'=> '<b>заголовок новости</b>32434<br>',
        
    'message' => html_entity_decode('<b>заголовок новости</b>32434<br>текст1efww8888888888888wwwwwwwwwwwwwwwwww'),
        
    'format_message' =>1,
        
    'edttmessage'=>2,
        
    'html_message' =>1,
        
    'coms_allowed'=>1,
        
    'ssid' => $ssid
    );
     
    $ch3=  curl_init();
    curl_setopt($ch3CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch3CURLOPT_USERAGENT'Opera 10.00');
    curl_setopt($ch3CURLOPT_COOKIEFILE'cookie.txt');
    curl_setopt($ch3CURLOPT_URL,  "http://wm-ginza.ru/news/0-0-0-0-1");
    curl_setopt($ch3CURLOPT_POSTFIELDS$filds);
    $res1 curl_exec($ch3);
     
    ?>
    С curl где $ch и $ch1, все понятно. А вот с $ch3 вопрос: Почему при передаче данных в POSTFIELDS в виде ассоциативного массива не указывается параметр POST (1 или true)?
    Или параметр POST (1 или true) надо указывать только когда отправка данных в POSTFIELDS идет в таком виде: 'para1=val1&para2=val2&...'.
    Если поставить POST (1 или true) то вылетает 411 ошибка.
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    Во первых отказывайтесь от копипаста...
    Для начала навоять нужно функцию.
    Как только с отим разберетесь можно перейти к класам..
    Без обертки работать с HTTP очень неудобно.

    Изначально я так понимаю вы взяли просто код и приняли его за верный и начали разбираться...
    В подобных исходниках можно только брать саму суть логики не более. Далее переписывать.
    Сейчас навояю пример.

    PHP:
    <?php
    $login 
    'qqwwwq';
    $passwd 'qqwwwq1';
    $site='http://horeman.ru/';
     
    header("Content-Type: text/html;charset=utf-8");
    define ('DS',DIRECTORY_SEPARATOR);
     
    // Сама функция обработки запросов...
    function GO($url$post=false$header=false)
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_COOKIEJARgetcwd().DS.'cookie.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILEgetcwd().DS.'cookie.txt');
        
    curl_setopt($chCURLOPT_USERAGENT'Opera 10.00');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
        
    curl_setopt($chCURLOPT_TIMEOUT20);
        
    curl_setopt($chCURLOPT_AUTOREFERER1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_MAXREDIRS10);
     
        if (
    $post!==false)
        {
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
        }
     
        if (
    $header!==false)
            
    curl_setopt($chCURLOPT_HTTPHEADER$header);
     
        
    $res curl_exec($ch);
        
    curl_close($ch);
        return 
    $res;
    }
     
    $page=GO($site.'index/sub/', array(
        
    'user'        => $login,
        
    'password'    => $passwd,
        
    'rem'        => 1,
        
    'a'            => 2,
        
    'ajax'        => 1,
        
    '_tp_'        => 'xml',
        
    ''            => rand(100,999)
    )
    );
     
    $page=GO($site.'/news/0-0-0-0-1');
     
    if (
    preg_match_all('#<input type="hidden" name="ssid" value="(.+)" />#i'$page$page))
    {
        
    $ssid=$res[1][0];
        
    $filds = array(
            
    'a'=> 2,
            
    'jkd428'=> 1,
            
    'jkd498'=> 1,
            
    'title'=> '<b>заголовок новости</b>32434<br>',
            
    'message' => html_entity_decode('<b>заголовок новости</b>32434<br>текст1efww8888888888888wwwwwwwwwwwwwwwwww'),
            
    'format_message' =>1,
            
    'edttmessage'=>2,
            
    'html_message' =>1,
            
    'coms_allowed'=>1,
            
    'ssid' => $ssid
        
    );
     
        
    $page=GO($site.'/news/0-0-0-0-1'$filds);
    }
    else
        echo 
    'ssid не получен';
    ?>
    Этот тот же самый код только в нормальном читабельном виде.
    На счет проблемы с 411 нужен сайт и логин с паролем для онализа заголовков...
    + сейчас гляну у меня вроди есть постер в юкоз...

    PS. Какая то большая концентрация програмов на PHP в городе подымается..
     
    svk__wlad нравится это.
  3. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    Да... есть постер но 2009 года... Даже стыдно выкладывать...
    Но наверно даже работает хоть и код там мама не горюй какой убогий....

    PS. Скрипт писался под заказ... так что подойдет ли он вам незнаю... В конце концов на основе точно сможете сделать треуемое именно вам.
     

    Вложения:

  4. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    Inviseble_Demon, спасибо за ответ, думал уж не кто не ответит.
    А теперь по сути, вопрос был другой: я хочу понять когда и как надо отправлять данные (когда в массиве, когда строкой... и как от этого зависит параметр post). Прошу обратить внимание на текст после кода. Для меня главное понять логику работы с "Curl и отправка postfields".
    Обвертка у меня есть на классе и все работает (у мня там более наворочение и что бы лишним кодом не забивать людям мозг выложил так)
     
  5. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    92
    Симпатии:
    11
    дело в том что даннsй код не отправляет данные. Пишет "Доступ запрещен. Истек период сессии.]]>"

    отправка postfields :
    1) http_build_query -- генерирует URL-кодированную строку запроса из массива $fields
    2) Отправляется POST запрос на сайт.
    3) Выдаётся ошибка
    4) Новость не добавляется.
     
  6. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    92
    Симпатии:
    11
    Ох, нет всё отлично работает, просто в строчке
    PHP:
    if (preg_match_all('#<input type="hidden" name="ssid" value="(.+)" />#i'$page$page))
    вместо $page должно конечно быть $res

    PHP:
    if (preg_match_all('#<input type="hidden" name="ssid" value="(.+)" />#i'$page$res))
     
  7. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    dirdir, как я понял это коммент к коду Inviseble_Demon.
    dirdir, смотри код, который выкладывал я он линейный и рабочий (Inviseble_Demon код не проверял, но работать должен).
    Inviseble_Demon, если надо то могу выложить код с классом curl'а
     
  8. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    92
    Симпатии:
    11
    Немного не понял вопрос, но всё же.

    1) CURL - просто библиотека, упрощающая работу с сокетами, грубо говоря просто автоматизирует работу для протоколов HTTP, ftp и т.д. Так что не требуется самому читать файлы куки, писать функции отпарвки данных контроля ошибок и т.п. И не требуется самому составлять "заголовок" для отправки на сервер.

    2) Строчка
    PHP:
    curl_setopt($chCURLOPT_POST1);
    Устанавливает метод отправки данных на сервер. Метод у нас POST. Это значит что CURL сформирует заголовок для отправки методом POST. Но строка с данными для метода POST не отличается от строки с данными для метода отправки GET.

    Вот здесь формируется данные для отправки из массива $filds (Строка вида переменная1=значение1&переменная2=значение2
    PHP:
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
    3) Ну и дальше отправляется на адрес /news/0-0-0-0-1 . Вот и всё вроде.
     
  9. svk__wlad

    svk__wlad Создатель

    Регистр.:
    21 мар 2012
    Сообщения:
    33
    Симпатии:
    1
    dirdir, 1) 2) 3) все понятно и было, я так и думал что это работает как было описано (читал маны)
    PHP:
    $ch3=  curl_init();
    curl_setopt($ch3CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch3CURLOPT_USERAGENT'Opera 10.00');
    curl_setopt($ch3CURLOPT_COOKIEFILE'cookie.txt');
    curl_setopt($ch3CURLOPT_URL,  "http://wm-ginza.ru/news/0-0-0-0-1");
    curl_setopt($ch3CURLOPT_POSTFIELDS$filds);
    $res1 curl_exec($ch3);
    я не могу понять почему у меня работает данный, код. Здесь же не указан параметр CURLOPT_POST 1. По логике вещей он должен быть обязателен т.к. отправляются данные в CURLOPT_POSTFIELDS
     
  10. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    92
    Симпатии:
    11
    Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое.

    Так что хоть кодируй строку, хоть массивом передавай. Данные всё равно отправятся.
     
    svk__wlad нравится это.
Статус темы:
Закрыта.