使用JSoup登录网站,有可能吗?

问题描述:

是否有可能使用JSOUP登录到使用csrf标记等的网站?我正在尝试登录的网站是aliexpress.com。这似乎有很多输入值,我注意到csrf标记在每次尝试时都会改变。我猜测这些是阻止垃圾邮件的保护措施。我对html很陌生,想知道,是否可以登录这类网站?由于使用JSoup登录网站,有可能吗?

这里是我的代码的情况下,我做错了什么:

public static void main(String[] args) throws IOException { 

    Connection.Response loginForm = Jsoup.connect("http://login.aliexpress.com") 
     .method(Method.POST) 
      .data("cookieexists", "false") 
      .data("loginId", "[email protected]") 
      .data("password", "xxxxxx") 
      .data("event_submit_do_login", "submit") 
      .data("submit-btn", "Sign In") 
      .data("appName", "aebuyer") 
      .data("appEntrance", "default") 
      .data("_csrf_token", "vdspQZH4cMoQT6GxLyU0a7") 
      .data("rdsToken", "") 
      .data("cid", "a832dd6d-990f-44eb-8bdb-9ec49d1c0a99") 
      .data("umidToken", "4e6219e38c34346dc2bb7914a54794aac7645e7b") 
      .data("lang", "en_us") 
      .data("hsid", "VP4zHOZfVs1Ec4qqEsI1mA") 
      .data("isRDSReady", "false") 
      .data("isUMIDReady", "false") 
      .data("umidGetStatusVal", "") 
      .data("bizParams", "") 
      .data("isRequiresHasTimeout", "false") 
      .data("loginHost", "https://passport.aliexpress.com/") 
      .data("scene", "") 
      .data("isMobile", "false") 
      .data("modulus", "d3bcef1f00424f3261c89323fa8cdfa12bbac400d9fe8bb627e8d27a44bd5d59dce559135d678a8143beb5b8d7056c4e1f89c4e1f152470625b7b41944a97f02da6f605a49a93ec6eb9cbaf2e7ac2b26a354ce69eb265953d2c29e395d6d8c1cdb688978551aa0f7521f290035fad381178da0bea8f9e6adce39020f513133fb") 
      .data("exponent", "10001") 
      .data("ua","099#KAFEx7E+TEGE6YTLEEEEE6twSXLoZ6NHDu3YS6tqDywMC6t3gR9YLfD1SryM4MDFYuJoV6t1YRB7n6f1Ych6n6g1DRJo+xqTETFUEcZt288mby1PYPrfds1gLjdTEEi5DEEErGFEHCLlhRaTG9llEJIm/KRlbpZV8MixZy164GFEJFwlsyaDMOcmby1TSV3WPy1tY0s3YuaHLyZTvbd9E7EFD67EEKqTETAEluZdtkH7NyhGYfciuOkG/MhXaQ3bAMZtY0s3JGFET6i5EE1iE7Eo73lP/3m4NVkAbIJi4leDbRZTvbuwsqk6/MhXaCqTETfEEcZt9CXmby1PYPrfds1tYo8XCV/zLybTETDElapdLIallGEeOOCxls1Pr08FSP8zYovKZMRc41qTETFUEcZt9Scmby1PYPrfds1gLioTETzElsXdLUQEWECmYKhMtV8gPy1fnM9SZyvHLioTETYQldXd7FEEVcCmYKhMtV8gPy1XC0ysUoSnE7EiK3l6/wqaEcExOMRyv9cGNyvHYp5TEEi5D7EE/GFETJDovl8JE7hMDwGEmba3U61vv0XBaYevDpiRciUt1OLjbo4Qc7rczQ8nZR2Bw7CWSQ/vPsqqi9exUqZ96Yz6bQWAnWuWLLrDA2iebRMREyB7Pbcdb4QsPok4QioWiYeWZyhqqOKR1eJ6UI2Vcgw6bXkPnypX1YuYalp7Pwnh1eyJroeXFSZ6UcCsZLpzLUZ1WsJhvLqpa291dzCncU7RbohMtscSi7hYSeJFFsxcTy/0/fhCv4bprqrANa2n+GCWds166OIp+WJFrtSSPFnRrVs8SAUM+GZDnR+kbyo6cWyIbISMHG1uVPybZz4M/vl4DXym8jvqaWw7zVZBNdZ6bteWNREZwErbnpywry4t+O/kuV8W/EPcuzpYa0uVaYnzZuB5hg9ulrimV65MJwnuV6i4DTY03BlWaccJ8ypu9u2A8WWzPMIszbcYDi4nEoCYDpiB4gvl9zkGVPq0IlbuQfcxVyrs37eQSyJKcw4RLeXKPt+Z4LslVewCYREnCQZVgcx+hz+l/ri5Vfx+8IRuNP94S0Yo3/sLDVwjvK4l7uyxOGFETYilssn1dASTEELlluaLom7wxeSTE1LlluZdt3illllls3aSt3t3llle33iSw6alluUdt37q33llWLaStEGde7FE5YHKJ7ThVa6o3kskwmyV0HUC6Df39yzU0xEG1DN7Vafo3kikLw+IRhj2qbAB6OT2qago1DN7VaTo3kikawWIRhj2qoAB6OT2qafo1DN7VmGtI8EJE7EhlAaP/3iSJGFET6i5EE1mE7EFlllbrxqTETFUluZdDWkmby1PYPrfds1gLioTETYQltCdBHGEV38mYKhMtV8gPy1XC0ysUoSnE7EB63l7/h6LEc7JNM1j83X0UykG+qxEdUF9E7EFD67EE1qTETFUluZt9CZmby1PYPrfds1gLjdTEEi5DEEE4GFEJFwlsyaD0Lxmby1TSV3WPy1tY0s3YuaHLyZTvbuiE7Eo73lP/3m+q0kAbIJi4leDbRZTvbuwsqk6/MhXaVqTETAEluZdtkpCNyhGYfciuOkG/MhXaQ3bAMZtY0s3IGFEHSwlsyDe2VkAbpZ1ZVnabRZTC0sR8u86") 
      .followRedirects(true) 
     .execute(); 

    // TODO code application logic here 
    Document doc = loginForm.parse(); 



    System.out.print("website title:" + doc); 
} 

}

+0

是的,这是可能的。看看这里的例子 - https://*.com/questions/31871801/problems-submitting-a-login-form-with-jsoup/31877829#31877829 – TDG

+0

@TDG嗨,抱歉误会。它似乎仍然不适合我,并一直把我放在登录屏幕上。我已经包含了所有的输入值,但我认为它不起作用的原因是因为某些输入值(如csrf标记)在每个新实例上都会发生变化。这是原因吗? –

既然你知道哪些parametrers送,我假设你知道如何使用浏览器的开发者工具,因此它会很容易为你:
为了登录到网站,你必须采取两个步骤。第一步是发送一个GET请求并解析结果。第二步是发送POST请求,并附带所需的参数,包括您从步骤1获得的参数。
我已经看到,当发送第一个get请求到https://login.aliexpress.com/时,结果不包含_csrf_token等浏览器发送另一个请求到https://passport.aliexpress.com/mini_login.htm?lang=en_us&appName=aebuyer&appEntrance=default&styleType=auto&bizParams=&notLoadSsoView=false&notKeepLogin=true&isMobile=false&rnd=0.9476178801629621,所以你必须这样做,并解析结果(请注意,获取请求的最后一个参数是一些随机数。我认为你也应该随机化字符串,而不是使用相同的数字一遍又一遍,这可能是一些保护措施):

String firstURL = "https://passport.aliexpress.com/mini_login.htm?lang=en_us&appName=aebuyer&appEntrance=default&styleType=auto&bizParams=&notLoadSsoView=false&notKeepLogin=true&isMobile=false&rnd=0.9476178801629621"; 
Connection.Response loginForm = Jsoup.connect(firstURL) 
    .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0")  
    .method(Method.GET); 

之后,你将不得不解析响应,并提取参数,像这样 -

Element e = doc.select("input[id=fm-cid]").first(); 
String cid = e.attr("value"); 

解析所有需要的值后,可以发送POST请求。