« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(2) »

2009/09/06

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での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のストリームからコンテンツを取得できた。

 

参考:

« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(2) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/18902/46138542

この記事へのトラックバック一覧です: Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(1):

« iPhone/iPod touchアプリ “ニコニコ動画” をパケット解析する(2) | トップページ | Android(HT-03A)でiPhone版ニコニコ動画にアクセスする(2) »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