OctopressにPubSubHubbubを適用してみた。

リアルタイム RSS 配信を可能にする PubSubHubbub を Octopress に適用してみました。

現状のほとんどの場合、更新情報を Pull で取得していますが、この PubSubHubbub を使うと Pub/Sub の仕組みによって配信情報がすぐ更新されるようになるらしいです。

参考:Pubsubhubbub with Octopress - ~/git/blog

  1. Publisher 登録
  2. _config.ymlの編集
  3. source/atom.xmlの編集
  4. Rakefileの編集

Publisher 登録

まずsuperfeedrに Publisher として登録します。

その後、RSS の URL を登録して、https://yug1224.superfeedr.comのような Hub になる URL を設定します。

_config.yml の編集

superfeedr で作った URL は_config.ymlに登録しておきます。

hub_url: https://yug1224.superfeedr.com

source/atom.xml の編集

Hub になる URL が atom.xml に追加されるように 7 行目を追加します。

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  {% raw %}<title><![CDATA[{{ site.title }}]]></title>
  <link href="{{ site.url }}/atom.xml" rel="self"/>
  <link href="{{ site.url }}/"/>
  {% if site.hub_url %}<link href="{{ site.hub_url }}" rel="hub"/>{% endif %}
  <updated>{{ site.time | date_to_xmlschema }}</updated>
  <id>{{ site.url }}/</id>
  <author>
    <name><![CDATA[{{ site.author | strip_html }}]]></name>
    {% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  {% for post in site.posts limit: 20 %}
  <entry>
    <title type="html"><![CDATA[{{ post.title | cdata_escape }}]]></title>
    <link href="{{ site.url }}{{ post.url }}"/>
    <updated>{{ post.date | date_to_xmlschema }}</updated>
    <id>{{ site.url }}{{ post.id }}</id>
    <content type="html"><![CDATA[{{ post.content | expand_urls: site.url | cdata_escape }}]]></content>
  </entry>
  {% endfor %}{% endraw %}
</feed>

Rakefile の編集

最後に deploy 時に superfeedr に通知する処理を Rakefile に追加します。13 行目からがそれ。

desc "Default deploy task"
task :deploy do
  # Check if preview posts exist, which should not be published
  if File.exists?(".preview-mode")
    puts "## Found posts in preview mode, regenerating files ..."
    File.delete(".preview-mode")
    Rake::Task[:generate].execute
  end

  Rake::Task[:copydot].invoke(source_dir, public_dir)
  Rake::Task["#{deploy_default}"].execute

  require 'net/http'
  require 'uri'
  hub_url = "https://yug1224.superfeedr.com" # <--- replace this with your hub
  atom_url = "http://blog.yug1224.com/atom.xml" # <--- replace this with your full feed url
  resp, data = Net::HTTP.post_form(URI.parse(hub_url),
                                   {'hub.mode' => 'publish',
                                     'hub.url' => atom_url})
  raise "!! Hub notification error: #{resp.code} #{resp.msg}, #{data}" unless resp.code == "204"
  puts "## Notified hub (" + hub_url + ") that feed #{atom_url} has been updated"
end

これでいつも通りに deploy する度に自動でやってくれるはず。