Yahoo! Pipes
Yahoo! Pipes は、(RSS)フィードを加工して出力するための、便利なウェブサービスです(この時点で「──呪文?」という人は、ちょっと予習が必要ですね……)。
自分も便利に Pipes を使っていますが、
「Pipes の出力するフィードの時間が、実際の投稿日時とは異なっている」
という問題があり、困っていました。たとえば、日本のブログが生成するフィードを Pipes に食わせると、「9 時間だけ進んだ時間」になるのです。──もう、ピンと来ましたよね?
今回は、これをスマートに解決します。手っ取り早く「答え」が知りたい人は、下記の URL から Pipes をご覧ください。
時間がズレて困る状況
たとえば、mixi の日記に「その他」(外部のブログ)を設定したい、という要望は多いでしょう。しかし、登録できるフィードの URL は、mixi の場合だと 1 つ だけです。
そこで、Pipes を使えば、複数のフィードを 1 つにまとめて配信できる! やった、これで「はてなダイアリー」も「Twitter」も、アレもコレもぶち込めるぜェ!(この人だけで「最新日記」が埋まりそう……)
──ところが、Pipes から出力されたフィードは、特定の条件がそろわなければ、確実に投稿日時が変わる。
なぜ時間がズレるのか
Pipes が最終的に出力するフィードの「pubDate」(投稿日時)は、「y:published.utime」を元にして決定します。「y:published.utime」は、元のフィードにある「item.pubDate」から Pipes が独自に算出される。しかし──、
「item.pubDate」が特定のテンプレートに沿っていない場合は、「+09:00」などのタイムゾーンをゴッソリと無視するのです!
具体的に Pipes の画面から例を紹介しますね。このブログで書いた記事の情報を見てみると──、
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 は、試験的作りました。ここのブログのフィードと、自分の Twitter のフィードとを合成して出力しています。
左下にある「Pipe Output」をクリックしましょう。同じようなタイトルが 2 つ並んで出力されるはずです。このブログに記事を投稿すると、自動的に(1 分くらいの時差で)Twitter に投稿されるからですね。
──ところが、Twitter へ何度もフィードのリクエストを送ると、「400 bad request」というエラーが出ます。エラーになったら、しばらく時間を空けてから「Refresh」してください。
次に、右のほうにある「Sort」をクリックした結果を見ると、ブログと Twitter との情報がバラバラになって出てきます(本当はもっとバラけて欲しかったけど、気にしないこと!)。
こちらのように、単純にフィードを混ぜて時間で並べ替えただけでは、ウマくいかないのですね。
どうやって解決したのか
ようするに、元々のフィードにある「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
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」モジュールへほかのモジュールを追加する方法は、下の画像をご参照ください。
このように、左にあるモジュールをそのままドラッグしてくるのです。一度ドロップしたモジュールを持ってきてもダメなんですね。──これだけで 30 分間が……。
最後に
繰り返し書きますが、「item.pubDate」から正確な「y:published.utime」が算出できない問題は、バグでしょう。バグが直った時には、今回の解決策は不要になります。でも、残しても問題は起こらない──と思う。すくなくとも、「y:published.utime」を加工するよりは安全なはず。
──まぁ、自己責任でお使いください、ということで……。とにかく、疲れた!