あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

Fastladderと東急電鉄のRSS

FastladderRSS購読するようになって唯一読めていなかったRSS東急電鉄のやつだけで、忙しくてずっと放置していたのですが、重い腰を上げて調べてみることにしました。

まとめ

  • Fastladderの実装は現在の規格にそっている
  • 東急のRSS提供方法が古い
    • 東急に問い合わせる?すげえ期待出来なさそう(田園都市線沿線民並感)
  • ユーザー的にはそうは言っても読めて欲しい
  • スクリプトでごまかすのが一番穏便っぽい気がしている

やったこと

curlでヘッダーをとるとContent-Type: application/xmlになっていました。

$ curl -I http://www.tokyu.co.jp/rss_news.xml
HTTP/1.1 200 OK
Server: Apache
Last-Modified: Fri, 12 Jan 2018 01:17:00 GMT
ETag: "1118-5628a05733b00"
Accept-Ranges: bytes
Content-Length: 4376
Content-Type: application/xml
Date: Sat, 13 Jan 2018 03:40:14 GMT
Connection: keep-alive

XMLの中を見ると「application/rss+xml」とあります。

<atom:link href="http://www.tokyu.co.jp/rss_news.xml" rel="self" type="application/rss+xml"/>

ホーン!合ってないからか!と思い、雑なスクリプトを書いてみました。

<?php
header('Content-Type: application/rss+xml');
$xml = "http://www.tokyu.co.jp/rss_news.xml";
print file_get_contents($xml);

これをFastladderに食わせたら、読んでくれるようになりました。でもFastladderで読めるべきでは??と思って調べると、Feedの取得はfeed_searcher gemに切り出されていて、lib/feed_searcher/page.rbで許容するMIME typeのリストがありました。

    MIME_TYPES = %w[
      application/atom+xml
      application/rdf+xml
      application/rss+xml
    ]

あーじゃあここにapplication/xmlを足せば動くのね!と、追加してやると、東急のRSSがそのまま読めるようになりました。なぜapplication/xmlが含まれていないのか疑問に思いつついくつかページを探して回ってもわからんので、Reject覚悟でとりあえずプルリクを出してみました。

add application/xml into MIME_TYPES by Akkiesoft · Pull Request #10 · fastladder/feed_searcher · GitHub

1分でTravis CIが失敗しました。specファイルという存在に気づいてませんでした……。spec/feed_searcher_spec.rbにはRSS読み込みのテストが記述されていて、application/xmlは読み込まないようになっていました。

 # This example makes sure the following specifications.
(略)
 #   * it does not recognize application/xml

ォォン……。その理由はfeed_searcherのプルリク#1のコメントにあった記事で解説されていました。見ていたけれど、斜め読みになってて理解できていなかった。わたしアホ。

r7kamura.hatenablog.com

  • XMLRDF(で書かれたRSS)はapplication/rdf+xmlを使えばよかったけど、昔はいろいろあって、リクエストではapplication/xmlと答えつつXMLにはapplication/rss+xmlなどと書くことが多かった
  • 今はいろいろ解決したので、application/rdf+xmlと書いて問題なくなった

たぶん上記の理由から、Fastladderでは昔からの「リクエストではapplication/xmlと答えつつXMLにはapplication/rss+xmlなどと書く」やつは弾いているのだろうと理解しました。application/xmlだとRDF以外のよくわからん文書食わされるかもわからんわけですし。プルリクする前に理解しないとあかんかったやつだ。

腑に落ちていない感じがあるのは、MIME_TYPESにapplication/rss+xmlはあるのにapplication/xmlがないところかもしれません。application/rss+xmlはIANAに入らなかったのでは?みたいな。ただ、RSS Autodiscoveryという機能的にはapplication/rss+xmlを書くようにとあるので、このあたりなのか。

さておき、東急のお問い合わせページを開いて↑を説明しながらContent-TypeをApplication/rdf+xmlにしてもらうのが正攻法と言うことになりそうですが、なんかそれはしんどそうだな……というのが今の心境です。サイト担当者の人見てたら直して頼む〜。

一方でこのままでは古いやり方のRSSFastladderで読めないので、なんか妥協しながらでも読んでほしいなあと思ったりもします。ので、出してしまったプルリクを下げるのも躊躇している状態です。コメントにどう書くか迷ってここにだらだらっと書いててしまった。。

どこにも変更を加えず、問い合わせもしないでやるなら、雑スクリプトを以下のとおりにしてやればそれでOKかな……と言う妥協を書く替え始めているところ。

<?php
header('Content-Type: application/rdf+xml');
$xml = "http://www.tokyu.co.jp/rss_news.xml";
$data = file_get_contents($xml);
print str_replace("application/rss+xml", "application/rdf+xml", $data);

WikipediaRSSのページを読んだら闇深そうな歴史とか書いてあるし、RSS自体なんか枯れてしまったままだし、ォォン……。

結局

上のスクリプトでやることにしました。東急のxmlのデータが以下のfeed_searcherの判定に1つも当てはまらないのでだめと言う感じでした。

  • で始まっているか(始まっていない)
  • サーバーの応答Content-typeがapplication/(rdf/rss/atom)+xmlか(application/xmlなので本当にRDF/RSS/Atomかわからない)

あと、rss_infomation.xmlって……。rぬけてる……。