簡體   English   中英

如何使用jsoup發布表單登錄?

[英]How to post form login using jsoup?

我想在這里登錄 在此輸入圖像描述 源代碼

<HTML><HEAD><TITLE>:: Dhaka Electric Supply Company Limited (DESCO)::</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META http-equiv=Pragma content=no-cache>
<META http-equiv=imagetoolbar content=no>
<META content="Home Page of  Dhaka Electric Supply Company Limited" name=description>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR>
<style type="text/css">
    img{
        border:0px;
    }   
</style>
<script type="text/javascript" src="js/ajax-dynamic-content.js"></script>
<script type="text/javascript" src="js/ajax.js"></script>
<script type="text/javascript" src="js/ajax-tooltip.js"></script>   
<link rel="stylesheet" href="css/ajax-tooltip.css" media="screen" type="text/css">
<link rel="stylesheet" href="css/ajax-tooltip-demo.css" media="screen" type="text/css">
<LINK media=all href="css/global.css" type=text/css rel=stylesheet>


</HEAD> 
<BODY>
<DIV id=over style="DISPLAY: none"></DIV>
<DIV class=baselayout>
<DIV class=pagetopshadow></DIV>
<DIV class=basebg>
<DIV class=pageleft></DIV>
<DIV class=pagecenter>
<DIV id=Header>
</DIV>
<DIV id=Menu>
</DIV>
<DIV id=HomeContent>
<DIV class=right>
<DIV class=homeintro>

<div style="padding-top: 0px;">
<script> 
function checkLogin()
 { if( document.login.username.value == '') 
  { 
  alert( 'Please enter  your account number' );
   return false; 
   }return true;
   }
   alert('Payments through VISA and Master Card are stopped by DBBL. only DBBL Nexus card is allowed.');
    </script>

        <form NAME='login' METHOD='POST' ACTION='authentication.php'>

          <table width="350" height="181"cellpadding='0' cellspacing='0' border='0' style="border:#e5e5e5 0px solid; BACKGROUND: url(css/images/top9.png) no-repeat left top;" align="center">
          <tr> <td rowspan="6" style="padding-left:15px;"><img src="css/images/groupperms.gif" width="50" height="50"><td></tr>
            <tr>
              <td colspan="2" height="50"></td>
            </tr>
           <tr>
              <td nowrap><span class="textcolor1">Account No. </span></td>
              <td><input type='text' name='username' style="border:#cacaca 2px solid; color:#000099;" value=''></td></tr>

            <tr>
            <td> <a class="uiTooltip" href="#" onMouseOver="ajax_showTooltip(window.event,'tooltip/help.html',this);return false" onMouseOut="ajax_hideTooltip()">Help</a></td>
            <td><input name="login" type='submit' value='Login' style="width:80px; font-family:Arial, Helvetica, sans-serif; font-weight:bold; color:#FFFFFF; border:#000000 2px solid; cursor:pointer; background-color: #1b4585;"  border="0" align="right" title="Login"  onClick="return checkLogin();"/></td>
            </tr>

        </table>

        </form>
<table width="630" border="0" cellspacing="2" cellpadding="2" align="center" bgcolor="#FFFFFF" bordercolor="#FFFFFF">
  <tr>
    <td width="80"></td>
    <td><img src="images/right_3.gif"/></td>
    <td><span class="textcolor"><strong><a href='https://www.desco.org.bd/index.php?page=internet-bill-payment' target="_blank" class="uiTooltip">Before, use this facility/services please read instructions...</a></strong></span></td>
  </tr>
  </table>
<p align="center" class="textcolor"><strong><a href='https://www.desco.org.bd' class="uiTooltip">Back Home</a></strong></p>
<table align="center" width="135" border="0" cellpadding="2" cellspacing="0" title="Click to Verify - This site chose VeriSign SSL for secure e-commerce and confidential communications.">
<tr>
<td width="135" align="center" valign="top"><script type="text/javascript" src="https://seal.verisign.com/getseal?host_name=www.desco.org.bd&amp;size=S&amp;use_flash=YES&amp;use_transparent=YES&amp;lang=en"></script><br />
<a href="http://www.verisign.com/ssl-certificate/" target="_blank"  style="color:#000000; text-decoration:none; font:bold 7px verdana,sans-serif; letter-spacing:.5px; text-align:center; margin:0px; padding:0px;">ABOUT SSL CERTIFICATES</a></td>
</tr>
</table>


</div>
<div align="center" style="padding-top:10px;">



<CENTER><B>
    Total Visits:  1</B></CENTER>   
</div>
</DIV>
</DIV>
</DIV>
</DIV>
<DIV class=pageright></DIV></DIV>
<DIV class=pagebotshadow>
<DIV  id=Footer>Copyright © 2010 Dhaka Electric Supply Company Ltd. All rights reserved.</DIV>
</DIV>
</DIV>
</BODY>
</HTML>

基本上下面的代碼就是表格

<form NAME='login' METHOD='POST' ACTION='authentication.php'>

      <table width="350" height="181"cellpadding='0' cellspacing='0' border='0' style="border:#e5e5e5 0px solid; BACKGROUND: url(css/images/top9.png) no-repeat left top;" align="center">
      <tr> <td rowspan="6" style="padding-left:15px;"><img src="css/images/groupperms.gif" width="50" height="50"><td></tr>
        <tr>
          <td colspan="2" height="50"></td>
        </tr>
       <tr>
          <td nowrap><span class="textcolor1">Account No. </span></td>
          <td><input type='text' name='username' style="border:#cacaca 2px solid; color:#000099;" value=''></td></tr>

        <tr>
        <td> <a class="uiTooltip" href="#" onMouseOver="ajax_showTooltip(window.event,'tooltip/help.html',this);return false" onMouseOut="ajax_hideTooltip()">Help</a></td>
        <td><input name="login" type='submit' value='Login' style="width:80px; font-family:Arial, Helvetica, sans-serif; font-weight:bold; color:#FFFFFF; border:#000000 2px solid; cursor:pointer; background-color: #1b4585;"  border="0" align="right" title="Login"  onClick="return checkLogin();"/></td>
        </tr>

    </table>

    </form>

在此輸入圖像描述

我正在嘗試這個

package jsouptest;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsouptTest {
    public static void main(String[] args) throws Exception {

        Connection.Response loginForm = Jsoup.connect("https://www.desco.org.bd/ebill/login.php")
                .method(Connection.Method.GET)
                .execute();

        Document document = Jsoup.connect("https://www.desco.org.bd/ebill/login.php")
                .data("cookieexists", "false")
                .data("username", "32007702")
                .data("login", "Login")
                .cookies(loginForm.cookies())
                .post();
        System.out.println(document);

    }

}

但我得到低於錯誤

Exception in thread "main" java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
    at sun.security.ssl.InputRecord.read(InputRecord.java:480)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:439)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:424)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:178)
    at jsouptest.JsouptTest.main(JsouptTest.java:12)

我缺少什么? 怎么解決?

您為了執行POST請求而使用的URL是錯誤的,因為當您必須對表單執行特定請求時,您應該使用表單標記中存在的網頁,在本例中為“authentication.php” ”。

所以代碼將是:

    package jsouptest;

    import org.jsoup.Connection;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;

    public class JsouptTest {
        public static void main(String[] args) throws Exception {

           Connection.Response loginForm = Jsoup.connect("https://www.desco.org.bd/ebill/login.php")
            .method(Connection.Method.GET)
            .execute();

           Document document = Jsoup.connect("https://www.desco.org.bd/ebill/authentication.php")
            .data("cookieexists", "false")
            .data("username", "32007702")
            .data("login", "Login")
            .cookies(loginForm.cookies())
            .post();
           System.out.println(document);

       }

    }

這個正確地檢索您想要的網頁。

對我來說問題是我沒有發送viewstate,eventvalidation,viewstategenerator值。

要獲得這些值,您必須先向登錄表單頁面發送GET請求。 在我的實例中,這是一個default.aspx頁面。

然后你必須提取這些值並將它們放入變量中。 當然,您還需要表單登錄和密碼字段ID,提交按鈕的ID等。 有關發送的所有變量的列表,請手動登錄並使用chrome dev工具(檢查元素)查看POST請求的網絡選項卡。 在里面它應該顯示您提交的用戶名和密碼。 在那里,您將看到發送的其他變量。

dev工具示例中的網絡選項卡

接下來,發送包含所有這些變量的POST請求,將響應中的cookie保存到變量中,然后您可以使用它來轉到另一個頁面。

碼:

import java.io.IOException;
import java.util.Map;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.FormElement;


public class get_example {

public static void main(String[] args) throws IOException {
    //===================================
    Connection.Response response2 = Jsoup.connect("yourloginpage")
            .method(Connection.Method.GET)
            .execute();

    Document responseDocument = response2.parse();

    Element eventValidation = responseDocument.select("input[name=__EVENTVALIDATION]").first();
    Element viewState = responseDocument.select("input[name=__VIEWSTATE]").first();
    Element viewStateGen = responseDocument.select("input[name=__VIEWSTATEGENERATOR]").first();



    Connection.Response response = Jsoup.connect("yourloginpage")
            .method(Connection.Method.POST)
            .data("ctl00$plnMain$txtLogin", "username")
            .data("ctl00$plnMain$txtPassword", "password")
            .data("ctl00$plnMain$Submit1", "Log In")
            .data("ctl00$ucCopyright$hdnPrivacyStatement", "Privacy Statement")
            .data("ctl00$ucCopyright$hdnTermsOfUse", "Terms of Use")
            .data("__VIEWSTATE", viewState.attr("value"))
            .data("__VIEWSTATEGENERATOR", viewStateGen.attr("value"))
            .data("__EVENTVALIDATION", eventValidation.attr("value"))
            .execute();


    Map<String, String> cookies = response.cookies();


    Document homePage = Jsoup.connect("anotherpage")
            .cookies(cookies)
            .get();


    System.out.println(homePage.body().html());

}
}

就我而言,它包括三個步驟:

  1. 從登錄表單頁面獲取cookie;
  2. 將憑據發布到登錄表單action= URL,更新cookie;
  3. 用戶將被重定向到索引頁面。 不要在這里解析,只需將Response發送到最終目標URL。
  4. 到達最后一頁時解析。

Cookie應該在每個步驟中更新,有時會添加條目,有時您必須清除它並重置。 請務必使用Internet Explorer / Chrome / Firefox Dev工具( F12 )在網絡面板中檢查網絡傳輸, cookies部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM