[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP запрос на https ?
oligarch
Доброго времени суток.
Это моя первая программа на php. Появилась необходимость быстро написать код, который бы отправлял запрос на сервер. В запросе должны быть login, password и содержимое XML-файла. Запрос отправляется по https протоколу.
В интернете нашел пример для http:

<?php
$host="server.ru"; // с каким хостом соединяемся
$file_send="C:\for_send.xml"; // файл который нужно отправить
$boundary = md5(rand(0,32000)); // создаем разделитель, md5 на основе случайного числа
$filesize = filesize($file_send); // получаем размер пересылаемого файла

// создаем код для отправки двух переменных

$data= "--".$boundary."\r\n"; // разделитель
$data.="Content-Disposition: form-data; name=\"login\"\r\n\r\n"; // имя перемнной
$data.="my_login\r\n"; // значение переменной
$data.="--".$boundary."\r\n"; // разделитель, начало следующего блока данных
$data.="Content-Disposition: form-data; name=\"passwd\"\r\n\r\n"; // имя следующей переменной
$data.="my_passwd\r\n"; // ее значение

// создаем заголовки файла

$head_file="--".$boundary."\r\n"; // разделитель
$head_file.="Content-Disposition: form-data; name=\"XMLfile\"; filename=\"".$file_send."\"\r\n"; // имя переменной с файлом и имя пересылаемого файла
$head_file.="Content-Type: ".mime_content_type($file_send)."\r\n\r\n";

// считаем размер данных. размер нужно считать всего, что идет после основных заголовков, вместе с разделителями и всем остальным
// складываем данные с переменными, заголовки файла, размер файла который будет вставлен позже и плюс завершающий разделитель

$contentlength = strlen($data) + strlen($head_file) + $filesize + strlen("--".$boundary."--\r\n");

// теперь создаем основные заголовки, сам запрос
$headers = "POST /recv/upload.aspx HTTP/1.0\r\n"; // путь до скрипта, который принимает данные
$headers.="Host: ".$host."\r\n";
$headers.="Referer: ".$host."\r\n";
$headers.="User-Agent: Mozilla/4.0\r\n";
$headers.="Content-type: multipart/form-data, boundary=".$boundary."\r\n"; // тип передаваемых данных и разделитель
$headers.="Content-length: ".$contentlength."\r\n\r\n"; // размер всех данных

if(!$fp = fsockopen($host, 80)) exit; // открываем соединение
fputs($fp, $headers); // посылаем основные заголовки в открытый поток
fputs($fp, $data); // посылаем переменные
fputs($fp, $head_file); // посылаем заголовки файла и ниже отправим сам файл

$fp2 = fopen($file_send, "rb"); // открываем файл, который будет отправлять
while(!feof($fp2)) // начинаем читать этот файл
{
$as=fgets($fp2, 2048); // читаем кусок файла
fputs($fp, $as); // посылаем этот кусок файла в открытый поток
}
fclose($fp2); // закрываем файл, который прочитали и отправили в поток

fputs($fp, "\r\n--".$boundary."--\r\n"); // завершаем, отправляем закрывающий разделитель, указывающий на конец даных


// вывод ответа от скрипта

while($gets=fgets($fp,2048))
{
print $gets;
}

fclose($fp); // закрыли поток.
?>


Что нужно тут поправить, чтобы запрос отсылался по https протоколу? Пробовал менять порт на 443 - не помогает, видимо что то еще надо поправить.
Или может посоветуете что то другое, что можно использовать для такой задачки?
Спасибо.



Спустя 21 минута, 36 секунд (19.01.2011 - 07:49) kirik написал(а):
oligarch
попробуйте вместо server.ru - ssl://server.ru/ и поправьте порт на 443.

Спустя 49 минут, 51 секунда (19.01.2011 - 08:39) oligarch написал(а):
попробовал поменять. При запуске выдается:

PHP Warning: fsockopen(): unable to connect to ssl://ekinobilet.ru:443 (Unable to find the socket transport "ssl" - did you forget to enable it when you config ured PHP?) in E:\Work\web\project\test.php on line 34

После этого я раскоментарил строку:

extension=php_openssl.dll

в php.ini. Запустил и на выходе получил:

HTTP/1.1 400 Bad Request
Server: nginx/0.8.53
Date: Wed, 19 Jan 2011 05:38:22 GMT
Content-Type: text/html
Content-Length: 173
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.8.53</center>
</body>
</html>


Что-то еще не так.

Спустя 2 минуты, 3 секунды (19.01.2011 - 08:41) Hoodzon написал(а):
Перепишите свой код используя CURL

Спустя 9 минут, 4 секунды (19.01.2011 - 08:50) oligarch написал(а):
CURL? я скорее всего больше не буду писать на php. Просто появилась такая задачка, единичная. Изучать CURL - нет возможности. Если там не сложно - может поможете с кодом? rolleyes.gif

Спустя 11 минут, 20 секунд (19.01.2011 - 09:02) Hoodzon написал(а):
$data = array('myXML' => '@'.ROOT.DS.'uploads'.DS.'tmp'.DS.'myfile.xml');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://site.ru/process');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$postResult = curl_exec($ch);
curl_close($ch);

Спустя 16 минут, 56 секунд (19.01.2011 - 09:18) oligarch написал(а):
с коментами поможете? не пойму где тут засунуть логин пароль и файл?

Спустя 3 минуты, 40 секунд (19.01.2011 - 09:22) Hoodzon написал(а):
А тебе нужно передавать в POST данных вместе с файлом логин и пароль? Или сначала авторизироваться, а потом загружать файл?

Спустя 1 час, 13 минут, 39 секунд (19.01.2011 - 10:36) oligarch написал(а):
одновременно надо слать логин, пароль и содержимое файла в одном запросе.
В браузере это выглядит так: форма с полями логина, пароля, имени файла и кнопкой "Загрузить". По нажатию кнопки "Загрузить" файл отправляется на сервер с введенными логином и паролем. То есть, на сколько я понимаю, помимо содержимого файла, еще отправляется две переменных: логин и пароль.

Спустя 1 день, 1 час, 56 минут, 47 секунд (20.01.2011 - 12:33) oligarch написал(а):
Помогите пожалуйста sad.gif Весь инет облазил и ничего полезного не нашел.

Спустя 20 минут, 43 секунды (20.01.2011 - 12:53) Hoodzon написал(а):
Если у вас есть сайт, на котором чтобы загрузить файл необходима авторизация
1) Сначала нужно с помощью CURL написать сценарий авторизии и сохранения Cookies.
2) Затем с помощью Cookies отправить файл

