C# 使用 HttpWebRequest 登录页面
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/450380/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Login to the page with HttpWebRequest
提问by SelvirK
How can I login to the this page http://www.bhmobile.ba/portal/indexby using HttpWebRequest?
如何使用 HttpWebRequest登录此页面http://www.bhmobile.ba/portal/index?
Login button is "Po?alji" (upper left corner).
登录按钮是“Po?alji”(左上角)。
HTML source of login page:
登录页面的 HTML 源代码:
<table id="maintable" border="0" cellspacing="0" cellpadding="0" style="height:100%; width:100%">
<tr>
<td width="367" style="vertical-align:top;padding:3px"><script type="text/javascript">
function checkUserid(){
if (document && document.getElementById){
var f = document.getElementById('userid');
if (f){
if (f.value.length < 8){
alert('Korisni?ko ime treba biti u formatu 061/062 xxxxxx !');
return false;
}
}
}
return true;
}
</script>
<div style="margin-bottom:12px"><table class="leftbox" style="height:184px; background-image:url(/web/2007/slike/okvir.jpg);" cellspacing="0" cellpadding="0">
<tr>
<th style="vertical-align:middle"><form action="http://sso.bhmobile.ba/sso/login" method="post" onSubmit="return checkUserid();">
<input type="hidden" name="realm" value="sso">
<input type="hidden" name="application" value="portal">
<input type="hidden" name="url" value="http://www.bhmobile.ba/portal/redirect?type=ssologin&url=/portal/show?idc=1111">
<table class="formbox" align="center" cellspacing="0" cellpadding="0">
<tr>
<th style="vertical-align:middle; text-align:right;padding-right:4px;">Korisnik:</th>
<td><input type="text" size="20" id="userid" name="userid"/></td>
</tr>
<tr>
<th style="text-align:right;padding-right:4px;">Lozinka:</th>
<td><input type="password" size="20" name="password" /></td>
</tr>
<tr>
<th colspan="2">
<input class="dugmic" type="image" id="prijava1" alt="Prijava" src="/web/2007/dugmici/posalji_1.jpg" onmouseover="ChangeImage('prijava1','/web/2007/dugmici/posalji_2.jpg')" onmouseout="ChangeImage('prijava1','/web/2007/dugmici/posalji_1.jpg')">
</th>
</tr>
</table>
<div style="padding:12px;">
<a href="/portal/show?idc=1121">Da li ste novi BH Mobile korisnik?</a><br />
<a href="/portal/show?idc=1121">Da li ste zaboravili lozinku(?ifru)?</a><br />
</div>
</form></th>
</tr>
</table></div>
Form action is http://sso.bhmobile.ba/sso/login. How can I use this with HttpWebRequest to get a cookie and use some date from this page?
表单操作是http://sso.bhmobile.ba/sso/login。如何将它与 HttpWebRequest 一起使用来获取 cookie 并使用此页面中的某个日期?
采纳答案by missaghi
Make a new default.aspx, and put this in the code behind: I cant test any further based on your current question, because you didn't include a valid username/password.
创建一个新的 default.aspx,并将其放在后面的代码中:我无法根据您当前的问题进一步测试,因为您没有包含有效的用户名/密码。
using System;
using System.Web;
using System.Net;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Foo
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://sso.bhmobile.ba/sso/login");
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
req.Method = "POST";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Language: en-us,en;q=0.5");
req.Headers.Add("Accept-Encoding: gzip,deflate");
req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
req.KeepAlive = true;
req.Headers.Add("Keep-Alive: 300");
req.Referer ="http://sso.bhmobile.ba/sso/login";
req.ContentType = "application/x-www-form-urlencoded";
String Username = "username";
String PassWord = "Password";
StreamWriter sw = new StreamWriter(req.GetRequestStream());
sw.Write("application=portal&url=http%3A%2F%2Fwww.bhmobile.ba%2Fportal%2Fredirect%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Ftype%3Dssologin%26url%3D%2Fportal%2Fshow%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Fidc%3D1023278&realm=sso&userid=" + Username + "&password=" + password + "&x=16&y=11");
sw.Close();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string tmp = reader.ReadToEnd();
foreach (Cookie cook in response.Cookies)
{
tmp += "\n" + cook.Name + ": " + cook.Value;
}
Response.Write(tmp);
Response.End();
}
}
}
回答by Matthew M. Osborn
You can use the build in WebClient Object instead of crating the request yourself.
您可以使用 WebClient 对象中的构建,而不是自己创建请求。
WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential("username", "password");
string url = "http://foo.com";
try
{
using (Stream stream = wc.OpenRead(new Uri(url)))
{
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
}
catch (WebException e)
{
//Error handeling
}