уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Один из способов ускорения индексации страниц Вашего блога — отправка сообщений ping-сервисам. Например, Яндекс предоставляет пользователям блогов свой пинг-сервис для ускорения индексации новых записей блога. В двух словах работа с пинг-сервисами состоит в следующем: вы отправляете на специальный адрес сообщение определенного формата и, если все в порядке, то на ваш блог в скором времени пожалует поисковый робот.

В WordPress ping можно отправлять автоматически после публикации нового поста. Для этого необходимо внести пинг-сервисы в настройки «Settings — Writeng». В этом случае отправка пинга полностью ложиться на «хрупкие плечи» движка блога. А что делать в случае, если необходимо отправить пинг не в 1-2, а в 100 сервисов сразу? Можно, конечно, занести их все в настройки ВордПресс, но, по-моему это слишком уж замедлит работу Вашего блога. Дополнительно к этому возрастёт нагрузка на сервер и, если хостинг у Вас слабенький, то можно легко нажить себе проблемы с хостером. Вот я и подумал — почему бы не написать небольшую программку, которая будет отправлять пинги в необходимые сервисы? Но, так как любой он-лайн сервис имеет свойство «умирать», то дополнительно программа должна уметь вычищать мёртвые сервисы из списка. Сказано — сделано.

Для тех, кто не интересуется программированием — первые два пункта поста можно смело пропустить и перейти сразу к описанию работы программы. Ссылка на скачивание программы, как всегда в конце поста. Ну, а те, кто хотят понять работу программы — читайте весь пост. Разбираться будем по порядку.

1. Как происходит «общение» с пинг-сервисами

Для отправки пингов используется протокол Weblogs.Ping. Вы отправляете сервису сообщение в формате XML-RPC, воспользовавшись одной из двух функций:

  1. ?weblogUpdates.ping  — для отправки простого уведомления об изменениях в блоге
  2. weblogUpdates.extendedPing — для расширенного описания изменений.

Простое уведомление должно быть оформлено следующим образом:

<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value>Someblog</value>
</param>
<param>
<value>http://spaces.msn.com/someblog</value>
</param>
</params>
</methodCall>

то есть первый параметр — название Вашего блога, например «Delphi в Internet» и второй параметр — адрес страницы, которая изменилась, например http://webdelphi.ru/category/delphiweb/.

Сообщение для расширенного пинга выглядит так:

<methodCall>
<methodName>weblogUpdates.extendedPing</methodName>
<params>
<param>
<value>Someblog</value>
</param>
<param>
<value>http://spaces.msn.com/someblog</value>
</param>
<param>
<value>http://spaces.msn.com/someblog/PersonalSpace.aspx?something</value>
</param>
<param>
<value>http://spaces.msn.com/someblog/feed.rss</value>
</param>
<param>
<value>personal|friends</value>
</param>
</params>
</methodCall>

то есть помимо того, что Вы указываете название блога  и адрес изменившейся страницы, Вы также можете указать RSS-канал блога и список тэгов для поста.

После того как сообщение успешно отправлено, сервер высылает Вам ответ, который может содержать следующие параметры:

  1. flerror (Boolean) — если параметр равен 1 (true), то это означает, что сервер обнаружил ошибку в сообщении
  2. message (string). Здесь может содержаться сообщение об ошибке, либо сообщение об успешном принятии пинга.
  3. legal (string) — дополнительная информация, передаваемая сервисом

Таким образом, для того, чтобы обеспечить нормальную работу нашего будушего клиента для работы с пинг-сервисами от нас требуется:

  1. Сформировать правильный запрос и отправить его на адрес
  2. Обработать ответ сервиса и выдать сообщение о выполнении операции.

2. Организуем формирование и отправку запроса пинг-сервису.

Для отправки/получения сообщений по HTTP-протоколу воспользуемся библиотекой Synapse (модуль httpsend). Для формирования тела запроса будем использовать следующие модули Lazarus:

  • DOM — для работы с DOM XML-документа
  • XMLRead — для чтения XML-файлов
  • XMLWrite — для записи XML-файлов

Итак, отправлять будем расширенное сообщение. Следовательно, нам необходимо получать от пользователя пять строковых значений:

  1. Название блога
  2. Адрес блога
  3. Адрес изменившейся страницы
  4. Адрес RSS-канала
  5. Список тэгов поста

