java - 以编程方式登录网站

标签 java android web

我已经使用本教程尝试登录我正在实习的公司的网站:http://www.mkyong.com/java/how-to-automate-login-a-website-java-example/

但是,它没有登录,因为登录站点时的 URL 与未登录时的 URL 相同。所以所有发生的事情就是我将数据添加到字段中,然后页面刷新,没有任何反应。谁能告诉我应该如何继续?

谢谢

(编辑):我只有一个重定向链接

public class ProfileLogin extends AsyncTask<Void, Void, Void>{

    private List<String> cookies;
    private HttpsURLConnection conn;

    private final String USER_AGENT = "Mozilla/5.0";
    private String page;
    private String userName;
    private String passWord;
    private String postParams;
    URL obj;

    //Setting up  out connection
    public ProfileLogin(String user, String pass){
        CookieManager cManager = new CookieManager();
        CookieHandler.setDefault(cManager);
        page = null;
        try {
            obj = new URL(LOGIN_URL);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //Setting the username and password
        userName = user;
        passWord = pass;

        try {
            conn = (HttpsURLConnection) obj.openConnection();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //Starting our Asynctask to do all of the networking
        execute();
    }

    public VpnProfile getProfiles(){
        VpnProfile profile = new VpnProfile(null);
        return profile;
    }

    public String getPageContent() throws Exception{
        //Set Get method
        conn.setRequestMethod("GET");

        conn.setUseCaches(false);

        //The properties of our site, we need to act like a browser
        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language", "nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4");

        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 : " + LOGIN_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();
        setCookies(conn.getHeaderFields().get("Set-Cookie"));
        return response.toString();
    }   

    private String getFormParams(String userName2, String passWord2) throws Exception{
        System.out.println("Extract form's data...");

        Document doc = Jsoup.parse(page);

        //Elements of the login page
        Element userNameElement = doc.getElementById("username");
        Element passWElement = doc.getElementById("password");

        List<String> paramList = new ArrayList<String>();
        paramList.add(userNameElement.attr("name") + "=" + URLEncoder.encode(userName2, "UTF-8"));
        paramList.add(passWElement.attr("name") + "=" + URLEncoder.encode(passWord2, "UTF-8"));

        StringBuilder result = new StringBuilder();
        for(String param : paramList){
            if(result.length() == 0){
                result.append(param);
            } else {
                result.append("&" + param);
            }
        }
        return result.toString();
    }   

    private void sendPost(String postParams) throws Exception {
        conn = (HttpsURLConnection) obj.openConnection();

        //Act like a browser
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        //This line is deleted, I can't show the url, I set the host here
        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language", "nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4");
        if(cookies != null){
            for(String cookie : this.cookies){
                System.out.println("This is cookies: " + cookie);
                conn.addRequestProperty("cookie", cookie.split(";", 1)[0]);
            }
        }
        conn.setRequestProperty("Connection", "keep-alive");
        //Deleted line setting referer URL
        conn.setRequestProperty("Content-Type", "text/html; charset=UTF-8");
        conn.setRequestProperty("Content-Length", Integer.toString(postParams.length()));

        conn.setDoOutput(true);
        conn.setDoInput(true);

        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 : " + LOGIN_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();

    } 

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            page = getPageContent();
            postParams = getFormParams(userName, passWord);
            sendPost(postParams);
            page = getPageContent();
            Document doc = Jsoup.parse(page);
            Element userNameElement = doc.getElementById("username");
            if(userNameElement.toString() != null){
                System.out.println("Not logged in");
            }else{
                System.out.println("Logged in!");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }


    private void setCookies(List<String> cookies) {
        this.cookies = cookies;
    }

}

最佳答案

我找到了解决方法:How to log into Facebook programmatically using Java?

这对我来说非常有效,并且给我非常干净和简短的代码:)

关于java - 以编程方式登录网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050371/

相关文章:

android - Android 音乐流媒体应用程序上的致命信号 11

java - 无法通过android模拟器发送电子邮件

C# Web 服务客户端转换错误

java - 斐波那契算法的时间复杂度

java - 滚动多行 EditText 时移除焦点

java - 使用 -Xmx 标志时,如果给定的参数超出物理内存,会发生什么情况?

java - 在 JSP/Servlet 中安全地传递参数(无框架)

html - 仅使用 css 和 html 显示菜单

java - 一旦源文件更新,Eclipse PMD会自动重新解析吗?

java - Selenium WebDriver java.lang.UnsupportedClassVersionError : org/openqa/selenium/WebDriver : Unsupported major. 次要版本 52.0