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?
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...
Jaa että miten selain sitten hakee sivun?
Veikkaisin, että selain lähettää jonkun tunnisteen minkä avulla päätellään, mikä se on. Tämä kuitenkin on villi arvaus.
Eikö tuo sitten ole lainkaan mahdollista?
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.
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.
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.
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
Kiitos Nea. Sain toimimaan.
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?
Muuta formin TopMost-ominaisuuden arvoksi True.
Ai, kiitos. Se olikin noin yksinkertaista. :)
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.