Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проверка ссылки на активность (https://javascript.ru/forum/jquery/79699-proverka-ssylki-na-aktivnost.html)

drmodjo 11.03.2020 17:13

Проверка ссылки на активность
 
Всем привет.
Помогите пожалуйста.
Нужен код, который автоматически проверит определенную ссылку на существование и выведет текст. Если ссылка существует, то отобразить один текст, а если не существует, то красным цветом отобразить другой текст.
Я в этом чайник. Помогите добрые люди.

laimas 11.03.2020 18:16

http://htmlbook.ru/css/active + content: attr() позволит это сделать без скриптов.

drmodjo 11.03.2020 18:28

Простите наверно не правильно выразился. Скрипт должен проверить существование ссылки.

laimas 11.03.2020 18:32

Цитата:

Сообщение от drmodjo
Скрипт должен проверить существование ссылки.

То есть, если на странице есть ссылка, то она считается активной? Активной считается ссылка на которую нажали, и определить ее можно просто обработав событие onclick.

Если считать активной существующие ссылки, следовательно несуществующие неактивными будут, то какой же у них может быть текст?

drmodjo 11.03.2020 18:35

Проверить надо внешнюю ссылку. (Ссылка на другой сайт)
Если она существует, то выдать указанный текст. Если не существует, то выдать другой указанный текст но уже красным цветом. И это должно происходит автоматически, то есть без каких либо нажатий.

laimas 11.03.2020 18:43

Наконец-то добрались до истины. )

$('a').each(function() {
    //здесь проверяйте значение атрибута href - this.href
    //если домен ссылки не равен домену сайта, значит внешняя ссылка 
})


Или с JS вообще проблемы и самостоятельно не ...?

drmodjo 11.03.2020 18:45

Как я уже честно признался полный чайник.
Помогите пожалуйста с полным кодом.
Кроме вас тут никто не отозвался.
Заранее благодарю.

laimas 11.03.2020 18:59

Ну на jQuery это так:

$(function() {
    var host = location.hostname;
    $('a').each(function() {
        if(!~this.href.indexOf(host)) //это внешние ссылки, что-то делаем
        else //иначе своя ссылка, что-то делаем
    })
})


А вот что делаем ... ?

voraa 11.03.2020 19:04

Цитата:

Сообщение от laimas (Сообщение 521165)
Наконец-то добрались до истины. )

Может истина не в этом?
Похоже под "активной" ссылкой подразумевается то, что страница, на которую она указывает - существует.

drmodjo 11.03.2020 19:07

А куда вставить ссылку? Нужно проверить определенную ссылку.
Куда вставить текст "Существует"
и "Не существует" (красным цветом)
:(

laimas 11.03.2020 19:09

drmodjo, чтобы проверить существование ссылки, это просто проверить есть ли такая на странице. А вот если "мертвая/живая" она, это только запросом к домену. Вам чего надо то?

drmodjo 11.03.2020 19:44

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

laimas 11.03.2020 20:00

Цитата:

Сообщение от drmodjo
Как сложно все. )

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

То есть, если правильно понимать выше написанное, то страницу некоего домена загружает другой домен, и эта страница содержит битые ссылки? Если да, то браузер запрещает доступ к содержимому с другого домена, если домен источник этого содержимого не дает на это добро.

drmodjo 11.03.2020 20:23

Меня не интересует политика поисковых систем и рейтинг ресурса. Это специфический проект. Просто помогите это реализовать. Я не сразу сюда написал. Два дня помучался и не получилось. Просто знаний не хватает.
По поводу так не сработает не согласен. Скажу что на PHP все работает, но не подходит. Уже даже не знаю куда подробнее описать, задачу. Вроде даже некуда больше. Вот пример на PHP может он поможет вам определить смысл:
<?PHP
$content = @file_get_contents("ССЫЛКА НА РЕСУРС");
if (strpos($http_response_header[0], "200")) {
echo "<h5>ЕСЛИ СУЩЕСТВУЕТ</h5>";
} else {
echo "<font color=red><h5>ЕСЛИ НЕ СУЩЕСТВУЕТ</h5></font>";
}
?>

laimas 11.03.2020 20:51

Цитата:

Сообщение от drmodjo
Вот пример на PHP может он поможет вам определить смысл

А я к чему и писал? Почему на стороне севера не делается это?

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

laimas 11.03.2020 21:14

Цитата:

Сообщение от drmodjo
Скажу что на PHP все работает, но не подходит.

Что-то я это пропустил. Ну тогда, если только так "берется другим хостом" - ваш домен берет с другого домена страницу через прокси (иначе запрет), анализирует и после анализа вставляет полученное на страницу. Тогда можно, вкратце это так (JQ):

$.get(url-прокси+url-страницы, function(html) {
     var html = $(html);
     html.find('a').each(function() {
          //а здесь ajax запросы по url ссылкам с анализом заголовков ответа
     })
})


Типа такого по сути, а если иначе "берет другой хост", то не известно как и не факт что все получится.

drmodjo 11.03.2020 22:02

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

laimas 11.03.2020 22:33

Цитата:

Сообщение от drmodjo
Не могли бы вы указать, куда что вставить и ajax запрос.

Нет, не зная конкретно "что у вас есть или что нужно". Ну хотя бы ответь на вопросы:

1) Страница "источник", на которой нужно анализировать ссылки, уже вставлена в страницу "приемник"? Если да, то как и кем?

2) Если на первый вопрос ответ отрицательный, то что в конечном итоге должно быть, например, как предполагалось выше - получить страницу, пометить на ней ссылки и вставить в страницу? Если вставить, то во что?

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

Пишите конкретно, что и как, народу на форуме много, ответят.

drmodjo 11.03.2020 22:57

Честно говоря уже не знаю что добавить.
1. Из описанного выше и так ясно, что сайт со скриптом анализа (источник) не имеет отношения к сайту ссылку которого надо проанализировать.
2. Из предоставленного мною скрипта видно, что анализируемая ссылка указана в коде мною.
2. Ни о каких пометках ссылок или вставлениях их куда либо речь изначальна не шла вообще.
На сайте А нужен скрипт, который проверит ссылку на сайте В и если ссылка существует, то выдаст указанный заранее текст. В случае если ссылка не существует, то выдаст другой текст красного цвета.
Конкретнее просто некуда.

laimas 11.03.2020 23:07

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

drmodjo 11.03.2020 23:08

Благодарю за помощь.

laimas 11.03.2020 23:27

drmodjo, например, на РНР чтобы узнать "живой/нет" совсем не нужно делать так, как это делаете вы - получаете содержимое, а затем проверяете статус. Наоборот, сначала get_headers(), проверяем статус, и затем, если нужно file_get_contents. Кстати, "собачка" тут совсем не нужна.

А на клиенте то ведь DOM, все иначе, и кто вам может ответить конкретно куда вам что-то вставить, имея только общее представление чего нужно? То есть, описывайте конкретно, конкретный и код будет. Только лишь всего.

drmodjo 11.03.2020 23:43

Ладно. Задайте конкретный вопрос и я дам конкретный ответ. Может что и выйдет. Что нужно вам знать?

Aetae 11.03.2020 23:55

Цитата:

Сообщение от drmodjo (Сообщение 521188)
На сайте А нужен скрипт, который проверит ссылку на сайте В и если ссылка существует, то выдаст указанный заранее текст. В случае если ссылка не существует, то выдаст другой текст красного цвета.
Конкретнее просто некуда.

Если вы управляете сайтом A и не управляете сайтом B то напрямую это сделать невозможно из соображений безопасности.

Вам нужен будет серверный прокси, который запросит ссылку и вернёт ответ - жива или не жива, точно также как это сделано у вас сейчас.

Пример: условно так
// links - массив ссылок, 
// success - колбэк получающий ссылку в случае удачи
// error - колбэк получающий ссылку в случае неудачи
async function tryFetchList(links, success, error) {
  for(let link of links) {
    const result = await fetch('/check-link-api.php?url=' + encodeURIComponent(link.href))
    if(result === 'ok') 
      success(link)
    else
      error(link)
  }
}
// или скопом, смотря как у вас сервер работать будет 
async function tryFetchList(links, success, error) {
  links = Array.prototype.slice.call(links);

  const results = await fetch('/check-links-api.php', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(
      links.map(({href}) => href)
    )
  }).then(res => res.json());

  results.forEach((result, i) => {
    if(result === 'ok') 
      success(links[i])
    else
      error(links[i])
  }
}

drmodjo 12.03.2020 00:00

Тогда может подскажете как поступить? Ибо когда на одной странице много запросов на проверку, то она весьма долго загружается и это проблема. Может как-то можно реализовать это иначе?
<?PHP
$content = @file_get_contents("ССЫЛКА НА РЕСУРС");
if (strpos($http_response_header[0], "200")) {
echo "<h5>ЕСЛИ СУЩЕСТВУЕТ</h5>";
} else {
echo "<font color=red><h5>ЕСЛИ НЕ СУЩЕСТВУЕТ</h5></font>";
}
?>

Aetae 12.03.2020 00:12

Замените file_get_contents на get_headers, как посоветовал laimas - уже будет быстрей.

А дальше надо сделать таки отдельным файлом проверку. Я иду спать, так что не сегодня.
М.б. дальше laimas и поможет, ведь теперь ясно что:
а) Есть сервер с php.
б) Ссылки появляются из php и изначально там доступны.
с) Проблема лишь в долгой загрузке.

=)

drmodjo 12.03.2020 00:19

То есть вот так?
<?PHP
$content = @file_get_headers("ССЫЛКА НА РЕСУРС");
if (strpos($http_response_header[0], "200")) {
echo "<h5>ЕСЛИ СУЩЕСТВУЕТ</h5>";
} else {
echo "<font color=red><h5>ЕСЛИ НЕ СУЩЕСТВУЕТ</h5></font>";
}
?>

Все равно долго.

laimas 12.03.2020 01:24

Цитата:

Сообщение от drmodjo
То есть вот так?

