2017-11-04 139 views
0

是否有可能使用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://stackoverflow.com/questions/31871801/problems-submitting-a-login-form-with-jsoup/31877829#31877829 – TDG

+0

@TDG嗨,抱歉誤會。它似乎仍然不適合我,並一直把我放在登錄屏幕上。我已經包含了所有的輸入值,但我認爲它不起作用的原因是因爲某些輸入值(如csrf標記)在每個新實例上都會發生變化。這是原因嗎? –

回答

1

既然你知道哪些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請求。