[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: cURL+https+multipart/form-data
teandr
Доброго времени суток!!!

Требуется авторизоваться на сайте с помощью cURL .

Форма запроса:

<form id="index" action="https://www.mysite.com/studiologin/index.php" method="post" enctype="multipart/form-data">
<input
type="hidden" id="client_datetime" name="client_datetime" value="" />
<input
type="text" name="PerformerID" id="PerformerID" maxlength="50" value="" />
<input
type="password" name="PPassword" id="PPassword" maxlength="50" value="" />
<input
type="submit" id="mlogin" name="mlogin" value="Login" />
<input
type="text" name="StudioID" id="StudioID" maxlength="50" value="" />
<input
type="password" name="SPassword" id="SPassword" maxlength="50" value="" />
<input
type="submit" id="slogin" name="slogin" value="Login" />
</form>


Содержание запроса:

Content-Type=multipart/form-data; boundary=---------------------------41184676334

POSTDATA =-----------------------------114782935826962
Content-Disposition: form-data; name="client_datetime"

Wed Jan 13 2010 04:49:35 GMT+0000
-----------------------------114782935826962
Content-Disposition: form-data; name="PerformerID"

login
-----------------------------114782935826962
Content-Disposition: form-data; name="PPassword"

password
-----------------------------114782935826962
Content-Disposition: form-data; name="mlogin"

Login
-----------------------------114782935826962
Content-Disposition: form-data; name="StudioID"


-----------------------------114782935826962
Content-Disposition: form-data; name="SPassword"


-----------------------------114782935826962--

Пишу такой код:

<?php
$date=date("D M d Y H:i:s \G\M\TO");
$postdata=array(
'client_datetime'=>'.$date.',
'PerformerID'=>'login',
'PPassword'=>'password',
'mlogin'=>'Login',
'StudioID'=>'',
'SPassword'=>''
);
// вход в систему
// имя хоста, куда будем заходить

$hostname = 'www.mysite.com';

// инициализация cURL
$ch = curl_init('https://'.$hostname.'/studiologin/index.php');
// получать заголовки
curl_setopt ($ch, CURLOPT_HEADER, 1);
// если ведется проверка HTTP User-agent, то передаем один из возможных

допустимых вариантов:
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT

5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'
);
// елси проверятся откуда пришел пользователь, то указываем допустимый

заголовок HTTP Referer:
curl_setopt ($ch, CURLOPT_REFERER,

'https://'.$hostname.'/studiologin/index.php');
// использовать метод POST
curl_setopt ($ch, CURLOPT_POST, 1);
// сохранять информацию Cookie в файл, чтобы потом можно было ее использовать
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'C:\AppServ\www\cookie.txt');
curl_setopt($ch,CURLOPT_COOKIEFILE,'C:\AppServ\www\cookie.txt');
// передаем поля формы
curl_setopt ($ch, CURLOPT_POSTFIELDS,$postdata);
// возвращать результат работы
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// не проверять SSL сертификат
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
// не проверять Host SSL сертификата
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
// это необходимо, чтобы cURL не высылал заголовок на ожидание
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));
// выполнить запрос
curl_exec ($ch);
// получить результат работы
$result = curl_multi_getcontent ($ch);
// вывести результат
echo $result;
// закрыть сессию работы с cURL
curl_close ($ch);
?>


Выдает это:

HTTP/1.1 302 Found Server: nginx/0.7.64 Date: Wed, 13 Jan 2010 05:15:25 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.1.6 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: member_skin=skin2; expires=Fri, 12-Feb-2010 05:15:25 GMT; path=/; domain=.needlive.com location: /performerarea/ Content-Length: 0

Что я делаю неправильно? Подскажите пожалуйста!



Спустя 1 час, 19 минут, 4 секунды (13.01.2010 - 10:35) Oyeme написал(а):
$result = curl_multi_getcontent ($ch);
curl_multi_getcontent — Возвращает результат операции, если был установлен параметр CURLOPT_RETURNTRANSFER

Что выдаёт?
$string = curl_exec($ch);
echo $string;

Спустя 19 минут, 46 секунд (13.01.2010 - 10:54) teandr написал(а):
Добрый день,Oyeme!
Спасибо,что откликнулись biggrin.gif
$string = curl_exec($ch);
echo $string;
выдает тоже самое:
HTTP/1.1 302 Found Server: nginx/0.7.64 Date: Wed, 13 Jan 2010 07:53:00 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.1.6 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: member_skin=skin2; expires=Fri, 12-Feb-2010 07:52:59 GMT; path=/; domain=.needlive.com location: /performerarea/ Content-Length: 0

