2018-03-23

Python を使って PubSubHubBub で記事を登録する

今まで 検索エンジン への記事登録は WordPress にまかせていたのですが、 自分でやらないといけなくなったので Python で できる方法を調査しました。

そもそも PubSubHubbub って何って方に対して軽く説明。

PubSubHubbub(パブサブハブバブ)とは、インターネット上の分散型出版-購読型モデル(PubSub)のためのオープン標準プロトコルである。パブサブハバブとも呼ばれる。

元々はデータフィード用のAtomやRSSプロトコルを拡張するために設計された。HTTPを介してアクセスできるデータであればどんなデータ形式にも(例えばテキスト、画像、音声、動画ファイルなど)適用できるプロトコルとなっている。

このプロトコルの主な目的はデータが変更されたことをリアルタイムに通知することである。PubSubHubbubはHTTPの通知をPush技術を用いて行う。これはクライアントがポーリングに資源を消費しないで済むため、サーバ上のフィードに一定間隔でアクセスして更新を確かめるポーリングを行うより優れている。

ということですが、多くのブロガーにとっての目的とはスクレイピングによる不正な記事登録を防ぐということでしょうね。

Googleがこの通知をちゃんと扱っているかという話はここでは置いておきます。

ライブラリ

python-publisher を使えば良さそうです。 PyPI には PubSubHubbub_Publisher として登録されているっぽいのです 現状ではこれは Python2 系でしか動かないようです。

動くように修正してプルリクを出しました。 rewrote to be able to run in python2.7 or later by righ · Pull Request #1 · pubsubhubbub/python-publisherI fixed the code failing in Python3, the details are the following: Module path modified in python3. Request parameters encoding. Unit tests. I checked in python2.7 and python3.6 using existing t...https://github.com/pubsubhubbub/python-publisher/pull/1

このプルリクが取り込まれるまでは

$ pip install git+https://github.com/righ/python-publisher.git@righ-patch-1

としてください。

取り込まれて PyPI に反映されたら記事更新します。 (気づいてなかったらコメントください)

なんかリポジトリ見る感じだと放置されてるっぽいので、すぐには取り込まれない気はします。

まぁ現状動くだけで十分ですね、実際に使ってみましょう。

使い方

docstring を読むと 以下のように書かれています。 Feed の URL を送れば良さそうです。

# Example usage: from pubsubhubbub_publish import * try: publish('http://pubsubhubbub.appspot.com', 'http://example.com/feed1/atom.xml', 'http://example.com/feed2/atom.xml', 'http://example.com/feed3/atom.xml') except PublishError, e: # handle exception...

実際 に パブリッシュ するコードは以下のような感じになりました。

import logging from pubsubhubbub_publish import publish, PublishError FEED_URLS = ('http://note.crohaco.net/feed/',) try: # この URL は固定 publish('http://pubsubhubbub.appspot.com', *FEED_URLS) except PublishError: logging.exception('An error occured!')
info
  • 実際に上記のコードを使う方は FEED_URLSを書き換えて使ってください。

これを適当に publish.py とかで保存して 実行するだけです。

$ chmod +x publish.py $ ./publish.py

特にメッセージとかは出ないけど多分大丈夫です。

私は 記事のFTP転送 で作った deploy.py の 最後に挿入して使おうと思います。