Постараюсь попонятней описать свою проблему. Есть у меня сайт на движке dle. Загорелся я написать скрипт который будет добавлять новости на сайт. Ну есть у меня файл с новостями(100 шт.) хочу чтоб не ручками добавлять а сразу все добавить. Опыт программирования на php - 3 месяца. Для начала думал просто попробовать написать скрипт который будет авторизовываться в админке. Беру лису, ловлю заголовки, собственно вот они
POST /admin.php? HTTP/1.1
Host: site.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
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://site.ru/admin.php?
Cookie: PHPSESSID=0c18570fb756f5590d89d1f77bd34aa2
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
subaction=dologin&username=admin&password=pass
Ага все ясно! вот скрипт.
<?
function post_content($url,$postdata)
{
$uagent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0";
$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/cookies.txt');
$content = curl_exec( $ch );
return $content;
}
//тут ф-ция которая скачивает http://site.ru/admin.php? и выдирает из заголовка PHPSESSID в переменную $session
//формирую post данные
$postdata = array(
'Host'=>'site.ru',
'User-Agent'=>'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0',
'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://site.ru/admin.php?',
'Cookie'=>'PHPSESSID='.$session, //подставляю PHPSESSID
'Content-Type'=>'application/x-www-form-urlencoded',
'Content-Length'=>'50',
'subaction'=>'dologin',
'username'=>'admin',
'password'=>'pass');
$url = 'http://site.ru/admin.php?';
echo post_content($url,$postdata);
?>
Как же я удивился что он не работает!!! Я пробовал и так и сяк. Убирал строчки которые отвечают за COOKIE, убирал все лишнее из POST,писал данные одной строкой. Вот так
subaction=dologin&username=admin&password=pass
Добавлял в POST - PHPSESSID='.$session, десять раз проверил логин и пароль! и нифига!
Короче я разочарован ппц. Надеюсь на Вашу помощь. Может и ошибка пустяковая но я уже своим мутным взглядом невижу её!
Спустя 13 минут, 14 секунд (10.08.2011 - 00:33) Invis1ble написал(а):
Цитата |
'Host'=>'site.ru', 'User-Agent'=>'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0', '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://site.ru/admin.php?', 'Cookie'=>'PHPSESSID='.$session, //подставляю PHPSESSID 'Content-Type'=>'application/x-www-form-urlencoded', 'Content-Length'=>'50', |
это не пост-данные, а заголовки. Не нужно их пихать в CURLOPT_POSTFIELDS. А вот это
Цитата |
'subaction'=>'dologin', 'username'=>'admin', 'password'=>'pass' |
надо. причем в виде
Цитата |
subaction=dologin&username=admin&password=pass |
После того, как исправишь - смотри заголовки ответа сервера и показывай код
Спустя 15 минут, 53 секунды (10.08.2011 - 00:49) Боря написал(а):
Не работает(((
вот что прислал сервер
вот скрипт
Только я непойму как тогда отослать заголовки на сервер? Браузер их же как то отсылает.
вот что прислал сервер
HTTP/1.1 200 OK
Date: Tue, 09 Aug 2011 21:40:24 GMT
Server: Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
X-Powered-By: PHP/5.2.14
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
Set-Cookie: dle_user_id=deleted; expires=Mon, 09-Aug-2010 21:40:23 GMT; path=/; domain=.site.ru; httponly
Set-Cookie: dle_name=deleted; expires=Mon, 09-Aug-2010 21:40:23 GMT; path=/; domain=.site.ru; httponly
Set-Cookie: dle_password=deleted; expires=Mon, 09-Aug-2010 21:40:23 GMT; path=/; domain=.site.ru; httponly
Set-Cookie: dle_hash=deleted; expires=Mon, 09-Aug-2010 21:40:23 GMT; path=/; domain=.site.ru; httponly
Last-Modified: Tue, 09 Aug 2011 21:40:24 GMT
Transfer-Encoding: chunked
Content-Type: text/html
вот скрипт
<?
function post_content($url,$postdata)
{
$uagent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0";
$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/cookies.txt');
$content = curl_exec( $ch );
return $content;
}
//формирую post данные
$postdata = 'subaction=dologin&username=admin&password=pass';
$url = 'http://site.ru/admin.php?';
echo post_content($url,$postdata);
?>
Только я непойму как тогда отослать заголовки на сервер? Браузер их же как то отсылает.
Спустя 8 часов, 55 минут, 18 секунд (10.08.2011 - 09:44) olegod написал(а):
Заголовки curl отсылает сам, отдельно отсылать их надо только если использовать сокеты.
Формат записи не имеет значения, можно писать всё в готовом виде, или массивом. Вы просто забыли поле selected_language, где указывается язык.
$postdata = array('username'=>'user',
'subaction'=>'dologin',
'selected_language'=>'Russian',
'password'=>'pass');
Формат записи не имеет значения, можно писать всё в готовом виде, или массивом. Вы просто забыли поле selected_language, где указывается язык.
Спустя 1 час, 3 минуты, 58 секунд (10.08.2011 - 10:48) fire написал(а):
Если цель добавление новостей на свой сайт то непонятно зачем эти извращения с курлом) Почему бы просто не сгенерировать дамп бд с новостями и потом уже залить его ? Кстати, видел под дле плагин xmlrpc, можно как и в вордпресе добавлять новости удаленно через апи, либо написать свой плагин для таких целей

Спустя 3 часа, 25 минут, 6 секунд (10.08.2011 - 14:13) Боря написал(а):
Сам думал сгенерировать дамп. Но в новостях в основном картинки которые при наведении увеличиваються. Для каждой кртинки нужно указывать ширину и высоту (а она у всех картинок разная). Ну я посчитал что это очень геморно. Но ошибся. Походу лучше генерировать дамп.
Спустя 55 минут, 11 секунд (10.08.2011 - 15:08) Боря написал(а):
Ха! Заработало!
<?php
function post($url,$post)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
return $result;
}
$page = post('http://site.ru/admin.php','subaction=dologin&username=admin&password=pass');
echo $page;
?>
Спустя 1 день, 23 часа, 49 минут, 24 секунды (12.08.2011 - 14:58) alexbel2404 написал(а):
пиши сразу в базу) таблица dle_post, там ничего сложного
и не надо морочить голову с авторизацией
