Webサイトへのログインを自動化する方法-Javaの例
この例では、標準のJavaHttpsURLConnection
を介してWebサイトにログインする方法を示します。 この手法は、ほとんどのログインフォームで機能するはずです。
この例で使用されるツールとJavaライブラリ
-
Google Chromeブラウザー-HTTP要求および応答ヘッダーフィールドを分析するための[ネットワーク]タブ。
-
jsoupライブラリ–HTMLフォーム値を抽出します。
-
JDK 6。
1. Httpヘッダー、フォームデータを分析します。
Webサイトにログインするには、次の値を知っている必要があります。
-
ログインフォームのURL。
-
ログインフォームデータ。
-
認証用のURL。
-
HTTPリクエスト/レスポンスヘッダー。
Google Chromeを使用して上記のデータを取得します。 Chromeでは、どこでも右クリックして、[要素の検査]→[ネットワーク]タブを選択します。
コーディングする前に、Chrome経由でログインして、HTTPリクエスト、レスポンス、フォームデータがどのように機能するかを確認します。後でJavaで同じ手順をシミュレートする必要があります。
2. HttpsURLConnectionの例
この例では、Gmailにログインする方法を示します。
要約:
-
HTTP「GET」リクエストをGoogleログインフォームに送信します–https://accounts.google.com/ServiceLoginAuth
-
Google Chromeの「ネットワーク」機能を使用してフォームデータを分析します。 または、HTMLソースコードを表示できます。
-
jSoupライブラリを使用して、表示および非表示のすべてのフォームのデータを抽出し、ユーザー名とパスワードに置き換えます。
-
HTTP「POST」リクエストを、構築されたパラメータとともにログインフォームに送り返します
-
ユーザーが認証されたら、別のHTTP「GET」リクエストをGmailページに送信します。 https://mail.google.com/mail/
Note
この例は、JavaHttpURLConnectionの機能を示すためのものです。 一般に、Gmailとやり取りするには、Google Gmail APIを使用する必要があります。
HttpUrlConnectionExample.java
package com.example; 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 Listcookies; 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, "[email protected]", "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 paramList = new ArrayList (); 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 getCookies() { return cookies; } public void setCookies(List 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
Note
この同等の例を参照してください。ただし、Apache HttpClient to send HTTP requestを使用します。