Скрипт автоматической проверки обратных ссылок.

Рубрики: Скрипты PHP, на PHP  

При поддержке: регистратор доменов – дешевая и удобная регистрация доменов.
_________________________________

Для чего может понадобиться такой скрипт? Например, Вы обменялись статьями со многими веб-мастерами – их статьи висят у Вас, Ваши – у них. Конечно, рассчитывать на то, что все они порядочные люди – опрометчиво. И приходится периодически проверять, а висит ли там моя статья с моими ссылочками? Или, например, Вы оплатили рекламу в Блогуне, блоггер разместил пост, но через две недели убрал. Хотя бы забаним мудака обманщика!

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

Как всегда – в конце статьи я дам ссылку на архив со скриптом, а по ходу объяснения работы скрипта, расскажу как им пользоваться для простых пользователей, не знающих программирования. Если честно, то я буквально после этой статьи быстро сделаю сервис авто-проверки ссылок, так что, в принципе, не-программистам не обязательно забивать себе голову ерундой ;) Кроме того, сервис будет проверять также наличие 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)..

Ждите сервис через пару часов ;)

____________________________________
Социальное пастбище для блогера – социальная сеть для блоггеров, сосредоточие вселенского зла и записей из множества блогов. Можно подписаться на нее и ничего не читать – информации будет достаточно ;) И еще радует, что автор заботится о своей сети, в отличие от других аналогичных сетей.



Отзывов (16) на «Скрипт автоматической проверки обратных ссылок.»

    VolCh пишет:

    регекспа дырявая, сходу несколько вариантов:
    <а> в html комменте
    <а> в JS
    <а href=http://setidengi.ru qwerty=dimoning.ru>

    про такие «мелочи» как noindex и nofollow не вспоминаю :)


    Владимир пишет:

    Только что додумался как обмануть такие проверки. Ну не додумался, просто вспомнил.
    Есть такой способ. С помощью .htaccess можно сделать так, что всем запросам с вашего IP будет отправляться оригинальная страница, а всем остальным – измененная.
    Тут может помочь внешний сервер, который вы обещаете открыть :wink: , но только и его IP спамер может занести в списочек.

    P.S. Похоже, становлюсь параноиком :smile:


    VolCh пишет:

    Для внешних серверов хорошо юзать список прокси обновляемый ;)


    DimoninG пишет:

    2VolCh:

    > регекспа дырявая, сходу несколько вариантов:
    > 1. < а> в html комменте
    > 2. < а> в JS
    > 3. < а href=http://setidengi.ru qwerty=dimoning.ru>
    > 4. про такие “мелочи” как noindex и nofollow не вспоминаю

    1, 2 – верно, нужно подумать.
    3 – не верно, не видит таких ссылок, см регу.
    4 – я написал в начале, что в скрипте этого нет, а будет в сервисе.

    2Владимир:
    > Только что додумался как обмануть такие проверки.

    Клоакинг, да.

    > P.S. Похоже, становлюсь параноиком
    Есть немного ;) Не думаю, что ради ссылки с Вашего сайта они на такое пойдут.


    DimoninG пишет:

    Я сам нашел косяк еще.
    Скрипт сожрет код dimoning. Правлю.


    Сервис автоматической проверки наличия обратных ссылок. » Блог Простого Программиста пишет:

    [...] предыдущем посте я обещал сделать сервис, позволяющий автоматически [...]


    BEXT пишет:

    Мне нравятся Ваши посты, заставляет задуматься)


    Олег пишет:

    Спасибо за скрипт. Но ведь подобные функции уже реализованны, в том же netpromoter и semonitor :?:


    DimoninG пишет:

    Олег, незачто. А netpromoter и seomonitor’ом я не пользуюсь – я ведь все же не СЕОшник, так что просто не знал.


    Andrey пишет:

    Нужно распределять нагрзку по времени, чтобы выполнение скрипта не превышало time_limit


    Daman пишет:

    Неправильно обрабатывает адреса вида http://mysite.ru/index.php?link=view&id=23

    Воспринимает только часть до амперсанда:
    http://mysite.ru/index.php?link=view

    Соответственно, результат: Пусто!


    Daman пишет:

    Пардон, все работает.
    Проблема была в том, что URL, подлежащий проверке передавался в скрипт через GET и каким-то образом усекался.
    Сделал чуть по другому:
    В скрипт передаю id сайта, который надо проверить, потом по id из базы беру проверяемый URL – и все в порядке – работает!


    Успешный автоматизатор пишет:

    А где же скрипт? При попытке пройти по ссылке выбрасывает на главную страницу!!


    armagedon пишет:

    Попытался запустить данный скрипт с денвера, пишет Fatal error: Call to undefined function curl_init() in M:\home\localhost\www\scriptprov.php on line 31.
    Видать нема на денвере библиотеки curl (((


    Алексей пишет:

    А где же скрипт? ССЫЛКА БИТАЯ


    Роман пишет:

    вы бы на своем сайте выложили форму проверки обратный ссылок! полезно было бы


Оставьте свой комментарий

Теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не спамер и не робот.
Я спамер и робот!

dimoning.ru
SEO и программирование.
  • Рубрики:



  • Рассылка:

  • Дополнительно:

  • По месяцам:

  • Счетчики:

    Яндекс цитирования

  • dimoning.ru © 2008-2011 г.
    Все материалы авторские, но их можно копировать с указанием прямой ссылки на источник.