Очень сложная задача! (для меня)

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-12 12:34:19

spy писал(а):как мне выдернуть ее, если с моего запроса меня рефрешить на стартовую...
рефрешит потому, что ты выводишь код ответа, в котором сидит рефреш.

вот этот код у тебя построчно выводит ответ сервера

Код: Выделить всё

echo fgets($fp, 128);
ты должен изменить его так, чтобы выдернуть из ответа только номер сессии, например через preg_match();

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-12 13:07:27

ну вот

Код: Выделить всё

$host = 'www.spysoft.us';
$service_uri = '/test/login.php';
$vars ='login=test&pass=test';

# compose HTTP request header
$header = "Host: $host\r\n";
$header .= "User-Agent: PHP Script\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($vars)."\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = pfsockopen($host, 80, $errno, $errstr);
if (!$fp) {
   echo "$errstr ($errno)<br/>\n";
   echo $fp;
} else {
    fputs($fp, "POST $service_uri  HTTP/1.1\r\n");
    fputs($fp, $header.$vars);
    @fwrite($fp, $out);
    while (!feof($fp)) {

   $str=fgets($fp, 128);
    if (preg_match ("/Set/", $str))
  {
         $str=eregi_replace("Set-Cookie: PHPSESSID=","",$str);
         $str=eregi_replace("; path=/","",$str);

  @print $str;
  }
  }
    fclose($fp);
}
http://spysoft.us/test/test3.php

получил сессию... на седня хватит )))
unix# ?

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-13 5:32:28

как теперь прикрутить грамотно эту сессию??? :unknown:

Код: Выделить всё

include("c.php");
@$data=file_get_contents("http://spysoft.us/test/?ses=razdel&id=1");
//@$data = htmlspecialchars($data);
@$data=stristr($data,"?");
@$data=eregi_replace("<table border=1>","<br>",$data);
@$data=eregi_replace("
","",$data);
@$data=eregi_replace("<tr><td>Наименование магазина</td><td>Дополнительная информация</td></tr>","",$data);
@$data=eregi_replace("<tr><td><a href=\"","",$data);
@$data=eregi_replace("\">","||",$data);
@$data=eregi_replace("</a></td><td>","||",$data);
@$data=eregi_replace("</td></tr>","||&&",$data);
//print $data;
$str_exp = explode("&&", $data);
$s=count($str_exp);
$s=$s-1;
for($i=0; $i<$s; $i++)
{
$str_expe = explode("||", $str_exp[$i]);
print "<p><b>Наименовани магазина:</b> ".$str_expe[1]."<br><b>Ссылка:</b> ".$str_expe[0]."<br><b>Описание:</b> ".$str_expe[2]."</p>";

$r=mysql_query("SELECT * from obj_2199_tab where link='$str_expe[0]'");
                                    if(mysql_num_rows($r)!=0)
                                    {
                                    print "<font color=red>нафиг вам дубли? в базе есть уже такая запись ;)</font>";
                                    }
                                    else
{
@mysql_query("INSERT into obj_2199_tab (name, link, info) values ('$str_expe[1]', '$str_expe[0]','$str_expe[2]')");
}
}
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-13 9:26:37

spy писал(а):как теперь прикрутить грамотно эту сессию???
через контекст file_get_contents -) за одно научишься им пользоваться

там надо в заголовок будет добавить куку со значением сессии и всё -)

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-13 9:45:14

ой наконецто ты появился, а то без тебя ваще дело встало :smile:
Вот все на что хватило моей соображалки)))
http://spysoft.us/test/test3.php

Код: Выделить всё

$header .= "Connection: close\r\n\r\n";

$fp = pfsockopen($host, 80, $errno, $errstr);
if (!$fp) {
   echo "$errstr ($errno)<br/>\n";
   echo $fp;
} else {
    fputs($fp, "POST $service_uri  HTTP/1.1\r\n");
    fputs($fp, $header.$vars);
    @fwrite($fp, $out);
    while (!feof($fp)) {

   $str=fgets($fp, 128);
    if (preg_match ("/Set/", $str))
  {
         $str=eregi_replace("Set-Cookie: PHPSESSID=","",$str);
         $str=eregi_replace("; path=/","",$str);

?><META HTTP-EQUIV="REFRESH" CONTENT='5; URL=test.php?PHPSESSID=<?print $str;?>'><?
  }
  }
    fclose($fp);
}
http://spysoft.us/test/test.php

Код: Выделить всё

