0

我正在尝试以编程方式登录https://thingspeak.com/login网站。我已经编写了 Blow android 程序,但它不能帮助我登录。请告诉我我做错了什么。

//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");

我可以加载网站,但它告诉这个频道不公开,因为它没有登录。请帮助我。提前致谢。

用户名:niru

密码:helloworld@123

4

1 回答 1

2

您正在搜索的方法称为 HTTP 基本身份验证。如果您的目标服务器使用 SSL,这会变得非常困难,因为您需要证书。

这种身份验证按以下步骤工作:

  • 登录表单 URL。
  • 登录表单数据。
  • 用于身份验证的 URL。
  • Http 请求/响应标头。

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

重要资源:
如何自动登录网站 – Java 示例

于 2015-06-19T12:53:32.820 回答