Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1)
パケット解析結果の妥当性検証のため、Javaで実際にHTTP通信を行ってみた。デスクトップPCからアクセスしても面白味に欠けるため、Android端末であるdocomoのGoogleケータイHT-03Aからアクセスし、実際に画像表示までを行っている。
ただし、Androidプログラミングについては、私自身が学習を始めてから間がなく、説明したとしても誤りを多く含んでしまう懸念があるため、ポイントのみ提示することとした。
前半はJakarta Commons HttpClient4.0を用いたHTTP通信について説明する。この部分についてはAndroid SDKには依存しない(ただし注意点あり。後半に記述)ためデスクトップのJDKで実行可能である。
後半ではAndroid上で実行する際のポイントを説明する。
今回用いたソフト/ハードは以下の通り。
- HttpClient4.0及び依存ライブラリ
- JDKでHttpClient APIを利用するのに必要である。なおAndroid SDKは同等のAPIを含んでいる。
- ダウンロードページでHttpClientのBinary with dependenciesを選べば依存ライブラリを含め一括ダウンロードできる。
- JDK 6 update 16
- Android 1.5 SDK, release 3
- Android端末エミュレータ、もしくは実機で動作させるために必要。
- HT-03A
- iPod touchと同様の、wifi通信でのみ検証した。
HttpClient4.0でのHTTP通信
始めに注意点を述べる。
HttpClient4.0は、3.x以前のバージョンとはインタフェースが大きく異なっている。googleで検索したところ、日本語の解説ページは3.xのものが多いようなので、プログラミング時にはこの点に注意が必要であると思われる。
HttpClientの使用方法は、ダウンロードしたファイルに含まれるtutorialを読むのが良いと考える。web上のtutorialは3.xのままのようだ。1.1.6節”Consuming entity content” が今回使用する手段の大半である。
今回の記述では省略しているが、同tutorial1.1.5節”Ensuring release of low level resources”の処理も必要である。経験上、HttpGet#execute()で例外が発生する場合にはそれ以前のコネクションについて、この処理が漏れていることが多かった。
以降、実際のプログラミングについて述べる。
まず、HttpCientインスタンスを生成し、ヘッダ情報を設定する。ヘッダ情報はiPod touchが設定しているものに合わせた。
HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams().setParameter("http.useragent", "iPod touch"); ArrayList<Header> params = new ArrayList<Header>(); params.add(new BasicHeader("Accept-Encoding", "gzip, deflate")); httpclient.getParams().setParameter("http.default-headers", params);
実際に実行してみるとわかるが、UserAgentをiPhone/iPod touchと合わせておく必要があるようだ。設定が無いとセッションID取得時にエラーとなる。ニコニコ動画サービスでUserAgentを確認している箇所はあまりないようだ[1]が、ここだけ確認が入ってるのは高木さんの指摘[2]が関連しているのだろうか。
次に、ID(メールアドレス)とパスワードを設定してログインを行う。
HttpPost login = new HttpPost("https://secure.nicovideo.jp/secure/login?site=nicoiphone"); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("mail", mail)); nvps.add(new BasicNameValuePair("password", password)); login.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); HttpResponse response = httpclient.execute(login);
4,5行目の変数mail, passwordには実際のID, パスワード文字列を設定する。ログイン時のパラメータsiteは、PCでのログインではniconicoだが、iPohone版ではnicoiphoneとなっている。余談だがニコ生アラートというサービスではnicolive_antennaだそうだ。他にもあるのだろうか。
response.getEntity().getContent(); でXML形式のストリームが得られる。ログイン認証が正常に行われていれば<ticket>タグ値が得られるので、これをチケットIDとして保持しておく。
続いてこのチケットIDをパラメータ値としてセッションIDを取得する。
login2 = new HttpGet(http://i.nicovideo.jp/v2/login?ticket=" + ticket); response = httpclient.execute(login2);
このresponseからsessionIdが取得できる。
ログイン認証が正常に終了しセッションIDが得られた。これでコンテンツストリーム取得ができるようになった。そこで、コンテンツ取得のための情報を集める。
status = new HttpGet("http://fence.i.nicovideo.jp/v2/videostatus?video_id=" + videoId); httpclient.execute(status); gate = new HttpGet("http://fence.i.nicovideo.jp/v2/gate?video_id=" + videoId + "&sid=" + sessionId); response = httpclient.execute(gate);
変数videoIdはsm8080447などの、今回取得するコンテンツのID文字列である。
5行目のresponseはバイナリ形式で、ここからコンテンツストリーム取得時のパラメータを得られる。
最後は、前回記載した通り”http://fence.i.nicovideo.jp/v2/play?transmission_speed=”から始まるURLを適切回数実行する。
結果として、responseのストリームからコンテンツを取得できた。
参考:
- [1]odz, odz buffer, session の invalidate
- [2]高木浩光, 高木浩光@自宅の日記, やはり退化していた日本のWeb開発者「ニコニコ動画×iPhone OS」の場合
« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(2) »
この記事へのコメントは終了しました。
« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(2) »
コメント