include("c.php");
$url="http://spysoft.us/test/?ses=razdel&id=1&PHPSESSID=".$PHPSESSID;
print $url;
@$data=file_get_contents($url);
@$data = htmlspecialchars($data);
@$data=stristr($data,"?");
@$data=eregi_replace("<table border=1>","<br>",$data);
@$data=eregi_replace("
","",$data);
@$data=eregi_replace("<tr><td>Наименование магазина</td><td>Дополнительная информация</td></tr>","",$data);
@$data=eregi_replace("<tr><td><a href=\"","",$data);
@$data=eregi_replace("\">","||",$data);
@$data=eregi_replace("</a></td><td>","||",$data);
@$data=eregi_replace("</td></tr>","||&&",$data);
$str_exp = explode("&&", $data);
$s=count($str_exp);
$s=$s-1;
for($i=0; $i<$s; $i++)
{
$str_expe = explode("||", $str_exp[$i]);
print "<p><b>Наименовани магазина:</b> ".$str_expe[1]."<br><b>Ссылка:</b> ".$str_expe[0]."<br><b>Описание:</b> ".$str_expe[2]."</p>";

$r=mysql_query("SELECT * from obj_2199_tab where link='$str_expe[0]'");
                                    if(mysql_num_rows($r)!=0)
                                    {
                                    print "<font color=red>нафиг вам дубли? в базе есть уже такая запись ;)</font>";
                                    }
                                    else{
@mysql_query("INSERT into obj_2199_tab (name, link, info) values ('$str_expe[1]', '$str_expe[0]','$str_expe[2]')");
}
}
естественно ничего не происходит))) :crazy:
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-13 10:10:15

spy писал(а):Вот все на что хватило моей соображалки)))
сейчас основная проблема в том, что ты не ориентируешься в своём коде. Уже пора писать свои функции, конкретно нужны две:
1. Функция для логирования по адресу, которая будет возвращать номер сессии
2. Функция для создания контекста с номером сессии.

Не буду тебя мучить по этому поводу, накатаю реализацию сам. Твоя задача будет понять чего там написано.

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-13 10:17:24

Спасибо... Просто для меня это новое все...
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-13 11:36:04

Первая страница

Код: Выделить всё

 <pre><?

$uri = 'http://test1/spy/session.php?id=asd&login=asd';

$cookies = getUriCookies($uri, array('login' => 'My login', 'password' => 'my password'), 'POST');
$context = createCookiesContext($cookies);

echo file_get_contents($uri, false, $context);

/**
 * Функция возвращает массив кук по заданному запросу
 *
 * @author zg
 * @param string $uri Адрес запроса
 * @param array $params Параметры запроса
 * @param string $method Метод запроса
 * @return array
 */
function getUriCookies( $uri, $params = null, $method = null )
{
    if ( !isset($method) )$method = 'GET';
    if ( $method !== 'GET' && $method !== 'POST' ) throw new Exception('Function '. __FUNCTION__ .'(): Invalid method '. $method .'. Must be GET or POST.');
    
    // Парсим запрос
    $url = parse_url( $uri );
    
    // Получаем данные из адреса запроса
    $host  = isset($url['host']) ? $url['host'] : null;
    $path  = isset($url['path']) ? $url['path'] : null;
    $query = isset($url['query']) ? $url['query'] : null;
    
    // Защита от нулевого хоста
    if ( !$host ) throw new Exception('Function '. __FUNCTION__ .'(): Invalid hostname in URI "'. $uri .'".');
    
    // Строим массив параметров
    $outParams = array();
    
    // Заполняем массив параметров из строки запроса
    if ( isset($query) ) parse_str($query, $outParams);
    
    // Добавляем параметры из аргументов функции, если метод GET
    if ( $method === 'GET' && is_array($params) ) $outParams = array_merge( $outParams, $params );
    
    // Получаем результирующий запрос
    $query = http_build_query( $outParams );
    
    // Формируем заголовки
    $headers = array();
    
    // Общие заголовки
    $headers[] = $method .' '. $path .'?'. $query .' HTTP/1.0';
    $headers[] = 'Host: '. $host;
    
    // Тело запроса
    $content = null;
    
    // Если метод запроса POST
    if ( $method === 'POST' && is_array( $params ) )
    {
        // Добавляем параметры запроса
        $headers[] = 'Content-type: application/x-www-form-urlencoded';
        $content   = http_build_query($params);
    }
    
    // Дбоавляем к заголовкам тело запроса
    $headers[] = 'Content-length: '. strlen($content);
    $headers[] = 'Connection: close';
    $headers[] = '';
    $headers[] = $content;
    
    // Формируем запрос
    $request = join("\r\n", $headers);
    
    // Открываем сокет для записи
    $fp = @fsockopen($host, 80, $errno, $error);
    
    // Проверка правильности открытия сокета
    if ( !$fp ) throw new Exception('Function '. __FUNCTION__ .'(): Filed open URL '. $uri .'');
    
    // Посылаем запрос
    fputs($fp, $request);
    
    // Массив результата
    $result = array();
    
    // Считываем ответ построчно
    while ( !feof($fp) )
    {
        $line = trim(fgets( $fp ));
        
        // Меня интерисует только заголовок
        if ( !$line ) break;
        
        // В заголовке меня интерисуют только куки
        @list($field, $value) = preg_split('/\s*:\s*/', $line, 2);
        
        // Запоминаем найденную куку
        if ( strtolower($field) === 'set-cookie' )
        {
            // Точнее, запоминаем только само значение куки (недекодированное)
            $result[] = array_shift(preg_split('/\s*;\s*/', $value, 2));
        }
    }
    
    // Тут можно сделать обработку тела ответа, например, проверку результата логирования
    // но это специфичный код, поэтому я его опущу
    
    // Вывод тела ответа
    //fpassthru($fp);
    
    // Закрываем сокет
    fclose($fp);
    
    // Возвращаем массив результата
    return $result;
}

