Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 3 января 2010 в 01:38.
Категории: Моя работа.


Один из способов ускорения индексации страниц Вашего блога - отправка сообщений 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://www.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 и т.д.)

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

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

Ну, а теперь самое главное - ссылки на скачивание программы. Программа распространяется для ОС Windows и ОС Linux.

Ссылка версии для Windows - скачать

Ссылка версии для Linux - скачать

Новая версия:  zip Пинговалка(553.51 kB)

Если у Вас нет своего списка пинг-сервисов, то можете воспользоваться моим текущим списком на 97 сервисов. Он скачивается здесь. На момент написания поста все сервисы были 100% доступны. Таким образом, отправив 97 пингов, Вы устроите натуральный бодибилдинг и через некоторое время заметите насколько сильно Ваше детище полюбиться поисковым роботам.

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

Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (25)

WP_Cloudy
  • Альберт пишет:

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

  • Vlad пишет:

    Сервера работают в прежнем режиме

  • Bytexpert пишет:

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

  • Vlad пишет:

    Да вот и я думаю, что мою пинговалку надо тож с потоками подружить.

  • Хз пишет:

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

  • kolos1010 пишет:

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

  • SeoGhost пишет:

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

  • Vlad пишет:

    Нету DPR — проект на Лазарусе делался. Сейчас переписываю на Delphi 2010 и, соответственно, добавляю новые возможности и т.д.

  • Anfi пишет:

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

  • Ярослав пишет:

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

  • Vlad пишет:

    Так новый Pint тоже многопоточный :) http://www.webdelphi.ru/2010/10/programma-dlya-raboty-s-ping-servisami-prodolzhenie/ У меня пинг на 42 сервиса пролетает где-то за секунда 5 :)

  • Ярослав пишет:

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

  • Vlad пишет:

    Ну я решил остаться не оригинальным в подходе к списку сайтов — просто считываю N записей из RSS-ленты, а сами ленты храню отдельным списком. По-моему с RSS-каналом работать удобнее, чем ковыряться в DOM’е в поисках мета-тегов (тем более, что его может и не быть). Кстати, пользователи пару раз просили зделаь дополнительно пинг сразу нескольких страниц — не проходит такая фишка. Не могу сказать за все сервисы, но большинство не принимают подряд 2 пинга от одного и того же сайта/блог — задерживают подачу нового запроса на несколько минут. А у вас сколько сервисов сейчас в листе? У меня после последнего пинга осталось 42 100% работающих из 102 найденных полгода назад :)

  • Ярослав пишет:

    В списке сервисов у меня около 180 живых адресов, но большая часть из них это национальные гугловские, может в них и нет смысла. По поводу работы с rss, да удобнее, но title тоже легко вытаскивается из HTML через регулярку: <title>(.*?)<\/title>. Моя программа написана на JavaScript со своими обертками, поэтому код, получается достаточно лаконичный:

    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){}
    }
    }
    if (!data.title)
    {
    // html
    var a = s.match(/&lt;title&gt;(.*?)&lt;\/title&gt;/i);
    if (a != null)
    data.title = a[1];
    }

  • danjoy12 пишет:

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

  • KiloCY пишет:

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

  • Vlad пишет:

    Мог бы, если бы не одно «нехорошее» дело. Большинство пинг-сервисов запрещают отправку пинга чаще 1 раза в течении 5 минут и, если вы шлете 2 пинга подряд, то первый проходит, а второй уже нет и возвращается 4хх ошибка. Поэтому смысл делать программу на пинг нескольких страниц одновременно отпадает. Есть идея прикрутить к программе дополнительно список проксей и вот с ними возможно ваша просьба будет выполнена

  • Ярослав пишет:

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

  • Vlad пишет:

    Ярослав, спасибо за разъяснение. Попробую выкроить немного времени и дописать пинговалку. Ошибка 4хх, кстати, приходит вместе с XML-документом в котором содержится строка, типа «Slowly, cowboy…», т.е. сервис ка бы намекает на то, что надо бы по-медленнее пинговать :)

  • KiloCY пишет:

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

  • Vlad пишет:

    KiloCY, Ок, понятно. Как сказал комментом ранее — попробую реализовать эту фишку, тем более, что особых сложностей в этом не вижу. Главное найти на это время под конец года :)

  • Ярослав пишет:

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

  • KiloCY пишет:

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

  • KiloCY пишет:

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

  • Ярослав пишет:

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

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник

   


интернет игры. игры онлайн. онлайн игры бесплатные --|--. Качай бесплатно! Без регистрации - бесплатные игры.