Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.03.2008, 23:23
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

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

Как это можно реализовать? Может, конечно, неправильно выбрал тему. Но я если честно, даже не знаю с чего начать.
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
Ответить с цитированием
  #2 (permalink)  
Старый 11.03.2008, 23:37
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Странно, что это требуется именно на клиенте брать вывод. 0_о
Не очень тривиальная задача. На ум приходит только брать "document.body.innerHTML", а из шапки брать и генерировать на основе свойств document... Потом ajax'ом отправлять это всё через POST на php скрипт...
Ответить с цитированием
  #3 (permalink)  
Старый 11.03.2008, 23:43
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

Не обязательно на клиенте. Мой php скрипт хранит юрл данной страницы. Если можно подобное реализовать, используя PHP, то так даже лучше. Но, насколько я знаю, то страницы защищены от инклуда(если не с данного сайта он происходит).
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
Ответить с цитированием
  #4 (permalink)  
Старый 11.03.2008, 23:59
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Нет, с этим нету проблем, если на сервере разрешено сокетное подключение.
На всех платных хостингах оно разрешено. Делается это примерно так:
$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.
Ответить с цитированием
  #5 (permalink)  
Старый 12.03.2008, 00:31
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

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

Последний раз редактировалось Kolyaj, 12.03.2008 в 00:36.
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2008, 00:43
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Ну да, можно в принципе и через file_get_contents(). Но всё-таки везде есть fsockopen, но кое-где нету fopen wrappers, так что использовать fsockopen тут более рационально. Тем более, для расширения (+cookie, +POST, ...) да и для общего развития полезно использовать fsockopen. Это ИМХО, конечно...
Ответить с цитированием
  #7 (permalink)  
Старый 12.03.2008, 00:58
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

маленькое замечание: file_get_contents (если параметр - url) внутри себя использует сокетное соединение, так что - без разницы =)
Ответить с цитированием
  #8 (permalink)  
Старый 12.03.2008, 01:23
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

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

В любом случае, решать автору
Ответить с цитированием
  #9 (permalink)  
Старый 12.03.2008, 21:11
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

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

Вот, подправил немного код. Исправил ошибку, и сделал более универсальным:
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);
    }
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
Ответить с цитированием
  #10 (permalink)  
Старый 17.03.2008, 12:09
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск