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
Android实战——jsoup实现网络爬虫,糗事百科项目的起步