HttpClient4.3模拟登录ITEYE

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class HttpClient4ITEYELogin {
    private CloseableHttpClient httpClient = HttpClients.createDefault();

    private String getAuthenticity_token(String html) {
        Document doc = Jsoup.parse(html);
        return doc.select("form#login_form input[name=authenticity_token]")
                .attr("value");
    }

    /**
     * 获取iTeye登录页面
     * 
     * @param url
     * @return
     * @throws IOException
     * @throws ClientProtocolException
     */
    private String getITEyePageContent(String url) throws Exception {
        StringBuffer result = new StringBuffer();

        // 设置请求信息
        HttpGet request = new HttpGet(url);
        request.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
        request.setHeader("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        request.setHeader("Accept-Language",
                "zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4,zh-TW;q=0.2");

        // 发送请求
        HttpResponse response = httpClient.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();

        // statusCode==200表示请求成功.
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + statusCode);

        // 读取返回内容解析成字符串
        BufferedReader br = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent(), "utf-8"));

        String line = "";
        while ((line = br.readLine()) != null) {
            result.append(line);
        }
        //关闭资源
        br.close();
        return result.toString();
    }

    /**
     * 设置请求头
     * 
     */
    public void setRequestHeader(HttpUriRequest request) {
        request.setHeader("Host", "www.iteye.com");
        request.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
        request.setHeader("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        request.setHeader("Accept-Language",
                "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
        request.setHeader("Accept-Encoding", "gzip, deflate");
        request.setHeader("Referer", "http://www.iteye.com/login");
        request.setHeader("Connection", "keep-alive");
    }

    private List<NameValuePair> getParameters(String username, String password)
            throws Exception {
        List<NameValuePair> parameters = new ArrayList<NameValuePair>();
        parameters.add(new BasicNameValuePair("name", username));
        parameters.add(new BasicNameValuePair("password", password));
        parameters
                .add(new BasicNameValuePair(
                        "authenticity_token",
                        getAuthenticity_token(getITEyePageContent("http://www.iteye.com/login"))));
        parameters.add(new BasicNameValuePair("remember_me", "1"));
        return parameters;
    }

    public void login(String url, String username, String password)
            throws Exception {
        HttpPost httpPost = new HttpPost(url);
        setRequestHeader(httpPost);
        // 设置请求参数
        List<NameValuePair> parameters = getParameters(username, password);
        HttpEntity httpEntity = new UrlEncodedFormEntity(parameters);

        System.out.println("send parameters: " + parameters);

        httpPost.setEntity(httpEntity);
        HttpResponse response = httpClient.execute(httpPost);
        // 状态码
        System.out.println("StatesCode:"
                + response.getStatusLine().getStatusCode());
        BufferedReader br = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent(), "utf-8"));
        StringBuffer sb = new StringBuffer();
        while (br.ready()) {
            sb.append(br.readLine());
        }
        // 打印HTML
        System.out.println(sb.toString());
        // 关闭资源
        br.close();
    }

    public static void main(String[] args) throws Exception {
        // 打开cookie
        HttpClient4ITEYELogin httpClient4ITEYELogin = new HttpClient4ITEYELogin();
        httpClient4ITEYELogin.getITEyePageContent("http://www.iteye.com/login");
        httpClient4ITEYELogin.login("http://www.iteye.com/login", "your name",
                "your password");
        //关闭httpClient
        String indexHtml = httpClient4ITEYELogin.getITEyePageContent("http://www.iteye.com/");
        //看看有没有欢迎xxx登录
        System.out.println(indexHtml);
        httpClient4ITEYELogin.httpClient.close();
    }
}

关键点:首次访问先把authenticity_token取到,这个为input type="hiden"可以通过jsoup取到这个值,这个值会变化,每次关闭浏览器,再重新访问,这个值就会变,没运行一次HttpClient4ITEYELogin这个值也会变

 

猜你喜欢

转载自jaychang.iteye.com/blog/2035817