Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Программирование на PHP

  Все выпуски  

RFpro.ru: Программирование на PHP


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2483
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1319
∙ повысить рейтинг »
amnick
Статус: Профессионал
Рейтинг: 712
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / PHP

Номер выпуска:1234
Дата выхода:09.06.2011, 12:30
Администратор рассылки:Устинов С.Е. (Профессионал)
Подписчиков / экспертов:292 / 149
Вопросов / ответов:1 / 1

Вопрос № 183502: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Не могу понять, почему не работает скрипт. Изучаю курл, пробую эмулировать браузер, а именно авторизацию на форуме-отправка сообщения. Авторизация получилась, а отправка ни в какую. Что не пробов...



Вопрос № 183502:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Не могу понять, почему не работает скрипт. Изучаю курл, пробую эмулировать браузер, а именно авторизацию на форуме-отправка сообщения. Авторизация получилась, а отправка ни в какую. Что не пробовал, как не меняли скрипт - все равно, одна и та же ошибка сессии.. Подскажите, что я делаю не так? Или же на этом форуме, на котором я решил попробовать (специально создал тестовый), стоит какая-то супер защита от скриптов?

1вариант моего скрипта

Код (PHP):
<?php
$ch = curl_init('http://testtest.flyfolder.ru/login.php');
//@unlink('my_cookies.txt');
curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.16) Gecko/20110319 MRA 5.7 (build 03796) Firefox/3.6.16'); 

$headers = array
(
    '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-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'
); 
curl_setopt($ch, CURLOPT_HTTPHEADER,$headers); 

curl_setopt($ch, CURLOPT_REFERER, "http://testtest.flyfolder.ru/");

curl_setopt($ch, CURLOPT_POSTFIELDS, 'username=givi&password=111222&redirect=&login=%C2%F5%EE%E4');

curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");  
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");  
$result = curl_exec($ch);

curl_setopt($ch, CURLOPT_HEADER, true);
/////////////////////пост запрос
$pm = curl_init ('http://testtest.flyfolder.ru/posting.php');
curl_setopt($pm, CURLOPT_POST, 1);
curl_setopt ($pm, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.16) Gecko/20110319 MRA 5.7 (build 03796) Firefox/3.6.16'); 

curl_setopt($pm, CURLOPT_HTTPHEADER,$headers); 

curl_setopt($pm, CURLOPT_REFERER, "http://testtest.flyfolder.ru/viewtopic.php?p=28");

curl_setopt($pm, CURLOPT_POSTFIELDS, 'message=%F2%E5%F1%F2%EE%E2%EE%E5+%F1%EE%EE%E1%F9%E5%ED%E8%E5&sid=4bc642318a66e47b7d1046c8c88413d6&mode=reply&t=4&post=%CE%F2%EF%F0%E0%E2%E8%F2%FC');

$postdata = array( 'message' => 'blabla', 'sid' => 'sid');

curl_setopt($pm, CURLOPT_COOKIEJAR, "my_cookies.txt");  
curl_setopt($pm, CURLOPT_COOKIEFILE, "my_cookies.txt");  

$result = curl_exec($pm);
curl_setopt($pm, CURLOPT_HEADER, true);
curl_close($pm);

?>

2вариант моего скрипта (переделал 1 человек, но ошибка осталась).
Код (PHP):
<?php

function getURL($url, $postdata = "") {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Firefox');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

        if($postdata) {
          curl_setopt($ch, CURLOPT_POST, 1);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
          }

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);

        $data = curl_exec($ch);
        curl_close($ch);

  return $data;

  }

$url = 'http://testtest.flyfolder.ru/login.php';
$postdata = array('username'=>'givi', 'password'=>'111222', 'redirect'=>'http://testtest.flyfolder.ru/viewtopic.php?p=32', 'login'=>'true');

echo getURL($url, $postdata);

$url = 'http://testtest.flyfolder.ru/posting.php';
$postdata = array('message'=>'blabla', 'attach_sig'=>'on', 'mode'=>'reply', 't'=>'4', 'post'=>'%CE%F2%EF%F0%E0%E2%E8%F2%FC');

echo getURL($url, $postdata);
?>



3. Заголовки, полученные мозиллой, при ручной отправке сообщения в форум. http://paste.org.ru/?zvjodd

4. Код, который показывает скрипт, когда я его запускаю:
Код :
nginx/0.7.65
HTTP/1.1 100 Continue HTTP/1.1 200 OK Server: nginx/0.7.65 Date: Sat, 04 Jun 2011 07:50:27 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive Cache-Control: private, pre-check=0, post-check=0, max-age=0 Expires: 0 Pragma: no-cache

Появляется окно, в котором мое сообщение, и текст
Ошибка контроля сессий (вы слишком долго заполняли форму?). Попробуйте отправить данные заново.

А еще ниже (в другом фрейме) - 404 The requested URL /posting.php was not found on this server.
Т.е. ошибка денвера, хотя я не пойму, причем он тут вообще, ведь я писал полные пути, а не относительные.

Отправлен: 04.06.2011, 11:52
Вопрос задал: cherkasoff (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Волков Алексей aka Lupo (5-й класс) :
Здравствуйте, Черкасов Степан Николаевич!

Проблема не в cURL. Просто Вы указываете файл для cookies cookie.txt, который cURL не может использовать, так как у пользователя, под которым он вызывается, нет прав на запись в текущий каталог.

В качестве простейшего решения Вы можете создать в каталоге со скриптом файл cookie.txt и установить к нему права на запись для всех (666).

Хотя я бы рекомендовал создавать этот файл во временном каталоге - для безопасности системы:

Код :
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt');



*********************************************************************************************

Я рассматривал второй вариант. Кроме проблемы доступа к файлу cookies, при втором вызове getURL необходимо было передать ещё один POST-параметр: sid. Он устанавливается во время авторизации (в первом вызове getURL) и служит для однозначной идентификации автора сообщения, которое мы передаём при втором вызове getURL. Поскольку работу браузера мы только эмулируем, то проще получить этот параметр, разобрав заголовки сервера, которые возвращает нам первый вызов cURL. Выделим sid из первого вызова cURL и добавим его в POST-параметры для второго:

$url = 'http://testtest.flyfolder.ru/login.php';
$postdata = array('username'=>'givi', 'password'=>'111222', 'redirect'=>'viewtopic.php?p=32', ' ;login'=>'true');


$x = getURL($url, $postdata);

list ($null, $sid) = explode ("sid=", $x, 2);
list ($sid, $null) = explode (";", $sid, 2);


$url = 'http://testtest.flyfolder.ru/posting.php';
$postdata = array('message'=>'blabla_B', 'attach_sig'=>'on', 'mode'=>'reply', 'sid'=>$sid, 't'=>'4', 'post'=>'%CE%F2%EF%F0%E0%E2%E8%F2%FC');

echo getURL($url, $postdata);


*********************************************************************************************


Скорректировано по просьбе автора ответа.
Редактирование ответа по просьбе автора.
-----
∙ Отредактировал: Цикалов Игорь Константинович (Модератор)
∙ Дата редактирования: 07.06.2011, 15:35 (время московское)

-----
If each of us have one object, and we exchange them, then each of us still has one object. If each of us have one idea, and we exchange them, then each of us now has two ideas. (с)перто.

Ответ отправил: Волков Алексей aka Lupo (5-й класс)
Ответ отправлен: 06.06.2011, 17:44
Номер ответа: 267600
Россия, Москва
Адрес сайта: Мой опус, делаю для работы в свободное от основных занятий время
ICQ # 444811291

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267600 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное