Один из способов ускорения индексации страниц Вашего блога — отправка сообщений ping-сервисам. Например, Яндекс предоставляет пользователям блогов свой пинг-сервис для ускорения индексации новых записей блога. В двух словах работа с пинг-сервисами состоит в следующем: вы отправляете на специальный адрес сообщение определенного формата и, если все в порядке, то на ваш блог в скором времени пожалует поисковый робот.
В WordPress ping можно отправлять автоматически после публикации нового поста. Для этого необходимо внести пинг-сервисы в настройки «Settings — Writeng». В этом случае отправка пинга полностью ложиться на «хрупкие плечи» движка блога. А что делать в случае, если необходимо отправить пинг не в 1-2, а в 100 сервисов сразу? Можно, конечно, занести их все в настройки ВордПресс, но, по-моему это слишком уж замедлит работу Вашего блога. Дополнительно к этому возрастёт нагрузка на сервер и, если хостинг у Вас слабенький, то можно легко нажить себе проблемы с хостером. Вот я и подумал — почему бы не написать небольшую программку, которая будет отправлять пинги в необходимые сервисы? Но, так как любой он-лайн сервис имеет свойство «умирать», то дополнительно программа должна уметь вычищать мёртвые сервисы из списка. Сказано — сделано.
Для тех, кто не интересуется программированием — первые два пункта поста можно смело пропустить и перейти сразу к описанию работы программы. Ссылка на скачивание программы, как всегда в конце поста. Ну, а те, кто хотят понять работу программы — читайте весь пост. Разбираться будем по порядку.
1. Как происходит «общение» с пинг-сервисами
Для отправки пингов используется протокол Weblogs.Ping. Вы отправляете сервису сообщение в формате XML-RPC, воспользовавшись одной из двух функций:
- ?weblogUpdates.ping — для отправки простого уведомления об изменениях в блоге
- 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-канал блога и список тэгов для поста.
После того как сообщение успешно отправлено, сервер высылает Вам ответ, который может содержать следующие параметры:
- flerror (Boolean) — если параметр равен 1 (true), то это означает, что сервер обнаружил ошибку в сообщении
- message (string). Здесь может содержаться сообщение об ошибке, либо сообщение об успешном принятии пинга.
- legal (string) — дополнительная информация, передаваемая сервисом
Таким образом, для того, чтобы обеспечить нормальную работу нашего будушего клиента для работы с пинг-сервисами от нас требуется:
- Сформировать правильный запрос и отправить его на адрес
- Обработать ответ сервиса и выдать сообщение о выполнении операции.
2. Организуем формирование и отправку запроса пинг-сервису.
Для отправки/получения сообщений по HTTP-протоколу воспользуемся библиотекой Synapse (модуль httpsend). Для формирования тела запроса будем использовать следующие модули Lazarus:
- DOM — для работы с DOM XML-документа
- XMLRead — для чтения XML-файлов
- XMLWrite — для записи XML-файлов
Итак, отправлять будем расширенное сообщение. Следовательно, нам необходимо получать от пользователя пять строковых значений:
- Название блога
- Адрес блога
- Адрес изменившейся страницы
- Адрес RSS-канала
- Список тэгов поста
Процедура формирования тела запроса может выглядеть следующим образом:
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;
Здесь мы действуем следующим образом:
- Записываем XML-документ с телом запроса в поток THTTPSend.Document
- Если отправка сообщения методом POST прошла успешно, т.е. код ответа сервиса был равен 200, то это не свидетельствует о том, что пинг будет обработан, вполне возможно, что в ответном сообщении содержится описание ошибки, поэтому тело полученного от сервера сообщения отправляется на дальнейшую обработку
- Если код ответа был отличен от 200, то это говорит о том, что ваше сообщение вообще не дошло до сервиса. Тут всё зависит от Вас — можете удалить сервис из списка, можете проанализировать код ответа и т.д. В большинстве случаев такой ответ свидетельствует о том, что сервис «умер»
Вот, пожалуй и все основные операции при работе с пинг-сервисами. Достаточно просто, неправда ли :)
3. Программа для отправки сообщений пинг-сервисам
Как я уже говорил выше, назначение программы состоит в следующем:
- отправка пингов (сообщений) в выбранные Вами пинг-сервисы
- поддержание списка сервисов в актуальном состоянии, чистка списка от несуществующих сервисов.
Внешний вид запущенного приложения показан на рисунке:
В целом программа пока получилась достаточно простой. Слева располагается список Ваших пинг-сервисов для работы, справа — поля, которые необходимо заполнить.
Т.к. по сути я человек достаточно ленивый, а лень, как известно, двигатель прогресса, то я решил, что было бы неплохо организовать автоматическое заполнение всех необходимых полей напрямую из RSS-канала Вашего блога. В настоящее время поддерживаются только фиды Google FeedBurner.
Работа программы происходит следующим образом. Вначале Вы заходите в меню «Настройки»—«Сайт» и вписываете адрес своего фида:
Теперь, чтобы загрузить содержимое своего фида нажимаете кнопку «Обновить» рядом с полем RSS-канал:
после этого содержимое Вашего фида запишется в список.
Теперь, чтобы загрузить список ping-сервисов можно:
- нажать на кнопку «Загрузить список» в главном окне
- выбрать в меню «Список сервисов» — «Загрузить свой список»
В программу можно передавать либо текстовый файл, в котором каждая строка — это отдельный URL сервиса. Либо XML-файл определенного формата (описание формата см. далее).
Также Вы можете добавлять сервисы к уже существующему списку. Для этого необходимо выбрать в главном меню «Список сервисов» — «Добавить к текущему списку».
Программа автоматически сохраняет последний рабочий список. Этот же список будет загружен при следующем запуске программы.
Когда список сервисов загружен, выбираете необходимые для работы пинг-сервисы и пост из списка RSS-канала. Например, вот так:
Жмете кнопку «Пинг!» и идёте курить, пить чай и т.д. и т.п., а программа тем временем выполнит все необходимые действия.
Внимание! При разработке программы я не использовал многопоточность, поэтому при отправке сообщений на «мёртвые» сервисы интерфейс программы может «замирать». Это нормально при такой организации работы.
Теперь, что касается XML-формата файла, используемого в программе и чистке сервисов.
Фрагмент файла представлен на рисунке:
Как видите, всё достаточно проста каждый сервис описывается узлом ping. Аттрибуты узла:
- lang — гео-принадлежность сервиса (русский, английский, албанский и т.д.). Т.к. в настоящее время существует 1-2 русских пинг-сервиса, то я пока решил оставить этот атрибут «на вырост» и присваиваю всем узлам значение атрибута other
- error — содержит общее количество ошибок, которые произошли при работе с сервисом за всё время использования списка
- lasterror — содержит код последней ошибки (404, 302, 500 и т.д.)
Последние два атрибута используются для чистки списка пинг-сервисов. Чтобы провести очистку списка необходимо выбрать в главном меню «Список сервисов» — «Очистить» и выбрать в открывшемся окне необходимые опции:
Далее нажимаете «Чистить» и программа очищает список согласно Вашим предпочтениям.
Ну, а если Вы разработчик и Вы хотите посодействовать развитию программы или использовать её часть в своей разработке, то можете скачать исходники программы тут. Только не забывайте, что согласно лицензии у Synapse и Lazarus, Вы в итоге также как и я будете обязаны предоставить в общий доступ исходники своих творений.
Выложите пожалуйста эту программу куда нибудь например на свой хостинг, потому что ссылка ведущая на ifolder сдохла так как сервера агавы отключили.
Сервера работают в прежнем режиме
Тоже писал для себя такую пинговалку, вот на этой технологии: http://bit.ly/aWsphS результаты работы выложил тут: http://ru.websitepad.com/ping_statichnyh_saitov.html
По ходу работы над приложением заметил, что мне код на JavaScript показалось удобнее писать чем на Дельфи, особенно относительно формирования запросов в xml-rpc. И еще я делал пинг многопоточным, очень ускоряло работу, т.к. не отвечающие сервисы встречались достаточно часто.
Да вот и я думаю, что мою пинговалку надо тож с потоками подружить.
Чего то не пашет прога, а если точнее — не грузит список пинг сервисов. Я ей и в тхт формате скармливал и в xml(все по картинке сделал:) ). Ни в какую не хочет добавлять пинг сервисы.
на всякий случай кратко о системе:
WinXP SP3
Netframework 2.0
Nod 32 4/0/424
Outpost Sec. Suit Pro 2009
Жаль что с кодировкой windows1251 не работает, а в лазарусе я никогда не работал, только в дельфи 6
Здравствуйте, а не могли бы вы выложить сам проект, не только PAS, но и DPR? Был бы благодарен
Нету DPR — проект на Лазарусе делался. Сейчас переписываю на Delphi 2010 и, соответственно, добавляю новые возможности и т.д.
Спасибо за програмку! Очень полезная, оссобенно когда на оперативную память не богат на своём хостинге =)
Я для себя написал очень простой вариант, пингует в несколько потоков, по списку и пинг простой не расширенный, т.е. самый простой вариант. Работает под виндой, иногда подвисает. Можно взять здесь: http://pingxpert.com
Так новый Pint тоже многопоточный :) http://www.webdelphi.ru/2010/10/programma-dlya-raboty-s-ping-servisami-prodolzhenie/ У меня пинг на 42 сервиса пролетает где-то за секунда 5 :)
Ага, читал о выпуске новой версии. Просто я в своем варианте для себя сделал список по которому можно пинговать, т.е. указываешь все свои сайты списком и он уже их проверяет на живучесть и дергает оттуда title для XML-RPC запроса. А потом уже проходится по спсиску пинг-сервисов.
Ну я решил остаться не оригинальным в подходе к списку сайтов — просто считываю N записей из RSS-ленты, а сами ленты храню отдельным списком. По-моему с RSS-каналом работать удобнее, чем ковыряться в DOM’е в поисках мета-тегов (тем более, что его может и не быть). Кстати, пользователи пару раз просили зделаь дополнительно пинг сразу нескольких страниц — не проходит такая фишка. Не могу сказать за все сервисы, но большинство не принимают подряд 2 пинга от одного и того же сайта/блог — задерживают подачу нового запроса на несколько минут. А у вас сколько сервисов сейчас в листе? У меня после последнего пинга… Подробнее »
В списке сервисов у меня около 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){} }… Подробнее »
У меня почему-то не добавляются адресса для пинга. С чем это может быть связано???
А не могли бы вы переделать её, что бы можно было просто список ссылок туда вставить и он отправлял каждую ссылку в пинг сервисы ?
Мог бы, если бы не одно «нехорошее» дело. Большинство пинг-сервисов запрещают отправку пинга чаще 1 раза в течении 5 минут и, если вы шлете 2 пинга подряд, то первый проходит, а второй уже нет и возвращается 4хх ошибка. Поэтому смысл делать программу на пинг нескольких страниц одновременно отпадает. Есть идея прикрутить к программе дополнительно список проксей и вот с ними возможно ваша просьба будет выполнена
Видимо автор коммента имел ввиду список не на один сайт, а на несколько разных сайтов. Я тестировал на своей программе — вроде проходит, но за все сервисы не уверен. А 4XX ошибка может и не из-за этого быть, я наступал на эти грабли по дурости — забывал очищать список параметров заголовка перед повторным запросом и у меня там мусор уходил. Но прокси — тоже хорошее решение.
Ярослав, спасибо за разъяснение. Попробую выкроить немного времени и дописать пинговалку. Ошибка 4хх, кстати, приходит вместе с XML-документом в котором содержится строка, типа «Slowly, cowboy…», т.е. сервис ка бы намекает на то, что надо бы по-медленнее пинговать :)
Да я имелл ввиду, что бы отправлять много страниц не одного сайта а разных, предположим для чего нам это нужно, мы купили базу трастовых сайтов, прорегали, и когда там они проиндексируются не известно, а при помощи пингов процесс очень ускорился, если что пусть будет даже через пинги, хотя мне кажется пинги принимают постоянно
KiloCY, Ок, понятно. Как сказал комментом ранее — попробую реализовать эту фишку, тем более, что особых сложностей в этом не вижу. Главное найти на это время под конец года :)
2 KiloCY — пока Влад дописывает, можете попробовать http://pingxpert.com — там нет много того что есть в программе у Влада, но по списку она пингует.
Спасибо, в принципе должна подойти, щас попробую пару тысяч отпинговать
Ну вот, отпинговал 100к за время от последнего комента, теперь ждём еффекта
Ой, боюсь пару тыщь не отпингует, разбейте хотя б на пары десятков. А то вдруг подвиснет и придется с самого начала пинговать. А вообще для такого софта нужен специальный режим который бы отслеживал, что он пинганул, а что нет и если бы подвис, то начал бы с последней успешной попытки, а не с самого начала.
С помощью этой программы происходит автоматическое пингование при добавлении нового материла? Или нет?
Киса, нет
[…] Пинговалка […]
[…] Простым примером такого приложения может быть программа для работы с пинг-сервисами. В ней модуль используется как раз для того, чтобы […]