150分求解HttpRequest的问题

hbx1982 2010-09-06 03:32:15
各位高手帮个忙,前几天发了一个帖子50分求助这个问题,没有得到答案。今天再发布一个100分的,加起来150分求解。
其实代码很简单,请各位给解答一下,或者把代码修改之后,能得到我要的结果即可。

原帖地址 http://topic.csdn.net/u/20100902/22/b967c713-4538-41c8-8556-4305a367d0eb.html

使用HTTPREQUEST来登录网站获取信息
登录地址 http://www.sdo.com/loginPT.asp,登录密码只要看代码就可以找得到,我要登录账号获得账号的可用积分余额,各位可以现在IE中试一下看看。

代码如下:
private CookieContainer myCookieContainer;
private Encoding charset = Encoding.GetEncoding("GB2312");

private string HTTPGET(string url)
{
string outdata;
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
myHttpWebRequest.CookieContainer = myCookieContainer;
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebResponse.Cookies = myCookieContainer.GetCookies(myHttpWebRequest.RequestUri);
Stream myResponseStream = myHttpWebResponse.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, charset);
outdata = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return outdata;
}

private string HTTPPOST(string url, string postData)
{
string outdata;

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.ContentLength = postData.Length;
myHttpWebRequest.Method = "POST";
myHttpWebRequest.CookieContainer = myCookieContainer;

Stream myRequestStream = myHttpWebRequest.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.Default);
myStreamWriter.Write(postData);
myStreamWriter.Close();
myRequestStream.Close();

HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebResponse.Cookies = myCookieContainer.GetCookies(myHttpWebRequest.RequestUri);
Stream myResponseStream = myHttpWebResponse.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, charset);
outdata = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();

return outdata;
}

private void btnStart_Click(object sender, EventArgs e)
{
string strHTML = string.Empty;
//登录
myCookieContainer = new CookieContainer();
string loginUrl = "http://dplogin.sdo.com/dispatchlogin.fcgi?service=http%3A%2F%2Fjf%2Esdo%2Ecom%2FRedirectPage%2Easpx%3Ftarget%3DUserHouse%2FQueryScore%2Easpx";
string loginPost = "warn=false<=test&_eventId=submit&idtype=0&gamearea=0&gametype=0&username={0}&password={1}&ekey=&challenge=&domaink=jf.sdo.com&templateId=&sdid=&pageType=&infoEx=&uid=&appArea=0&appId=0&service=http%3A%2F%2Fjf.sdo.com%2FRedirectPage.aspx%3Ftarget%3DUserHouse%2FQueryScore.aspx&code=2";
strHTML = HTTPPOST(loginUrl, string.Format(loginPost, "da3fdsds", "1230"));

if (strHTML.Contains("通行证和密码不匹配"))
{
//
}
else
{
string strReDirect = Regex.Match(strHTML, "location.href=.*", RegexOptions.IgnoreCase).Value;
strReDirect = strReDirect.Replace("location.href=\"", "").Replace("\";", "");

strHTML = HTTPGET(strReDirect); //到了这一步就不行了 }
}
...全文
291 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbx1982 2010-09-06
  • 打赏
  • 举报
回复
谢谢各位的回复,今天下午有事外出了。
我逐楼层试一下吧,验证后结贴。
JiuchunYoung 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 computerfox 的回复:]
你是否实现的自动登录,登录以后,获取积分,就是获取页面上的这个元素呀,应该不难的。


HTML code
积分余额:<span class="high_ttl" id="creditAvail">0</span><a href="http://jf.sdo.com/" target="_blank">[查看]</a>


用HtmlElement获取到id="creditAvail……
[/Quote]
他说的有点道理 有点意思
捷哥1999 2010-09-06
  • 打赏
  • 举报
回复
你是否实现的自动登录,登录以后,获取积分,就是获取页面上的这个元素呀,应该不难的。

积分余额:<span class="high_ttl" id="creditAvail">0</span><a href="http://jf.sdo.com/" target="_blank">[查看]</a>


用HtmlElement获取到id="creditAvail" 元素就可以了!

WM_JAWIN 2010-09-06
  • 打赏
  • 举报
回复
myHttpWebResponse.Cookies = myCookieContainer.GetCookies(myHttpWebRequest.RequestUri);
这个有问题吧,去掉试试
whowhen21 2010-09-06
  • 打赏
  • 举报
回复
嗯,lS的也是,有的跳转不一定非要是登录之后的页面,可以到个人中心也没问题呀~~
whowhen21 2010-09-06
  • 打赏
  • 举报
回复
我没去看你那个东东,对于返回不正常,我给你提两个原因,你自己排查一下,第一:抓包看你请求的地址是否正确,还有需要和网站相同的编码。第二:请求的时候有个Referer属性,有的网站会对这个有限制,如果不是他的Host,不会正确的返回,这个很重要哦。
不行可以看看这里,希望对你有所帮助,第一篇
云瑀 2010-09-06
  • 打赏
  • 举报
回复
        private void button2_Click(object sender, RoutedEventArgs e)
{
string strHTML = string.Empty;
//登录
myCookieContainer = new CookieContainer();
string loginUrl = "http://dplogin.sdo.com/dispatchlogin.fcgi?service=http%3A%2F%2Fjf%2Esdo%2Ecom%2FRedirectPage%2Easpx%3Ftarget%3DUserHouse%2FQueryScore%2Easpx";
string loginPost = "warn=false<=test&_eventId=submit&idtype=0&gamearea=0&gametype=0&username={0}&password={1}&ekey=&challenge=&domaink=jf.sdo.com&templateId=&sdid=&pageType=&infoEx=&uid=&appArea=0&appId=0&service=http%3A%2F%2Fjf.sdo.com%2FRedirectPage.aspx%3Ftarget%3DUserHouse%2FQueryScore.aspx&code=2";
strHTML = HTTPPOST(loginUrl, string.Format(loginPost, "da3fdsds", "1230"));

if (strHTML.Contains("通行证和密码不匹配"))
{
//
}
else
{
//string strReDirect = Regex.Match(strHTML, "location.href=.*", RegexOptions.IgnoreCase).Value;
//strReDirect = strReDirect.Replace("location.href=\"", "").Replace("\";", "");

string strReDirect = "http://www.sdo.com/index.asp";

strHTML = HTTPGET(strReDirect); //到了这一步就不行了 }
}
}

这样就进去了.....
guyehanxinlei 2010-09-06
  • 打赏
  • 举报
回复
Friendly Up!
烈火蜓蜻 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 hbx1982 的回复:]
各位高手帮个忙,前几天发了一个帖子50分求助这个问题,没有得到答案。今天再发布一个100分的,加起来150分求解。
其实代码很简单,请各位给解答一下,或者把代码修改之后,能得到我要的结果即可。

原帖地址 http://topic.csdn.net/u/20100902/22/b967c713-4538-41c8-8556-4305a367d0eb.html

使用HTTPREQUEST……
[/Quote]

strHTML = HTTPGET(strReDirect); //到了这一步就不行了 }


把strReDirect这个Url变量中的最后一个 & 字符简单删除了就可以了,
也就是先

if(strReDirect!=null && strReDirect!="")
strReDirect = strReDirect.Trim().SubString(0,strReDirect.Length-1);
strHTML = HTTPGET(strReDirect); //到了这一步就不行了

不过,你在请求的时候,最好指定一下,请求的编码,不然可能会乱码
  • 打赏
  • 举报
回复
把错误贴出来看看。
glest 2010-09-06
  • 打赏
  • 举报
回复
Http错误代码是什么?
huangmin3956 2010-09-06
  • 打赏
  • 举报
回复
你把那个网址替换一个简单点的试试 也太长了点 看着不头晕啊
bloodish 2010-09-06
  • 打赏
  • 举报
回复
不是很清楚你的问题,我自己在用的一个Get函数,希望对你有帮助

public string Get(string url, string referer)
{
int num = this.tryTimes;
while (num-- > 0)
{
try
{
if (this.delayTime > 0)
{
Thread.Sleep((int) (this.delayTime * 1000));
}
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(new Uri(url));
request.UserAgent = this.reqUserAgent;
request.CookieContainer = this.cookieContainer;
request.Referer = referer;
request.Method = "GET";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Timeout = this.timeout;
if ((this.proxy != null) && (this.proxy.Credentials != null))
{
request.UseDefaultCredentials = true;
}
request.Proxy = this.proxy;
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
return reader.ReadToEnd();
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
continue;
}
}
return string.Empty;
}

wys46 2010-09-06
  • 打赏
  • 举报
回复
感觉楼主想做网页游戏的外挂吧
gongsun 2010-09-06
  • 打赏
  • 举报
回复
HTTPGET(strReDirect);

调用 private string HTTPGET(string url) 这个方法。

你是不是在
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

这里报错?
编程爱好者L 2010-09-06
  • 打赏
  • 举报
回复
学习...

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