Пингатор робота Яндекс-блоги

Планируется ли реализация этого простенького, но очень полезного модуля в ближайшем будущем?
Возможна ли разработка за денюшку, в складчину с другими заинтересованными пользователями.
Готов сразу выделить 10$. Уверен найдется немало и других желающих.

65 комментариев

avatar
а что это такое?

к вам вообще робот яндекс блога приходит? есть какой-нибудь живой LS куда он приходит?
  • ozz
  • 0
avatar

У Яндекса есть, насколько я знаю, пара роботов по блогам.
Один робот производит плановый обход всех зарегистированных блогов в базе в определенное время.
Второй робот (которого пингуют сами блоги сразу после публикации нового сообщения) — чешет в блог сразу после пинга. То есть проглатывает и выдает инфу в поиске по блогам гораздо раньше тех блогов, которые так не делают.
Такой пингатор — необходимое условие для включения сайта в раздел Сервисы.

У меня есть исходник такого пингатора для друпала. Думаю адаптировать его не составит труда:


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-ленты его личного блога
avatar
Я понял. 23 — 24 будет время заняться написанием.

У меня только подозрение что выдача LS вообще не естся яндекс.блогами, пока я не одного попавшего туда не видел.
avatar
Должна вестись. Если этого не происходит — скорее всего из-за того, что владельцы сайтов на LS не удосуживаются добавить ленту записей в поисковик по блогам.

Я туда одно время забивал ленты даже простых форумов на Yabb — прекрасно Яндекс-роботы их кушают :)
avatar
Да, есть подозрение, что могут не выдаваться из-за низкой частотности публикаций. Робот, типа, просто редко ходит. :)
По крайней мере это было бы логично со стороны разработчиков
avatar
часто не выдается из за того что rss формируется с ошибками на взгляд робота
например первый платный BS не принимает робот, текущую версию забирает на ура.
avatar
вот вот, у нас не очень то валидный rss выдается, надо править, займусь этим в ближайщее время.

а вот такой момент: если блог попал в я.блоги, то как это влияет на обычную поисковую выдачу (не по блогам, а вообще по интернету)?
avatar
Сложный вопрос. Я задумывался об этом, однако ответа не нашел.
Я рассматриваю выдачу в поиске по блогам как дополнительный канал траффика помимо выдачи в обычном поиске.

Кроме того, в поиске по блогам ранжирование идет по умолчанию «по времени публикации», что логично, ибо блоговые записи быстро устаревают. Поэтому пингатор мегаважен.
А вот в обычном поиске по умолчанию вывод результатов идет по релятивантности. Так что нужно в обоих каналах выводиться :)
avatar
hiero.ru/rss2lj/

тут есть валидатор, вот насколько я вижу он совпадает с валидатором яндекса

ls не проходит
avatar
Яндекс предлагает проверять этим валидатором: www.feedvalidator.org

Сейчас посмотрел — фиды действительно не валидные. Надо править. Многие rss-трансляторы тоже отбраковывают инвалидные потоки.
avatar

У меня из ошибок выдает только:
<author>###</author>
Т.е. не хватает мыла пользователя. Но имхо это неправильно, почту юзверей открывать нельзя.

Остальное — рекомендации по вычищению из rss скриптов и object, добавление atom:link и объявление mime-типа контента как rss+xml.
avatar

В итоге валидатор сказал мне: «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>
 
avatar

Уберите вообще эту строку.
Вместо нее поставьте <dc:creator>НИК ЮЗЕРА</dc:creator>
avatar

Сори, необходима еще первая строчка с объявой:
xmlns:dc="purl.org/dc/elements/1.1/
avatar
Или так :) Пасиб, вроде работает.
avatar
а как посмотреть попал блог или нет?
avatar
в поиске сразу должен выдаваться по идее,
а я сейчас тупо делаю кросс-пост тизер в ЖЖ, оттуда он индексируется в секунды и по ссылке яндекс уже индексирует топик на сайте. неудобно, но работает. я так защищаю в секунды уникальность контента. А то Бог его знает, когда сам яндекс проиндексирует сайт…
avatar

Закинул вот такую функцию в конец файла 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 ("ping.blogs.yandex.ru/RPC2", $oTopic->getUserLogin(),$oTopic->getBlogUrlFull());