/**
 * Создание контекста со значениями кук
 * 
 * @author zg
 * @param array $cookies
 * @return resource
 */
function createCookiesContext( $cookies )
{
    return stream_context_create(array(
        'http' => array(
            'header' => 'Cookie: '. join('; ', $cookies),
        ),
    ));
}

?>
вторая страница session.php

Код: Выделить всё

<?

session_start();

setcookie('asddsad', 'привет мир!!!');

echo 'GET => ';
print_r( $_GET );

echo 'POST =>';
print_r( $_POST );

echo 'Cookies =>';
print_r( $_COOKIE );

?>
Результат работы первой страницы

Код: Выделить всё

GET => Array
(
    [id] => asd
    [login] => asd
)
POST =>Array
(
)
Cookies =>Array
(
    [PHPSESSID] => 480cfa07ec4f4aad170263bd7d1548c8
    [asddsad] => привет мир!!!
)
то есть, функция file_get_contents() успешно передала все куки, которые были получены при логировании с помощью функции getUriCookies()

Результат работы второго скрипта при логировании можно увидеть если расокмментировать

Код: Выделить всё

//fpassthru($fp);
он будет таким

Код: Выделить всё

GET => Array
(
    [id] => asd
    [login] => asd
)
POST =>Array
(
    [login] => My login
    [password] => my password
)
Cookies =>Array
(
)

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-13 11:46:41

ок буду розбираться :smile:
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-13 12:40:30

выложил у себя на сайте http://anton-pribora.ru/articles/php/socket-context/ :smile: правда ничё не расписывал, но зато код удобнее читается.

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-14 5:21:50

Ура!!! Ура!!! Ура!!! Ура!!! Ура!!!
Все работает!!! Огромное спасибо ))))) :drinks:
unix# ?

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-14 9:56:53

добью тебя еще одним глупым вопросом
есть переменная

Код: Выделить всё

$i="
бугага твтвтвттвтввтв\n
тратат ылвлыфовлыовыва\n
бугага ыдвылвлдлыввывыв\n
бугага ываьываыдвлаьвьалва\n
бугага 328гтрмт83г84\n
тратат ылвлыфовлыовыва\n
";
Как мне из этой переменной убрать все строки который начинаются с "тратат"?
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-14 10:57:08

да всё просто — разбиваешь на массив строк по признаку конца строки и проверяшь каждую на шаблон регулярки, отбираяя нужные. А в конце склеиваешь массив обратно. :smile:

Аватара пользователя
spy
сержант
Сообщения: 276
Зарегистрирован: 2008-05-21 10:27:31
Откуда: Красноярск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение spy » 2009-05-14 10:58:53

ага.. спасибо... я думал об этом, но думал что есть какаято функиция)))
unix# ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Очень сложная задача! (для меня)

Непрочитанное сообщение zg » 2009-05-14 11:00:05

ну... можно и функцией, просто это сложнее будет :smile: