跪求——带验证码的外域登陆问题

qq454006060 2009-11-20 09:18:09
请回答的朋友仔细看完
A:网站是俺的网站。
B:是另一个代验证码登陆的网站

做法
第一步:访问B网站获得相应的cookie
HttpWebRequest request = WebRequest.Create("http://www.b.cn/index.jsp") as HttpWebRequest;
//获取request信息
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//根据request信息获取response
string cookie = response.Headers["Set-Cookie"].Split(';')[0];
//根据response获得相应的cookies
第二步:根据cookie去请求相应的验证码信息
WebClient _Client = new WebClient();
//建立新的请求
_Client.Headers.Add("Cookie", cookie);
//将新的请求添加cookies头
byte[] _ImageBytes = _Client.DownloadData("http://www.b.cn/GetCode.jsp");
//获取图片字节流
第三步:登陆B网站并跳转到B网站。
我不知道该怎么做了。

<form action="http://www.b.cn/login.jsp" method="post">
<input type="text" name="userid" />
<input type="text" name="userkey" />
<input type="text" name="verifycode" />
<input type="submit" value="submit" />
</form>
如果像上面那样的话,对于B网站又是一个新的session。验证码肯定错误。

Stream outStream = request.GetRequestStream();
outStream.Write(data, 0, data.Length);
outStream.Close();
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream inStream = response.GetResponseStream();
这样获得的是B网站登陆后的信息,这不是我想要的。我想要的就是直接登陆B网站。
我已经发了两个帖子求助。可惜每次回答的人估计都没看懂我的要求,很想当然的回答
所以请各位哥哥姐姐们帮俺考虑考虑到底该如何完成
我要的是直接登陆到B网站。。跪谢!
...全文
220 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqcs712 2009-12-01
  • 打赏
  • 举报
回复
顶,我也有类似问题。只不过我这不考虑验证码的问题。不知道现在lz问题解决没有
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
晕 利用这个怎么让浏览器跳转到
www.b.com页面啊
貌似利用这个只能获得登陆后的数据流来着
现在是想让浏览器跳转啊。

topso 2009-11-20
  • 打赏
  • 举报
回复
汗,你原来代码里面不是已经实现了嘛:
request.Headers.Add("Cookie", Session["imgcookie"].ToString());
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 topso 的回复:]
晕死,你在手动跳转的时候,当然要把原来的cookies放到WebRequest里面了,这样就不会产生新的session了
[/Quote]

就是不知道怎么做啦!!!!!
给段代码咯 谢谢
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
如果有人讨论的话+偶QQ454006060
跪求帮助谢谢
topso 2009-11-20
  • 打赏
  • 举报
回复
晕死,你在手动跳转的时候,当然要把原来的cookies放到WebRequest里面了,这样就不会产生新的session了
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 topso 的回复:]
你手动跳转下不就可以了嘛
[/Quote]
手动跳转会分配一个新的session。所以跳转后会到error页面
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
"ASPSESSIONIDCSTQRADB=PHOLFNOCHJBAIADGHMDIKOKO"
这是服务器返回的sessionid
要将这个id应用在所有的有关对B服务器的操作上
如果是使用C#。那么
HttpWebRequest和WebClient
都有
WebClient _Client = new WebClient();
_Client.Headers.Add("Cookie", cookie);
和request.Headers.Add("Cookie", Session["imgcookie"].ToString());
方法
但这样登陆的话获得的是B服务器的数据流。我想要直接跳转到B服务器而不是获得登陆成功的数据流所以被卡住了。

我的意思是如何在 跳转的时候加上"ASPSESSIONIDCSTQRADB=PHOLFNOCHJBAIADGHMDIKOKO"
这段服务器分配给我的sessionid。让服务器知道我来自这个会话。而不是重新分配给我一个session
topso 2009-11-20
  • 打赏
  • 举报
回复
你手动跳转下不就可以了嘛
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
登陆成功。。
但是我现在不是要使用StreamReader获得登陆成功后返回的流
而是要直接跳转到登陆后的页面。就是这个问题困扰着俺
topso 2009-11-20
  • 打赏
  • 举报
回复
楼主的代码,是否已经能成功登陆呢?
如果可以获取登陆以后的信息,那就可以了啊,后面再获取其它登陆后才能查看的页面信息应该很容易了。
如果是POST到登陆页面以后,返回的是登陆错误,说明代码还有问题。
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
我正在尝试解决这个问题。有思路但是正在完善。而且不一定能搞定郁闷
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 topso 的回复:]
或者是做个半自动的程序,验证码让用户自己输入。
[/Quote]
不是验证码的问题
验证码本来就是用户手动
关键是用户提交后在B服务器的session,如何和验证码的session匹配的问题
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HttpWebRequest request = WebRequest.Create("http://www.b.cn/index.jsp") as HttpWebRequest;
//获取request信息
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//根据request信息获取response
string cookie = response.Headers["Set-Cookie"].Split(';')[0];
//根据response获得相应的cookies
response.Close();
request.Abort();
//关闭两者
//放入session
Session["imgcookie"] = cookie;
this.Image1.ImageUrl = "Default2.aspx";
}


}
protected void Button2_Click(object sender, EventArgs e)
{
HttpWebRequest request = WebRequest.Create("http://www.b.cn/login.jsp") as HttpWebRequest;
request.Method = "POST";
request.Referer = "http://www.b.cn/index.jsp";
request.Headers.Add("Cookie", Session["imgcookie"].ToString());
request.ContentType = "application/x-www-form-urlencoded";
Encoding encoding = Encoding.GetEncoding("gb2312");
string uname = this.TextBox1.Text.Trim();
string pass = this.TextBox2.Text.Trim();
string code = this.TextBox3.Text.Trim();

string postdata = "userid=" + pass + "&userkey=" + uname + "&verifycode=" + code + "";

byte[] data = encoding.GetBytes(postdata);
request.ContentLength = data.Length;

Stream outStream = request.GetRequestStream();
outStream.Write(data, 0, data.Length);
outStream.Close();
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream inStream = response.GetResponseStream();

using (StreamReader reader = new StreamReader(inStream, encoding))
{
string content = reader.ReadToEnd();
// content.Replace("default.jsp", "Default3.aspx");

//content "<meta http-equiv=refresh content=\"3;URL=default.jsp\"><script Language=Javascript>alert('请注意,客户在提交短信的时候请预留3个字作为后缀。安徽会员类短信的统一后缀为【H】');location.href='default.jsp';</script>\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\r\n<LINK href=\"../Css/Css.css\" type=text/css rel=stylesheet>\r\n<title> -- 会员登录</title>\r\n</head>\r\n\r\n<body>\r\n\r\n\r\n\r\n</body>\r\n</html>\r\n" string

Response.Write(content);
}

inStream.Close();
response.Close();
request.Abort();


}


验证码页面:

protected void Page_Load(object sender, EventArgs e)
{
string cookie = Session["imgcookie"].ToString();

WebClient _Client = new WebClient();
//建立新的请求
_Client.Headers.Add("Cookie", cookie);
//将新的请求添加cookies头
byte[] _ImageBytes = _Client.DownloadData("http://www.b.cn/GetCode.jsp");
//获取图片字节流
_Client.Dispose();
//释放客户端信息
MemoryStream ns = new MemoryStream(_ImageBytes);
//内存流转换
//Bitmap img = (Bitmap)(Bitmap.FromStream(ns));
System.Drawing.Image image = System.Drawing.Image.FromStream(ns);
Response.BinaryWrite((byte[])_ImageBytes);

//image.Save("c:\\2.jpg");
//Response.BinaryWrite((byte[])_ImageBytes);
//转换为图片
}
topso 2009-11-20
  • 打赏
  • 举报
回复
或者是做个半自动的程序,验证码让用户自己输入。
qq454006060 2009-11-20
  • 打赏
  • 举报
回复
楼上 看看这段代码是否能解决你的需求
这是我做的一段。但是不符合我的需求
topso 2009-11-20
  • 打赏
  • 举报
回复
识别验证码要看目标网站验证码的难度的,像百度贴吧这样的验证码基本上很难,一般小网站的,如果验证码中的位数、位置、字体不变,也不旋转变形,那是比较好办的。碰到比较复杂的一般用专门的验证组件。
hemingyang 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 topso 的回复:]
你都已经可以登陆了,怎么还问怎么登陆?
另外B网站要验证码的,你怎么识别的?如果不能自动识别,也是登陆不了的。
[/Quote]
我的问题是 如何识别验证码?只能硬性破解吗?这是不是存在一个概率问题?
topso 2009-11-20
  • 打赏
  • 举报
回复
你都已经可以登陆了,怎么还问怎么登陆?
另外B网站要验证码的,你怎么识别的?如果不能自动识别,也是登陆不了的。
hemingyang 2009-11-20
  • 打赏
  • 举报
回复
与我遇到的问题一样,求助。
加载更多回复(8)

110,533

社区成员

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

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

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