ニコニコ動画のお勧め動画を取得する api

via 2008-02-03 さん

(追記)とおもったら,オススメ動画とかflvも既に取得できるのか!?修正しなきゃー http://d.hatena.ne.jp/picas/20080202/1201955339

(さらに追記)しかもさらにちょっと調べてみたら,URLはwww.*だけじゃないっぽげ.こりゃあ定数も作り直さなきゃいけんかー>< http://tetetep.blog112.fc2.com/blog-entry-181.html

http://d.hatena.ne.jp/sotarok/20080203

なんと!色々公開されているのか。
というわけで、調子に乗ってお勧め動画を取得するのを書いてみた。
例によって Zend Framework

ブートストラップ

<?php
$baseDir = dirname(dirname(__FILE__));
$includePath = ini_get('include_path');
$libPath = $baseDir . '/library/';
ini_set('include_path', $includePath . ':' . $libPath);

$nico = new NicoRelation();
$xml  = $nico->setUri('http://www.nicovideo.jp/api')
            ->setPage('1')
            ->setSort('r')
            ->setOrder('d')
            ->get('sm1787699');
$ret = $nico->parse($xml)
            ->getVideo();
var_dump($ret);
var_dump($nico->getTotalCount());
var_dump($nico->getPageCount());
var_dump($nico->getDataCount());

取得用のクラス

<?php
class NicoRelation
{    
    private $_uri = 'http://www.nicovideo.jp/api/';
    private $_relation = 'getrelation/';
    private $_page = '1';
    private $_sort = 'p';
    private $_order = 'd';
    private $_videoId;

    public function __construct()
    {
    }
    public function setUri($value)
    {
        $this->_uri = $value;
        return $this;
    }
    public function setPage($value)
    {
        $this->_page = $value;
        return $this;
    }
    public function setRelation($value)
    {  
       $this->_relation = $value;
       return $this;
    }
    public function setSort($value)
    {
        $this->_sort = $value;
        return $this;
    }
    public function setOrder($value)
    {   
        $this->_order = $value;
        return $this;
    }
    public function get($videoId = '')
    {
        if ($videoId !== '') {
            $this->_videoId = $videoId;
        }
        require_once 'Zend/Http/Client.php';

        $client = new Zend_Http_Client();
        $baseUri  = rtrim($this->_uri, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
        $relation = rtrim($this->_relation, DIRECTORY_SEPARATOR) . '?';
        $page     = 'page=' . $this->_page . '&';
        $sort     = 'sort=' . $this->_sort . '&';
        $order    = 'order=' . $this->_order . '&';
        $video    = 'video=' . $this->_videoId . '&';
        $uri      = rtrim($baseUri . $relation . $page . $sort . $order .$video, '&');
        $response = $client->setUri($uri)
            ->setConfig(array('keepalive' => true, 'strictredirects' => true))
            ->setMethod(Zend_Http_Client::GET)
            ->request('GET');
        if ($response instanceof Zend_Http_Response) {
            return $response->getBody();
        }
        return null;
    }
    public function parse($value)
    {   
        $this->_xml = simplexml_load_string($value);        
        if ($this->_xml->attributes()->status == 'fail') {
            throw new Zend_Http_Client_Exception($xml->error->code . " " . $xml->error->description);
        }
        return $this;
    }
    public function getTotalCount()
    {   
        if ($this->_xml->video instanceof SimpleXMLElement) {
            return array('total_count' => (string)$this->_xml->total_count);
        }
        return null;
    }
    public function getPageCount()
    {   
        if ($this->_xml->video instanceof SimpleXMLElement) {
            return array('page_count' => (string)$this->_xml->page_count);
        }
        return null;
    }
    public function getDataCount()
    {   
        if ($this->_xml->video instanceof SimpleXMLElement) {
            return array('data_count' => (string)$this->_xml->data_count);
        }
        return null;
    }
    public function getVideo()
    {   
        if ($this->_xml->video instanceof SimpleXMLElement) {
            $xml = array();
            foreach ($this->_xml->video as $key => $val) {
                $xml[] = (array)$val;
            }
            return $xml;
        }
        return null;
    }
}

結果

array(7) {
  [0]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1063923"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1063923"
    ["title"]=>
    string(97) "ギターでらき☆すたの「もってけ!セーラーふく 」を涙目で弾いてみた"
    ["view"]=>
    string(6) "214453"
    ["comment"]=>
    string(5) "19772"
    ["mylist"]=>
    string(4) "5237"
    ["length"]=>
    string(3) "266"
    ["time"]=>
    string(10) "1189847671"
  }
  [1]=>
  array(8) {
    ["url"]=>
    string(38) "http://www.nicovideo.jp/watch/sm970753"
    ["thumbnail"]=>
    string(42) "http://tn-skr.smilevideo.jp/smile?i=970753"
    ["title"]=>
    string(93) "黒髪が長くて美しい○○がなんとギターでアクエリオンを弾いてみた"
    ["view"]=>
    string(6) "167525"
    ["comment"]=>
    string(5) "14673"
    ["mylist"]=>
    string(4) "2282"
    ["length"]=>
    string(3) "312"
    ["time"]=>
    string(10) "1188714393"
  }
  [2]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1016059"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1016059"
    ["title"]=>
    string(94) "友人黒うんたらかんたらがギターでハルヒのパラレルDaysを弾いてみた"
    ["view"]=>
    string(5) "93123"
    ["comment"]=>
    string(4) "6468"
    ["mylist"]=>
    string(4) "1712"
    ["length"]=>
    string(3) "278"
    ["time"]=>
    string(10) "1189242861"
  }
  [3]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1834784"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1834784"
    ["title"]=>
    string(96) "ニコチュウの俺の嫁に「めざせポケモンマスター」のベースを弾かせた"
    ["view"]=>
    string(6) "122857"
    ["comment"]=>
    string(4) "6227"
    ["mylist"]=>
    string(4) "2419"
    ["length"]=>
    string(3) "259"
    ["time"]=>
    string(10) "1198270411"
  }
  [4]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1553571"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1553571"
    ["title"]=>
    string(85) "ポケモン&アンインストールを師走の如く「正直スマンカッタ」"
    ["view"]=>
    string(5) "41612"
    ["comment"]=>
    string(4) "3284"
    ["mylist"]=>
    string(3) "566"
    ["length"]=>
    string(3) "197"
    ["time"]=>
    string(10) "1195297421"
  }
  [5]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1133647"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1133647"
    ["title"]=>
    string(78) "コージーパウエルのソロのサンセットを男前に弾いてみた"
    ["view"]=>
    string(5) "50173"
    ["comment"]=>
    string(4) "2722"
    ["mylist"]=>
    string(4) "1058"
    ["length"]=>
    string(3) "231"
    ["time"]=>
    string(10) "1190630414"
  }
  [6]=>
  array(8) {
    ["url"]=>
    string(39) "http://www.nicovideo.jp/watch/sm1955291"
    ["thumbnail"]=>
    string(43) "http://tn-skr.smilevideo.jp/smile?i=1955291"
    ["title"]=>
    string(81) "【スライ君】ラリーグラハム師と弾いてみた【また遅刻か】"
    ["view"]=>
    string(4) "7485"
    ["comment"]=>
    string(3) "277"
    ["mylist"]=>
    string(2) "74"
    ["length"]=>
    string(2) "72"
    ["time"]=>
    string(10) "1199517321"
  }
}
array(1) {
  ["total_count"]=>
  string(1) "7"
}
array(1) {
  ["page_count"]=>
  string(1) "1"
}
array(1) {
  ["data_count"]=>
  string(1) "7"
}

前回よりちょっと長くなった。取得元の動画はティッシュ大統領でw
エラー周りは、id:sotarok さんの書かれたソースをパクっ真似した <(_ _)>
あ〜めっちゃ楽しいw


api 周りが非公式にでも公開されてきたみたい。
以前はログインしないと取れなかったものも取れるようになってきたみたいだし、
ちょっと取得をまとめるクラスを作ってみようかな・・・。
# 負荷が掛からないのかが心配だけど。。。