|
При поддержке: регистратор доменов – дешевая и удобная регистрация доменов.
_________________________________
Для чего может понадобиться такой скрипт? Например, Вы обменялись статьями со многими веб-мастерами – их статьи висят у Вас, Ваши – у них. Конечно, рассчитывать на то, что все они порядочные люди – опрометчиво. И приходится периодически проверять, а висит ли там моя статья с моими ссылочками? Или, например, Вы оплатили рекламу в Блогуне, блоггер разместил пост, но через две недели убрал. Хотя бы забаним мудака обманщика!
Аналогично, скрипт может использоваться для проверки трекбеков, хотя создавался не совсем для этого.
Как всегда – в конце статьи я дам ссылку на архив со скриптом, а по ходу объяснения работы скрипта, расскажу как им пользоваться для простых пользователей, не знающих программирования. Если честно, то я буквально после этой статьи быстро сделаю сервис авто-проверки ссылок, так что, в принципе, не-программистам не обязательно забивать себе голову ерундой ;) Кроме того, сервис будет проверять также наличие nofollow и noindex, что есть круче, чем этот скрипт.
Внимание, вспышка справа!
header ("Content-Type: text/html; charset=utf-8");
$sites[] = "www.millioner.org/";
$sites[] = "yandex.ru";
$sites[] = "dimoning.ru/hello.txt";
$sites[] = "www.simplecoding.org";
$sites[] = "nettakogosaita.fuck";
$check_url = "dimoning.ru";
function to_utf($str){
if (mb_detect_encoding($str, "UTF-8, ISO-8859-1, GBK")
!= "UTF-8"){
return iconv("gbk", "utf-8", $str);
}
else{
return $str;
}
}
for ($i = 0; $i < count ($sites); $i++){
$sites[$i] = str_replace ("http://", "", $sites[$i]);
$sites[$i] = "http://".$sites[$i];
}
$check_url = str_replace ("http://", "", $check_url);
$check_url = str_replace ("/", "\/", $check_url);
$ch = curl_init();
for ($i = 0; $i < count ($sites); $i++){
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, $sites[$i]);
$page = curl_exec($ch);
echo "<b>".$sites[$i].":</b><br>";
preg_match("/<a.*?href=.*?".$check_url.".*?>(.*?)<\/a>/",
$page, $m);
$m[1] = to_utf ($m[1]);
if (!empty ($m[1]) && !empty ($page))
echo "Ссылка: есть, с анкором: ".$m[1]."<br><br>";
if (empty ($m[1]) && !empty ($page))
echo "Пусто!<br><br>";
if (empty ($page))
echo "// Сайт не открылся.<br><br>";
}
curl_close($ch);
Совсем небольшой скрипт, способный сэкономить несколько часов Вашего времени!
Для начала отмечу, что это вариант скрипта, для которого нужно неограниченное время выполнения. Для VDS и выделенных серверов это можно легко поставить, на обычном хостинге – можно попробовать написать провайдеру или написать первой строкой в скрипте set_time_limit(0);.
Будьте осторожны с set_time_limit – во-первых, часто такая инструкция просто не срабатывает, а во-вторых, сам Веб-сервер может иметь лимит времени отдачи документа. Другими словами, даже если сам скрипт будет работать неограниченно долго, Веб-сервер может порвать сессию и результаты работы скрипта Вы так и не увидите.
Есть еще вариант обхода этого ограничения – записывать в файл, какой сайт проверялся последним и при повторном запуске начинать с него. Правда здесь это не реализовано, т.к. я недавно купил выделенный сервер у FirstVDS и настроил его так, как мне нужно ;) Всего за 150 рублей я получил гораздо больше возможностей, чем на обычном хостинге за 250! Я серьезно говорю, никто меня рекламировать фествдс не просил.
Теперь к скрипту. Объясняю :)
Сначала мы указываем кодировку страницы UTF-8, ну это понятно что. Дальше в массив $sites записываются адреса сайтов для проверки. Здесь я проверяю несколько сайтов и страниц, где ссылки на меня есть и где ссылок на меня нет. На Яндексе ссылки на мой блог заведомо нет :lol:
В переменную $check_url записывается адрес, который нужно проверить. Внимание! Записывать туда адрес без http://, без внутренней страницы. Грубо говоря в формате ??????.?? (домен и зона). Если писать туда другие адреса – не гарантируется правильность работы скрипта. Такая реализация, потому что наличие ссылки с доменом в любом случае означает, что ссылка на Ваш сайт установлена.
Функция to_utf используется для преобразования строки из любой кодировки в UTF-8. Дело в том, что сам скрипт в кодировке UTF-8, но если проверяемый сайт в другой кодировке, то анкор ссылки будет выводиться неверно. Функцию я скопировал с php.net.
Первым циклом for мы гарантируем, что в адресах проверяемых сайтов будет присутствовать http://. Это нужно для подключения к ним.
Две строки перед вторым for – там мы обрабатываем проверяемый домен так, чтобы он не содержал http:// и заменяем все / так, чтобы они не были спец-символами.
Ну и самое вкусное! Инициализируем curl (библиотека для работы с удаленными сайтами) с помощью curl_init.
В цикле перебираем все проверяемые URL. Установленная опция CURLOPT_RETURNTRANSFER означает, чтобы результат чтения удаленного сайта не выводился на страницу, а записывался в переменную. Опция CURLOPT_CURLOPT_TIMEOUT означает, сколько времени в секундах ждать открытия сайта (здесь – 10). Если он открыться не успеет, то мы получим пустой результат. Это важно, иначе скрипт может выполняться очень долго.
CURLOPT_URL означает, какой URL мы сейчас будем проверять. С помощью $page = curl_exec($ch); мы и получаем код проверяемого сайта.
Следующим шагом мы с помощью регулярного выражения проверяем, если ли в коде нужная нам ссылка. Отличие этого метода от предложенного Владимиром в том, что Владимир проверяет просто наличие URL на странице, а я – именно ссылки (адреса, заключенного в <a>). Понятно, что отличие – очень существенное и скрипт Владимира обмануть гораздо легче, к сожалению (мой вроде бы обмануть нельзя, но зарекаться не буду).
С помощью адского регулярного выражения (preg_match) мы и проверяем наличие ссылки. Если Вы совсем не знакомы с регулярными выражениями в PHP, рекомендую сначала почитать о регулярных выражениях на SoftTime.ru. Коротко, то группа символов .*? означает «сколько угодно чего угодно». Ну и все слеши / нужно экранировать обратным слешем \, чтобы они не являлись спец-символами.
Результат работы попадает в массив $m; Для эксперимента его интересно вывести с помощью функции print_r ();
В ячейку 1 массива $m попадает как раз анкор ссылки (текст ссылки). Мы его преобразовываем к UTF-8 и выводим в браузер. А потом закрываем curl.
Как этим пользоваться обычным пользователям? Достаточно менять в заголовке содержимое массива $sites. Грубо говоря, просто копируйте $sites[] = «yandex.ru»; на новую строку и вместо yandex.ru подставляйте свой URL для проверки. Про $check_url я уже говорил. Загружаете скрипт на сервер – запускаете и готово.
Вот пример результата работы скрипта:
http://www.millioner.org/:
Ссылка: есть, с анкором: Блог простого программиста
http://yandex.ru:
Пусто!
http://dimoning.ru/hello.txt:
Ссылка: есть, с анкором: DimoninG.ru
http://www.simplecoding.org:
Ссылка: есть, с анкором: статью об одной из уязвимостей Sape
http://nettakogosaita.fuck:
// Сайт не открылся.
Скачать скрипт можно здесь: Скрипт автоматической проверки наличия обратных ссылок от DimoninG’а (dimoning.ru)..
Ждите сервис через пару часов ;)
____________________________________
Социальное пастбище для блогера – социальная сеть для блоггеров, сосредоточие вселенского зла и записей из множества блогов. Можно подписаться на нее и ничего не читать – информации будет достаточно ;) И еще радует, что автор заботится о своей сети, в отличие от других аналогичных сетей.
Оставьте свой комментарий
|
05.08.2008 в 5:07 пп
регекспа дырявая, сходу несколько вариантов:
<а> в html комменте
<а> в JS
<а href=http://setidengi.ru qwerty=dimoning.ru>
про такие «мелочи» как noindex и nofollow не вспоминаю :)
05.08.2008 в 5:30 пп
Только что додумался как обмануть такие проверки. Ну не додумался, просто вспомнил.
Есть такой способ. С помощью .htaccess можно сделать так, что всем запросам с вашего IP будет отправляться оригинальная страница, а всем остальным – измененная.
Тут может помочь внешний сервер, который вы обещаете открыть :wink: , но только и его IP спамер может занести в списочек.
P.S. Похоже, становлюсь параноиком :smile:
05.08.2008 в 5:42 пп
Для внешних серверов хорошо юзать список прокси обновляемый ;)
05.08.2008 в 5:44 пп
2VolCh:
> регекспа дырявая, сходу несколько вариантов:
> 1. < а> в html комменте
> 2. < а> в JS
> 3. < а href=http://setidengi.ru qwerty=dimoning.ru>
> 4. про такие “мелочи” как noindex и nofollow не вспоминаю
1, 2 – верно, нужно подумать.
3 – не верно, не видит таких ссылок, см регу.
4 – я написал в начале, что в скрипте этого нет, а будет в сервисе.
2Владимир:
> Только что додумался как обмануть такие проверки.
Клоакинг, да.
> P.S. Похоже, становлюсь параноиком
Есть немного ;) Не думаю, что ради ссылки с Вашего сайта они на такое пойдут.
05.08.2008 в 6:02 пп
Я сам нашел косяк еще.
Скрипт сожрет код dimoning. Правлю.
05.08.2008 в 7:54 пп
[...] предыдущем посте я обещал сделать сервис, позволяющий автоматически [...]
08.08.2008 в 2:22 дп
Мне нравятся Ваши посты, заставляет задуматься)
27.08.2008 в 2:04 пп
Спасибо за скрипт. Но ведь подобные функции уже реализованны, в том же netpromoter и semonitor :?:
27.08.2008 в 7:56 пп
Олег, незачто. А netpromoter и seomonitor’ом я не пользуюсь – я ведь все же не СЕОшник, так что просто не знал.
25.05.2009 в 1:12 пп
Нужно распределять нагрзку по времени, чтобы выполнение скрипта не превышало time_limit
06.06.2009 в 5:17 пп
Неправильно обрабатывает адреса вида http://mysite.ru/index.php?link=view&id=23
Воспринимает только часть до амперсанда:
http://mysite.ru/index.php?link=view
Соответственно, результат: Пусто!
07.06.2009 в 11:10 дп
Пардон, все работает.
Проблема была в том, что URL, подлежащий проверке передавался в скрипт через GET и каким-то образом усекался.
Сделал чуть по другому:
В скрипт передаю id сайта, который надо проверить, потом по id из базы беру проверяемый URL – и все в порядке – работает!
04.03.2010 в 8:16 дп
А где же скрипт? При попытке пройти по ссылке выбрасывает на главную страницу!!
28.08.2010 в 1:43 пп
Попытался запустить данный скрипт с денвера, пишет Fatal error: Call to undefined function curl_init() in M:\home\localhost\www\scriptprov.php on line 31.
Видать нема на денвере библиотеки curl (((
10.11.2010 в 1:44 дп
А где же скрипт? ССЫЛКА БИТАЯ
20.01.2012 в 1:11 пп
вы бы на своем сайте выложили форму проверки обратный ссылок! полезно было бы