Webページをダウンロードして解析するために、Cookieを使用して手動でGETを実行したいと考えています。フォーラムに投稿するには、セキュリティトークンを抽出する必要があります。ログインを完了し、応答を読み、Cookieを抽出しました((name、value)の3ペア)。次に、次のようなCookieを含む文字列を作成しました。
CookieString="name1=value1; name2=value2; name3=value3"
次に、次のことを行います
HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();
次にページを読みましたが、フォーラムにログインしていないようです。何が悪いのですか?
編集:投稿するには、セキュリティトークンを抽出する必要があることを知っています。私の考えは、それを抽出するために、この特定のページを取得する必要があるというものでした。しかし、セキュリティトークンを非表示フィールドとして使用するには、オンラインである必要があるため、Cookieが必要でした。しかし、ページを取得し、上記のようにCookieを設定すると、ページがゲストとして取得されます。これは、オンラインではなく、セキュリティトークンの値がゲストであることを示しています。私はあなたが私に与えたリンクをチェックし、うまくいけば解決策を見つけるでしょう。
確かに、応答の_Set-Cookie
_ヘッダーからCookieを収集する必要があります。後続のリクエストでそれらを送り返すには、 URLConnection#addRequestProperty()
を使用して1つずつ設定する必要があります。
基本的に:
_// ...
// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
// ...
// Send them back in subsequent requests:
for (String cookie : cookies) {
connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}
// ...
_
split(";", 2)
は、expires
、path
などのサーバー側に関係のないcookie属性を取り除くためにあります。
より便利なHTTPクライアントについては、 Apache HttpComponents Client を参照することをお勧めします。すべてのCookieをより透過的に処理できます。
更新:コメントのとおり、これはCookieの問題ではありません。間違った要求トークンは、サーバーにCSRF /ボット防止機能が組み込まれていることを意味します(あなたのような人を防止するため)。フォームを使用して、リクエストされたページからトークンを非表示の入力フィールドとして抽出し、リクエストパラメータとして再送信する必要があります。 Jsoup は、すべての(非表示の)入力フィールドを抽出するのに役立ちます。プログラムで「押し」たいボタンの名前と値のペアも渡すことを忘れないでください。ヒントについては、上記のリンクも参照してください。
将来的には、取得する正確なエラーをより明確にし、実際に何かを推測しないようにする必要があります。正確なエラーメッセージなどをコピーして貼り付けます。
Cookieの値がハードコードされておらず、前のリクエストから取得されていると想定すると、CookieHandler
クラスを使用するのがおそらく最も簡単です。
CookieHandler.setDefault(new CookieManager());
次に、HttpURLConnection
は受信したCookieを自動的に保存し、同じホストへの次のリクエストでそれらを送り返します。