Процедура формирования тела запроса может выглядеть следующим образом:

procedure TPingService.SetPingInfo(const BlogName, BlogURL, PageURL, BlogRSS,
Tags: string);
var Root,Node,Text:TDOMNode;
begin
FreeAndNil(FPingInfo);
FPingInfo:=TXMLDocument.Create;
Root:=FPingInfo.CreateElement('methodCall');
FPingInfo.AppendChild(Root);
Root:=FPingInfo.DocumentElement;
Node:=FPingInfo.CreateElement('methodName');
Text:=FPingInfo.CreateTextNode('weblogUpdates.extendedPing');
Node.AppendChild(Text);
Root.AppendChild(Node);
 
Node:=FPingInfo.CreateElement('params');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('param');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('value');
Text:=FPingInfo.CreateTextNode(BlogName);
Node.AppendChild(Text);
Root.AppendChild(Node);
Root:=Root.ParentNode;
 
Node:=FPingInfo.CreateElement('param');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('value');
Text:=FPingInfo.CreateTextNode(BlogURL);
Node.AppendChild(Text);
Root.AppendChild(Node);
Root:=Root.ParentNode;
 
Node:=FPingInfo.CreateElement('param');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('value');
Text:=FPingInfo.CreateTextNode(PageURL);
Node.AppendChild(Text);
Root.AppendChild(Node);
Root:=Root.ParentNode;
 
Node:=FPingInfo.CreateElement('param');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('value');
Text:=FPingInfo.CreateTextNode(BlogRSS);
Node.AppendChild(Text);
Root.AppendChild(Node);
Root:=Root.ParentNode;
 
Node:=FPingInfo.CreateElement('param');
Root:=Root.AppendChild(Node);
Node:=FPingInfo.CreateElement('value');
Text:=FPingInfo.CreateTextNode(StringsReplace(Tags,[','],['|'],[rfReplaceAll]));
Node.AppendChild(Text);
Root.AppendChild(Node);
end;

Здесь представлено формирование тела запрос, если можно так выразиться, в расширенном виде, т.е. шаг за шагом. В принципе, если передавать в процедуру не отдельные строки, а, например список TStringList, то можно сократить тело процедуры раз эдак в пять. Но это на Ваше усмотрение. Главное, не забыть, что тэги должны быть разделены не запятыми, а вертикальной чертой.

В результате выполнения процедуры у нас получается XML-документ (FPingInfo), содержащий необходимые параметры.

Для отправки сообщения воспользуемся объектом THTTPSend из библиотеки Synapse:

...
 
var info: TMemoryStream;
str: string;
begin
  with THTTPSend.Create do
    begin
      MimeType:='text/xml';
      WriteXMLFile(FPingInfo,Document);
      if HTTPMethod('post',PingURL) then
        begin
          if ResultCode=200 then//отправка прошла успешно - вернулся ответ
             Result:=ParseResponce(Document,str) //обрабатываем полученный ответ
         else
//отправка сообщения не удалась (сервис перегружен, недоступен и т.д.)
end;

Здесь мы действуем следующим образом:

  1. Записываем XML-документ с телом запроса в поток THTTPSend.Document
  2. Если отправка сообщения методом POST прошла успешно, т.е. код ответа сервиса был равен 200, то это не свидетельствует о том, что пинг будет обработан, вполне возможно, что в ответном сообщении содержится описание ошибки, поэтому тело полученного от сервера сообщения отправляется на дальнейшую обработку
  3. Если код ответа был отличен от 200, то это говорит о том, что ваше сообщение вообще не дошло до сервиса. Тут всё зависит от Вас — можете удалить сервис из списка, можете проанализировать код ответа и т.д. В большинстве случаев такой ответ свидетельствует о том, что сервис «умер»

Вот, пожалуй и все основные операции при работе с пинг-сервисами. Достаточно просто, неправда ли :)

3. Программа для отправки сообщений пинг-сервисам

Как я уже говорил выше, назначение программы состоит в следующем:

  • отправка пингов (сообщений) в выбранные Вами пинг-сервисы
  • поддержание списка сервисов в актуальном состоянии, чистка списка от несуществующих сервисов.

Внешний вид запущенного приложения показан на рисунке:

