Curl и отправка postfields

Статус
В этой теме нельзя размещать новые ответы.

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($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_USERAGENT, 'Opera 10.00');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, "http://сайт/index/sub/");
curl_setopt($ch, CURLOPT_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($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_USERAGENT, 'Opera 10.00');
curl_setopt($ch1, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch1, CURLOPT_URL,  "http://сайт/news/0-0-0-0-1");
curl_setopt($ch1, CURLOPT_POST, 0);
$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($ch3, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch3, CURLOPT_USERAGENT, 'Opera 10.00');
curl_setopt($ch3, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch3, CURLOPT_URL,  "http://wm-ginza.ru/news/0-0-0-0-1");
curl_setopt($ch3, CURLOPT_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 ошибка.
 
Во первых отказывайтесь от копипаста...
Для начала навоять нужно функцию.
Как только с отим разберетесь можно перейти к класам..
Без обертки работать с 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($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().DS.'cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().DS.'cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera 10.00');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
 
    if ($post!==false)
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }
 
    if ($header!==false)
        curl_setopt($ch, CURLOPT_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 в городе подымается..
 
Да... есть постер но 2009 года... Даже стыдно выкладывать...
Но наверно даже работает хоть и код там мама не горюй какой убогий....

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

Вложения

  • Ucoz_Poster_v1.0.rar
    70,8 KB · Просмотры: 8
Inviseble_Demon, спасибо за ответ, думал уж не кто не ответит.
А теперь по сути, вопрос был другой: я хочу понять когда и как надо отправлять данные (когда в массиве, когда строкой... и как от этого зависит параметр post). Прошу обратить внимание на текст после кода. Для меня главное понять логику работы с "Curl и отправка postfields".
Обвертка у меня есть на классе и все работает (у мня там более наворочение и что бы лишним кодом не забивать людям мозг выложил так)
 
дело в том что даннsй код не отправляет данные. Пишет "Доступ запрещен. Истек период сессии.]]>"

отправка postfields :
1) http_build_query -- генерирует URL-кодированную строку запроса из массива $fields
2) Отправляется POST запрос на сайт.
3) Выдаётся ошибка
4) Новость не добавляется.
 
Ох, нет всё отлично работает, просто в строчке
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))
 
dirdir, как я понял это коммент к коду Inviseble_Demon.
dirdir, смотри код, который выкладывал я он линейный и рабочий (Inviseble_Demon код не проверял, но работать должен).
Inviseble_Demon, если надо то могу выложить код с классом curl'а
 
когда в массиве, когда строкой... и как от этого зависит параметр post
Немного не понял вопрос, но всё же.

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

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

Вот здесь формируется данные для отправки из массива $filds (Строка вида переменная1=значение1&переменная2=значение2
PHP:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));

3) Ну и дальше отправляется на адрес /news/0-0-0-0-1 . Вот и всё вроде.
 
dirdir, 1) 2) 3) все понятно и было, я так и думал что это работает как было описано (читал маны)
PHP:
$ch3=  curl_init();
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch3, CURLOPT_USERAGENT, 'Opera 10.00');
curl_setopt($ch3, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch3, CURLOPT_URL,  "http://wm-ginza.ru/news/0-0-0-0-1");
curl_setopt($ch3, CURLOPT_POSTFIELDS, $filds);
$res1 = curl_exec($ch3);
я не могу понять почему у меня работает данный, код. Здесь же не указан параметр CURLOPT_POST 1. По логике вещей он должен быть обязателен т.к. отправляются данные в CURLOPT_POSTFIELDS
 
Здесь же не указан параметр CURLOPT_POST 1. По логике вещей он должен быть обязателен т.к. отправляются данные в CURLOPT_POSTFIELDS

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

Так что хоть кодируй строку, хоть массивом передавай. Данные всё равно отправятся.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху