Постим без капчи: бэклинки через Trackback и Pingback

February 22, 2008

Не буду объяснять что такое 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

Comments »

The URI to TrackBack this entry is: http://intrex.blogsome.com/2008/02/22/p62/trackback/

No comments yet.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



Anti-spam measure: please retype the above text into the box provided.