Оповещение веб-сервисов при публикации статей

После публикации статьи мы ожидаем, что она тут же окажется в RSS-лентах пользователей, а поисковые сервера моментально её проиндексируют. Но в жизни все сложнее, и приходиться ждать, когда же поисковые роботы дойдут до сайта и обработают информацию с него.

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

# Ping Pingomatic
desc 'Ping pingomatic'
task :pingomatic do
  begin
    require 'xmlrpc/client'
    puts '* Pinging ping-o-matic'
    XMLRPC::Client.new('rpc.pingomatic.com', '/').call('weblogUpdates.extendedPing', 'www.juev.org' , 'http://www.juev.org', 'http://www.juev.org/atom.xml')
      rescue LoadError
    puts '! Could not ping ping-o-matic, because XMLRPC::Client could not be found.'
  end
end # task :pingomatic

# Ping Yandex
desc 'Ping yandex'
task :yandex do
  begin
    require 'xmlrpc/client'
    puts '* Pinging yandex'
    XMLRPC::Client.new('ping.blogs.yandex.ru', '/RPC2').call('weblogUpdates.extendedPing', 'www.juev.org' , 'http://www.juev.org', 'http://www.juev.org/atom.xml')
  rescue LoadError
    puts '! Could not ping yandex, because XMLRPC::Client could not be found.'
  end
end # task :yandex

# Ping Google
desc 'Notify Google of the new sitemap'
task :sitemapgoogle do
  begin
    require 'net/http'
    require 'uri'
    puts '* Pinging Google about our sitemap'
    Net::HTTP.get('www.google.com', '/webmasters/tools/ping?sitemap=' + URI.escape('http://www.juev.org/sitemap.xml'))
      rescue LoadError
    puts '! Could not ping Google about our sitemap, because Net::HTTP or URI could not be found.'
  end
end # task :sitemapgoogle

# Ping Bing
desc 'Notify Bing of the new sitemap'
task :sitemapbing do
  begin
    require 'net/http'
    require 'uri'
    puts '* Pinging Bing about our sitemap'
    Net::HTTP.get('www.bing.com', '/webmaster/ping.aspx?siteMap=' + URI.escape('http://www.juev.org/sitemap.xml'))
      rescue LoadError
    puts '! Could not ping Bing about our sitemap, because Net::HTTP or URI could not be found.'
  end
end # task :sitemapbing

# Ping pubsubhubbub
desc 'Notify pubsubhubbub server.'
task :ping do
  begin
    require 'cgi'
    require 'net/http'
    puts '* Pinging pubsubhubbub server'
    data = 'hub.mode=publish&hub.url=' + CGI::escape("http://www.juev.org/atom.xml")
    http = Net::HTTP.new('pubsubhubbub.appspot.com', 80)
    resp, data = http.post('http://pubsubhubbub.appspot.com/publish',
            data,
            {'Content-Type' => 'application/x-www-form-urlencoded'})
    puts "Ping error: #{resp}, #{data}" unless resp.code == "204"
  end
end # task: pubsubhubbub

#Usage: rake notify
desc 'Notify various services about new content'
task :notify => [:pingomatic, :sitemapgoogle, :sitemapbing, :ping, :yandex] do
end # task :notify

После добавления данного раздела в Rakefile, для оповещения достаточно использовать команду:

$ rake notify

Два сервиса: pingomatic и pubsubhubbub получая оповещение, обновляют RSS-ленты различных сервисов практически в реальном времени. А оповещение Google и Bing позволяет быстро добавить новую статью в индекс поисковых систем.

Update: Добавил пинг поисковой системы Яндекс