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する度に自動でやってくれるはず。

Octopress