asp.net模拟登录,数据采集问题 紧急求助!!!!!!!!!

SteadyThinker 2009-09-29 03:57:26
要求
先有两套系统,系统A为外网系统,系统B为自己开发系统,
要求在系统B里模拟登录系统A的同时,保存登录状态,继续模拟查询
然后返回查询的源码,对源码进行数据提取。。比如提取页面里表的某行数据,或者整个表结构。

各位大哥大姐最好先讲些基础原理性的东西,有源码当然好,但附带点简单的原理说明就更感激不敬了。。
两眼泪喷的等待回复。。


我自己做的简单应用:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>源页</title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>


后台代码:

public static string PostAndGetHTML(string targetURL, CookieContainer cc, Hashtable param)
{
//prepare the submit data
string formData = "";
foreach (DictionaryEntry de in param)
{
formData += de.Key.ToString() + "=" + de.Value.ToString() + "&";
}
if (formData.Length > 0)
formData = formData.Substring(0, formData.Length - 1); //remove last '&'
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(formData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetURL);
request.Method = "POST"; //post
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
request.CookieContainer = cc;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cc.Add(response.Cookies);
Stream stream = response.GetResponseStream();
string result = new StreamReader(stream, System.Text.Encoding.UTF8).ReadToEnd();
return result;
}
protected void Button1_Click(object sender, EventArgs e)
{
CookieContainer cc = new CookieContainer();//this is for keep the Session and Cookie
Hashtable param = new Hashtable();//this is for keep post data.
string urlLogin = "http://localhost:2723/Calendar/WebCollection/FountainPage.aspx";
//do find the elementId that needed. check the source of login page can get this information
param.Add("TextBox1", "zyg");
param.Add("TextBox2", "123");
param.Add("TextBox3", "");
param.Add("Button1", "Button");
param.Add("__VIEWSTATE","/wEPDwUKMTI1MTk2NDQzM2Rkk6u ZldYY1+fzRUM5R vNvdCBjuHY=");
param.Add("__EVENTVALIDATION","/wEWBQL2mMyfAwLs0bLrBgLs0fbZDALs0Yq 1BQKM54rGBuvZsBxWq JfO2NPZRSrp68d7MNRQ");
string result = PostAndGetHTML(urlLogin, cc, param);
Response.Write(result);
}


总是报500错误!!!错误代码行:HttpWebResponse response=(HttpWebResponse)request.GetResponse();

大哥们救我~~~
...全文
1959 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
草原619 2011-03-20
  • 打赏
  • 举报
回复
louzhu la ji
cqcs712 2009-11-30
  • 打赏
  • 举报
回复
是啊,楼主怎么解决的呢?
iwhyme 2009-11-18
  • 打赏
  • 举报
回复
楼主不要闪呀~~最后怎么解决的?求助求助!
SteadyThinker 2009-10-10
  • 打赏
  • 举报
回复
自己解决了。。结帖闪人~
SteadyThinker 2009-09-30
  • 打赏
  • 举报
回复
大哥 我用你推荐的工具HttpWatch了 果然比我的好用,可问题还是没有解决啊.

POST DATA标签如下:
parameter Val size
__EVENTVALIDATION /wEWBAKs1+r2CQLs0bLrBgLs0fbZDAKM54rGBqc/HlccvtrW08kNqxhBoSJUnBKw 88
__VIEWSTATE /wEPDwULLTExNTc2NTI3OTlkZHbOdWF4uA82vzs960/N2fQQfeZD 68
Button1 Button 14
TextBox1 zyg 12
TextBox2 123 12

主要代码:

protected void Button1_Click(object sender, EventArgs e)
{
CookieContainer cc = new CookieContainer();//this is for keep the Session and Cookie
Hashtable param = new Hashtable();//this is for keep post data.
string urlLogin = "http://localhost:2723/Calendar/WebCollection/FountainPage.aspx";
//do find the elementId that needed. check the source of login page can get this information
param.Add("TextBox1", "zyg");
param.Add("TextBox2", "123");
param.Add("Button1", "Button");
param.Add("__VIEWSTATE", "/wEPDwULLTExNTc2NTI3OTlkZHbOdWF4uA82vzs960/N2fQQfeZD");
param.Add("__EVENTVALIDATION", "/wEWBAKs1+r2CQLs0bLrBgLs0fbZDAKM54rGBqc/HlccvtrW08kNqxhBoSJUnBKw");
string result = PostAndGetHTML(urlLogin, cc, param);
Response.Write(result);
}



