【ニコニコ動画】ログイン処理

ニコニコ動画にHTTP通信でログインし、セッションを取得します。

  • HTTP通信開始

    // HTTP通信を開始する。
    URL url = new URL("https://secure.nicovideo.jp/secure/login?site=niconico");
    String params = String.format("mail=%s&password=%s", "niconico@gmail.com", "password");
    HttpsURLConnection https = (HttpsURLConnection)url.openConnection();
    
  • リクエストヘッダ部設定

    // リクエストヘッダ部を設定する。
    https.setRequestMethod("POST");
    https.setDoOutput(true);
    https.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    https.setRequestProperty("Content-Length", Integer.toString(params.length()));
    
  • リクエストボディ部設定

    // リクエストボディ部を設定する。
    PrintStream ps = new PrintStream(https.getOutputStream());
    ps.print(params);
    ps.close();
    
  • レスポンスヘッダ部取得

    // レスポンスヘッダ部を取得する。
    String userSession = null;
    Map<String, List<String>> responseHeaders = https.getHeaderFields();
    Iterator<String> responseIt = responseHeaders.keySet().iterator();
    while (responseIt.hasNext()) {
        String responseKey = responseIt.next();
        List<String> responseList = responseHeaders.get(responseKey);
        for(String reponseValue: responseList) {
            System.out.println(responseKey + ":" + reponseValue);
            if ("Set-Cookie".equals(responseKey)) {
                String[] cookieAry = reponseValue.split(";");
                for (String cookie: cookieAry) {
                    String[] userSessionAry = cookie.split("=");
                    if ("user_session".equals(userSessionAry[0]) 
                            && userSessionAry[1].indexOf("deleted") == -1) {
                        userSession = userSessionAry[1];
                    }
                }
            }
        }
    }
    
  • レスポンスヘッダは以下のように出力されます。
    HTTPステータスコードが302なので、
    Locationに指定されたニコニコ動画のトップ画面にリダイレクトしているのが分かります。

    null:HTTP/1.1 302 Found
    x-niconico-authflag:0
    x-niconico-authflag:0
    Content-Language:ja
    Date:Fri, 28 Apr 2017 13:39:03 GMT
    Content-Length:0
    Location:http://www.nicovideo.jp/
    Set-Cookie:nicosid=1111111111.1111111111; Max-Age=315360000; Expires=Mon, 26 Apr 2027 13:39:03 GMT; Path=/; Domain=.nicovideo.jp
    Set-Cookie:user_session_secure=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Max-Age=2591999; Expires=Sun, 28 May 2017 13:39:02 GMT; Path=/; Domain=.nicovideo.jp; Secure; HTTPOnly
    Set-Cookie:user_session=user_session_22222_zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz; Max-Age=2591999; Expires=Sun, 28 May 2017 13:39:02 GMT; Path=/; Domain=.nicovideo.jp
    Set-Cookie:user_session=deleted; Max-Age=0; Expires=Fri, 28 Apr 2017 13:39:03 GMT; Path=/
    Set-Cookie:nicosid=3333333333.3333333333; expires=Mon, 26-Apr-2027 13:39:03 GMT; Max-Age=315360000; path=/; domain=.nicovideo.jp
    X-niconico-sid:3333333333.3333333333
    X-niconico-sid:4444444444.4444444444
    Connection:close
    Content-Type:text/html; charset=UTF-8
    Server:Apache
    

    取得したいのは5つある「Set-Cookie」のうち、3つ目の「user_session」の値です。
    不要:「nicosid」
    不要:「user_session_secure」
    必要:「user_session」
    不要:「user_session」(deletedのものは不要)
    不要:「nicosid」

    クッキーからセッションを取得できれば良いので
    レスポンスボディ部の取得は行いません。