Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > получить любую информацию с другого узла


Автор: Alx 11.3.2006, 16:15
привет. есть большой html-список ссылок, генерируемый PHP из простого текстового списка.
нужно как то пройтись (либо PHP во время генерации, либо JS после загрузки) по списку и проверить ссылки на валидность.
все страница расположены на narod.ru и при неправильной ссылке выводится http://narod.yandex.ru/404 страница.
нужно как-то открыть эти ссылки и узнать, какие из них приводят на 404-ю и записать их, чтобы потом можно было в ручную исправить.
вот, как это сделать? может, фреймами/окнами или ещё как...

Автор: Aliance 11.3.2006, 19:35
Думаю тебе нужно решать эту задачу http://forum.vingrad.ru/index.php?showforum=207, ибо будет более корректным. Но это мое имхо.

Автор: Alx 11.3.2006, 19:38
не хотелось бы php юзать...

Автор: Ciber SLasH 11.3.2006, 20:20
Цитата(Alx @ 11.3.2006, 19:38 Найти цитируемый пост)
не хотелось бы php юзать...

Иначе придётся юзать либо убогий IFRAME, либо XmlHttpRequest.
Имхо лучше это делать на сервере.

Автор: Alx 11.3.2006, 21:13
не понял...

Автор: Ciber SLasH 11.3.2006, 21:16
Цитата(Alx @ 11.3.2006, 21:13 Найти цитируемый пост)
не понял...

Что именно?

Автор: Aliance 11.3.2006, 21:18
Цитата(Ciber SLasH @ 11.3.2006, 21:20 Найти цитируемый пост)
Иначе придётся юзать либо убогий IFRAME, либо XmlHttpRequest.

Второе же итак связано с серверными языками. А первое, как ты правильно заметил, больно устаревший способ решения задач.

Автор: Ciber SLasH 11.3.2006, 21:35
Цитата(Aliance @ 11.3.2006, 21:18 Найти цитируемый пост)
Второе же итак связано с серверными языками.

Вот именно, поэтому я предложил работать на стороне сервера.

Автор: Alx 11.3.2006, 21:53
Цитата(Ciber SLasH @ 11.3.2006, 20:20 Найти цитируемый пост)
Цитата(Alx @ 11.3.2006, 19:38 )
не хотелось бы php юзать...


Иначе придётся юзать либо убогий IFRAME, либо XmlHttpRequest.
Имхо лучше это делать на сервере.

smile

Автор: Ciber SLasH 11.3.2006, 21:59
Alx, ну что тут не понятного?
Есть как я уже сказал 3 варианта:
1) обрабатывать всё на сервере
2) юзать IFRAME. Загружаешь в него проверяемые ссылки, выдираешь контент в переменную и анализируешь на текст, где должно быть что-то из: 404, Not found.
3) юзать XmlHttpRequest — это опять же запрос на сервер, т.е. с его помощью отсылаешь запрос на сервер и если ссылка битая, то прийдёт заголовок с кодом 404

Вот собсна и всё. smile

Автор: Alx 11.3.2006, 23:16
Ciber SLasH,
в чем разница между первым и третим?
и как получить контент из iframe содержимое которого на другом узле?

Автор: Ciber SLasH 12.3.2006, 09:31
Цитата(Alx @ 11.3.2006, 23:16 Найти цитируемый пост)
в чем разница между первым и третим?

Тем, что на сервере это быстрее и клиентский код будет намного меньше, чем при использовании 3-го метода, а уменьшение кода благополучно влияет на быстроту загрузки. smile

Цитата(Alx @ 11.3.2006, 23:16 Найти цитируемый пост)
и как получить контент из iframe содержимое которого на другом узле?

http://forum.vingrad.ru/index.php?showtopic=73988

Автор: Alx 12.3.2006, 12:17
Ciber SLasH,
я тебя не понимаю...
кто-нибудь ещё скажите мне, что сделать это средствами JS нельзя и я успокоюсь и сделаю через PHP.

Автор: Aliance 12.3.2006, 16:17
Сделать можно, только нужно ли…

Автор: 12345c 13.3.2006, 00:12
Alx, при попытке что-либо прочитать из чужого фрейма идёт ошибка доступа к другому сайту. Поэтому, что пришло - как узнаешь?