В целом программа пока получилась достаточно простой. Слева располагается список Ваших пинг-сервисов для работы, справа — поля, которые необходимо заполнить.

Т.к. по сути я человек достаточно ленивый, а лень, как известно, двигатель прогресса, то я решил, что было бы неплохо организовать автоматическое заполнение всех необходимых полей напрямую из RSS-канала Вашего блога. В настоящее время поддерживаются только фиды Google FeedBurner.

Работа программы происходит следующим образом. Вначале Вы заходите в меню «Настройки»—«Сайт» и вписываете адрес своего фида:

Теперь, чтобы загрузить содержимое своего фида нажимаете кнопку «Обновить» рядом с полем RSS-канал:

после этого содержимое Вашего фида запишется в список.

Теперь, чтобы загрузить список ping-сервисов можно:

  • нажать на кнопку «Загрузить список» в главном окне
  • выбрать в меню «Список сервисов» — «Загрузить свой список»

В программу можно передавать либо текстовый файл, в котором каждая строка — это отдельный URL сервиса. Либо XML-файл определенного формата (описание формата см. далее).

Также Вы можете добавлять сервисы к уже существующему списку. Для этого необходимо выбрать в главном меню «Список сервисов» — «Добавить к текущему списку».

Программа автоматически сохраняет последний рабочий список. Этот же список будет загружен при следующем запуске программы.

Когда список сервисов загружен, выбираете необходимые для работы пинг-сервисы и пост из списка RSS-канала. Например, вот так:

Жмете кнопку «Пинг!» и идёте курить, пить чай и т.д. и т.п., а программа тем временем выполнит все необходимые действия.

Внимание! При разработке программы я не использовал многопоточность, поэтому при отправке сообщений на «мёртвые» сервисы интерфейс программы может «замирать». Это нормально при такой организации работы.

Теперь, что касается XML-формата файла, используемого в программе и чистке сервисов.

Фрагмент файла представлен на рисунке:

Как видите, всё достаточно проста каждый сервис описывается узлом ping. Аттрибуты узла:

  1. lang — гео-принадлежность сервиса (русский, английский, албанский и т.д.). Т.к. в настоящее время существует 1-2 русских пинг-сервиса, то я пока решил оставить этот атрибут «на вырост» и присваиваю всем узлам значение атрибута other
  2. error — содержит общее количество ошибок, которые произошли при работе с сервисом за всё время использования списка
  3. lasterror — содержит код последней ошибки (404, 302, 500 и т.д.)

Последние два атрибута используются для чистки списка пинг-сервисов. Чтобы провести очистку списка необходимо выбрать в главном меню «Список сервисов» — «Очистить» и выбрать в открывшемся окне необходимые опции:

Далее нажимаете «Чистить» и программа очищает список согласно Вашим предпочтениям.

Ну, а если Вы разработчик и Вы хотите посодействовать развитию программы или использовать её часть в своей разработке, то можете скачать исходники программы тут. Только не забывайте, что согласно лицензии у Synapse и Lazarus, Вы в итоге также как и я будете обязаны предоставить в общий доступ исходники своих творений.

Скачать исходник: Исходники —> Интернет и Сети —> Прочие
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
29 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Альберт
Альберт
19/03/2010 18:56

Выложите пожалуйста эту программу куда нибудь например на свой хостинг, потому что ссылка ведущая на ifolder сдохла так как сервера агавы отключили.

Bytexpert
27/03/2010 22:41

Тоже писал для себя такую пинговалку, вот на этой технологии: http://bit.ly/aWsphS результаты работы выложил тут: http://ru.websitepad.com/ping_statichnyh_saitov.html
По ходу работы над приложением заметил, что мне код на JavaScript показалось удобнее писать чем на Дельфи, особенно относительно формирования запросов в xml-rpc. И еще я делал пинг многопоточным, очень ускоряло работу, т.к. не отвечающие сервисы встречались достаточно часто.

Хз
18/04/2010 23:40

Чего то не пашет прога, а если точнее — не грузит список пинг сервисов. Я ей и в тхт формате скармливал и в xml(все по картинке сделал:) ). Ни в какую не хочет добавлять пинг сервисы.
на всякий случай кратко о системе:
WinXP SP3
Netframework 2.0
Nod 32 4/0/424
Outpost Sec. Suit Pro 2009

