FastladderでRSS購読するようになって唯一読めていなかった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覚悟でとりあえずプルリクを出してみました。
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のコメントにあった記事で解説されていました。見ていたけれど、斜め読みになってて理解できていなかった。わたしアホ。
- XMLなRDF(で書かれた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にしてもらうのが正攻法と言うことになりそうですが、なんかそれはしんどそうだな……というのが今の心境です。サイト担当者の人見てたら直して頼む〜。
一方でこのままでは古いやり方のRSSがFastladderで読めないので、なんか妥協しながらでも読んでほしいなあと思ったりもします。ので、出してしまったプルリクを下げるのも躊躇している状態です。コメントにどう書くか迷ってここにだらだらっと書いててしまった。。
どこにも変更を加えず、問い合わせもしないでやるなら、雑スクリプトを以下のとおりにしてやればそれで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);
WikipediaのRSSのページを読んだら闇深そうな歴史とか書いてあるし、RSS自体なんか枯れてしまったままだし、ォォン……。