Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: MediaWiki Login @ VB.NET

Petja [10.12.2011 18:01:48]

#

Dim request As WebRequest = WebRequest.Create(".../api.php?action=login")
request.Method = "POST"
Dim postData As String = "lgname=X&lgpassword=Y"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
Dim objXML As New System.Xml.XmlDocument
objXML.Load("http://fi.wikipedia.org/w/api.php?action=query&...")
Application.DoEvents()

Tämä koodi ei toimi! Tiedän kyllä miksi, mutten tiedä miten korjata toimivaksi.

Miten saisin loggaamaan MediaWikiin ilman virheitä (esim. HTTP 417, 403 jne.)?

Käytin apunani em. koodin kirjoittamisessa tätä artikkelia.

TIEDÄN OLEVANI HUONO OHJELMOINNISSA. SIITÄ HUOLIMATTA TOIVON YSTÄVÄLLISIÄ KOMMENTTEJA.

Metabolix [10.12.2011 18:12:25]

#

Eihän tuossa ole mitään logiikkaa. Kirjaudut yhdellä pyynnöllä, ja sitten teet täysin riippumattoman toisen pyynnön. Mistä ajattelit palvelimen saavan selville, että kyseessä on sama ohjelma, joka juuri kirjautui?

Suosittelen WebClientin käyttöä. Tavallinen WebClient ei muista keksejä, mutta tämä muistaa (C#:lla, käännä itse VB.NETiksi):

public class CookieAwareWebClient: WebClient {
	private CookieContainer m_container = new CookieContainer();
	protected override WebRequest GetWebRequest(Uri address) {
		WebRequest request = base.GetWebRequest(address);
		if (request is HttpWebRequest) {
			(request as HttpWebRequest).CookieContainer = m_container;
		}
		return request;
	}
}

Sitten voit käyttää luokkaa tähän tapaan:

WebClient wc = new CookieAwareWebClient();
wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
wc.UploadString(".../api.php?action=login", "POST", "lgname=X&lgpassword=Y");

string sivu = wc.DownloadString(".../api.php?action=query&...");

ErroR++ [10.12.2011 19:12:28]

#

Public Class CookieAwareWebClient
	Inherits WebClient
	Private m_container As New CookieContainer()
	Protected Overrides Function GetWebRequest(address As Uri) As WebRequest
		Dim request As WebRequest = MyBase.GetWebRequest(address)
		If request Is HttpWebRequest Then
			CType(request, HttpWebRequest).CookieContainer = m_container
		End If
		Return request
	End Function
End Class

Vastaus

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

Tietoa sivustosta