Не буду объяснять что такое trackback и pingback, об этом можно почитать здесь и здесь.
Как видите в обоих случаях результат выполнения функций это ссылки в заголовке коммента, причем track можно посылать с кейвордом сразу, а пинг самостоятельно выдирает кейворд из титла страницы, с которой его посылают.
Как это использовать в своих целях, Вы, наверняка уже догадались. Осталось автоматизировать этот процесс. Нам же дорого наше время?
Что самое интересное писать почти ничего не нужно. За нас это уже сделали Умы и гуру инета и супер CMS WordPress
, итак:
Как послать трэк?
Чтобы послать трэк на чужой блог нужно сначала специальный линк, на который он посылается. Этот линк можно получить загрузив страницу со статьей. Блок, в котором прописана ссылка выглядит так:
вот под словом
trackback
как раз и есть ссылка для посылки трэка. Поиск и выдергивание ссылки из текста HTML оставляю на Ваших плечах.
Выглядит эта ссылка примерно так:
http://ruskii10k.com/wp-trackback.php?p=15
или так
http://www.quietlyscheming.com/blog/2006/03/06/flex-and-ajax/trackback/
.
или так
http://eightbar.co.uk/2006/09/29/google-sketchup-second-life-export/trackback/
.
Теперь осталось дело за мылым: Чтобы наш трэк опубликовался нужно его просто послать блогу товарища
. Для этого составляем обычный POST запрос в теле которого следующие параметры:
title=My Super Blog&url=http://mysuperblog.com&blog_name=Super Ankor&excerpt=Description
Расшифрую:
title – Заголовок коммента, будет писаться в тэге <strong> гугл это любит, так что можно писать какой-нить кейворд
url – Урл, на который хотим поставить трэк.
blog_name – используем как Анкор к ссылке – будет светится вместо имени.
excerpt – Сам коммент. Ну тут уж думайте сами , хотя многие здесь благодарят автора за пост , хвалят его. Некоторые , умные парни, даже научились цитировать часть сообщения, чтобы обойти Akismet
Вот и все, после посылки POST’а Вам придет XML-ответ:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<response>
<error>0</error>
</response>
Здесь циферка 0 между <error> обозначает, что все прошло гладко и ваш трэк понравился блогу.
Как послать пинг ?
Тут методика чутка усложняется, но также остается на уровне “начинающего пхп-кодера”. Для работы с этим делом нам понадобится библиотека для работы с интерфесом XML-RPC. Библиотека эта распространяется бесплатно и скачать ее можно
здесь
или выдрать опять же из WordPress’a (файл с именем class-IXR.php).
Для посылки пинга нам нужны три вещи:
1. Линк на статью в нашем блоге, от которой мы посылаем пинг.
2. Линк на статью в чужом блоге, в коменты которой мы посылаем пинг.
3. Линк на XML-RPC сервер блога, в который постим и который принимает пинги.
С первыми двумя пунктами все ясно. Сосредоточимся на третьем:
Если блог принимает пинги, то по спецификации
pingback
он обязан передавать ссылку на pingback url в HTTP-заголовке ответа на каждый запрос параметр X-Pingback, например:
X-Pingback:
http://ruskii10k.com/pingback/xmlrpc
либо в заголовке HTML документа, пример:
<link rel=”pingback” href=”http://ruskii10k.com/pingback/xmlrpc”>
В моем полюбившемся движке блога есть функция, которая находит и возвращает pingback url. Так что снова всю грязную работу сделали за нас:
PHP
function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
global $wp_version;
$byte_count = 0;
$contents = ;
$headers = ;
$pingback_str_dquote = rel="pingback";
$pingback_str_squote = rel=pingback;
$x_pingback_str = x-pingback: ;
$pingback_href_original_pos = 27;
extract(parse_url($url));
if (!isset($host)) {
// Not an URL. This should never happen.
return false;
}
$path = (!isset($path)) ? / : $path;
$path .= (isset($query)) ? ?.$query : ;
$port = (isset($port)) ? $port : 80;
// Try to connect to the server at $host
$fp = @fsockopen($host, $port, $errno, $errstr, 2);
if (!$fp) {
// Couldnt open a connection to $host;
return false;
}
// Send the GET request
$request = "GET $path HTTP/1.1 Host: $host User-Agent: WordPress/$wp_version ";
// ob_end_flush();
fputs($fp, $request);
// Lets check for an X-Pingback header first
while (!feof($fp)) {
$line = fgets($fp, 512);
if (trim($line) == ) {
break;
}
$headers .= trim($line)." ";
$x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
if ($x_pingback_header_offset) {
// We got it!
preg_match(#x-pingback: (.+)#is, $headers, $matches);
$pingback_server_url = trim($matches[1]);
return $pingback_server_url;
}
if(strpos(strtolower($headers), content-type: )) {
preg_match(#content-type: (.+)#is, $headers, $matches);
$content_type = trim($matches[1]);
}
}
if (preg_match(#(image|audio|video|model)/#is, $content_type)) {
// Not an (x)html, sgml, or xml page, no use going further
return false;
}
while (!feof($fp)) {
$line = fgets($fp, 1024);
$contents .= trim($line);
$pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
$pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
if ($pingback_link_offset_dquote || $pingback_link_offset_squote) {
$quote = ($pingback_link_offset_dquote) ? " : ;
$pingback_link_offset = ($quote==") ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
$pingback_href_pos = @strpos($contents, href=, $pingback_link_offset);
$pingback_href_start = $pingback_href_pos+6;
$pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
$pingback_server_url_len = $pingback_href_end - $pingback_href_start;
$pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
// We may find rel="pingback" but an incomplete pingback URI
if ($pingback_server_url_len >
0) {
// We got it!
return $pingback_server_url;
}
}
$byte_count += strlen($line);
if ($byte_count >
$timeout_bytes) {
// Its no use going further, there probably isnt any pingback
// server to find in this file. (Prevents loading large files.)
return false;
}
}
// We didnt find anything.
return false;
}
Получаем линк:
PHP
$pagelinkedfrom = "http://yabadan.net/?p=40";
$pagelinkedto = "http://ruskii10k.com/2007/03/13/i-love-404-not-found-2/";
$pingback_server_url = discover_pingback_server_uri($pagelinkedto,2048);
И постим:
PHP
$client = new IXR_Client($pingback_server_url);
$client->
timeout = 3;
$client->
useragent .= — WordPress/ . $wp_version;
$client->
debug = false;
$client->
query(pingback.ping, $pagelinkedfrom, $pagelinkedto );
Есть один нюанс
, чтобы все
прошло антиспам прошло гладко нужно сначала в свой пост, от имени которого посылается пинг, добавить ссылку на адресата пинга (т.е. урл в которой мы пингуем). А после того как пинг успешно завершен можно
оставить :D удалить ненужные внешние ссылки.
Пример XML переговоров на уровне XML-RPC-сервера:
Посылаем запрос пинга:
POST /xmlrpc.php HTTP/1.0
Host: ruskii10k.com
Content-Type: text/xml
User-Agent: Incutio XML-RPC — WordPress/
Content-length: 286 <?xml version=”1.0″?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>
http://yabadan.net/?p=40</string></value></param>
<param><value><string>
http://ruskii10k.com/2007/03/13/i-love-404-not-found-2/</string></value></param>
</params></methodCall>
Получаем ответ:
<?xml version=”1.0″?>
<methodResponse>
<params>
<param>
<value>
<string>Pingback from http://yabadan.net/?p=40 to http://ruskii10k.com/2007/03/13/i-love-404-not-found-2/ registered. Keep the web talking! </string>
</value>
</param>
</params>
</methodResponse>
Вот и все . Всем удачного трэкинга и пингига
© http://seorepa.com/show.php?id=991
А есть и бесплатный аналог
Английский текст переводит на 12 языков. Есть кеширование.