Если по XMLHttpRequest, то в FF не работает, а так - получишь код возврата. Так что, я вижу, что можно только для IE. Есть у кого другиек методы?

Автор: Alx 13.3.2006, 13:25
12345c,
да мне пофиг какой браузер))))
мне надо просто "пропинговать" УРЛы, чтобы узнать какие из низ валидны, а какие - нет, чтобы в ручную ихисправить.


Цитата(12345c @ 13.3.2006, 00:12 Найти цитируемый пост)
Если по XMLHttpRequest

но это же опять идет использование php.
просто я не хочу пользоваться сокетами и все такое. это слишком муторно.

где-то тут видел что-то вроде

Код

file_get_contents("http://site.ru/page.html");

разве эта функция работает для страниц на другом сервере?

Автор: 12345c 13.3.2006, 15:03
Цитата(Alx @ 13.3.2006, 13:25 Найти цитируемый пост)
Если по XMLHttpRequest

но это же опять идет использование php.

Нет, грузишь сразу проверяемый УРЛ в объект XMLHttp и смотришь состояние.

Автор: Alx 13.3.2006, 18:12
12345c,
сорри, но см. первый пост...

Автор: 12345c 13.3.2006, 19:03
Т.е. 404-я ошибка не выдаётся? Я бы попробовал извлечь что-то по XMLHttpRequest на клиенте, заранее сказать трудно.

Через прокси на сервере, конечно, будет работать, контент проанализируется.

Автор: Alx 13.3.2006, 20:47
эх, лана, буду тра**ть сокеты)
всем пасиб)

Автор: S.A.P. 13.3.2006, 20:54
Можно попробовать сделать мегахитрую вещь ( smile)) ). На своем серваке настроть mod_rewrite на другой домен и от туда подкачивать данные XMLHttpRequest ом (который ссылаться будет уже на твой домен).

Автор: Aliance 13.3.2006, 21:31
Цитата(Alx @ 13.3.2006, 14:25 Найти цитируемый пост)
разве эта функция работает для страниц на другом сервере?

совершенно точно работает. я вместо сокетов ее использую

Автор: Alx 13.3.2006, 22:02
Aliance,
ухт...
тогда, наверное, всё будет гораздо проще...)
спасибо большое!!)

Автор: 12345c 13.3.2006, 23:37
file_get_contents(), конечно, работает вместо сокетов, с одним условием. Сервер не должен стоять за прокси, иначе без сокетов не обойтись.

Автор: Ciber SLasH 14.3.2006, 12:38
Цитата(Alx @ 13.3.2006, 13:25 Найти цитируемый пост)
да мне пофиг какой браузер))))

Если пофиг какой браузер, то можно таким методом для IE сделать (остальные браузеры, как оказалось ни так, ни через IFRAME не позволяют к чужим доменам обращаться):
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251'>
<meta name="Generator" content='EditPlus 2.21.330'>
<meta name="Author" content='Ciber SLasH'>
<title>JavaScript :: Проверка ссылок [XmlHttpRequest] (IE only)</title>
<script type='text/javascript'>
var XmlHttp;

/*** Инициализация XmlHttpRequest-а ***/
function init() {
var is_IE = false;
    if (window.XMLHttpRequest) {        // Mozilla
        try {
            XmlHttp = new XMLHttpRequest();
        } catch (e) {
            XmlHttp = false;
        }
    } else if (window.ActiveXObject) {    // IE
        try {
            XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
        } catch (e) {
            try {
                XmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    XmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    XmlHttp = false;
                }
            }
        }
        is_IE = true;
    }
    if (XmlHttp) {
        if (is_IE) XmlHttp.onreadystatechange = parseRequest;
        else XmlHttp.onload = parseRequest;
        return true;
    } else return false;
}
/*** Обработка ответа ***/
function parseRequest() {
    if (XmlHttp.readyState == 4) {
        if (XmlHttp.status == 404) {
            badLinks[index] = 1;
        } else {
            badLinks[index] = 0;
        }
        index++;
        if (index < testLinks.length) {
            sendQuery(testHost + testLinks[index]);
        } else {
            alert(badLinks);
        }
    }
}
/*** Отправка запроса ***/
function sendQuery(url) {
    XmlHttp.open('GET', url, true);
    XmlHttp.send(null);
}
testHost = "http://newmail.ru/";
testLinks = ["1.zip", "index.html"];
badLinks = [];
index = 0;

