トークン方式にログインする方法とは?
個人的な興味で、
トークンを用いているホームページに
ログインしてスクレイピングしてみたいと思って、
書いてみたのですが、そもそもログインからしてうまく行きません。
原因は何なのか出来る限り自分でも調べたのですが、よくわかりません。
以下コードですが、
値として、data[_Token][key]とdata[_Token][fields]はページを手動検索して取得。
ほかは知っているので、4つの値をそれぞれ入力。といった感じです。
値はクロームの機能で調べてみましたが、あってるのかはよくわかりません。
結果は、ログイン失敗ページにリダイレクトされた旨のHTML内容が返ってきます。
まだJAVA歴が数ヶ月しかなく、
WEB関連部分は知識がかなり不足している状態なので、
コードに致命的に間違っている部分があったかもしれません……。
ご教示いただけると助かります。
public static void main(String[] args) throws Exception {
String USER_AGENT = "Mozilla/5.0";
String url = "https://www.lancers.jp/user/login";
String user = "https://www.lancers.jp/mypage";
HttpGet get = new HttpGet(url);
HttpPost post = new HttpPost(url);
RequestConfig reqconf = RequestConfig.custom()
.setCircularRedirectsAllowed(true)
.setRedirectsEnabled(true)
.build();
List<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader("User-Agent", USER_AGENT));
headers.add(new BasicHeader("Accept-Charset","utf-8"));
headers.add(new BasicHeader("Accept-Language","ja, en;q=0.8"));
headers.add(new BasicHeader("Content-Type", "application/x-www-form-urlencoded"));
CloseableHttpClient client = HttpClientBuilder.create()
.setRedirectStrategy(new LaxRedirectStrategy())
.setDefaultRequestConfig(reqconf)
.setDefaultHeaders(headers)
.build();
CloseableHttpResponse loginpage = client.execute(get);
String loginpageHTML = EntityUtils.toString(loginpage.getEntity(),"UTF-8");
//JsoupとかでもTokenのみパースは無理ぽかったので、手動で検索‥
Pattern p = Pattern.compile("(?is)value=\"(.+?)\"");
Matcher m = p.matcher(loginpageHTML);
//トークンを探す。
String[] TokenArray = new String[6];
int i= 0;
while (m.find()) {
TokenArray[i]=m.group((1));
i++;
}
//TokenArray[1] TokenArray[5]
//1はkey,5はfields. これをPOST送信に含めてみることにする。
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("data[_Token][key]",TokenArray[1]));
params.add(new BasicNameValuePair("data[User][email]","自分のID"));
params.add(new BasicNameValuePair("data[User][password]","自分のPASS"));
params.add(new BasicNameValuePair("data[User][auto_login]","0"));
params.add(new BasicNameValuePair("data[User][referer]","http://www.lancers.jp/"));
params.add(new BasicNameValuePair("data[_Token][fields]",TokenArray[5]));
post.setHeader("Connection", "keep-alive");
post.setHeader("Referer", user);
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new UrlEncodedFormEntity(params));
String html="";
CloseableHttpResponse response = client.execute(post);
try{
HttpEntity entity = response.getEntity();
html=EntityUtils.toString(entity,"UTF-8");
EntityUtils.consume(entity);
}finally{
response.close();
}
Document doc = Jsoup.parse(html);
System.out.println(doc);
}
}