AS3.0でニコニコ動画を検索する
ActionScript3.0でニコニコ動画の動画を検索する。
NNDDの次期バージョン(v1.1(仮))で実装しようと思っているニコニコ動画の検索。
さすがにランキングに乗ってないやつはニコニコ動画行って検索して調べて・・・ってのはめんどいなと思ったので。
やり方は簡単。
- ニコニコ動画にログイン
- http://www.nicovideo.jp/search/にURLエンコードした検索語を結合してGETリクエスト
- 戻って来たHTMLを解析
HTMLを解析してるあたりが、「ニコニコ動画がUI変えました!」でだめになってしまいそうで怖いんですが・・・検索する為のAPIはさっと調べた感じ無かったのでこれでいこうと思ってます。
以下ソースコードです。NNDDのコード(Access2Nicoクラス)から抜粋。(このソースだけじゃ動きませんよ。)
//URLLoaderとかimportする。 public class Access2Nico{ private var isSearch:Boolean = false; //等々... private var searchLoader:URLLoader; //等々... /** * ニコニコ動画で指定された単語について検索を行います。<br> * 外部向けAPIです。<br> * * @param topPageUrl ニコニコ動画のトップページのURLです。 * @param loginUrl ログイン先のURLです。 * @param mailAddress ログインに必要なメールアドレスです。 * @param password ログインに必要なパスワードです。 * @param searchURL 検索先のURLです。このURLとsearchWordを結合してリクエストとして送信します。 * @param searchWord 検索語です。 * @param rankingListProvider ランキングリストを管理するArrayCollectionです。 * */ public function search(topPageUrl:String, loginUrl:String, mailAddress:String, password:String, searchURL:String, searchWord:String, rankingListProvider:ArrayCollection):void { this.rankingListProvider = rankingListProvider; //検索語をURIエンコード。 searchWord = encodeURI(searchWord); this.isSearch = true; //URIエンコードした検索語と検索用URLを結合 this.nicoSearchURL = searchURL + searchWord trace(nicoSearchURL); this.login(topPageUrl, loginUrl, mailAddress, password); } /** * ログイン処理を行います。<br> * 指定したトップページ下のURLには引数で指定した承認情報付きでリクエストが行われます。 * @param topPageUrl トップページのURL。 * @param loginUrl ログインページのURL。 * @param mailAddress メールアドレス。ログイン名です。 * @param password ログインパスワードです。 * */ private function login(topPageUrl:String, loginUrl:String, mailAddress:String, password:String):void { trace("function:login"); //以降のURLRequestが全て認証情報付きで行われるように、デフォルト値としてセット URLRequestDefaults.setLoginCredentialsForHost(topPageUrl, mailAddress, password); //ログインURLにアクセス var req:URLRequest = new URLRequest(loginUrl); //POSTメソッドです req.method = "POST"; //メールアドレスとパスワードをURLエンコードしてリクエストに付加 var variables : URLVariables = new URLVariables (); variables.mail = mailAddress; variables.password = password; req.data = variables; //ログイン成功時のリスナーを追加してリクエストを実行 var loader:URLLoader = new URLLoader(); loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onLoginSuccess); loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.load(req); } /** * ログイン作業が成功した場合に呼ばれるリスナー * @param event * */ private function onLoginSuccess(event:HTTPStatusEvent):void { // trace("function:onLoginSuccess"); statusLabel.text = "ログインに成功(" + event.status + ")"; if(isVideoGetting){ /* 先にコメントを取りにいく。コメントを取り終わったら2週目でビデオを取得しにいく。 */ watchLoader = this.watchVideo(this.videoURL, COMMENT_DOWNLOAD); }else if(isRankingListGetting){ /* ランキングを取りにいく。 */ listLoader = this.watchRanking(this.nicoRankingURL); }else if(isSearch){ /* 検索リストを取りにいく */ searchLoader = this.watchSearch(this.nicoSearchURL); } } /** * * @param url * @return * */ private function watchSearch(url:String):URLLoader { var request:URLRequest = new URLRequest(url); var loader:URLLoader = new URLLoader(); //GETメソッドです。 request.method="GET"; //リクエストにリターンが有ったらonSearchSuccessを呼ぶ loader.addEventListener(Event.COMPLETE, onSearchSuccess); loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); //アクセスを実行 loader.load(request); return loader; } /** * * @param event * */ private function onSearchSuccess(event:Event):void { //ここでsearchLoader.dataに入ってるHTMLを解析する } }
久々にソースコードをはてダに貼った!プログラマっぽくていいなぁ!
この方法だと、「動画投稿が新しい順」の上位30項目の動画のアドレスが得られます。
さらに、
http://www.nicovideo.jp/search/"検索単語"?sort=v
のようにする事で、それ以外の(この場合だと「再生が多い順」)検索結果を得る事ができますよ。
まあAPIみたいに見えにくいものじゃないから、少し調べれば分かる事なんですけどねー。AS3.0でウェブアクセスするときの勉強の足しにしていただければ幸いです。