Модуль пинга для службы Яндекс.Блоги

Главные вкладки

Аватар пользователя inc inc 26 декабря 2006 в 2:02

Создан по просьбе romantaran@eikon.org.ru ( http://www.drupal.ru/node/3298 )

Вот что он писал (зачем нужен этот модуль):

>> ...стандартный ping.module выдает лишь общий пинг для всего сайта, чего совершенно >>недостаточно. Вот что мне, в частности, написали из яндексовской службы:
>>
>>Для того, чтобы мы могли включить вас сервис в рейтинг блог-хостингов, мы должны быть уверены, что полно и быстро индексируем его (иначе цифры для него не будут верными). При вашем объёме записей в день, наилучшим способом добиться этого было бы организовав отправку нам сообщений о каждой новой записи по протоколу Weblogs.Ping (http://www.xmlrpc.com/weblogsCom) на адрес http://ping.blogs.yandex.ru/RPC2. <…> пинг должен указывать именно на тот журнал, который обновился. При этом, по адресу журнала должен быть прописано автоопределение (link rel) для rss этого журнала. Тогда всё будет работать правильно.

Мне задача показалась несложной, к тому же было интересно поработать с пингами - так и родился этот модуль.
С целью тестирования пришлось написать модуль для приема (с сохранением и дальнейшим показом) этих самых пингов. Наверное есть готовые модули для этого, я не искал.

P.S.
Поздравляю Всех с наступающим Новым Годом!

ВложениеРазмер
Двоичные данные yandex_blogs.module2.33 КБ
Двоичные данные pings_test.module2.24 КБ

Комментарии

Аватар пользователя axel axel 26 декабря 2006 в 7:54

Сорри, настройки на drupal.ru мешали. Теперь можно скачать.

--
Администратор сайта «Drupal — Россия»
на вопросы по Drupal отвечаю только на форумах, не пишите в почту и приватом!

Аватар пользователя romantaran romantaran 26 декабря 2006 в 11:45

Супер! Спасибо!

Но есть пара вопросов.

  1. Что означает: "При этом, по адресу журнала должен быть прописано автоопределение (link rel) для rss этого журнала" ? Где это прописано?
  2. У меня на все URL блогов прописаны псевдонимы вида "http://mysite.com/username", а для RSS — "http://mysite.com/username/feed". Сможет ли Яндекс определить имя пользователя и адрес RSS?
Аватар пользователя romantaran romantaran 26 декабря 2006 в 12:05

Хм… Что-то никаких признаков пинга…

Как я понял, модуль посылает пинг после создания/редактирования/удаления ноды, а в логи записывает только отрицательный результат?

Почему-то страница ping_test остается пустой.

Аватар пользователя inc inc 26 декабря 2006 в 14:25

>>Что означает: "При этом, по адресу журнала должен быть прописано автоопределение
>>(link rel) для rss этого журнала"
? Где это прописано?

Я так понял, что в странице блога должен присутствовать тэг, дающий ссылку на RSS-ленту.
В Drupal'е это есть:
<link rel="alternate" type="application/rss+xml" title="Дневник пользователя admin RSS - ленты" href="/blog/1/feed" />

>>У меня на все URL блогов прописаны псевдонимы вида "http://mysite.com/username",
>>а для RSS — "http://mysite.com/username/feed".
>>Сможет ли Яндекс определить имя пользователя и адрес RSS?

Модуль посылает Яндексу POST-запрос такого вида:

<?xml version="1.0"?>
<methodCall>
        <methodName>weblogUpdates.ping</methodName>
        <params>
                <param>
                        <value>Дневник пользователя admin</value>
                </param>
                <param>
                        <value>http://ИМЯ_САЙТА/blog/1</value>
                </param>
        </params>
</methodCall>

В описании формата ( http://www.xmlrpc.com/weblogsCom ) нет поля для указания имени пользователя,
и Яндекс не просит его добавить.

Чтобы изменить путь с http://ИМЯ_САЙТА/blog/{id_пользователя} на http://ИМЯ_САЙТА/{имя_пользователя}, надо
изменить строку 57 в файле yandex_blogs.module:
<value>'.$base_url.'/blog/'.$uid.'</value>
на
<value>'.$base_url.'/'.pathauto_cleanstring($account->name).'</value>
Естественно, если вы используете модуль pathauto и он включен.

Я подозреваю, что имя блога в формате "Дневник пользователя admin", может не совсем понравится Яндексу,
и он захочет увидеть еще и имя сайта, или его слоган. Спросите у службы Яндекса, как им лучше.

Аватар пользователя inc inc 26 декабря 2006 в 15:06

>>Хм… Что-то никаких признаков пинга…
>>Почему-то страница ping_test остается пустой.

Модуль pings_test предназначался для регистрации любых пингов,
приходящих по адресу http://ИМЯ_САЙТА/pings_test_ping

Чтобы yandex_blogs.module пинговал pings_test.module, надо изменить в первом строку 62:
$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);

>>Как я понял, модуль посылает пинг после создания/редактирования/удаления ноды, а в логи записывает
>>только отрицательный результат?

да, по аналогии с модулем ping

Аватар пользователя romantaran romantaran 29 декабря 2006 в 0:27

1. Будет ли модуль пинговать при публикации с блог-клиента?

2. В какой момент модуль выдаст пинг при автоматической публикации при помощи модуля Scheduler? Во время отправки формы или во время перевода статьи из статуса "неопубликовано" в статус "опубликовано"? Это особенно важно для стабильного поддержания рейтинга сайта.

Аватар пользователя inc inc 29 декабря 2006 в 21:44

>>1. Будет ли модуль пинговать при публикации с блог-клиента?
Да, должны работать, т.к. там вызываются функции node_save и node_delete, ведущие к срабатыванию пингов.

>>2. В какой момент модуль выдаст пинг при автоматической публикации при помощи модуля Scheduler?
По-умолчанию действия scheduler.module не приводят к пингам. Чтобы пинг срабатывал, надо в yandex_blogs.module добавить функцию:

function yandex_blogs_scheduler_api($node, $action) {
        watchdog('Yandex ping', $action, WATCHDOG_WARNING);
        switch($action) {
                case 'publish':
                        if($node->status==1)
                                return;
                        break;
                case 'unpublish':
                        if($node->status!=1)
                                return;
                        break;
        }
        _yandex_blogs_doping($node->uid);
}

например, начиная с 8-й строки.

Модуль Scheduler мне не понравился, т.к. возможна такая ситуация, приводящая к 2 пингам подряд, хотя они совсем не нужны: нода распубликована, установлены времена для публикации, а затем для распубликации; если запуск cron'а произойдет только после времени, установленного для распубликации, то scheduler.module подаст команду для пинга 2 раза подряд, но в результате статус ноды не изменится!

P.S.
Хочется еще поработать над логикой посылки пингов, но это уже наверное в Новом Году, тогда же и включу строки выше в модуль.

Аватар пользователя romantaran romantaran 6 марта 2007 в 1:46

Сейчас мой сайт работает без этого модуля, но в рейтинге Яндекса всё равно появляется, правда, как будто, на сутки позже. Похоже, Яндекс ориентируется на Пингоматик, которого пингует Друпал.

Аватар пользователя Eugene2k Eugene2k (не проверено) 8 мая 2007 в 15:42

а можно еще файл common.inc или ссылку где весь source от drupal скачать, а то у меня что-то не получается...