За последние 24 часа нас посетили 183439 программистов и 2783 робота. Сейчас ищет 1741 программист ...

Socket, Нужна помощь

Тема в разделе "PHP для новичков", создана пользователем nws, 16 июл 2008.

  1. nws

    nws Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    48
    Симпатии:
    0
    Добрый день!
    Есть форма в ней 2 поля: username/password
    Мне необходимо пройти авторизацию с другого сервера
    Вот функция:

    PHP:
    1. function bot($server, $port, $path, $second)
    2. {
    3.     $write = '';
    4.     $fp = fsockopen($server, $port, $errno, $errstr, $second);
    5.     if ($fp)
    6.     {
    7.         $write .= 'POST $path HTTP/1.0\r\n';
    8.         $write .= 'Host: $server\r\n\r\n';
    9.         $write .= 'username = vasea';
    10.         $write .= 'password =123456';
    11.         fwrite($fp, $write);
    12.         fclose($fp);
    13.     }else{
    14.         echo 'BORODA';    
    15.     }
    16. }
    Почему это:
    PHP:
    1. $write .= 'username = vasea';
    2. $write .= 'password =123456';
    не передается в форму?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    nws
    Пременные передаваемые POST должны разделяться символом & и между = и именем и значением переменной пробелов быть не должно. Учите матчасть.
     
  3. nws

    nws Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    48
    Симпатии:
    0
    PHP:
    1. $write .= 'username=vasea&password=123456';
    Все равно данные не передаются в форму. Выводится пустая страница.
     
  4. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Замени везде ' на обычные кавычки ".
     
  5. NOmeR1

    NOmeR1 Активный пользователь

    С нами с:
    11 май 2008
    Сообщения:
    97
    Симпатии:
    0
    Перед запросом нужно писать длинну запроса в Content-length
     
  6. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    И вообще, лучше не сокращать, а полностью все писать, в т.ч. и псевдозаголовки браузера. И Connection: Close тоже писать. Я помню по первой, списал пример скрипта с книги. 1:1, тоже отправка данных в форму, но он зараза по 20 секунд работал.Оказалось в книге была ошибка, они забыли дописать Connection: Close.
     
  7. nws

    nws Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    48
    Симпатии:
    0
    Немного переписал функцию:

    PHP:
    1. function bot($server, $port, $path, $second)
    2.  
    3. {
    4.  
    5.  
    6.     $write = '';
    7.     $read = '';
    8.  
    9.     $fp = fsockopen($server, $port, $errno, $errstr, $second);
    10.  
    11.     if ($fp)
    12.  
    13.     {
    14.         $params = "username=vasea&password=123456";
    15.         $size = strlen($params);
    16.  
    17.         $write .= "POST $path HTTP/1.0\r\n";
    18.  
    19.         $write .= "Host: $server\r\n";
    20.         $write .= "Content-Type: application/x-www-form-urlencoded\r\n";
    21.         $write .= "Content-Length: $size\r\n";
    22.         $write .= "User-Agent: Vasea\r\n";
    23.         $write .= $params;
    24.         $write = "Connection: Close\r\n\r\n";
    25.  
    26.  
    27.         fwrite($fp, $write);
    28.        
    29.         while (!feof($fp)) {
    30.             $read .= fgets($fp, 8192);
    31.         }
    32.        
    33.  
    34.         for ($i = 5; $i < strlen($read); $i++)
    35.  
    36.         {
    37.  
    38.             if (substr($read, $i - 3, 4) == "\r\n\r\n")
    39.  
    40.             {
    41.  
    42.                 $read = substr($read, $i + 1);
    43.  
    44.                 $i = strlen($read);
    45.  
    46.             }
    47.  
    48.         }
    49.  
    50.         fclose($fp);
    51.  
    52.     }
    53.  
    54.     else
    55.  
    56.     {
    57.  
    58.         $read = "";
    59.  
    60.     }
    61.  
    62.  
    63.  
    64.     return $read;
    65.    
    66.  
    67. }
    Результат: 400 - Bad Request
    Не могу понять почему ((
     
  8. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    $write .= $params; должно идти после $write = "Connection: Close\r\n\r\n"; Этого можно достичь двумя путями. Смотри мой скрипт здесь:

    http://php.ru/forum/viewtopic.php?t=12934
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  10. nws

    nws Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    48
    Симпатии:
    0
    Всем спасибо!

    Надо писать
    PHP:
    1. $params = "username=".urlencode("vasea")."&password=".urlencode(123456)."\r\n\r\n";
    Вместо

    PHP:
    1. $params = "username=vasea&password=123456";
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0