public static string PostAndGetHTML(string targetURL, CookieContainer cc, Hashtable param)
{
//prepare the submit data
string formData = "";
foreach (DictionaryEntry de in param)
{
formData += de.Key.ToString() + "=" + de.Value.ToString() + "&";
}
if (formData.Length > 0)
formData = formData.Substring(0, formData.Length - 1); //remove last '&'
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(formData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetURL);
request.Method = "POST"; //post
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
request.CookieContainer = cc;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cc.Add(response.Cookies);
Stream stream = response.GetResponseStream();
string result = new StreamReader(stream, System.Text.Encoding.Default).ReadToEnd();
return result;
}



参数我是严格按照 PostData 的参数形式传递的 ,可还是报500错误,很费解,应该不是我参数传递的问题吧。
屌丝女士111 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 steadythinker 的回复:]
非常感谢wanglltulong和tuoshi我用的工具是Fiddler2

我发的代码是自己测试做的例子没有发布,那个URL是我本地的服务器地址,是存在的,可能是我的参数值匹配有问题吧。。。

那个问题大哥们没回答我啊:如果模拟查询的页面有6个查询条件(即6个 <input>),但我只需要根据其中一个查询条件模拟查询,那我模拟查询的时候是不是要把页面上所有的 <input>都提交过去??还是只提交一个就可以了??
[/Quote]


都要提交 因为你要提交的数据 它是转换成二进制字节 它是辨别你的字节长度 还有就是 你参数看看是多少
如果可以的话 别的条件就传入一个“”试试 不过你先试试所有的条件加上试试 如果可以 你再试为条件“”
ch219888 2009-09-30
  • 打赏
  • 举报
回复
顶下
gongsun 2009-09-30
  • 打赏
  • 举报
回复
...
yzf86211861 2009-09-30
  • 打赏
  • 举报
回复
学习下,正好有用
SteadyThinker 2009-09-30
  • 打赏
  • 举报
回复
非常感谢wanglltulongtuoshi我用的工具是Fiddler2

我发的代码是自己测试做的例子没有发布,那个URL是我本地的服务器地址,是存在的,可能是我的参数值匹配有问题吧。。。

那个问题大哥们没回答我啊:如果模拟查询的页面有6个查询条件(即6个<input>),但我只需要根据其中一个查询条件模拟查询,那我模拟查询的时候是不是要把页面上所有的<input>都提交过去??还是只提交一个就可以了??
lsgy2008 2009-09-29
  • 打赏
  • 举报
回复
关注一下,我也要做采集系统了
tuoshi 2009-09-29
  • 打赏
  • 举报
回复
网页不在外网不好帮你调试,先用嗅探工具把你这个工具的通讯抓取一下看看。

做这方面工作没个好的嗅探工具很麻烦的。
屌丝女士111 2009-09-29
  • 打赏
  • 举报
回复
string urlLogin = "http://localhost:2723/Calendar/WebCollection/FountainPage.aspx";


这个是什么url 自己整明白再写
屌丝女士111 2009-09-29
  • 打赏
  • 举报
回复
还有就是500错误是最难找到问题的所在 没有根据的问题 我以前做的时候也报个这个错误 但是很奇怪就是一下就没抱着个错了 就是这么奇怪
屌丝女士111 2009-09-29
  • 打赏
  • 举报
回复
呵呵 你需要一个工具 httpwatch 查看别人网站是如何post 数据 然后看看传入的参数值是什么?值是什么? 然后需要

你要对比你传入的文件流 的字节长度是不是和别人的一样
模拟登陆是很需要注意细节的 ,如果一个字错误都会不响应你的请求

param.Add(urlEncond("__VIEWSTATE","/wEPDwUKMTI1MTk2NDQzM2Rkk6u ZldYY1+fzRUM5R vNvdCBjuHY="));
param.Add("__EVENTVALIDATION","/wEWBQL2mMyfAwLs0bLrBgLs0fbZDALs0Yq 1BQKM54rGBuvZsBxWq JfO2NPZRSrp68d7MNRQ");




SteadyThinker 2009-09-29
  • 打赏
  • 举报
回复
大哥,我是第一次发帖,代码发的不是很全,我自己的测试都是好用的,我说下问题,你看能看懂不:

一个页上有两个文本框,一个按钮,这时我可以通过后台实现模拟登录,但如果是三个文本框,我只用了其中两个,所有只传了两个文本框的值,第三个文本框为空,但这是模拟登录就报500错误。。。我不知道为什么。。可能原理不明白的原因吧。。。有大哥知道的给小弟留个QQ,可能我发的问题不详细。。

主要想弄明白的: 假如A系统有6个<input>文本框 但我只用其中一个,怎么实现不登陆A系统,而在B系统里模拟查询和登录。
time_is_life 2009-09-29
  • 打赏
  • 举报
回复
没有找到网页,先直接访问一下这个网页是否存在:
http://localhost:2723/Calendar/WebCollection/FountainPage.aspx

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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