Is it possible login into website programmatically with android?

六眼飞鱼酱① 提交于 2020-02-07 08:00:09

问题


I am trying to login into https://thingspeak.com/login website programmatically. I have written blow android program but its not help me to login. pls tell me what am i doing wrong.

//inside thread function

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("User ID", "****"));
nameValuePairs.add(new BasicNameValuePair("Password", "*****"));
nameValuePairs.add(new BasicNameValuePair("Sign In", "Sign In"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);

//after thread function getting called, below line is from oncreate method

WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setAppCacheEnabled(false);
webview.getSettings().setJavaScriptEnabled(true);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webview.loadUrl("https://thingspeak.com/channels/42085");

I am able to load the website but its tells This channel is not public because its not logged in. pls help me out. thanks in advance.

username:niru

password:helloworld@123


回答1:


The method you are searching for is called HTTP basic authentication. In the case that your target server is using SSL it gets really difficult because you need a certificate.

Such a authentication is working as these steps:

  • Login form URL.
  • Login form data.
  • URL for authentication.
  • Http request / response header.

    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;
    }
    }
    

Important resource:
How to automate login a website – Java example



来源:https://stackoverflow.com/questions/30935897/is-it-possible-login-into-website-programmatically-with-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!