kolos1010
kolos1010
31/08/2010 22:29

Жаль что с кодировкой windows1251 не работает, а в лазарусе я никогда не работал, только в дельфи 6

SeoGhost
SeoGhost
25/09/2010 17:11

Здравствуйте, а не могли бы вы выложить сам проект, не только PAS, но и DPR? Был бы благодарен

Anfi
Anfi
26/10/2010 14:42

Спасибо за програмку! Очень полезная, оссобенно когда на оперативную память не богат на своём хостинге =)

Ярослав
02/12/2010 12:05

Я для себя написал очень простой вариант, пингует в несколько потоков, по списку и пинг простой не расширенный, т.е. самый простой вариант. Работает под виндой, иногда подвисает. Можно взять здесь: http://pingxpert.com

Ярослав
04/12/2010 13:21

Ага, читал о выпуске новой версии. Просто я в своем варианте для себя сделал список по которому можно пинговать, т.е. указываешь все свои сайты списком и он уже их проверяет на живучесть и дергает оттуда title для XML-RPC запроса. А потом уже проходится по спсиску пинг-сервисов.

Ярослав
04/12/2010 19:35

В списке сервисов у меня около 180 живых адресов, но большая часть из них это национальные гугловские, может в них и нет смысла. По поводу работы с rss, да удобнее, но title тоже легко вытаскивается из HTML через регулярку: <title>(.*?)<\/title>. Моя программа написана на JavaScript со своими обертками, поэтому код, получается достаточно лаконичный: [code] var xml = rtl.xml(); var s = data.http.getString(data.url); if (xml.loadXml(s)) { if (xml.root.tag == 'rss') { //rss try { data.title = xml.root.channel.title.text data.date = xml.root.channel.lastBuildDate.text; } catch(e){} } else if (xml.root.tag == 'feed') { //atom try { data.title = xml.root.title.text; data.date = xml.root.updated.text; } catch(e){} }… Подробнее »

danjoy12
06/12/2010 17:48

У меня почему-то не добавляются адресса для пинга. С чем это может быть связано???

KiloCY
KiloCY
15/12/2010 04:32

А не могли бы вы переделать её, что бы можно было просто список ссылок туда вставить и он отправлял каждую ссылку в пинг сервисы ?

Ярослав
15/12/2010 13:58

Видимо автор коммента имел ввиду список не на один сайт, а на несколько разных сайтов. Я тестировал на своей программе — вроде проходит, но за все сервисы не уверен. А 4XX ошибка может и не из-за этого быть, я наступал на эти грабли по дурости — забывал очищать список параметров заголовка перед повторным запросом и у меня там мусор уходил. Но прокси — тоже хорошее решение.

KiloCY
KiloCY
15/12/2010 16:34

Да я имелл ввиду, что бы отправлять много страниц не одного сайта а разных, предположим для чего нам это нужно, мы купили базу трастовых сайтов, прорегали, и когда там они проиндексируются не известно, а при помощи пингов процесс очень ускорился, если что пусть будет даже через пинги, хотя мне кажется пинги принимают постоянно

Ярослав
15/12/2010 18:12

2 KiloCY — пока Влад дописывает, можете попробовать http://pingxpert.com — там нет много того что есть в программе у Влада, но по списку она пингует.

KiloCY
KiloCY
15/12/2010 21:29

Спасибо, в принципе должна подойти, щас попробую пару тысяч отпинговать

KiloCY
KiloCY
15/12/2010 23:58

Ну вот, отпинговал 100к за время от последнего комента, теперь ждём еффекта

Ярослав
16/12/2010 01:08

Ой, боюсь пару тыщь не отпингует, разбейте хотя б на пары десятков. А то вдруг подвиснет и придется с самого начала пинговать. А вообще для такого софта нужен специальный режим который бы отслеживал, что он пинганул, а что нет и если бы подвис, то начал бы с последней успешной попытки, а не с самого начала.

Киса
22/02/2012 18:30

С помощью этой программы происходит автоматическое пингование при добавлении нового материла? Или нет?

trackback

[…] Простым примером такого приложения может быть программа для работы с пинг-сервисами. В ней модуль используется как раз для того, чтобы […]