Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Копирование блоков страницы(или целиком) (https://javascript.ru/forum/misc/1086-kopirovanie-blokov-stranicy-ili-celikom.html)

Phoenix 11.03.2008 23:23

Копирование блоков страницы(или целиком)
 
У меня возникла задача копирования всей страницы, или отдельных блоков ее.
Т.е. мне нужно сохранить(через скрипт страницу) и отправить ее на файл php для обработки ( по идее в переменную ее занести не получится). А скрипт в свою очередь, сохранит ее в файл...
Т.е. получится, как бы копирование страницы и сохранение в определенной папке.
У меня есть встраиваемый скрипт, который берет со страницы ее юрл и титл. (на JS написаны). А вот как быть со страницей не знаю.

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

Андрей Параничев 11.03.2008 23:37

Странно, что это требуется именно на клиенте брать вывод. 0_о
Не очень тривиальная задача. На ум приходит только брать "document.body.innerHTML", а из шапки брать и генерировать на основе свойств document... Потом ajax'ом отправлять это всё через POST на php скрипт...

Phoenix 11.03.2008 23:43

Не обязательно на клиенте. Мой php скрипт хранит юрл данной страницы. Если можно подобное реализовать, используя PHP, то так даже лучше. Но, насколько я знаю, то страницы защищены от инклуда(если не с данного сайта он происходит).

Андрей Параничев 11.03.2008 23:59

Нет, с этим нету проблем, если на сервере разрешено сокетное подключение.
На всех платных хостингах оно разрешено. Делается это примерно так:
$fp = fsockopen("www.site.ru", 80, $errno, $errstr, 30);
if ($fp) {
    // Генерируем шапку запроса к странице:
    $out = "GET /path_to_page.php HTTP/1.1\r\n"
             ."Host: www.site.ru\r\n"
             ."Connection: Close\r\n"
             ."\r\n";

    // Посылаем запрос на сайт:
    fwrite($fp, $out);

    // Получаем ответ:
    while (!feof($fp)) {
        $result = fgets($fp, 128);
    }
    fclose($fp);

    // Результатом будет ответ сервера: шапка http + тело ответа,
    // оно будет разделено двумя переносами "\r\n" так что нужно
    // будет найти первое вхождение "\r\n\r\n" и отрезать шапку от тела.
    echo $result;
}


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

Kolyaj 12.03.2008 00:31

В принципе можно не заморачиваться с сокетами и просто использовать функцию file_get_contents.

А через JavaScript все равно исходный код страницы не восстановить, т.к. каждый браузер приводит html-код к своему виду. Если у вас установлен плагин к файерфоксу Web Developer Toolbar, то сравните "View source" и "View generated source". В частности, firefox удаляет все xhtml-ные закрытия тегов, а-ля <img />. ИЕ еще больше мудрит: у некоторых значений аттрибутов удаляет кавычки, у некоторых нет.

Андрей Параничев 12.03.2008 00:43

Ну да, можно в принципе и через file_get_contents(). Но всё-таки везде есть fsockopen, но кое-где нету fopen wrappers, так что использовать fsockopen тут более рационально. Тем более, для расширения (+cookie, +POST, ...) да и для общего развития полезно использовать fsockopen. Это ИМХО, конечно... :)

Dmitry A. Soshnikov 12.03.2008 00:58

маленькое замечание: file_get_contents (если параметр - url) внутри себя использует сокетное соединение, так что - без разницы =)

Андрей Параничев 12.03.2008 01:23

Ну да, по сути любое соединение, использующее URL fopen wrappers является сокетным соединением, т.е fopen, file_get_contents, include (раньше) если им передать url в качестве пути, откроют сокетное подключение, т.к это вообще механизм коммуникации между клиентом и сервером.

Всё таки по мне, лучше использовать сделанную именно для таких задач функцию fsockopen, чем функции работы с локальными файлами с параметром url. Да и если приложение нужно будет расширить, например получить страницу, сгенерированную POST запросом, или с определёнными куками, или получить через https, то тут уже легче самому запрос генерировать, чем писать неудобный (имхо) контекст для file_get_contents.

В любом случае, решать автору :)

Phoenix 12.03.2008 21:11

Цитата:

Сообщение от Андрей Параничев
Нет, с этим нету проблем, если на сервере разрешено сокетное подключение.

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

Вот, подправил немного код. Исправил ошибку, и сделал более универсальным:
function par_str($str,$start,$end){
$res = substr($str,strpos($str,$start)+strlen($start),strlen($str));
if ($end!=null) $res = substr($res,0,strpos($res,$end));
echo($res);
return $res;
}
function get_contents($url){
$url_host = par_str($url,"http://","/");
$url_get = par_str($url,$url_host,null);
$fp = fsockopen($url_host, 80, $errno, $errstr, 30);
if ($fp) {
    $out = "GET ".$url_get." HTTP/1.1\r\n"
             ."Host: ".$url_host."\r\n"
             ."Connection: Close\r\n"
             ."\r\n";
			 

    fwrite($fp, $out);
	$result="";
    while (!feof($fp)) {
        $result .= fgets($fp, 128);
	}
	$result=substr($result,strpos($result,"\r\n\r\n")+4,strlen($result));
	$result=substr($result,strpos($result,"\r\n")+2,strlen($result));
    fclose($fp);
return $result;
}
}


а ошибка была у тебя, точку надо поставить, что бы объединить все:

while (!feof($fp)) {
        $result .= fgets($fp, 128);
    }

Phoenix 17.03.2008 12:09

Возникла проблема с кодировкой... При отображении в браузере, все нормально. если я пытаюсь отправить эту страницу на мыло. То некоторые приходят нормально, а некоторые в непонятной кодировке...

Пример: "µРїРѕСЃС‚СЊ - Главная страница".

Как этого можно избежать? и перекодировать(или другие способы) что бы на мыло приходил нормальный текст.


Часовой пояс GMT +3, время: 15:12.