Спустя 9 минут, 25 секунд (13.01.2010 - 11:04) jetistyum написал(а):
тебе выдается хедер Location:
посмотри опцию
CURLOPT_FOLLOWLOCATION

Спустя 7 минут, 25 секунд (13.01.2010 - 11:11) VolCh написал(а):
teandr
Грубо говоря ты авторизовался (скорее всего) и тебя перенаправляют уже на страницу с тем для чего ты авторизовался.

Спустя 31 минута, 35 секунд (13.01.2010 - 11:43) teandr написал(а):
Авторизовался?
Т.е. нужно попробывать перейти на следующую страницу сайта?
А как всё таки увидеть содержание именно этой страницы?

Заранее спасибо!

Спустя 9 минут, 15 секунд (13.01.2010 - 11:52) VolCh написал(а):
ответ сервера "302 FOUND" означает, что запрашиваемая страница находится по другому адресу, адрес указан в Location - у тебя /performerarea/ , то есть теперь ты должен запрашивать её (согласно стандарта запрашивать ты её должен тоже через POST, но многие на это не рассчитывают и ждут GET, попробуй и так, и так, cURL'у я бы тут доверять не стал)

Спустя 57 секунд (13.01.2010 - 11:53) Oyeme написал(а):
Каким методом ты авторизируешсья?
1.Через коокисы
2.Пост.
2.1 В случаи поста тебе придётся всё время тоскать за собой ПОСТ.

Наверни ка сайт сделан на коокисах,тогда пост тебе тут вообще не пригодиться.

Как раз curl_exec($ch); выдаёт содержимое сайста в виде строки.

Просто выведи содержимой страници начально,потом уже работай с коокисамы.

Как тут и сказали при посте идёт редирикт,чтобы последовать поставь CURLOPT_FOLLOWLOCATION в 1.

Спустя 5 минут, 2 секунды (13.01.2010 - 11:58) jetistyum написал(а):
Цитата (VolCh @ 13.01.2010 - 11:52)
cURL'у я бы тут доверять не стал)

а это с чего бы??? если есть стандарт редиректа, ему должен следовать и cURL и браузер, так зачем изобретать велосипед...

Спустя 6 минут, 11 секунд (13.01.2010 - 12:04) teandr написал(а):

curl_setopt ($ch,CURLOPT_FOLLOWLOCATION,1); -работает!!!

Oyeme, ты гений! biggrin.gif

Только вот заголовок выводится тоже sad.gif

Как его убрать?

Спустя 7 минут, 43 секунды (13.01.2010 - 12:12) jetistyum написал(а):
а как на счет почитать доки о CURL

Спустя 3 минуты, 12 секунд (13.01.2010 - 12:15) VolCh написал(а):
jetistyum
Потому что по стандарту при 302 ответе на не GET или HEAD клиент должен спросить у пользователя осуществлять ли ридирект, как это спрашивать будет cURL я слабо представляю unsure.gif

Спустя 2 минуты, 22 секунды (13.01.2010 - 12:18) jetistyum написал(а):
я как-то не наблюдал чтобы браузер спрашивал о редиректе после поста...
можно пруфлинк на стандарт??? RFC ???

Спустя 4 минуты, 14 секунд (13.01.2010 - 12:22) VolCh написал(а):
Цитата
  If the 302 status code is received in response to a request other
  than GET or HEAD, the user agent MUST NOT automatically redirect the
  request unless it can be confirmed by the user, since this might
  change the conditions under which the request was issued.


http://tools.ietf.org/html/rfc2616#section-10.3.3

Вот потому-то я cURL'у и не доверяю обрабатывать редиректы при POST, то ли он будет вести себя как популярные браузеры не по стандарту, то ли у кого-то как-то будет спрашивать.

Спустя 8 минут, 5 секунд (13.01.2010 - 12:30) jetistyum написал(а):
VolCh, да, отчасти ты прав
но там сказано про работу с юзером, cURL реализация в PHP не предусматривает работу с юзером, как ты понимаешь


но тут же есть:
Цитата
Note: RFC 1945 and RFC 2068 specify that the client is not allowed
      to change the method on the redirected request.  However, most
      existing user agent implementations treat 302 as if it were a 303
      response, performing a GET on the Location field-value regardless
      of the original request method. The status codes 303 and 307 have
      been added for servers that wish to make unambiguously clear which
      kind of reaction is expected of the client.


тоесть большинство юзер-агентов не придерживаются этого правила и обрабатывают 302 так же как если бы это был 303 ... посылая GET запрос

ну и еще, CURL ни разу не подводил в этих вопросахю Ну и сервер должен уметь обрабатывать результат работы браузера, которые в большинстве своем не придерживаются стандарта ...

Спустя 14 минут, 43 секунды (13.01.2010 - 12:45) VolCh написал(а):
jetistyum
Не хочется зависеть от того, что вдруг девы сURL'а решат работать по стандарту, а мой скрипт перестанет работать после очередного обновления сервака. Я лучше ручками сам не по стандарту сделаю и коммент поставлю, что это потому что в 2010 году большинство агентов на стандарт забивали, а сервера с этим были согласны smile.gif

Спустя 5 минут, 15 секунд (13.01.2010 - 12:50) jetistyum написал(а):
обратная совместимость думаю будет поддерживаться, тем более скорее исправят выдачу заголовка с 302 на 303 (явно промах программера) чем изменят работу cURL
я бы полностью на него полагался...

Спустя 4 минуты, 13 секунд (13.01.2010 - 12:54) jetistyum написал(а):
по докам CURL_FOLLOWLOCATION:

Цитата
TRUE to follow any "Location: " header that the server sends as part of the HTTP header (note this is recursive, PHP will follow as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set).


тоесть считай что это есть "согласие на все" (и есть согласие юзера на редирект) .. так что можно сказать что это и так придерживание стандартов ... и ничего менять нет смысла и нет возможности .
ну люблю я спорить!!! smile.gif)

Спустя 6 минут, 20 секунд (13.01.2010 - 13:00) VolCh написал(а):
jetistyum
а запросит он гетом или постом? smile.gif если постом, кстати, то можно "ловилку" курлобразных грабберов сделать, браузеры же гет дают cool.gif

Спустя 9 минут, 21 секунда (13.01.2010 - 13:10) jetistyum написал(а):
вот это нужно проверить ... интересно кстати ..

Спустя 11 месяцев, 24 дня, 5 часов, 1 минута, 40 секунд (7.01.2011 - 18:11) Tigran написал(а):
Прошу вас выручите прям очень срочно нужно. Я не знаю в чем ошибка. Но не отправляется ничего. вот код самой формы:
<?
###########################
# Alokazay 435-695-848 #
# t-banks@mail.ru #
###########################
#Подключаем города с файла gorod.php
$gorod = Array();
$email = Array();
$cont = file('gorod.txt');
foreach ($cont as $key){
$i = strpos ($key,",");
$gorod[] = substr($key,0,$i);
$email[]= substr($key,$i+1);
}



#Форма отправки если данные не ведены то показываем первую форму
if (@$_REQUEST['gorod']==""){
echo '<form enctype="multipart/form-data" action="" method="post">';
echo '<center><h1>Подать заявку</h1></center><br><font color="red" size="2">*</font> <b>Город</b><br>';
echo '<select name="gorod" size="1">';
# формируем список городов из массива $gorod
foreach ($gorod as $key => $value){
$goroda .= '<option value="'.$key.'">'.$value.'</option>';
}
echo $goroda;
echo '</select>';
echo '
<br><br><font color="red" size="2">*</font> <b>Наименование исполнителя</b><br><input maxlength="" name="pole_1" style="width: 300px;" value="" type="text"><br><br>
<font color="red" size="2">*</font> <b>Список участников</b><br><textarea cols="50" rows="5" name="pole_2"></textarea><br><br>
<font color="red" size="2">*</font> <b>Описание коллектива</b><br><textarea cols="50" rows="5" name="pole_3"></textarea><br><br>
<font color="red" size="2">*</font> <b>Мобильный телефон</b><br><input maxlength="" name="pole_4" style="width: 300px;" value="" type="text"><br><br>
<font color="red" size="2">*</font> <b>E-mail</b><br>
<input maxlength="" name="pole_5" style="width: 300px;" value="" type="text"><br><br> <b>Вконтакте</b><br>
<input maxlength="" name="pole_6" style="width: 300px;" value="" type="text"><br><br> <b>Skype</b><br>
<input maxlength="" name="pole_7" style="width: 300px;" value="" type="text"><br><br> <b>ICQ</b><br>
<input maxlength="" name="pole_8" style="width: 300px;" value="" type="text"><br><br><font color="red" size="2">*</font> <b>Ссылка на ваш трек №1</b><br>
<input maxlength="" name="pole_9" style="width: 300px;" value="" type="text"><br><br> <b>Ссылка на ваш трек №2</b><br><input maxlength="" name="pole_10" style="width: 300px;" value="" type="text"><br><br> <b>Ссылка на ваш трек №3</b><br>
<input maxlength="" name="pole_11" style="width: 300px;" value="" type="text"></p>';
echo '<input type=submit name=go value="Отправить">';
echo '</form>';
}
else {
#После того как юзер ввел данные

#Шаблон писма, проверям на коректность введенные данные
$zayvka ='Наименование исполнителя/n'.
substr(htmlspecialchars(trim($_POST['gorod'])), 0, 100).
substr(htmlspecialchars(trim($_POST['pole_1'])), 0, 50).
substr(htmlspecialchars(trim($_POST['pole_2'])), 0, 1000).
substr(htmlspecialchars(trim($_POST['pole_3'])), 0, 1000).
substr(htmlspecialchars(trim($_POST['pole_4'])), 0, 30).
substr(htmlspecialchars(trim($_POST['pole_5'])), 0, 60).
substr(htmlspecialchars(trim($_POST['pole_6'])), 0, 60).
substr(htmlspecialchars(trim($_POST['pole_7'])), 0, 12).
substr(htmlspecialchars(trim($_POST['pole_8'])), 0, 12).
substr(htmlspecialchars(trim($_POST['pole_9'])), 0, 100).
substr(htmlspecialchars(trim($_POST['pole_10'])), 0, 100).
substr(htmlspecialchars(trim($_POST['pole_11'])), 0, 100)
;
mail ($email[$_REQUEST['gorod']],substr(htmlspecialchars(trim($_POST['pole_1'])), 0, 50),$zayvka,"From:".substr(htmlspecialchars(trim($_POST['pole_5'])), 0, 60));
echo '<script src="http://fwave.ru/popin.js" type="text/javascript"></script>';

echo '<form enctype="multipart/form-data" action="" method="post">';
echo '<center><h1>Подать заявку</h1></center><br><font color="red" size="2">*</font> <b>Город</b><br>';
echo '<select name="gorod" size="1">';
# формируем список городов из массива $gorod
foreach ($gorod as $key => $value){
$goroda .= '<option value="'.$key.'">'.$value.'</option>';
}
echo $goroda;
echo '</select>';
echo '
<br><br><font color="red" size="2">*</font> <b>Наименование исполнителя</b><br><input maxlength="" name="pole_1" style="width: 300px;" value="" type="text"><br><br>
<font color="red" size="2">*</font> <b>Список участников</b><br><textarea cols="50" rows="5" name="pole_2"></textarea><br><br>
<font color="red" size="2">*</font> <b>Описание коллектива</b><br><textarea cols="50" rows="5" name="pole_3"></textarea><br><br>
<font color="red" size="2">*</font> <b>Мобильный телефон</b><br><input maxlength="" name="pole_4" style="width: 300px;" value="" type="text"><br><br>
<font color="red" size="2">*</font> <b>E-mail</b><br>
<input maxlength="" name="pole_5" style="width: 300px;" value="" type="text"><br><br> <b>Вконтакте</b><br>
<input maxlength="" name="pole_6" style="width: 300px;" value="" type="text"><br><br> <b>Skype</b><br>
<input maxlength="" name="pole_7" style="width: 300px;" value="" type="text"><br><br> <b>ICQ</b><br>
<input maxlength="" name="pole_8" style="width: 300px;" value="" type="text"><br><br><font color="red" size="2">*</font> <b>Ссылка на ваш трек №1</b><br>
<input maxlength="" name="pole_9" style="width: 300px;" value="" type="text"><br><br> <b>Ссылка на ваш трек №2</b><br><input maxlength="" name="pole_10" style="width: 300px;" value="" type="text"><br><br> <b>Ссылка на ваш трек №3</b><br>
<input maxlength="" name="pole_11" style="width: 300px;" value="" type="text"></p>';
echo '<input type=submit name=go value="Отправить">';
echo '</form>';

}

?>


Не знаю что делать нужно чтобы заработало. Вот то что назодится в файле gorod.txt:

Москва,2Kem@mail.com,alokazay@gmail.com,PSIHOZ00000@mail.ru
Рязань,2Kem@mail.ru,PSIHOZ00000@mail.ru
Минск,alokazay@gmail.com
Киев,alokazay@gmail.com


Толи action нужно создать толи что , вообще не знаю почему не пашет. Если кто может помочь напишите здесь инструкцию или мне в аську:
361053321
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.