Ответ от сервера яндекса получаю OK. Отправляется соответственно логин оставившего пост и урл на обновленный блог. Как вариант — оставлять ссылку на конкретный элемент, но это можно сделать для комментариев.
avatar
Небольшая поправка — ссылку надо отправлять на RSS-фид обновленного блога.
avatar
Черт, я как-то этот момент упустил.
avatar
Кстати, еще поправка. Отправлять лучше НИК/ИМЯ пользователя. Не его логин :)
Это имя будет показываться в результатах поиска в яндексе напротив блога.
avatar
Если НИК не заполнен, тогда уже логин.
avatar
Не согласен. Если вы вовсю используете на сайте имена пользователей, то конечно такой вариант имеет право на жизнь. Я лично привык идентифицировать пользователя по его логину на любом сервисе. К примеру, на сайтах LS в комментариях пишется логин, а не имя.
avatar
Фишка в том, что передаваемое имя, яндекс использует для показа в результатах поиска. То есть — для людей.

К примеру так:

* 1 ч. 54 мин. назад
* комментарий Юми_очаровательная_смерть в журнале Натаниэль_Де_Рин
* www.liveinternet.ru/users/2375098
avatar
Хорошо, соглашусь. Но для меня это откровенно говоря неважно. Упоминание имени будет встречаться только на Яндексе, а нигде на сайте использовано не будет. Посему уж лучше будут логины.
avatar
а покажите мне валидную выдачу с именем автора?
avatar
В rss?
joesmith@example.com (Joe Smith) Будет валидным.
avatar
не мне реальный рсс с автором надо валидный посмотреть
avatar

Дописываем в 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 ("ping.blogs.yandex.ru/RPC2", $oTopic->getUserLogin(),$oTopic->getRssUrl());
avatar
Супер! :)
Пасиба. На какой кошель отправить обещанную денюжку?
avatar
Эээ. Я вообще только сейчас увидел, что тут еще и деньги дают. Не возьму, я за опенсорс ) Лучше отправьте их в копилку проекта LS. Кошельки тут написаны.
avatar
Ок. Принято
:)
avatar
я так понимаю, прежде чем rss конкретного блога появится в яндексе, нужно его добавить через blogs.yandex.ru/add.xml? если так, то не лучше ли яндексу скармливать yourdomain.ru/rss/new/, а не урл конкретного топика? а для комментариев yourdomain.ru/rss/allcomments?
avatar
yourdomain.ru/rss/new/ относится ко всему подряд. А я предлагаю подсовывать яндексу конкретный поток конкретного обновленного блога. Имхо таким образом он сможет определить, например, блог «Предложения и пожелания» как самостоятельный на сервисе livestreet.ru.
Пока это всего лишь догадки, ибо ответа из поддержки Яшки я не получил.
avatar
это да, но ваша конечная задача состоит в том, чтобы блог попал в яндекс. так скормив ему yourdomain.ru/rss/new/ не надо будет добавлять ему новые блоги, ведь главное чтобы топики и комментарии проиндексировались, нет?
avatar
Блог попадает в яндекс, как только ему скармливают единоразово yourdomain.ru/rss. По крайней мере в теории, на практике для ls не работает, но видимо это временно. Так вот, это происходит единожды.
Да, можно использовать пинг, чтобы rss-лента постоянно подсовывалась роботу, но если есть такой инструмент, то мне хочется использовать его тоньше.
В любом случае, вы вправе использовать пингатор по своему назначению. Например, докрутить в него список всех сервисов и сделать модуль пинга каждого из них так, чтобы процесс постинга не затягивался.
Я же у себя ограничился пингом яндекса и гугла.
avatar
Основная функция пинга — сообщать роботу о появлении новой публикации и передавать имя автора этой публикации и адрес его блога. Вы конечно можете наворотить еще разных прибамбасов. Только робот под них не заточен и ничего ровным счетом не увидит из того, что вы писали. :)

Более того, при попытке попасть в Сервисы, администратор ласково попросит вас порезать все лишнее и привести формат выдачи пинга к тому виду, который необходим роботу.

Кроме того, выдавая «левые» пинги особенно часто, предполагаю, что вы рискуете попасть в бан-лист. Политика яндекса очень жестка к сайтам, которые «мусорят» почем зря.
avatar
Про условия попадания в Сервиси поподробнее пожалуйста )
avatar
Это мне писали из поддержки яндекса:

1. В рейтинг сервисов добавляются только блогохостинги с отдельными пользовательскими блогами.

2. Для того, чтобы мы могли включить сервис в рейтинг блог-хостингов, мы должны
быть уверены, что полно и быстро его индексируем (иначе цифры для него не будут верными). Наилучшим способом добиться этого будет организация отправки
нам сообщений о каждой новой записи по протоколу Weblogs.Ping на адрес
ping.blogs.yandex.ru/RPC2

Описание протокола можно посмотреть здесь — www.xmlrpc.com/weblogsCom
Пример готового скрипта для отправки пингов нам, например, здесь — nudnik.ru/zips/ping.txt

3. Сервис должен иметь не менее 200 зарегистрированных пользователей.
avatar
Спасибо за информацию. По крайней мере теперь есть, к чему стремиться )
avatar
Повторюсь еще раз: Пингатор должен передавать НИК автора свежей публикации и АДРЕС RSS-потока своего блога.
Такой формат нужен яндексу для того, чтобы правильно формировать вывод в результатах поиска, как я понимаю.

Добавлять же фид по адресу blogs.yandex.ru/add.xml логичнее и правильнее как вами и предложено. А не каждый блог по отдельности. :)
avatar
вот и я о том же, что замучаюсь каждый блог добавлять руками, если бы он по результатам пинга сам умно добавлял блог в индекс, то одно, на деле же все сложнее я смотрю.
яндексу хотя бы основную rss скормить, а потом уже что-то конкретное :(
avatar
Судя по отзывам — робот яндекса не кушает rss от lS по причине его некорректности. Что вполне разумно :)
Поправьте rss-формат ленты, закиньте ее заново в форму заявки и ждите. По опыту, ленты появляются в результатах в течение примерно одной недели.
avatar
все поправили, ошибки есть, но RSS Valid кнопка присутствует. Будем ждать. А что вы имели ввиду про частый пинг? Если я скормлю яндексу rss комментариев и пинговать буду каждую минуту (по частоте появления комментариев естественно), есть шанс быть забанненым?
avatar
Робот яндекса не кушает комментарии :)
Он кушает только записи из блогов. И распознает их по формату передаваемого URL адреса. Адреса, которые должны передаваться, к примеру:

livestreet.ru/blog/Covax/rss
livestreet.ru/blog/Coxus/rss
livestreet.ru/blog/jurius/rss

Дальше робот сам распознает какие записи свежие, а какие уже у него есть в базе.
avatar
А вообще — я не работаю в Яндексе. Поэтому, наилучшим образом, чтобы прояснить все вопросы — лучше обратится в тех.поддержку самого Яндекса :)
avatar

Скажите пожалуйста, между какими строками вставлять пинг??

Сейчас он у меня стоит здесь (ответ от яндекса во время создания\обновления не приходит..), они написали мне письмо, что, мол пинг не приходит…

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 ("ping.blogs.yandex.ru/RPC2", $oTopic->getUserLogin(),$oTopic->getBlogUrlFull());

                        return $oTopic;

                }
                return false;
        }
avatar
дописал в методы AddTopic и UpdateTopic

а можно по конкретней пожалуйста — после каких строк это прописывать? а то у меня после редактирования ошибка 500 выходит.
avatar
Так указывать надо все таки RSS канал или же ссылку на URL просто?
Я хочу эту возможность прикрутить к стороннему проекту и хотел бы уточнить этот факт у Вас, как «создателя».
avatar
Зделал Я как тут указано и у Меня выпала ошибка на с указанием на строчку
$tb_send='<?xml version="1.0" encoding="utf-8"?>
avatar
Печально конечно, но сайт в блогах Яндекса у меня так и не появился.
avatar
А когда он был добавлен?
avatar
Первый раз — в декабре. Второй — неделю или полторы назад. Третий — сегодня днем.
avatar
Рекомендую обратится в службу поддержки Яндекса
Отвечают они быстро и оперативно. Объяснят причины.
Если можно — отчетец сюда. Может у всех владельцев LS такие же проблемы.
avatar
Да, уже обратился. Жду ответа, лог скину сюда или в отдельный топик.
avatar
гут
avatar
Некоторые результаты, как и обещал, есть тут.
avatar
какой урл?
avatar
avatar
опять я со своими проблемами :) пингатор сделали чудесный, но как из-за него теперь новые топики постятся и апдейтятся с задержкой… как сделать работу пингатора в фоне?
avatar
Да… как же тормозит функция пингатора сохранение и редактирование топика… жесть… Давайте подумаем, как его в фон убрать, гадину :)
avatar
По крону например. Пинговаться будет не сразу, но и интервал можно не большой поставить.
avatar
Можно в отдельный процесс выкидывать через exec.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.