登录网站?(Jsoup) [英] Logging into a website?( Jsoup)
问题描述
使用Jsoup登录网站需要什么?我相信我的代码是正确的,但是我从未使用Jsoup成功登录到网站,因此我可能会丢失一些东西.这是我的代码:
What is required to log into a website using Jsoup? I believe my code is correct, but I have never successfully logged into a website using Jsoup so I might be missing something. Here is my code:
try {
String url = ("http://quadrigacx.com/login");
Connection.Response loginForm = (Connection.Response)Jsoup.connect(url)
.method(Connection.Method.GET)
.execute();
Document loginDoc = loginForm.parse();
Elements loginElements = loginDoc.select("input:not([name=client_id]):not([name=password])");
int i = 0;
String v[] = new String[loginElements.size()];
for (Element element: loginElements){
v[i++] = element.attr("value");
}
int ii = 0;
String n[] = new String[loginElements.size()];
for (Element element: loginElements){
n[ii++] = element.attr("name");
}
Connection.Response loginFormLogin = (Connection.Response)Jsoup.connect(url)
.cookies(loginForm.cookies())
.data(n[0],v[0])
.data("client_id", "xxxxxxx")
.data("password", "xxxxxx")
.data(n[1],v[1])
.data(n[2],v[2])
.method(Connection.Method.POST)
.execute();
Document document2 = Jsoup.connect("http://quadrigacx.com/settings")
.cookies(loginFormLogin.cookies())
.get();
System.out.print(document2.toString());
} catch (IOException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
document2
返回一个登录页面,显示该页面未成功登录.有一个名为time
的输入值,我认为这可能是为什么它不起作用的原因.它是随着时间的推移而上升的值.我运行了两次代码,时间变量返回了1511226860
和1511226876
.我的代码需要大约10秒钟来打印文档,因此time
变量在发送过帐请求时可能已经更改了吗?我不确定这是否是问题.也许还有其他我没看到的东西?谢谢.
document2
returns a login page which shows it didn't successfully log in. There is a input value named time
, and I think that it might be why it doesn't work. It is a value that goes up over time; I ran the code twice and the time variables returned 1511226860
and 1511226876
. My code takes about 10 seconds to print the doc, so maybe the time
variable has already changed by the time it sends the post request? I am not sure whether this is the problem. Maybe there is something else I'm not seeing? Thanks.
这是代码,我已经使用用户ID和密码登录后发布了身份验证. loginCookies
是首次登录的cookie. Connection.Response auth = Jsoup.connect("https://quadrigacx.com/authenticate")
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(loginCookies)
.data("google_code", googleCode.getText())
.data("email_code", emailCode.getText())
.data("authenticate", "Authenticate")
.followRedirects(true)
.execute();
我也尝试过:
byte[] gcText = googleCode.getText().getBytes(ISO_8859_1);
String gcValue = new String(gcText, UTF_8);
byte[] ecText = emailCode.getText().getBytes(ISO_8859_1);
String ecValue = new String(ecText, UTF_8);
Connection.Response auth = Jsoup.connect("https://quadrigacx.com/authenticate")
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(loginCookies)
.data("google_code", gcValue)
.data("email_code", ecValue)
.data("authenticate", "Authenticate")
.followRedirects(true)
.execute();
Here is the code, I post the authenticate after I have already logged in with the user Id and password. loginCookies
are the cookies from the first login. Connection.Response auth = Jsoup.connect("https://quadrigacx.com/authenticate")
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(loginCookies)
.data("google_code", googleCode.getText())
.data("email_code", emailCode.getText())
.data("authenticate", "Authenticate")
.followRedirects(true)
.execute();
I have also tried:
byte[] gcText = googleCode.getText().getBytes(ISO_8859_1);
String gcValue = new String(gcText, UTF_8);
byte[] ecText = emailCode.getText().getBytes(ISO_8859_1);
String ecValue = new String(ecText, UTF_8);
Connection.Response auth = Jsoup.connect("https://quadrigacx.com/authenticate")
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(loginCookies)
.data("google_code", gcValue)
.data("email_code", ecValue)
.data("authenticate", "Authenticate")
.followRedirects(true)
.execute();
推荐答案
您需要在请求中添加更多参数: csrf,时间,哈希
You need to add more parameters to your request: csrf, time, hash
带有空表的代码:
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
public class Quadrigacx {
public static String[] TABLE = new String[]{}; // Add data here
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
final String URL = "https://www.quadrigacx.com/login/";
String password = "password";
String clientId = "id";
String hashPassword = getHash(new String[]{clientId, password});
Connection.Response response = Jsoup.connect(URL)
.userAgent("Mozilla")
.method(Connection.Method.GET)
.execute();
Element csrf = response.parse().select("input[name=csrf]").first();
Element time = response.parse().select("input[name=time]").first();
Element hash = response.parse().select("input[name=hash]").first();
Jsoup.connect(URL)
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(response.cookies())
.data("password", hashPassword)
.data("client_id", clientId)
.data("csrf", csrf.attr("value"))
.data("time", time.attr("value"))
.data("hash", hash.attr("value"))
.execute();
String googleCode = "";
while (!googleCode.matches("^(?=[0-9]+)\\d{6}$")) {
System.out.print("Please enter the Two-Factor Authentication to validate your login. (Numbers Only): ");
Scanner in = new Scanner(System.in);
googleCode = in.nextLine();
}
Jsoup.connect("https://www.quadrigacx.com/authenticate")
.userAgent("Mozilla")
.method(Connection.Method.POST)
.cookies(response.cookies())
.data("google_code", googleCode)
.data("redirect", "dash")
.data("authenticate", "Authenticate")
.execute();
response = Jsoup.connect("https://www.quadrigacx.com/dash/")
.userAgent("Mozilla")
.cookies(response.cookies())
.method(Connection.Method.GET)
.execute();
System.out.println(response.body());
}
private static String getHash(String[] loginArray) throws NoSuchAlgorithmException, UnsupportedEncodingException {
StringBuilder h = new StringBuilder();
for (String data : loginArray)
h.append(data).append(getSalt(data));
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] byteHash = digest.digest(h.toString().getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder(byteHash.length * 2);
for (byte b : byteHash)
sb.append(String.format("%02x", b));
return sb.toString();
}
private static String getSalt(String arg) throws UnsupportedEncodingException {
return TABLE[getLastByte(arg)];
}
private static int getLastByte(String login) throws UnsupportedEncodingException {
final byte[] utf8Bytes = login.getBytes("UTF-8");
return utf8Bytes[utf8Bytes.length - 1];
}
}
完整的工作代码,您可以在这里找到(很长):
这篇关于登录网站?(Jsoup)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!