Пингатор робота Яндекс-блоги
Планируется ли реализация этого простенького, но очень полезного модуля в ближайшем будущем?
Возможна ли разработка за денюшку, в складчину с другими заинтересованными пользователями.
Готов сразу выделить 10$. Уверен найдется немало и других желающих.
Возможна ли разработка за денюшку, в складчину с другими заинтересованными пользователями.
Готов сразу выделить 10$. Уверен найдется немало и других желающих.
65 комментариев
к вам вообще робот яндекс блога приходит? есть какой-нибудь живой LS куда он приходит?
У Яндекса есть, насколько я знаю, пара роботов по блогам.
Один робот производит плановый обход всех зарегистированных блогов в базе в определенное время.
Второй робот (которого пингуют сами блоги сразу после публикации нового сообщения) — чешет в блог сразу после пинга. То есть проглатывает и выдает инфу в поиске по блогам гораздо раньше тех блогов, которые так не делают.
Такой пингатор — необходимое условие для включения сайта в раздел
У меня есть исходник такого пингатора для друпала. Думаю адаптировать его не составит труда:
function yandex_blogs_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('Alerts blogs.Yandex.ru that your site\'s blogs have been updated.');
}
}
/**
* Implementation of hook_nodeapi().
* будет дергаться ядром каждый раз, когда создается нода любого типа
*/
function yandex_blogs_nodeapi($node, $op, $teaser = NULL, $page = NULL) {
global $base_url;
switch($op) {
case 'insert':
case 'update':
case 'delete':
//сработает при любом изменении статуса отображаемой ноды
if ($node->status==1)
//пингуем Яндекс если задано — имя сайта, иначе заголовок ноды
_yandex_blogs_doping($node->uid);
}
}
//
function _yandex_blogs_doping($uid) {
global $base_url;
global $user;
$account = user_load(array('uid' => $uid, 'status' => 1));
/*
// It sends not fully correct result: parameters appear in <string>..</string> tags
$result = xmlrpc('http://drupal47/pings_test_ping',//'http://ping.blogs.yandex.ru/RPC2',
'weblogUpdates.ping',
t("%name", array('%name' => $account->name)),
$base_url.'/'.pathauto_cleanstring($account->name).'/feed');
*/
// So we need to use something simplier than code in xmlrpc_request()
require_once './includes/xmlrpc.inc';
$result=true;
$req = '<?xml version="1.0"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value>'.t("%name", array('%name' => $account->name)).'</value>
</param>
<param>
<value>'.$base_url.'/'.pathauto_cleanstring($account->name).'/feed</value>
</param>
</params>
</methodCall>';
$res = drupal_http_request('http://ping.blogs.yandex.ru/RPC2', array("Content-Type" => "text/xml"), 'POST', $req);
//$res = drupal_http_request($base_url.'/pings_test_ping', array("Content-Type" => "text/xml"), 'POST', $req);
if ($res->code != 200) {
xmlrpc_error(-$res->code, $result->error);
$result=false;
}
$message = xmlrpc_message($res->data);
// Now parse what we've got back
if (!xmlrpc_message_parse($message)) {
// XML error
xmlrpc_error(-32700, t('Parser error'));
$result=false;
}
// Is the message a fault?
if ($message->messagetype == 'fault') {
xmlrpc_error($message->fault_code, $message->fault_string);
$result=false;
}
// Message must be OK
if($result==true) {
$result=$message->params[0];
watchdog('Yandex ping', t('blogs.Yandex.ru ping accomplished'), WATCHDOG_WARNING);
}
if ($result === FALSE) {
watchdog('Yandex ping', t('Ping blogs.Yandex.ru FAULT'), WATCHDOG_WARNING);
}
}
формат строк между … — должен оставаться без изменений.
Роботу должно передаваться:
— Ник пользователя, создавшего новую публикацию
— Адрес RSS-ленты его личного блога
У меня только подозрение что выдача LS вообще не естся яндекс.блогами, пока я не одного попавшего туда не видел.
Я туда одно время забивал ленты даже простых форумов на Yabb — прекрасно Яндекс-роботы их кушают :)
По крайней мере это было бы логично со стороны разработчиков
например первый платный BS не принимает робот, текущую версию забирает на ура.
а вот такой момент: если блог попал в я.блоги, то как это влияет на обычную поисковую выдачу (не по блогам, а вообще по интернету)?
Я рассматриваю выдачу в поиске по блогам как дополнительный канал траффика помимо выдачи в обычном поиске.
Кроме того, в поиске по блогам ранжирование идет по умолчанию «по времени публикации», что логично, ибо блоговые записи быстро устаревают. Поэтому пингатор мегаважен.
А вот в обычном поиске по умолчанию вывод результатов идет по релятивантности. Так что нужно в обоих каналах выводиться :)
тут есть валидатор, вот насколько я вижу он совпадает с валидатором яндекса
ls не проходит
Сейчас посмотрел — фиды действительно не валидные. Надо править. Многие rss-трансляторы тоже отбраковывают инвалидные потоки.
У меня из ошибок выдает только:
<author>###</author>
Т.е. не хватает мыла пользователя. Но имхо это неправильно, почту юзверей открывать нельзя.
Остальное — рекомендации по вычищению из rss скриптов и object, добавление atom:link и объявление mime-типа контента как rss+xml.
В итоге валидатор сказал мне: «This is a valid RSS feed.»
НО! Вопрос с почтой для авторов остается открытым.
Заменил шаблон index.tpl у rss:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{$aChannel.title}</title>
<link>{$aChannel.link}</link>
<atom:link href="http://www.controlmusic.ru/rss/" rel="self" type="application/rss+xml" />
<description><![CDATA[{$aChannel.description}]]></description>
<language>{$aChannel.language}</language>
<managingEditor><![CDATA[{$aChannel.managingEditor} ({$aChannel.managingEditorName})]]></managingEditor>
<generator>{$aChannel.generator}</generator>
{foreach from=$aItems item=oItem}
<item>
<title><![CDATA[{$oItem.title|escape:'html'}]]></title>
<guid isPermaLink="true">{$oItem.guid}</guid>
<link>{$oItem.link}</link>
<description><![CDATA[{$oItem.description}]]></description>
<pubDate>{date_format date=$oItem.pubDate format="r"}</pubDate>
<author><![CDATA[{$oItem.author}@somesite.ru ({$oItem.author})]]></author>
<category><![CDATA[{$oItem.category|replace:',':']]></category>
<category><![CDATA['}]]></category>
</item>
{/foreach}
</channel>
</rss>
Уберите вообще эту строку.
Вместо нее поставьте <dc:creator>НИК ЮЗЕРА</dc:creator>
Сори, необходима еще первая строчка с объявой:
xmlns:dc="
а я сейчас тупо делаю кросс-пост тизер в ЖЖ, оттуда он индексируется в секунды и по ссылке яндекс уже индексирует топик на сайте. неудобно, но работает. я так защищаю в секунды уникальность контента. А то Бог его знает, когда сам яндекс проиндексирует сайт…
Закинул вот такую функцию в конец файла include/function.php:
function ping ($url, $blogname, $blogurl) {
$tb_send='<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value>'.$blogname.'</value>
</param>
<param>
<value>'.$blogurl.'</value>
</param>
</params>
</methodCall>';
$target=parse_url($url);
$tb_sock = fsockopen($target["host"], 80);
fputs($tb_sock, "POST ". $target["path"]. $target["query"]. " HTTP/1.1\r\n");
fputs($tb_sock, "User-Agent: The Incutio XML-RPC PHP Library (multicall client)\r\n");
fputs($tb_sock, "Host: ". $target["host"]. "\r\n");
fputs($tb_sock, "Content-Type: text/xml\r\n");
fputs($tb_sock, "Content-length: ". strlen($tb_send). "\r\n");
fputs($tb_sock, "Connection: close\r\n\r\n");
fputs($tb_sock, $tb_send);
// Gather result
while (!feof($tb_sock)) {
$response .= fgets($tb_sock, 128);
}
// Close socket
fclose($tb_sock);
// Did the trackback ping work
strpos($response, '<error>0</error>')? $return = true: $return = false;
// send result
return $return;
}
В файле classes/modules/Topic/Topic.class.php дописал в методы AddTopic и UpdateTopic:
ping ("
Ответ от сервера яндекса получаю OK. Отправляется соответственно логин оставившего пост и урл на обновленный блог. Как вариант — оставлять ссылку на конкретный элемент, но это можно сделать для комментариев.
Это имя будет показываться в результатах поиска в яндексе напротив блога.
К примеру так:
* 1 ч. 54 мин. назад
* комментарий Юми_очаровательная_смерть в журнале Натаниэль_Де_Рин
*
joesmith@example.com (Joe Smith) Будет валидным.
Дописываем в Topic.entity.class.php:
public function getRssUrl() {
if ($this->getBlogType()=='personal') {
return DIR_WEB_ROOT.'/rss/log/'.$this->getUserLogin().'/';
} else {
return DIR_WEB_ROOT.'/rss/blog/'.$this->getBlogUrl().'/';
}
}
и уже пинг используем так:
ping ("
Пасиба. На какой кошель отправить обещанную денюжку?
:)
Пока это всего лишь догадки, ибо ответа из поддержки Яшки я не получил.
Да, можно использовать пинг, чтобы rss-лента постоянно подсовывалась роботу, но если есть такой инструмент, то мне хочется использовать его тоньше.
В любом случае, вы вправе использовать пингатор по своему назначению. Например, докрутить в него список всех сервисов и сделать модуль пинга каждого из них так, чтобы процесс постинга не затягивался.
Я же у себя ограничился пингом яндекса и гугла.
Более того, при попытке попасть в Сервисы, администратор ласково попросит вас порезать все лишнее и привести формат выдачи пинга к тому виду, который необходим роботу.
Кроме того, выдавая «левые» пинги особенно часто, предполагаю, что вы рискуете попасть в бан-лист. Политика яндекса очень жестка к сайтам, которые «мусорят» почем зря.
1. В рейтинг сервисов добавляются только блогохостинги с отдельными пользовательскими блогами.
2. Для того, чтобы мы могли включить сервис в рейтинг блог-хостингов, мы должны
быть уверены, что полно и быстро его индексируем (иначе цифры для него не будут верными). Наилучшим способом добиться этого будет организация отправки
нам сообщений о каждой новой записи по протоколу Weblogs.Ping на адрес
Описание протокола можно посмотреть здесь —
Пример готового скрипта для отправки пингов нам, например, здесь —
3. Сервис должен иметь не менее 200 зарегистрированных пользователей.
Такой формат нужен яндексу для того, чтобы правильно формировать вывод в результатах поиска, как я понимаю.
Добавлять же фид по адресу
яндексу хотя бы основную rss скормить, а потом уже что-то конкретное :(
Поправьте rss-формат ленты, закиньте ее заново в форму заявки и ждите. По опыту, ленты появляются в результатах в течение примерно одной недели.
Он кушает только записи из блогов. И распознает их по формату передаваемого URL адреса. Адреса, которые должны передаваться, к примеру:
Дальше робот сам распознает какие записи свежие, а какие уже у него есть в базе.
Скажите пожалуйста, между какими строками вставлять пинг??
Сейчас он у меня стоит здесь (ответ от яндекса во время создания\обновления не приходит..), они написали мне письмо, что, мол пинг не приходит…
public function AddTopic(TopicEntity_Topic $oTopic) {
if ($sId=$this->oMapperTopic->AddTopic($oTopic)) {
$oTopic->setId($sId);
$aTags=explode(',',$oTopic->getTags());
foreach ($aTags as $sTag) {
$oTag=new TopicEntity_TopicTag();
$oTag->setTopicId($oTopic->getId());
$oTag->setUserId($oTopic->getUserId());
$oTag->setBlogId($oTopic->getBlogId());
$oTag->setText($sTag);
$this->oMapperTopic->AddTopicTag($oTag);
}
//чистим зависимые кеши
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_new',"topic_new_user_{$oTopic->getUserId()}","topic_new_blog_{$oTopic->getBlogId()}"));
ping ("
return $oTopic;
}
return false;
}
а можно по конкретней пожалуйста — после каких строк это прописывать? а то у меня после редактирования ошибка 500 выходит.
Я хочу эту возможность прикрутить к стороннему проекту и хотел бы уточнить этот факт у Вас, как «создателя».
Отвечают они быстро и оперативно. Объяснят причины.
Если можно — отчетец сюда. Может у всех владельцев LS такие же проблемы.