Android:Jsoup 登录 - https

Posted

技术标签:

【中文标题】Android:Jsoup 登录 - https【英文标题】:Android: Jsoup login - https 【发布时间】:2017-02-03 02:02:45 【问题描述】:

如何以编程方式登录网站?

示例:用户在 EditText 中输入他的登录数据,然后单击登录按钮。然后打开一个 WebView,他在其中登录。

我尝试使用这些代码示例,但是:

How to connect via HTTPS using Jsoup? - 我出错了

How to log in to an HTTPS website with Jsoup? - 我没有收到错误但我无法登录

Jsoup HTTPS connecting - 它不工作我得到错误

我用了这个之后,我尝试了这个

class JsoupAsyncIserv extends AsyncTask<Void, Void, Void> 

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
    

    @Override
    protected Void doInBackground(Void... params) 
        //html Parsen
        try 


            Connection.Response login = Jsoup.connect("https://lmg-nhs.de/idesk")
                    .data("login_act", "MyUsername")
                    .data("login_pwd", "MyPW")
                    .method(Connection.Method.POST)
                    .execute();

            Document document = Jsoup.connect("https://lmg-nhs.de/idesk")
                    .cookies(login.cookies())
                    .get();
         catch (IOException e) 
            e.printStackTrace();
        
        return null;
    

    @Override
    protected void onPostExecute(Void result) 


    

可以,但我无法登录。

private class IServAsyncTask extends AsyncTask<Void, Void, Void>

        private String resp;
        protected String doInBackground(String... params) 
            Connection.Response res = null;
            try 
                res = Jsoup.connect("https://lmg-nhs.de")
                        .data("login_act", "myUsername")
                        .data("login_pwd", "myPW")
                        .data("submit", "Anmelden")
                        .method(Connection.Method.POST)
                        .execute();

             catch (IOException e) 
                e.printStackTrace();
            

            try 
                Document doc = res.parse();
             catch (IOException e) 
                e.printStackTrace();
            
            String sessionId = res.cookie("phpSESSID");

            try 
                Document doc2 = Jsoup.connect("https://lmg-nhs.de")
                        .cookie("PHPSESSID", sessionId)
                        .get();
             catch (IOException e) 
                e.printStackTrace();

            

            return resp;
        

        @Override
        protected Void doInBackground(Void... voids) 
            return null;
        
    

如果可以的话,试着用一个或我的例子来解释它,因为初学者(比如我)可以通过这种方式更容易地学习它。

【问题讨论】:

使用 Chrome 打开开发工具并打开网络选项卡,标记为保留日志,清除 cookie/缓存,然后登录页面并检查请求和响应。您应该尝试设置所有需要的标头字段(并且设置用户代理通常是一个好主意)。一般的例子通常过于笼统(但它们存在:***.com/documentation/jsoup/4631/…),没有帐户我们无法提供具体的解决方案。 更好的登录方式可能是:打开一个 webview(不显示它),使用 javascript 填写并提交登录表单,然后显示 webview。 确定String doInBackground(String... params) 被调用而不是Void doInBackground(Void... voids) @F.Klein 我知道帮助非常困难,但感谢您尝试!我尝试使用第一个示例表单 [***.com/documentation/jsoup/4631/…,但我无法登录。我需要登录才能显示登录的 WebView 并下载没有 WebView 的东西。如果您有任何其他想法或帮助,请让它听到我的声音。大家可以帮帮我! @Stephan 我以这种方式仅找到了一个带有 Asynctask 的 Jsoup 示例Void doInBackground(Void... voids) 我尝试使用此示例,但我没有修复它的想法。如果你有更好的方法来做到这一点,让它听我说。 【参考方案1】:

试试这个:

Document doc2 = Jsoup.connect("https://lmg-nhs.de")
                    .cookie(res.cookies())
                    .get();

而不是

Document doc2 = Jsoup.connect("https://lmg-nhs.de")
                    .cookie("PHPSESSID", sessionId)
                    .get();

另见:

在本例中,我们将使用FormElement 类登录GitHub 网站。

// # Constants used in this example
final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 
final String LOGIN_FORM_URL = "https://github.com/login";
final String USERNAME = "yourUsername";  
final String PASSWORD = "yourPassword";  

// # Go to login page
Connection.Response loginFormResponse = Jsoup.connect(LOGIN_FORM_URL)
                                             .method(Connection.Method.GET)
                                             .userAgent(USER_AGENT)
                                             .execute();  

// # Fill the login form
// ## Find the form first...
FormElement loginForm = (FormElement)loginFormResponse.parse()
                                         .select("div#login > form").first();
checkElement("Login Form", loginForm);

// ## ... then "type" the username ...
Element loginField = loginForm.select("#login_field").first();
checkElement("Login Field", loginField);
loginField.val(USERNAME);

// ## ... and "type" the password
Element passwordField = loginForm.select("#password").first();
checkElement("Password Field", passwordField);
passwordField.val(PASSWORD);        


// # Now send the form for login
Connection.Response loginActionResponse = loginForm.submit()
         .cookies(loginFormResponse.cookies())
         .userAgent(USER_AGENT)  
         .execute();

System.out.println(loginActionResponse.parse().html());

public static void checkElement(String name, Element elem) 
    if (elem == null) 
        throw new RuntimeException("Unable to find " + name);
    

所有表单数据都由FormElement类为我们处理(甚至是表单方法检测)。调用FormElement#submit 方法时会构建一个现成的Connection。我们所要做的就是用额外的头文件(cookies、user-agent 等)完成这个连接并执行它。

【讨论】:

感谢您的回答。我试过了,但是来自.cookie(res.cookies())res 没有被定义。我定义了它Connection.Response res = null;android Studio 尝试用res != null 包围它,我得到了一个错误。 @Excel1 重写您的代码以仅使用一个 try 块而不是三个。 我试过但没用。 .cookie(res.cookies()) 无法应用 如果你有代码示例,也许我可以尝试并学习它。感谢您的帮助 @Excel1 请在我的帖子中查看文档链接 (***.com/documentation/jsoup/4631/…)。 我只需要一种方法就可以在此页面上成功登录。 Jsoup 是我发现的“最佳”方法,但我不知道有没有 jsoup。

以上是关于Android:Jsoup 登录 - https的主要内容,如果未能解决你的问题,请参考以下文章

Android - 使用 JSOUP 解析 JS 生成的 url

jsoup 发布和 cookie

Android实战——jsoup实现网络爬虫,糗事百科项目的起步

java爬虫利用Jsoup获取需要登陆的网站中的内容(无验证码的登录)

Android解析HTML网页数据 第一个方法Jsoup

Java 基于jsoup jar包的网络爬虫之登录原理