Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Wikipediasta 403-vastaus WebClientille

Sivun loppuun

Juhko [15.08.2009 13:00:40]

#

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wc As New System.Net.WebClient
        Dim html As String
        html = System.Text.Encoding.ASCII.GetString(wc.DownloadData("http://fi.wikipedia.org/w/index.php"))
        Me.Content.Text = html
    End Sub
End Class

...ja palvelin lähettää virhekoodin 403, eli kielletty. Veikkaisin, että tämä on vandaalibottien estämistä varten, mutta sellaista minä en ole tekemässä. :) Miten saisin tuon toimimaan?

neau33 [15.08.2009 15:14:57]

#

Morjes taas Juhko!

Jutskan pitäisi hoitua seuraavalla tavalla...

'Väännetty SharpDevelop 3.1'llä
Imports System.IO
Imports System.Net
Imports System.Text

Public Partial Class MainForm

   Public Sub New()

      Me.InitializeComponent()

   End Sub

  Sub Button1Click(sender As Object, e As EventArgs)

      Dim URL As String = _
      "http://fi.wikipedia.org/w/index.php"

      Dim theURI As String = URL.Substring(0, _
      URL.LastIndexOf("/") + 1)

      Dim HTML As String = String.Empty

      Const BUFFER_SIZE As Integer = 128

      Dim BytesRead As Integer = 0

      Dim theRequest As WebRequest = _
      WebRequest.Create(URL)

      Dim theResponse As WebResponse = _
      theRequest.GetResponse()

      Dim buffer(BUFFER_SIZE) As Byte

      Dim ResponseStream As Stream = _
      theResponse.GetResponseStream()

      Dim strResponse As StringBuilder = _
      New StringBuilder("")

      BytesRead = ResponseStream.Read( _
      Buffer, 0, BUFFER_SIZE)

      While BytesRead <> 0

          strResponse.Append( _
          Encoding.UTF8.GetString( _
          Buffer, 0, BytesRead))
          BytesRead = ResponseStream.Read( _
          Buffer, 0, BUFFER_SIZE)
          HTML = strResponse.ToString()

      End While

     'HTML = parseHtml(theURI, HTML) 'mahd. linkkien parsiminen

      MessageBox.Show(HTML)

   End Sub

   Private Function parseHtml(theURI As _
   String, strHTML As String) As String
      '...
      '...
      Return strHTML
   End Function

End Class

-Nea

EDIT: ei toimi enään...äkkiäpä saivat estettyä myös tämän viritelmän...

Juhko [15.08.2009 17:24:30]

#

Jaa että miten selain sitten hakee sivun?

MIB [15.08.2009 17:28:42]

#

Veikkaisin, että selain lähettää jonkun tunnisteen minkä avulla päätellään, mikä se on. Tämä kuitenkin on villi arvaus.

Juhko [15.08.2009 17:32:44]

#

Eikö tuo sitten ole lainkaan mahdollista?

Chiman [15.08.2009 18:36:20]

#

Joissakin tapauksissa auttaa, kun sivulatauksen yhteydessä lähetettävä user-agent-header asetetaan samaksi kuin mitä nettiselain lähettää. En tiedä miten se asetetaan Basicissa, mutta google neuvonee.

Grez [15.08.2009 18:44:16]

#

Olennaisempi kysymys, kuin "miten se asetetaan Basicissa", olisi "miten se asetetaan .Net:n WebRequestissa"...

Eli esim. seuraavasti

theRequest.Headers.Add(Net.HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729)")

C# ja managed C++:ssa pitäisi lisätä vielä ; loppuun.

Chiman [15.08.2009 18:51:12]

#

Kah, .Net oli kyseessä. Silmäilin koodia vain sen verran ettei näkynyt user-agenttia siellä :)

Sen vielä mainitsen, että käyttäkää näitä automatisoituja sivuhakuja vastuullisesti eli joko vähän tai sitten tarpeeksi harvakseltaan, jottei kohdesivusto kuormitu liiaksi.

neau33 [15.08.2009 23:51:24]

#

Morjes taas Juhko!

jutska hoituu seuraavasti...

Imports System.IO
Imports System.Net
Imports System.Text

Public Partial Class MainForm

   Public Sub New()

      Me.InitializeComponent()

   End Sub

  Sub Button1Click(sender As Object, e As EventArgs)

      Dim strURL As String = _
      "http://fi.wikipedia.org/w/index.php"

      Dim strHTML As String = String.Empty

      Const BUFFER_SIZE As Integer = 128

      Dim BytesRead As Integer = 0

      Dim theRequest As HttpWebRequest = _
      DirectCast(HttpWebRequest.Create( _
      strURL), HttpWebRequest)

      theRequest.UserAgent = _
      "Mozilla/5.0 (Windows; U; " + _
      "Windows NT 5.1; fi; rv:1.9.0.13)" + _
      "Gecko/2009073022 Firefox/3.0.13" + _
      "(.NET CLR 3.5.30729)"

      theRequest.Accept = _
      "text/xml,application/xml,application/" + _
      "xhtml+xml,text/html;q=0.9,text/plain;" + _
      "q=0.8,image/png,*/*;q=0.5"

      Dim theResponse As WebResponse = _
      DirectCast(theRequest.GetResponse, _
      HttpWebResponse)

      Dim buffer(BUFFER_SIZE) As Byte

      Dim ResponseStream As Stream = _
      theResponse.GetResponseStream()

      Dim strResponse As StringBuilder = _
      New StringBuilder("")

      BytesRead = ResponseStream.Read( _
      Buffer, 0, BUFFER_SIZE)

      While BytesRead <> 0

          strResponse.Append( _
          Encoding.UTF8.GetString( _
          Buffer, 0, BytesRead))
          BytesRead = ResponseStream.Read( _
          Buffer, 0, BUFFER_SIZE)
          strHTML = strResponse.ToString()

      End While

      webBrowser1.DocumentText = parseLINK(strHTML) 'testaa

   End Sub

   Private Function parseLINK(strHTML As String) As String

      Dim strURI As String = "http://fi.wikipedia.org/"
      Dim xref As String = "href=,src=,action=,virtual="
      Dim xarray() As String = xref.Split(",")
      For i As Integer = 0 To xarray.GetUpperBound(0)
         strHTML = strHTML.Replace( _
         xarray(i) + """" + "/", _
         xarray(i) + """" + strURI)
      Next

      Return strHTML

   End Function


End Class

Juhko [16.08.2009 00:39:21]

#

Kiitos Nea. Sain toimimaan.

Juhko [16.08.2009 13:32:32]

#

Olisi vielä toinen, samaan ohjelmaan liittyvä kysymys (-.-), että miten VB.NET:issä saa formin pysymään aina päälimmäisenä, tai sitten formin hWnd:n?

Antti Laaksonen [16.08.2009 16:37:57]

#

Muuta formin TopMost-ominaisuuden arvoksi True.

Juhko [16.08.2009 16:51:13]

#

Ai, kiitos. Se olikin noin yksinkertaista. :)

Juhko [11.09.2009 17:18:21]

#

Taas tarttee apua. Kyseinen ikkuna on minulla koko ajan ladattuna muistiin, mutta silloin kun minulla on muita ikkunoita avoinna, ja ikkuna näytetään (Form1.show), se ei tule päälimmäiseksi. Miten saisi korjattua? Sori kun olen näin tyhmä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta