質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

Java_ニコニコ動画へのログイン

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,801

Logg

score 11

前提・実現したいこと

Java Apache4.5.2を使用して
ニコニコ動画にログインを試みているのですが、うまく行きません

また、警告: Invalid cookie headerの意味も掴みかねています

Apacheもバージョンごとに方式が変わっており、参考資料も少なく、
ご教示いただけないでしょうか。

発生している問題・エラーメッセージ

警告: Invalid cookie header: "Set-Cookie: nicosid=1460272387.1433545994; Max-Age=315360000; Expires=Wed, 08 Apr 2026 07:13:07 GMT; Path=/; Domain=.nicovideo.jp". Invalid 'expires' attribute: Wed, 08 Apr 2026 07:13:07 GMT
4 10, 2016 4:13:36 午後 org.apache.http.client.protocol.ResponseProcessCookies processCookies
警告: Invalid cookie header: "Set-Cookie: user_session_secure=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Max-Age=2591999; Expires=Tue, 10 May 2016 07:13:06 GMT; Path=/; Domain=.nicovideo.jp; Secure; HTTPOnly". Invalid 'expires' attribute: Tue, 10 May 2016 07:13:06 GMT
4 10, 2016 4:13:36 午後 org.apache.http.client.protocol.ResponseProcessCookies processCookies
警告: Invalid cookie header: "Set-Cookie: user_session=xxxxxxxxxxxxxxxxxxxxxxxxxxxx; Max-Age=2591999; Expires=Tue, 10 May 2016 07:13:06 GMT; Path=/; Domain=.nicovideo.jp". Invalid 'expires' attribute: Tue, 10 May 2016 07:13:06 GMT
4 10, 2016 4:13:36 午後 org.apache.http.client.protocol.ResponseProcessCookies processCookies
警告: Invalid cookie header: "Set-Cookie: user_session=deleted; Max-Age=-1073741821; Expires=Thu, 01 Apr 1982 17:36:06 GMT; Path=/". Invalid 'expires' attribute: Thu, 01 Apr 1982 17:36:06 GMT
HttpResponseProxy{HTTP/1.1 302 Found [Server: nginx
 Date: Sun
 10 Apr 2016 07:13:07 GMT
 Content-Length: 0
 Connection: close
 Cache-Control: no-cache
 Content-Language: ja
 Expires: -1
 Location: http://www.nicovideo.jp/
 Pragma: no-cache
 Set-Cookie: nicosid=1460272387.1433545994; Max-Age=315360000; Expires=Wed
 08 Apr 2026 07:13:07 GMT; Path=/; Domain=.nicovideo.jp
 Set-Cookie: user_session_secure=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Max-Age=2591999; Expires=Tue
 10 May 2016 07:13:06 GMT; Path=/; Domain=.nicovideo.jp; Secure; HTTPOnly
 Set-Cookie: user_session=user_session_xxxxxxxxxxxxxxxxxxxxxxxxxxxx; Max-Age=2591999; Expires=Tue
 10 May 2016 07:13:06 GMT; Path=/; Domain=.nicovideo.jp
 Set-Cookie: user_session=deleted; Max-Age=-1073741821; Expires=Thu
 01 Apr 1982 17:36:06 GMT; Path=/
 X-Content-Type-Options: nosniff
 X-Frame-Options: SAMEORIGIN
 X-Nico-Account-Authentication: 2
 x-niconico-authflag: 0
 X-niconico-sid: 1460272387.1433545994] [Content-Length: 0
Chunked: false]}

該当のソースコード

import java.net.URI;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;

public class Test {
    public static void main(String[] args) {
        try {
            URI loginURI = new URI("https://account.nicovideo.jp/api/v1/login?show_button_twitter=1&site=niconico&show_button_facebook=1&next_url=");
            String mail = "xxxx@xxx.jp";
            String pass = "xxxxxxxx";

            //POST先の設定
            HttpPost httppost = new HttpPost(loginURI);

            //POST用パラメータの設定
            ArrayList<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("mail_tel", mail));
            parameters.add(new BasicNameValuePair("password", pass));
            httppost.setEntity(new UrlEncodedFormEntity(parameters,"UTF-8"));

            //POST実行
            HttpClient httpclient = HttpClientBuilder.create().build();
            HttpResponse httpresponse = httpclient.execute(httppost);

            //POST結果
            String response1 = httpresponse.toString();
            String response2 ="";
            for (String str : response1.split(",",0)){
                response2 += str+"\n";
            }

            System.out.println(response2);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

試したこと

調べたところ、レスポンスヘッダのx-niconico-authflag が 0 以外になれば
ログイン成功の証明らしいのですが、色々試しても変わらず。

SSL通信だからかと思い、
こちらのサイト(http://www.gadgety.net/shin/java/httpclient.html)を参考にして試してみましたが結果は同じでした。

補足情報(言語/FW/ツール等のバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • raccy

    2016/04/10 16:57 編集

    user_session_secureやuser_sessionの部分のセッションを表す英数時の羅列は誰でも見えるところに公開しないようにして下さい。技術がそれなりにある人であれば、アカウントを乗っ取ることができてしまいます。
    今すぐ、ブラウザで「ログアウト」→「ログイン」をし直した後、
    https://account.nicovideo.jp/my/history/login
    にアクセスして、古いセッションを全て削除(アクセスを切る)して下さい。また、ログイン履歴に見覚えなの無いIPアドレスから接続が無いかを確認して下さい。念のため、パスワードも変更しておくことをお勧めします。

    キャンセル

  • Logg

    2016/04/10 18:06

    ご指摘ありがとうございました。気をつけます。

    キャンセル

回答 2

+3

CookieSpecPNamesは非推奨になっていましたので、別の方法にて、
POSTメソッドにCookieSpecs.STANDARDを設定してあげたら警告は消えました。

RequestConfig requestconfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
httppost.setConfig(requestconfig);

また、コメント頂いたニコニコ動画のアクセス履歴ページにて確認すると、
ログインは出来ているようなので、ログイン後の処理方法を模索してみます
(ステータスは302Foundのままですが・・・)

ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

警告を見る限り、Set-CookieでのExpiresに対するファーマットが仕様に添っていないと判断されて、クッキーが正しく設定されないため、ログインした後の処理が何もできないのだと思われます。

[HTTPCLIENT-923] NetscapeDraftSpec is too strict about cookie expires date format - ASF JIRAによれば、Apache HttpComponents HttpClient はクッキーの仕様に従うかをかなり厳密にチェックするようです。少しでも仕様と異なると正しくSet-Cookieを認識してくれないようです。

解決策として、CookieSpecPNames.DATE_PATTERNSで任意の日付フォーマットを指定するとできる場合があるようです。以下を参考にしてみて下さい。

http://www.programcreek.com/java-api-examples/index.php?api=org.apache.http.cookie.params.CookieSpecPNames
http://stackoverflow.com/questions/6688071/invalid-cookie-header-and-then-it-asks-for-authorization
http://stackoverflow.com/questions/15143524/basichttpparams-adding-a-date-formatclasscastexception

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る