onload = function () {
    if (init()) {
        sendQuery(testHost + testLinks[index]);
    }
}
</script>
</head>

<body>
</body>
</html>

Автор: Aliance 26.3.2006, 23:31
Вот нашел еще:
Код

   xmlhttp.open("HEAD", "/faq/index.html",true);
   xmlhttp.onreadystatechange = function() {
   if (xmlhttp.readyState==4) {
      if (xmlhttp.status==200) {
         alert("URL существует!");
      } else if (xmlhttp.status==404) {
         alert("URL не существует!");
      } else {
         alert("Статус: "+xmlhttp.status);
      }
   }

   xmlhttp.send(null);


Автор: Alx 1.4.2006, 20:20
рибята!!!
спасибо всем, но http://mir-fuchsia.narod.ru/wronglink.html страница не существует!!! а ошибку 404 не возвращает!

Автор: S.A.P. 1.4.2006, 20:57
Alx, разумеется не возвращает smile . file_get_contents никоим образом не работает с заголовками. Для того, чтобы их получить используй fsockopen или получай страницу через mod_rewrite (читай мой, очередной раз проигнорированный, последний пост).

Автор: Alx 1.4.2006, 21:12
S.A.P., smile
я всё понимаю) мне наоборот нужно было именно народовскую страницу "простукивать"!
поэтому file_get_contents() подходит, а просто реквест и проверка на загрузку документа - нет!!
(см. первый пост)

Автор: S.A.P. 1.4.2006, 22:48
Alx, еще раз smile .

У нас есть сервер A, к которому мы имеем прямой доступ. Где - то там есть сервер B. На сераере B есть некоторые страницы, список которых у нас имеецца.

Задача: определить, запросы на какие страницы вернут 404 Not found и на какие 200 OK. Я правильно понял? smile

Если да, то сам контент запрашиваемых страниц нас не интересует (поэтому file_get_contents тут не к месту). А интересуют нас заголовки, которые вернутся с сервера B в ответ на HEAD запрос.

Решение:
1. На сервере, при помощи fsockopen и fwrite составлять HEAD запросы к твоему узлу по каждому URL из списка и читать заголовки, которые возвращаются.
2. Либо на сервере установить mod_rewrite с сервера A на сервер B, что нам позволит общаться HEAD запросами с сервером B из Java скрипта.

Автор: Alx 1.4.2006, 23:46
Цитата(S.A.P. @ 1.4.2006, 22:48 Найти цитируемый пост)
Задача: определить, запросы на какие страницы вернут 404 Not found и на какие 200 OK. Я правильно понял?

о Боги, нет!)))


народовские страницы не возвращают not found!
они возвращают дефолтовую страницу! там написано что страница не найдена.
поэтому тут как раз подходит просто поискать file_get_contents()'ом слова той деволтовой страницы.

проблема решена! всем спасибо!)))))

smile

Автор: Aliance 2.4.2006, 17:25
Цитата(Alx @ 2.4.2006, 00:46 Найти цитируемый пост)
проблема решена!

Пометить как решённый

Автор: Alx 2.4.2006, 18:33
Есть: пометить, как решеный smile

Автор: S.A.P. 2.4.2006, 19:54
Ужос.

Alx, дружеский совет: на досуге поискать в интернете:
1. Что такое заголовки и какие заголовки в каких ситуациях сервер возвращает.
2. Что такое HEAD запрос, где он применяется и чем отличается от GET запросов.
3. Почему нужно использовать fsockopen вместо file_get_contents для получения информации с другого узла.

ну и еще вот это статейку http://premshree.livejournal.com/66129.html?thread=881233 на закуску.

Автор: Alx 2.4.2006, 22:35
S.A.P.,
ты меня не понимаешь)))))

Автор: Ciber SLasH 2.4.2006, 23:12
Парни, вроде вопрос уже решён, что ещё требуется? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)