我正在使用WebClient / WebRequest访问网站上的受限数据.该网站没有官方的API,所以我想要做的只是填写
HTML表单并将值发布到服务器,以便我登录.
我试过this和this,但看起来不像即将到来的请求被登录.
后一个例子更具吸引力,因为我显然更喜欢WebClient,但遗留的WebRequest将会做.
无论如何,在第一个例子中,我认为它已经登录,但访问私有数据的即将到来的请求返回一个包含消息“这只是成员内容”的页面.
如何使WebClient永久登录?
解决方法
这是我做的,它的作品(
credit).
先添加这个类:
namespace System.Net { using System.Text; using System.Collections.Specialized; public class CookieAwareWebClient : WebClient { public void Login(string loginPageAddress,NameValueCollection loginData) { CookieContainer container; var request = (HttpWebRequest)WebRequest.Create(loginPageAddress); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var buffer = Encoding.ASCII.GetBytes(loginData.ToString()); request.ContentLength = buffer.Length; var requestStream = request.GetRequestStream(); requestStream.Write(buffer,buffer.Length); requestStream.Close(); container = request.CookieContainer = new CookieContainer(); var response = request.GetResponse(); response.Close(); CookieContainer = container; } public CookieAwareWebClient(CookieContainer container) { CookieContainer = container; } public CookieAwareWebClient() : this(new CookieContainer()) { } public CookieContainer CookieContainer { get; private set; } protected override WebRequest GetWebRequest(Uri address) { var request = (HttpWebRequest)base.GetWebRequest(address); request.CookieContainer = CookieContainer; return request; } } }
用法:
public static void Main() { var loginAddress = "www.mywebsite.com/login"; var loginData = new NameValueCollection { { "username","shimmy" },{ "password","mypassword" } }; var client = new CookieAwareWebClient(); client.Login(loginAddress,loginData); }