この例では、標準のJava「HttpsURLConnection」を使用してWebサイトにログインする方法を示します。この手法は、ほとんどのログインフォームで機能するはずです。
ツール
-
Google Chromeブラウザ – HTTPリクエストを分析するための[ネットワーク]タブ
レスポンスヘッダフィールド。
-
jsoup
library – HTMLフォームの値を抽出します. -
JDK 6.
1. HTTPヘッダ、フォームデータを分析します.
ウェブサイトにログインするには、以下の値を知っている必要があります:
-
ログインフォームのURL.
-
ログインフォームデータ.
-
認証のためのURL.
-
HTTP要求/応答ヘッダー.
Google Chromeを使用してデータを上書きします。 Chromeでは、どこでも右クリックし、「要素の検査」 – >「ネットワーク」タブを選択します。
コードを作成する前に、Chrome経由でログインし、HTTPリクエスト、応答、フォームデータの仕組みを観察し、後でJavaで同じ手順をシミュレートする必要があります。
2. HttpsURLConnectionの例
この例では、Gmailにログインする方法を示します。
要約:
-
GoogleのログインフォームにHTTP「GET」リクエストを送信する –
https://accounts.google.com/ServiceLoginAuth
。 Google Chromeの「ネットワーク」機能を使用してフォームデータを分析します。
また、HTMLソースコードを表示することもできます。
-
可視および非表示のフォームのデータをすべて抽出するには、jSoupライブラリを使用します.
あなたのユーザー名とパスワードで置き換えてください。
-
ログインフォームにHTTP “POST”リクエストを送信します.
構築されたパラメータ
。ユーザーの認証後、別のHTTP「GET」リクエストをGmailに送信します
HttpUrlConnectionExample.java
package com.mkyong; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.CookieHandler; import java.net.CookieManager; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import javax.net.ssl.HttpsURLConnection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class HttpUrlConnectionExample { private List<String> cookies; private HttpsURLConnection conn; private final String USER__AGENT = "Mozilla/5.0"; public static void main(String[]args) throws Exception { String url = "https://accounts.google.com/ServiceLoginAuth"; String gmail = "https://mail.google.com/mail/"; HttpUrlConnectionExample http = new HttpUrlConnectionExample(); //make sure cookies is turn on CookieHandler.setDefault(new CookieManager()); //1. Send a "GET" request, so that you can extract the form's data. String page = http.GetPageContent(url); String postParams = http.getFormParams(page, "username@gmail.com", "password"); //2. Construct above post's content and then send a POST request for //authentication http.sendPost(url, postParams); //3. success then go to gmail. String result = http.GetPageContent(gmail); System.out.println(result); } private void sendPost(String url, String postParams) throws Exception { URL obj = new URL(url); conn = (HttpsURLConnection) obj.openConnection(); //Acts like a browser conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Host", "accounts.google.com"); conn.setRequestProperty("User-Agent", USER__AGENT); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,** /** ;q=0.8"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); for (String cookie : this.cookies) { conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]); } conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestProperty("Referer", "https://accounts.google.com/ServiceLoginAuth"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", Integer.toString(postParams.length())); conn.setDoOutput(true); conn.setDoInput(true); //Send post request DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes(postParams); wr.flush(); wr.close(); int responseCode = conn.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + postParams); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //System.out.println(response.toString()); } private String GetPageContent(String url) throws Exception { URL obj = new URL(url); conn = (HttpsURLConnection) obj.openConnection(); //default is GET conn.setRequestMethod("GET"); conn.setUseCaches(false); //act like a browser conn.setRequestProperty("User-Agent", USER__AGENT); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,** /** ;q=0.8"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); if (cookies != null) { for (String cookie : this.cookies) { conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]); } } int responseCode = conn.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //Get the response cookies setCookies(conn.getHeaderFields().get("Set-Cookie")); return response.toString(); } public String getFormParams(String html, String username, String password) throws UnsupportedEncodingException { System.out.println("Extracting form's data..."); Document doc = Jsoup.parse(html); //Google form id Element loginform = doc.getElementById("gaia__loginform"); Elements inputElements = loginform.getElementsByTag("input"); List<String> paramList = new ArrayList<String>(); for (Element inputElement : inputElements) { String key = inputElement.attr("name"); String value = inputElement.attr("value"); if (key.equals("Email")) value = username; else if (key.equals("Passwd")) value = password; paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8")); } //build parameters list StringBuilder result = new StringBuilder(); for (String param : paramList) { if (result.length() == 0) { result.append(param); } else { result.append("&" + param); } } return result.toString(); } public List<String> getCookies() { return cookies; } public void setCookies(List<String> cookies) { this.cookies = cookies; } }
出力
Sending 'GET' request to URL : https://accounts.google.com/ServiceLoginAuth Response Code : 200 Extracting form data... Sending 'POST' request to URL : https://accounts.google.com/ServiceLoginAuth Post parameters : dsh=-293322094146108856&GALX=CExqdUbvEr4&timeStmp=&secTok=&__utf8=%E2%98%83 &bgresponse=js__disabled&Email=username&Passwd=password&signIn=Sign+in&PersistentCookie=yes&rmShown=1 Response Code : 200 Sending 'GET' request to URL : https://mail.google.com/mail/Response Code : 200 <!-- gmail page content.....-->
-
注** この同等の例を参照してください。ただし、
HTTPリクエストを送信するためのApache HttpClient
を使用してください。
参考文献
ドキュメント – HttpURLConnection]。
http://stackoverflow.com/questions/9954731/sending-http-request-get-post-to-form-with-java
[Sending
Javaで生成するHTTP要求GET/POST?]。
jSoup library
-
リンク://java/apache-httpclient-examples/[Apache HttpClientの例]