Yahoo! Pipes が出力する(RSS)フィードの時間がズレる問題を解決

シェアする

Yahoo! Pipes

Pipe dream (by Brapke (traveling))
(この手のパイプも、できればズレないで欲しいものだ──)

Yahoo! Pipes は、(RSS)フィードを加工して出力するための、便利なウェブサービスです(この時点で「──呪文?」という人は、ちょっと予習が必要ですね……)。

自分も便利に Pipes を使っていますが、

「Pipes の出力するフィードの時間が、実際の投稿日時とは異なっている

という問題があり、困っていました。たとえば、日本のブログが生成するフィードを Pipes に食わせると、「9 時間だけ進んだ時間」になるのです。──もう、ピンと来ましたよね?

今回は、これをスマートに解決します。手っ取り早く「答え」が知りたい人は、下記の URL から Pipes をご覧ください。

Pipes: Date Formatter sample

時間がズレて困る状況

たとえば、mixi の日記に「その他」(外部のブログ)を設定したい、という要望は多いでしょう。しかし、登録できるフィードの URL は、mixi の場合だと 1 つ だけです。

そこで、Pipes を使えば、複数のフィードを 1 つにまとめて配信できる! やった、これで「はてなダイアリー」も「Twitter」も、アレもコレもぶち込めるぜェ!(この人だけで「最新日記」が埋まりそう……)

──ところが、Pipes から出力されたフィードは、特定の条件がそろわなければ、確実に投稿日時が変わる。

なぜ時間がズレるのか

Pipes が最終的に出力するフィードの「pubDate」(投稿日時)は、「y:published.utime」を元にして決定します。「y:published.utime」は、元のフィードにある「item.pubDate」から Pipes が独自に算出される。しかし──、

「item.pubDate」が特定のテンプレートに沿っていない場合は、「+09:00」などのタイムゾーンをゴッソリと無視するのです!

具体的に Pipes の画面から例を紹介しますね。このブログで書いた記事の情報を見てみると──、

pipes-utime01 (by asiamoth)

unix time: 1272671942
= GMT: 2010/04/30 23:59:02 +00:00
= Japan time: 2010/05/01 08:59:02 +09:00

元々の投稿日時である「2010/04/30 23:59:02 +09:00」と、「y:published.utime」の時間とが異なっているのです。

参考: 時間の変換(Kodama's tips page)

解決策の例

この問題を解決するために、単純に「y:published.utime」から 9 時間(32400 秒)分を引く、という方法があります。

Yahoo! Pipesで解決! – ブッダの教えとネットと瞑想 ‐ 富永道也のブログ

──しかし、この時間がズレる問題は、どう考えても Pipes 側のバグであるため、いつかは修正される可能性があります(というか、修正されるべき)。そうなった場合には、また 9 時間ズレるのです……。

よりスマートに解決!

さて、ここでようやくワタクシこと asiamoth が、この問題をサックリと鮮やかに(8 時間くらいかけて)解決した方法を紹介します。上で示した「答え」のアドレスを、もう一度ご覧ください。

Pipes: Date Formatter sample

この Pipes は、試験的作りました。ここのブログのフィードと、自分の Twitter のフィードとを合成して出力しています。

左下にある「Pipe Output」をクリックしましょう。同じようなタイトルが 2 つ並んで出力されるはずです。このブログに記事を投稿すると、自動的に(1 分くらいの時差で)Twitter に投稿されるからですね。

pipes-result01 (by asiamoth)

──ところが、Twitter へ何度もフィードのリクエストを送ると、「400 bad request」というエラーが出ます。エラーになったら、しばらく時間を空けてから「Refresh」してください。

次に、右のほうにある「Sort」をクリックした結果を見ると、ブログと Twitter との情報がバラバラになって出てきます(本当はもっとバラけて欲しかったけど、気にしないこと!)。

こちらのように、単純にフィードを混ぜて時間で並べ替えただけでは、ウマくいかないのですね。

pipes-result02 (by asiamoth)

どうやって解決したのか

ようするに、元々のフィードにある「item.pubDate」を Pipes が理解できるように加工して、「y:published.utime」を算出させました。

まずは、「Date Formatter」を利用して、「%a, %d %b %Y %H:%M:%S %z」という形式に「item.pubDate」を変更する。それを「y:published」にコピーすると、ようやく正確な「y:published.utime」が得られるのです。

参考 – 時間のフォーマットについて: PHP: strftime – Manual

pipes-utime02 (by asiamoth)

unix time: 1272639542
= GMT: 2010/04/30 14:59:02
= Japan time: 2010/04/30 23:59:02

「y:published.utime」の時間と、記事の投稿日とが一致しました。──この画像の例だと少し分かりにくいですが、元々は「item.dc:date」と「item.pubDate」が同じなんですね。

「loop」モジュールについて

知らないと絶対にハマる(?)、「loop」モジュールへほかのモジュールを追加する方法は、下の画像をご参照ください。

pipes-loop01 (by asiamoth)

このように、左にあるモジュールをそのままドラッグしてくるのです。一度ドロップしたモジュールを持ってきてもダメなんですね。──これだけで 30 分間が……。

最後に

繰り返し書きますが、「item.pubDate」から正確な「y:published.utime」が算出できない問題は、バグでしょう。バグが直った時には、今回の解決策は不要になります。でも、残しても問題は起こらない──と思う。すくなくとも、「y:published.utime」を加工するよりは安全なはず。

──まぁ、自己責任でお使いください、ということで……。とにかく、疲れた!

参考: Yahoo!Pipesの使い方(全モジュール解説)