RSSをパースしてみる

ニコニコ動画Javaでゴニョゴニョする計画 第1弾。
rss4jっていつの間にか公開が停止されていた*1ので、違うライブラリを使って
書いてみた。


使ったライブラリはinforma。
rss4jと同じような機能を持っているので問題ないかな。詳しくしらないけどw
クラスパスは以下の4つのJarに設定。依存関係があるので全て必要。

  • informa.jar
  • commons-logging.jar
  • jdom.jar
  • xercesImpl.jar

早速ソース晒し。

NicoRssAnalyzer.java

package niconico;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;

import de.nava.informa.core.ChannelIF;
import de.nava.informa.core.ItemIF;
import de.nava.informa.core.ParseException;
import de.nava.informa.impl.basic.ChannelBuilder;
import de.nava.informa.parsers.FeedParser;

public class NicoRssAnalyzer {

  public ArrayList<RankingInfoBean> rankingAnalyzer() {

    ArrayList<RankingInfoBean> rankingList = new ArrayList<RankingInfoBean>();

    try {
      URL url = new URL("http://www.nicovideo.jp/ranking/daily/all?rss=2.0");
      ChannelIF channel = FeedParser.parse(new ChannelBuilder(), url);
      System.out.println(channel.getTitle());
      System.out.println(channel.getDescription());
      Collection<ItemIF> list = channel.getItems();

      ItemIF[] items = (ItemIF[]) list.toArray(new ItemIF[0]);
      
      int cnt = 0;
      for(ItemIF element:items){
        RankingInfoBean tmp = new RankingInfoBean();
        tmp.setTitle(element.getTitle());
        tmp.setUrl(element.getLink().toString());
        rankingList.add(tmp);
        if(cnt == 4){
          break;
        }
        cnt++;
      }
    } catch (IOException e) {
      e.printStackTrace();
    } catch (ParseException e) {
      e.printStackTrace();
    }
    
    return rankingList;
  }

}

ちょっと解説
ニコニコ動画の中にある総合ランキングのRSSを取得してくるソース。
http://www.nicovideo.jp/ranking/daily/all?rss=2.0 で取得できるURLオブジェクト
ChannelIFに変換。ChannelIFからはRSSヘッダの部分のデータを取得することができる。
RSSのBody部分はChannelIF.getItem()で取得する。
Collectionを返すのでそれをItemIF[]に変換する。
その中からデータを取得するという仕組み。
ちなみに途中でループ回数制御してるのはとってくるのが1〜100位となってるので
途中で切るため。

ちなみにこのソース自体が他のソースと繋いでた関係でArrayList
返却するようにしている。*2

RankingInfoBean .java

package niconico;

import java.io.Serializable;

public class RankingInfoBean implements Serializable{
  
  private static final long serialVersionUID = 960019628043979551L;
  
  private String title = "";
  private String url = "";
  private String message = "";

  public String getMessage() {
    this.message = "ニコニコ動画DailyRanking "
      +this.title+this.url;
    return message;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getUrl() {
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  

}

このBeanがデータを返却してくれる。

titleのほうが

第X位 : 動画タイトル

urlは動画のURLが返却されます。

第X位ってのはもともとRSSのTitleに含まれてるから特に加工してるわけではないです。

ニコニコ動画のWebAPIが公開されているのでそちらから各動画の詳細が取得できるよう
なんだけど、今日やってみたらレスポンスは200返してるけど内容が取得できてなかったり、
期待値が取れなかったりと試行錯誤中。
それかWebAPIが一部分しか実装されてないのかな?

もうちょっと調べてみる。

そんなかんじでーす

*1:サイトが開かない

*2:やってるのはランキングの内容をTwitterにポストする