Порядок авторизации будет таким;
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,"URL_КУДА_ПРИХОДЯТ_POST ДАННЫЕ АВТОРИЗАЦИИ");
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, "login=grizik&pass=12345"); //Где логин и пароль твои POST данные
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt ($ch, CURLOPT_COOKIEJAR, "cookie.txt");
$source['page'] = curl_exec ($ch);


Затем юзаешь загрузку файла:
$data = array('myXML' => '@'.ROOT.DS.'uploads'.DS.'tmp'.DS.'myfile.xml');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://site.ru/process');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt ($ch, CURLOPT_COOKIEJAR, "cookie.txt");
$postResult = curl_exec($ch);
curl_close($ch);




Спустя 7 минут, 2 секунды (20.01.2011 - 13:00) Hoodzon написал(а):
Так же может потребоваться указание:
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

Спустя 21 час, 10 минут, 47 секунд (21.01.2011 - 10:11) oligarch написал(а):
Спасибо )

Спустя 3 минуты, 30 секунд (21.01.2011 - 10:15) Hoodzon написал(а):
Написал?

Спустя 2 дня, 21 час, 14 минут, 17 секунд (24.01.2011 - 07:29) oligarch написал(а):
Я сделал при помощи утилиты 'curl' под винду. Там тупо в командной строке передаешь ей три параметра: логин, пароль, имя файла. Каждый параметр с опцией '-F'. И все. файл закачивается нормально )
Быстрый ответ:

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