То есть совсем не так. file_get_headers, это получение содержимого, а оно вам нужно?

function isValid($url) {

    if(!filter_var($url, FILTER_VALIDATE_URL)) return false;
    
    $curl = curl_init($url);
    curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($curl,CURLOPT_HEADER,true);
    curl_setopt($curl,CURLOPT_NOBODY,true);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

    $resp = curl_exec($curl);
    curl_close($curl);

    return $resp ? true : false;
}


echo isValid(\'https://javascript.ru/forum/jquery/79699-proverka-ssylki-na-aktivnost-3.html\') ? 'Yes' : 'No';

drmodjo 12.03.2020 01:55

Вставил ваш код на сайт. Заменил ссылку на нужную, живую. И отображается текст Yes. Меняю ссылку на несуществующую, не живую и отображается тоже самое. Что не так делаю?

drmodjo 12.03.2020 02:05

Сейчас заметил такую вещь.
Живая ссылка: https://site.ru/public/1024
Если меняю последние символы ссылки, то скрипт не работает.
Если в начале, где site.ru, то меняет на No.
В чем может быть проблема?

drmodjo 12.03.2020 02:06

(Не работает, в смысле ссылку считает рабочей и отображает Yes)

laimas 12.03.2020 08:36

Цитата:

Сообщение от drmodjo
Если в начале, где site.ru, то меняет на No.
В чем может быть проблема?

РНР язык, а не браузер, за вас он не подставит в url текущий домен, протокол, вы обязаны сами формировать полный URL. В данной функции сначала проверяется корректность URL (FILTER_VALIDATE_URL), и если он некорректен, то возвращается false.

laimas 12.03.2020 08:39

Цитата:

Сообщение от drmodjo
Не работает, в смысле ссылку считает рабочей и отображает Yes

А он и не производит анализ, он анализирует ответ сервера. Запросите так:

echo '<pre>' . print_r(get_headers(URL, 1), 1);


и проанализируйте заголовки.

PS. Вашей ссылке нет доверия со стороны браузера, такое же недоверие будет и со стороны РНР - проблема в сертификате, от чего функция не будет выполнена.

drmodjo 12.03.2020 09:51

Дорогой laimas, ссылку указал верно. Полный URL и соответствующий домен. Исходя из тестов скрипт не проверят ссылку после слэша. Как можно это исправить?

laimas 12.03.2020 11:27

Цитата:

Сообщение от drmodjo
ссылку указал верно. Полный URL и соответствующий домен

Вот чем отвечают браузеры по запросу этой ссылки:

Opera

Ваше подключение не является приватным
Не удалось подтвердить, что это сервер site.ru. Его сертификат безопасности относится к home.inforos.ru. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.

NET::ERR_CERT_COMMON_NAME_INVALID

Firefox

Предупреждение: Вероятная угроза безопасности

Firefox Developer Edition обнаружил вероятную угрозу безопасности и не стал открывать site.ru. Если вы посетите этот сайт, нападавшие могут попытаться похитить вашу информацию, такую как пароли, адреса электронной почты или данные банковских карт.

Другие браузеры также соблюдают меры безопасности, это же делает и РНР (вернее сказать сервер), запрашивая по безопасному протоколу, проверят сертификат.

drmodjo 12.03.2020 11:36

site. ru - это просто пример.
И данный скрипт прекрасно делает свою работу. Проблема в задержке.
<?PHP
$content = @file_get_contents("ССЫЛКА НА РЕСУРС");
if (strpos($http_response_header[0], "200")) {
echo "<h5>ЕСЛИ СУЩЕСТВУЕТ</h5>";
} else {
echo "<font color=red><h5>ЕСЛИ НЕ СУЩЕСТВУЕТ</h5></font>";
}
?>
Еще раз отмечу, что ваш скрипт работает в формате site.ru, а если ссылка имеет продолжение типа site.ru/что-тотам, то он не проверят все что после слеша. А ведь весь смысл в этом.

laimas 12.03.2020 11:53

Сколько же вам можно повторять, что $content = @file_get_contents("ССЫЛКА НА РЕСУРС"); полнейшая хрень в контексте вашей задачи. Вам нужно только знать есть или нет, зачем вы загружаете содержимое?

echo print_r(get_headers('http://javascript.ru/forum/jquery/ams', 1), 1);


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

drmodjo 12.03.2020 12:11

Это я уже понял.
Прошу вас без лишних текстов, чтобы уже оставить вас в покое. :-)
Напишите мною присланный скрипт в исправленном виде, полностью. Чтобы скопировать и вставить. Либо ваш скрипт, но чтобы он проверял ссылку полностью. Ибо то, что после слеша он не проверяет. И все, больше мучать вас не буду.

laimas 12.03.2020 12:40

Цитата:

Сообщение от drmodjo
Ибо то, что после слеша он не проверяет.

Это как понимать? Это выполняли echo print_r(get_headers('http://javascript.ru/forum/jquery/ams', 1), 1);?

drmodjo 12.03.2020 12:45

Ну это же надо в совокупности с основным кодом. Который под header надо сделать так? Полностью можете код прислать?


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