Octopress - PubSubHubbub でリアルタイムフィード配信
Updated:
PubSubHubbub というフィードをリアルタイムで配信する Google 提唱のプロトコルを利用し、 Ruby 製ブログシステム Octopress の更新情報配信時に、 Google 等にほぼリアルタイムにインデックスしてもらう方法についての記録です。
1. 設定ファイルの編集
設定ファイル “_config.yml” に、以下のような記述を追加する。
File: _config.yml
1
2
3
4
5
# PubSubHubbub
atom_url: http://www.mk-mode.com/octopress/atom.xml
hub_urls:
- https://pubsubhubbub.appspot.com
- https://push.superfeedr.com
- フィードの URL を “_config.yml” 内の
site
やsubscribe_rss
を組み合わせて生成するなら、敢えてatom_url
を設定しなくてもよいだろう。 hub_urls
は、複数の URL に対応できるよう配列化している。
(Web 上には1つの URL しか指定できない例がよく紹介されているが)- Superfeedr について
- 以前は
https://superfeedr.com/hubbub
だった? - ユーザ登録していれば、
https://username.superfeedr.com
?(未確認)
- 以前は
2. フィード用テンプレートの編集
フィード用テンプレート “source/atom.xml” を以下のように編集する。
- 8行目
link
タグにtype
属性を追加。 - 10行目(
link
タグとupdated
タグの間)を追加。 - 以下の全角の
{
や}
は、実際は半角。
File: source/atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
---
layout: null
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[{{ site.title | cdata_escape }}]]></title>
<link href="{{ site.url }}/atom.xml" rel="self" type="application/atom+xml" />
<link href="{{ site.url }}/" />
{% for hub_url in site.hub_urls %}<link href="{{ hub_url }}" rel="hub" />{% endfor %}
<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[{% if site.titlecase %}{{ post.title | titlecase | cdata_escape }}{% else %}{{ post.title | cdata_escape }}{% endif %}]]></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 %}
</feed>
3. ビルド定義ファイルの編集
ビルド定義ファイル “Rakefile” を編集する。
(require
記述部に以下の3行、 :deploy
タスク内に PubSubHubbub に関する行を追加)
File: Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
require 'yaml'
require 'net/http'
require 'uri'
#
# ===< 中略 >===
#
##############
# Deploying #
##############
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
# PubSubHubbub
cfg = YAML.load_file('_config.yml')
cfg["hub_urls"].each do |hub_url|
resp, data = Net::HTTP.post_form(
URI.parse(hub_url),
{'hub.mode' => 'publish','hub.url' => cfg["atom_url"]}
)
raise "!! Hub notification error: #{resp.code} #{resp.msg}, #{data}" unless resp.code == "204"
puts "## Notified hub (#{hub_url}) that feed #{cfg["atom_url"]} has been updated"
end
end
4. ジェネレート&デプロイ
あとは、いつものようにジェネレート&デプロイすればよい。
$ bin/rake generate
$ bin/rake deploy
もしくは、
$ bin/rake gen_deploy
5. 確認
生成されたフィードを確認してみる。(7行目(hub
に関する記述)が追加されているのを確認する)
File: atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[mk-mode BLOG]]></title>
<link href="https://www.mk-mode.com/octopress/atom.xml" rel="self" />
<link href="https://www.mk-mode.com/octopress/" />
<link href="https://pubsubhubbub.appspot.com" rel="hub" /><link href="https://push.superfeedr.com" rel="hub" />
<updated>2017-07-21T23:07:52+09:00</updated>
<id>https://www.mk-mode.com/octopress/</id>
:
===< 後略 >===
:
作成したばかりのブログ記事が Google 検索でヒットすることも確認する。
しかし、現時点ではなぜかうまく機能しない。
デプロイ直後に Google からクロールされているのは確認できるが、なかなかインデックスされない。
原因調査中!
以上。
Comments