none
[VB 2008.NET] 載入HTML碼時的問題 (不是分析代碼) RRS feed

  • 問題

  • 我先前問過如果下載網頁的HTML代碼

    所以我用這些code用作下載網頁的html碼

     

    Public Shared Function DownloadString(ByVal address As String)
        Dim client As WebClient = New WebClient()
        client.Encoding = Encoding.UTF8
        Dim reply As String = client.DownloadString(address)
        Return reply
    End Function
    

     

    這個方法比起在webbroser設定url然後等侯document completed快很多, 所以我一直都用這個

     

    但正當我把這個DownloadString在一個需要登入的網頁*使用時, 傳回的並非正常用IE登入後應該見到的畫面的html代碼, 而是要求用戶登入的畫面的代碼 (*需要登入的網頁: http://economy.erepublik.com/en/market/14/1/1/citizen/0/price_asc/1)

    我嘗試過先在IE開啟該網站並登入, 而且使用它提供的「remember me」功能

    同樣傳回需要登入的代碼, 但這時侯, 在IE開那個連結是正常畫面, 並非要求登入畫面

    這個問題我想過應該是cookie之類的東西導致發生這種錯誤, 因為如果網頁端是用session的話, DownloadString應該是會正常下載到的

    於是唯有用webbroswer嘗試, 不出所料, webbroser可以正常開啟該網頁, 並非登入畫面

    但webbroser下載該網頁速度變得非常慢

     

    所以我想問, 有無有防止這種錯誤的DownloadString方法或者是在webbroswer載入完該網頁的html代碼時就呼叫document completed之類的方法

    (總之是可以加快速度下載的方法)

     

    謝謝

    2011年2月11日 下午 12:59

解答

  • WebClient 也可以送 Cookies ,但碰上 Server.Redirect 會在完成前就被導向,所以碰上有登入的網站需要掛網路封包間聽起來比對才能做較佳的開發。

    ex.

    Dim wc As New System.Net.WebClient
    Dim replyString As String
    
    With wc
    	Dim strCookies As String = "xxx=xxx"
    	With .Headers
    		' .Add("User-Agent", "有些網站會檢查")
    		.Add("Content-Type", "application/x-www-form-urlencoded") ' 視需求
    		.Add("Cookie", strCookies)
    	End With
    	.Encoding = System.Text.Encoding.GetEncoding("utf-8") ' 正確來說要看該網頁的編碼
    
    	Dim postCol As New Specialized.NameValueCollection
    	postCol.Add("txtXX", "通常有帳號密碼")
    	Dim replyBytes() As Byte = .UploadValues(TargetUrl, "POST", postCol)
    	replyString = System.Text.Encoding.GetEncoding("utf-8").GetString(replyBytes) ' 正確來說要看該網頁的編碼
    End With
    
    

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月11日 下午 04:51
  • 忘了說,正確流程是

    1. 先做 GET login 網頁。

    2. 將 login 網頁回傳的 cookies 全部拿來用,裡面有 Session 的 ID ,然後把帳密貼出去。

    3. 登入後回傳的 cookies 可能會變,所以仍然要全部拿來用,全部指到後面的使用。

     

    所以你應該先去念 RFC 文件,搞清楚標準的 http protocol ,否則隨便一個阻擋方式,你就會被擋下來。

    我自己的網站就會做一些阻擋方式,防止機器人登入。

     

    討論破解阻擋方式的內容則違反本版置頂公告,所以只能談標準登入流程。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月11日 下午 04:56

所有回覆

  • WebClient 也可以送 Cookies ,但碰上 Server.Redirect 會在完成前就被導向,所以碰上有登入的網站需要掛網路封包間聽起來比對才能做較佳的開發。

    ex.

    Dim wc As New System.Net.WebClient
    Dim replyString As String
    
    With wc
    	Dim strCookies As String = "xxx=xxx"
    	With .Headers
    		' .Add("User-Agent", "有些網站會檢查")
    		.Add("Content-Type", "application/x-www-form-urlencoded") ' 視需求
    		.Add("Cookie", strCookies)
    	End With
    	.Encoding = System.Text.Encoding.GetEncoding("utf-8") ' 正確來說要看該網頁的編碼
    
    	Dim postCol As New Specialized.NameValueCollection
    	postCol.Add("txtXX", "通常有帳號密碼")
    	Dim replyBytes() As Byte = .UploadValues(TargetUrl, "POST", postCol)
    	replyString = System.Text.Encoding.GetEncoding("utf-8").GetString(replyBytes) ' 正確來說要看該網頁的編碼
    End With
    
    

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月11日 下午 04:51
  • 忘了說,正確流程是

    1. 先做 GET login 網頁。

    2. 將 login 網頁回傳的 cookies 全部拿來用,裡面有 Session 的 ID ,然後把帳密貼出去。

    3. 登入後回傳的 cookies 可能會變,所以仍然要全部拿來用,全部指到後面的使用。

     

    所以你應該先去念 RFC 文件,搞清楚標準的 http protocol ,否則隨便一個阻擋方式,你就會被擋下來。

    我自己的網站就會做一些阻擋方式,防止機器人登入。

     

    討論破解阻擋方式的內容則違反本版置頂公告,所以只能談標準登入流程。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月11日 下午 04:56
  • strCookies
    postCol.Add("txtXX", "通常有帳號密碼")

    應該是甚麼....
    那個值可以在cookies 檔案夾內找到的嗎?

    謝謝
    2011年2月12日 上午 03:16
  • strCookies 可在 Cookies 資料夾找到,但你沒辦法解讀他,所以要靠 Get 回來後,讀 wc.Headers ,實際運用時通常用同一個 wc ,這樣就不用重設 Cookies 。

    Post 是指你需要自動登入的值,需要看網頁原始碼才知道要填啥。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月12日 上午 04:50
  • 請問headers應該怎樣讀, 我用了這個

     

    Public Shared Function DownloadString(ByVal address As String)
        Dim client As WebClient = New WebClient()
        client.Encoding = Encoding.UTF8
        Dim reply As String = client.DownloadString(address)
        Trace.WriteLine(client.Headers.Count)
        Return reply
    End Function
    

    結果傳回 0, 是代表沒有header 還是我做錯了?

    Post 是指你需要自動登入的值,需要看網頁原始碼才知道要填啥。

    ↑是指登入的form?

    <form method="post" action="/en/login">
    <input type="hidden" id="_token" name="_token" value="349df332ab48569d2765fd32588666f9">
    <div class="half">
    <div class="fieldname">Citizen name</div>
    <input type="text" name="citizen_name" id="citizen_name" value="" class="field" tabindex="1">        <span class="invalid-small" style="display:none;" id="error_for_citizen_name"></span>
    <span id="error_for_citizen_name_twin" style="float:left;" class="twin-small"></span>        <a class="smalldotted goleft" tabindex="4" rel="nofollow" href="/en/forgot-password">Forgot password?</a>    </div>
        <div class="half">
          <div class="fieldname">Password</div>
            <input type="password" name="citizen_password" id="citizen_password" value="" class="field" tabindex="2">        <span class="invalid-small" style="display:none;" id="error_for_citizen_password"></span>
    <span id="error_for_citizen_password_twin" style="float:left;" class="twin-small"></span>        <input type="checkbox" name="remember" id="remember" value="1" class="check" tabindex="5">&nbsp;
    <label for="remember">Remember me</label>
    </div>
    <input type="submit" name="commit" value="Login" class="submit" tabindex="3">
    </form>
    

    謝謝

    2011年2月12日 下午 12:52
  • 請參考線上手冊的範例:

    http://msdn.microsoft.com/zh-tw/library/system.net.webclient.responseheaders.aspx


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月12日 下午 02:27
  • 請問這個應該怎樣用的?

    我把裹面的code 抄了

     

    但執行For i = 0 To myWebHeaderCollection.Count - 1時出現「並未將物件參考設定為物件的執行個體」

     

    謝謝

    2011年2月15日 上午 07:34
  • myWebClient GET 完後才是這段程式碼。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月15日 下午 01:11
  • 喔喔是這樣嗎?

     

        Dim client As WebClient = New WebClient()
        Dim wc As New System.Net.WebClient
        Dim replyString As String
    
        With wc
          Dim strCookies As String = "xxx=xxx"
          With .Headers
            ' .Add("User-Agent", "有些網站會檢查")
            .Add("Content-Type", "application/x-www-form-urlencoded") ' 視需求
            .Add("Cookie", strCookies)
          End With
          .Encoding = System.Text.Encoding.GetEncoding("utf-8") ' 正確來說要看該網頁的編碼
    
          Dim postCol As New Specialized.NameValueCollection
          postCol.Add("txtXX", "通常有帳號密碼")
          Dim replyBytes() As Byte = .UploadValues("http://economy.erepublik.com/en/market/14/1/1/citizen/0/price_asc/1", "POST", postCol)
          replyString = System.Text.Encoding.GetEncoding("utf-8").GetString(replyBytes) ' 正確來說要看該網頁的編碼
          Trace.WriteLine(replyString)
    
          Dim myWebHeaderCollection As WebHeaderCollection = wc.ResponseHeaders
          Trace.WriteLine(ControlChars.Cr + "Displaying the response headers" + ControlChars.Cr)
          ' Loop through the ResponseHeaders.
          Dim i As Integer
          For i = 0 To myWebHeaderCollection.Count - 1
            ' Display the headers as name/value pairs.
            Trace.WriteLine((ControlChars.Tab + myWebHeaderCollection.GetKey(i) + " " + ChrW(61) + " " + myWebHeaderCollection.Get(i)))
          Next i
        End With
    Trace.WriteLine(replyString)

     

    ↑這個應該不需要吧, 而且太大段不貼上來了

     

    ResponseHeaders就回傳了這個東西

     

     

    Displaying the response headers
    	Pragma = 
    	Node = 6-14
    	Vary = Accept-Encoding
    	X-Varnish = 3277636385
    	Age = 0
    	Connection = keep-alive
    	Content-Length = 16712
    	Cache-Control = 
    	Content-Type = text/html; charset=utf-8
    	Date = Tue, 15 Feb 2011 13:38:55 GMT
    	Expires = 
    	ETag = "970b052770cc6d671f1023b34053822c"
    	Set-Cookie = erpk=5bd1996d8cfb06903bee25f38836af88; path=/; domain=.erepublik.com
    	Server = Apache 2.4 and Linux 2.6.40
    	Via = 1.1 varnish
    	X-Powered-By = ERPK Team & Spiderpig

     

    就是這個了嗎??

     

     

    感謝 ><

    2011年2月15日 下午 01:43
  • 我重新開了一次....header就不同了...

     

    Pragma = 

    Node = 6-16

    Vary = Accept-Encoding

    X-Varnish = 3279271895

    Age = 0

    Connection = keep-alive

    Content-Length = 16712

    Cache-Control = 

    Content-Type = text/html; charset=utf-8

    Date = Tue, 15 Feb 2011 13:46:57 GMT

    Expires = 

    ETag = "5032b1e44ab0778a9eca33b9f6dd752b"

    Set-Cookie = erpk=77c12421df48dbbe129d371e29d20a33; path=/; domain=.erepublik.com

    Server = Apache 2.4 and Linux 2.6.40

    Via = 1.1 varnish

    X-Powered-By = ERPK Team & Spiderpig

    2011年2月15日 下午 01:47
  • Set-Cookie = erpk=5bd1996d8cfb06903bee25f38836af88; path=/; domain=.erepublik.com

    這行是重點,所以這行要將值轉給下一次的 WebClient 。

    不過前面說先 GET ... 不是直接 POST ...

     

    前面說的:

    1. 先做 GET login 網頁。

    2. 將 login 網頁回傳的 cookies 全部拿來用,裡面有 Session 的 ID ,然後把帳密貼出去。

    3. 登入後回傳的 cookies 可能會變,所以仍然要全部拿來用,全部指到後面的使用。

     

    你直接做 2 ,但是沒把 cookies 傳下去。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月15日 下午 02:17
  • 抱歉......甚麼是以get login網頁....
    2011年2月15日 下午 02:19
  • 所以你應該先去念 RFC 文件,搞清楚標準的 http protocol ,否則隨便一個阻擋方式,你就會被擋下來。
    請參考 RFC 2616
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月15日 下午 03:11
  • 我在wiki看了這個http 1.1解釋了

    但是我怎樣將get的要求傳給伺服器?

     

    謝謝

    2011年2月16日 上午 02:57
  • WebClient.DownloadXXXX 都是屬於 GET

    WebClient.UploadXXXX 屬於 POST


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月16日 下午 01:05
  • 如果這樣是不是get? 

    Dim client As WebClient = New WebClient()
        client.DownloadString("http://economy.erepublik.com/en/market/14/1/1/citizen/0/price_asc/1") '並未將物件參考設定為物件的執行個體
        Dim myWebHeaderCollection As WebHeaderCollection = client.ResponseHeaders
        Console.WriteLine(ControlChars.Cr + "Displaying the response headers" + ControlChars.Cr)
        ' Loop through the ResponseHeaders.
        Dim i As Integer
        For i = 0 To myWebHeaderCollection.Count - 1
          ' Display the headers as name/value pairs.
          Trace.WriteLine((ControlChars.Tab + myWebHeaderCollection.GetKey(i) + " " + ChrW(61) + " " + myWebHeaderCollection.Get(i)))
        Next i
    

    傳回的是

    Pragma = no-cache

    Vary = Accept-Encoding

    X-Varnish = 3642290229

    Age = 0

    Connection = keep-alive

    Content-Length = 16712

    Cache-Control = no-store, no-cache, must-revalidate, post-check=0, pre-check=0

    Content-Type = text/html

    Date = Thu, 17 Feb 2011 02:11:32 GMT

    Expires = Thu, 19 Nov 1981 08:52:00 GMT

    Set-Cookie = erpk=e7157ac2271ece61999ab1b8fc1abdfe; path=/; domain=.erepublik.com

    Server = Apache 2.4 and Linux 2.6.40

    Via = 1.1 varnish

    X-Powered-By = ERPK Team & Spiderpig

     

    但是每次載入Set-Cookie = 的東西都是不同的

     

    謝謝

    2011年2月17日 上午 02:12
  • 前面說的:

    1. 先做 GET login 網頁。

    2. 將 login 網頁回傳的 cookies 全部拿來用,裡面有 Session 的 ID ,然後把帳密貼出去。

    3. 登入後回傳的 cookies 可能會變,所以仍然要全部拿來用,全部指到後面的使用。


    你要嘛 只做 2 ,要嘛只做 1 ...
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月17日 下午 01:15
  • get 不是只是下載嗎?

    所以用了client.DownloadString

    那應該怎樣做?T^T

    2011年2月17日 下午 03:11
  • 把 1 得到的 cookies 設給 2 。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月17日 下午 03:46
  • Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim client As WebClient = New WebClient()
        Dim wc As New System.Net.WebClient
        Dim token As String = ""
    
        Dim replyString As String
    
    
        '下載登入網頁
        token = client.DownloadString("http://www.erepublik.com/en/login")
        '取得網頁指派的token
        Try
          token = token.Remove(0, token.IndexOf("<input type=""hidden"" id=""_token"" name=""_token"" value=""") + "<input type=""hidden"" id=""_token"" name=""_token"" value=""".Length)
          Trace.WriteLine(token)
          token = token.Remove(token.IndexOf(""""))
          Trace.WriteLine("token: " & token)
        Catch ex As Exception
          MsgBox("Error:" & ex.Message)
          End
        End Try
        '取得header
        Dim myWebHeaderCollection As WebHeaderCollection = client.ResponseHeaders
        Trace.WriteLine(ControlChars.Cr + "Displaying the response headers" + ControlChars.Cr)
        ' Loop through the ResponseHeaders.
        Dim i As Integer
        For i = 0 To myWebHeaderCollection.Count - 1
          ' Display the headers as name/value pairs.
          Trace.WriteLine((ControlChars.Tab + myWebHeaderCollection.GetKey(i) + " " + ChrW(61) + " " + myWebHeaderCollection.Get(i)))
        Next i
        '將header加入
        wc.Headers.Add(myWebHeaderCollection)
    
        wc.Encoding = System.Text.Encoding.GetEncoding("utf-8")
        Dim postCol As New Specialized.NameValueCollection
        '依照登入網頁的form的input物件填寫有關的值
        postCol.Add("_token", token)
        postCol.Add("citizen_name", "xxxxxxx") '登入名稱
        postCol.Add("citizen_password", "xxxxxxxx") '登入密碼
        postCol.Add("remember", "1") '記住登入
        postCol.Add("submit", "Login") '登入按鈕
        Dim replyBytes() As Byte = wc.UploadValues("http://www.erepublik.com/en/login", "POST", postCol)
        replyString = System.Text.Encoding.GetEncoding("utf-8").GetString(replyBytes) ' 正確來說要看該網頁的編碼
        Trace.WriteLine(replyString)
    
      End Sub
    

    我再重新整理一次寫成了這樣

    這樣應該是先get login 然後再貼吧?

     

    但是在執行

     

    Dim replyBytes() As Byte = wc.UploadValues("http://www.erepublik.com/en/login", "POST", postCol)
    

     

    這一行是出現這個錯誤:

    無法變更此要求的 Content-Type 標頭預設值。

    請問這是甚麼問題??

     

    謝謝

    2011年2月19日 上午 04:57
  • 前面提到:

    請參考 RFC 2616

     這樣你才知道那些標頭才可以加入送出的標頭。

    就算不知道,前面也舉過例子:

     With .Headers
    ' .Add("User-Agent", "有些網站會檢查")
    .Add("Content-Type", "application/x-www-form-urlencoded") ' 視需求
    .Add("Cookie", strCookies)
    End With

    也就是說一般標頭是加這些,而不是把所有的 ResponseHeaders 加進去,因為傳給你的標頭有些是不能用在上傳用,所以要看 RFC 2616。

    wc.Encoding = System.Text.Encoding.GetEncoding("utf-8")

    utf-8 是大部分網頁用的,具體要用哪種編碼要看網頁本身 html 內的 <header> 區的標記。

    另外前面有說:

    所以碰上有登入的網站需要掛網路封包間聽起來比對才能做較佳的開發。

    是因為用封包監聽後,你才能確認瀏覽器回應的是甚麼,你目前程式碼大體上差不多了,所以應該開始用封包監聽後,比對從電腦送出去跟接收到的 headers 。

    微軟有出免費的封包監聽器,可在微軟下載中心取得,要勾英文,軟體名為:Microsoft Network Monitor 3.4

    步驟如下:

    1. 先把自己從該網站登出,此時存在電腦的 cookies 會被標記清空,關閉瀏覽器。

    2. 準備好 login 、你要下載網址的超連結,開啟 Network Monitor 開始記錄。

    3. 使用點選 「login 超連結 (GET)」 、「輸入帳號密碼登入 (POST)」 、「點選你要下載網址超連結 (GET)」 ,停止 Network Monitor 紀錄。

    4. 從 Network Monitor 找出上面三個引號網址的紀錄,另外剪貼下來以備查閱,或者把此次記錄存檔,以後可開啟來看,若使用其他封包監聽器,步驟也是如此。

    5. Network Monitor 在開啟一次紀錄,執行你的程式,比對與瀏覽器的 headers ,看看差了那些,再修改 POST 那段的 headers 與 Post Colection 。

    6. 正確登入後,你 POST 的回傳值應該是該網站的自動轉向或是登入成功的網頁內容,這時的 cookies 要傳遞給「點選你要下載網址超連結 (GET)」 ,方法同 POST ,只是省略掉 POST Colection ,後續每次 GET 的 cookies 也應繼續往後傳遞,才能確保你的登入持續有效。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月19日 上午 09:29
  • 補充:

    若是網站會在 「輸入帳號密碼登入 (POST)」 後用伺服器自動轉向 (redirect) ,這時會發生 WebClient 會自動改得到 redirect 的網址,可能會沒辦法記錄到步驟 6 所需的 cookies ,則 POST 須改使用比較細的 HttpRequest + HttpResponse ,才能取得自動轉向的要求並記錄到此時的 cookies 進行傳遞。其他部分仍可使用 WebClient 。

    使用 client 端自動轉向的,例如用 script 或是 html header 的,仍可使用 WebClient 來做 POST ,例如 phpBB/phpWind 登入後會顯示登入確認的畫面,數秒後才轉到內容區,這種就可以用 WebClient 來處理 POST 動作。

    伺服器自動轉向可在 Network Monitor 中錄到依照 RFC 2616 所規範的輸出標記。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月19日 上午 09:42
  • 首先非常感謝你的解答 T^T

    我在做第3步GET login網頁時有些少不明白
    (我是用WPE PRO)

    是取得剛剛好按下開始載入網頁那一個封包嗎??

    (這是剛剛按下載入login頁時的封包:)
    GET /en/login HTTP/1.1..Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*..Accept-Language: zh-hk..UA-CPU: x86..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Foxy/1; FunWebProducts; SV1; GTB6.6; Foxy/1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; AskTbMYC-ST/5.9.1.14019)..Host: www.erepublik.com..Connection: Keep-Alive..Cookie: erpk_mid=051e6d95fc259a283585c4080e7a68bb; erpk_fb_expire=1; MeeboBarHidden=1; __utma=234733898.1637119018.1296015099.1297823473.1298120197.18; __utmz=234733898.1297152729.14.7.utmcsr=economy.erepublik.com|utmccn=(referral)|utmcmd=referral|utmcct=/en/login; ARMM=%7B%7D; __qca=P0-1834825738-1296015131484; ambient_Graphic=0; __unam=7639673-12e2c4f0e61-7d9920b0-1; __utmb=234733898.10.10.1298120197....

    其他2個暫時不試

    第5步中「比對與瀏覽器的 headers」

    是對比上那些東西(如果沒錯的話)和在VB裹接收的↓這些東西嗎?

    Displaying the response headers
    Pragma = 
    Node = 6-23
    Vary = Accept-Encoding
    X-Varnish = 1753208851
    Age = 0
    Connection = keep-alive
    Content-Length = 16712
    Cache-Control = 
    Content-Type = text/html; charset=utf-8
    Date = Sat, 19 Feb 2011 13:24:36 GMT
    Expires = 
    ETag = "2eeb104c9c00ec8f935eb9b1a20a4aa9"
    Set-Cookie = erpk=ff210827ce503a66380221f71aa48776; path=/; domain=.erepublik.com
    Server = Apache 2.4 and Linux 2.6.40
    Via = 1.1 varnish
    X-Powered-By = ERPK Team & Spiderpig

    2011年2月19日 下午 01:37
  • 6. 正確登入後,你 POST 的回傳值應該是該網站的自動轉向或是登入成功的網頁內容,這時的 cookies 要傳遞給「點選你要下載網址超連結 (GET)」 ,方法同 POST ,只是省略掉 POST Colection ,後續每次 GET 的 cookies 也應繼續往後傳遞,才能確保你的登入持續有效。

    不是剛開始的,而是 POST 回傳的,步驟 6 有寫。

    這時的 cookies 通常會包含帳號、時間戳記,大部分系統都會進行加密。

    Set-Cookie = erpk=ff210827ce503a66380221f71aa48776; path=/; domain=.erepublik.com

     所以把 POST 回傳的這個往下一個 GET 傳遞,這個才是你已登入後的值,不往下傳遞,用原先 GET 回傳的話,那是還沒登入的值,這個值是會變化的,所以每次 GET 完的都要取出來,往下傳遞。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月20日 上午 04:01
  • 喔, 是按下登入按鈕後發出的那一個封包?

    (登入的步驟只有一個封包是 POST 開頭的)

    2011年2月20日 上午 04:17
  • 正確來說是叫做方法,不論用 GET / POST / HEAD 哪種,都會回傳 header + body 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月20日 上午 07:13
  • 只需要Set-Cookie = erpk=ff210827ce503a66380221f71aa48776; path=/; domain=.erepublik.com 這一個header, 其他都不用了??  謝謝
    2011年2月22日 下午 02:10
  • 前面舉例是因為一般網站只需要這樣:
     With .Headers
    ' .Add("User-Agent", "有些網站會檢查")
    .Add("Content-Type", "application/x-www-form-urlencoded") ' 視需求
    .Add("Cookie", strCookies)
    End With

    還有沒有需要別的,就需要用封包監測器比對後,一行行 Header 刪除來測看看。

     

    這段貼好幾次了,你不覺得你一直在打轉嗎?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月22日 下午 02:18
  • 因為我只加了Set-Cookie = erpk=ff210827ce503a66380221f71aa48776; path=/; domain=.erepublik.com 還是會錯誤....

    Dim i As Integer
        For i = 0 To myWebHeaderCollection.Count - 1
          ' Display the headers as name/value pairs.
          Trace.WriteLine((ControlChars.Tab + myWebHeaderCollection.GetKey(i) + " " + ChrW(61) + " " + myWebHeaderCollection.Get(i)))
          If myWebHeaderCollection.GetKey(i).ToString.StartsWith("Set-Cookie") Then
            wc.Headers.Add(myWebHeaderCollection(i))
            Trace.WriteLine("add" & (ControlChars.Tab + myWebHeaderCollection.GetKey(i) + " " + ChrW(61) + " " + myWebHeaderCollection.Get(i)))
          End If
        Next i
    

    wc.Headers.Add(myWebHeaderCollection(i))
    這句有個

    指定值沒有 ':' 分隔符號。 參數名稱: header

    的錯誤....

     

    我不懂怎樣解決它...

    2011年2月23日 上午 03:24
  • 喔, 上面的解決了, 用

    wc.Headers.Add(myWebHeaderCollection.GetKey(i), myWebHeaderCollection.Get(i))

     

    現在我嘗試把封包傳的東西和IE一樣....

    wpe 接收到的post內容:

    POST /en/login HTTP/1.1..Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*..Referer: http://www.erepublik.com/en/login..Accept-Language: zh-hk..Content-Type: application/x-www-form-urlencoded..UA-CPU: x86..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Foxy/1; FunWebProducts; SV1; GTB6.6; Foxy/1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; AskTbMYC-ST/5.9.1.14019)..Host: www.erepublik.com..Content-Length: 100..Connection: Keep-Alive..Cache-Control: no-cache..Cookie: erpk_mid=051e6d95fc259a283585c4080e7a68bb; MeeboBarHidden=1; erpk_fb_expire=1; __utma=234733898.1637119018.1296015099.1298433208.1298433332.23; __utmz=234733898.1297152729.14.7.utmcsr=economy.erepublik.com|utmccn=(referral)|utmcmd=referral|utmcct=/en/login; ARMM=%7B%7D; __qca=P0-1834825738-1296015131484; ambient_Graphic=0; __unam=7639673-12e2c4f0e61-7d9920b0-1; __utmb=234733898.1.10.1298433332; erpk=47fc1f129cd3d08623d246d0957e4fe6; __utmc=234733898....

    VB的:

    POST /en/login HTTP/1.1..Set-Cookie: erpk=d2cef1e7dcbf63ba1aa194f9e14b555e; path=/; domain=.erepublik.com..Content-Type: application/x-www-form-urlencoded..Host: www.erepublik.com..Content-Length: 100..Expect: 100-continue..Connection: Keep-Alive....

    2個都有很大的分別?

    是不是直接將沒有的都放到VB就OK了?

     

    謝謝

    2011年2月23日 上午 04:00
  • 喔, 上面的解決了, 用

    wc.Headers.Add(myWebHeaderCollection.GetKey(i), myWebHeaderCollection.Get(i))

     

    現在我嘗試把封包傳的東西和IE一樣....

    wpe 接收到的post內容:

    POST /en/login HTTP/1.1..Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*..Referer: http://www.erepublik.com/en/login..Accept-Language: zh-hk..Content-Type: application/x-www-form-urlencoded..UA-CPU: x86..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Foxy/1; FunWebProducts; SV1; GTB6.6; Foxy/1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; AskTbMYC-ST/5.9.1.14019)..Host: www.erepublik.com..Content-Length: 100..Connection: Keep-Alive..Cache-Control: no-cache..Cookie: erpk_mid=051e6d95fc259a283585c4080e7a68bb; MeeboBarHidden=1; erpk_fb_expire=1; __utma=234733898.1637119018.1296015099.1298433208.1298433332.23; __utmz=234733898.1297152729.14.7.utmcsr=economy.erepublik.com|utmccn=(referral)|utmcmd=referral|utmcct=/en/login; ARMM=%7B%7D; __qca=P0-1834825738-1296015131484; ambient_Graphic=0; __unam=7639673-12e2c4f0e61-7d9920b0-1; __utmb=234733898.1.10.1298433332; erpk=47fc1f129cd3d08623d246d0957e4fe6; __utmc=234733898....

    所以告訴你要看 RFC 2616

     

    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*

    表示瀏覽器接受哪種檔案格式。

    Referer: http://www.erepublik.com/en/login

    表示推薦網址為何,部分防止機器人的網站這個是必選

    Accept-Language: zh-hk

    表示接受哪種語言,支援多國語言網站若是沒有這項,可能會輸出英文網頁。

    Accept-Encoding: gzip, deflate

    表示瀏覽器可以讀那些壓縮格式。我同常自己寫程式會加這個,讓網站跟我的 client 用 gzip 傳輸。

    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Foxy/1; FunWebProducts; SV1; GTB6.6; Foxy/1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; AskTbMYC-ST/5.9.1.14019)

    表示用哪個瀏覽器,部分防止機器人網站會檢查,部分網站會針對不同瀏覽器輸出不同網頁。

    Connection: Keep-Alive

    保持連線,部分網站會用到。

    Cookie: erpk_mid=051e6d95fc259a283585c4080e7a68bb; MeeboBarHidden=1; erpk_fb_expire=1; __utma=234733898.1637119018.1296015099.1298433208.1298433332.23; __utmz=234733898.1297152729.14.7.utmcsr=economy.erepublik.com|utmccn=(referral)|utmcmd=referral|utmcct=/en/login; ARMM=%7B%7D; __qca=P0-1834825738-1296015131484; ambient_Graphic=0; __unam=7639673-12e2c4f0e61-7d9920b0-1; __utmb=234733898.1.10.1298433332; erpk=47fc1f129cd3d08623d246d0957e4fe6; __utmc=234733898

    Cookies 比較長,可能有做部分的防止機器人登入,要比對 GET login 時的 cookies 才能做進一步判斷。

     

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月23日 下午 02:35
  • 喔喔

     

    下載到回來的是XML....

     

    應該怎樣拆解?

     

    原來那個網站有支援xml輸出

     

    謝謝

    2011年2月28日 上午 10:21
  • ...

    http://msdn.microsoft.com/zh-tw/library/system.xml.xmldocument.aspx


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月28日 下午 02:31