需求是这样子的,想开发一个外挂程序,能够抓取别的系统的数据,从而实现数据验证。

比如这样一个界面:

使用Chrome浏览器分析http请求和响应过程以及页面的html代码,发现这是一个ajax请求,于是跟踪找到了具体的请求地址和查询时提交的数据。

于是就可以请求这个地址,并且封装提交的数据进行http请求即可。

但实验后发现,需要先登录系统然后才能进行查询请求。

分析系统登录部分代码发现,仍然是一个ajax post请求后台的代码,截图如下:

从js代码可以看出res=899为登录失败,其它为登录成功。

于是思路就确定了,先模拟登陆系统,然后使用相同的cookie,再次请求查询即可获得数据。

登录方法:

public static string PostLogin(string postData, string requestUrlString, ref CookieContainer cookie)
{
UTF8Encoding encoding = new UTF8Encoding();
byte[] data = encoding.GetBytes(postData);
//向服务端请求
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(requestUrlString);
myRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36";
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
myRequest.CookieContainer = new CookieContainer();
myRequest.AllowAutoRedirect = true; Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, , data.Length);
newStream.Close();
//将请求的结果发送给客户端(界面、应用)
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
cookie.Add(myResponse.Cookies);
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
return reader.ReadToEnd();
}

登录进系统后查询方法:

public static string PostRequest(string postData, string requestUrlString, CookieContainer cookie)
{
UTF8Encoding encoding = new UTF8Encoding();
byte[] data = encoding.GetBytes(postData);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(requestUrlString);
myRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36";
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
myRequest.CookieContainer = cookie;
myRequest.AllowAutoRedirect = true; Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, , data.Length);
newStream.Close();
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
return reader.ReadToEnd();
}

调用部分代码:

CookieContainer cc = new CookieContainer();
string url_login = "http://10.77.197.23:7001/yzjy/login.action?method=login1";
string postData_login = "submitData={\"username\":\"登录账号\",\"userpwd\":\"密码\"}";
string result_login = PostLogin(postData_login, url_login, ref cc);
if (result_login.Equals(""))//1748表示登录成功
{
string url_getRyData = "http://10.77.197.23:7001/yzjy/Rygl.do?method=getRyData";
string postData_RyData = "aac002=" + sfz + "&aac003=" + xm + "&pageIndex=0&pageSize=30";
string result_RyData = PostRequest(postData_RyData, url_getRyData, cc);
RyData ry = JsonConvert.DeserializeObject<RyData>(result_RyData);
if (ry.total <= )
{
MessageBox.Show("对不起,没有查找到当前人信息。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}

返回json数据,封装类的代码:

public class RyData
{
public int total { get; set; }
public Data[] data { get; set; }
} public class Data
{
public string aac161_name { get; set; }
public string tbr { get; set; }
public string aac161 { get; set; }
public string aae100 { get; set; }
public string czdz { get; set; }
public string aac001 { get; set; }
public string aac002 { get; set; }
public string aae005 { get; set; }
public string aac003 { get; set; }
public string aac004 { get; set; }
public string aac005 { get; set; }
public string aac006 { get; set; }
public string aac009_name { get; set; }
public string aac009 { get; set; }
public string aac005_name { get; set; }
public string hjdz { get; set; }
public string aac011_name { get; set; }
public string aae011_name { get; set; }
public string aae036 { get; set; }
public string aac058 { get; set; }
public string aac016 { get; set; }
public string aac016_name { get; set; }
public string aac004_name { get; set; }
public string aac058_name { get; set; }
public string aac024_name { get; set; }
public string rn { get; set; }
}

参考资料:

http://www.cnblogs.com/ok519/p/3488091.html

C#模拟登录后请求查询的更多相关文章

  1. 23.模拟登录cookies请求速询网站数据

    采集速询网站数据: 网站地址:http://www.suxun0752.com/index.html 网站是需要账号登录才给返回信息的,我这里是直接拿的登录后的cookies请求的数据,cookies ...

  2. Python手动构造Cookie模拟登录后获取网站页面内容

    最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQ ...

  3. scrapy 模拟登录后再抓取

    深度好文: from scrapy.contrib.spiders.init import InitSpider from scrapy.http import Request, FormReques ...

  4. python学习,使用requests库来模拟登录github,post请求。

    这次我们要模拟登录的页面是 https://github.com/login 首先我们先尝试着登陆一遍分析一下请求, 打开开发者工具下的network选项, 可以很清楚的看到这个会话session,而 ...

  5. Python爬虫之模拟登录微信wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...

  6. POST信息模拟登录获取页面内容

    最近项目里有一个是要模拟登录后,访问固定页面获取内容的要求,一开始用JQ AJAX好像不支持跨域请求.后使用.net中HttpWebRequest对象来获取.一开始访问总是无法在第二个页面正常访问,好 ...

  7. Python模拟登录的几种方法

    目录 方法一:直接使用已知的cookie访问 方法二:模拟登录后再携带得到的cookie访问 方法三:模拟登录后用session保持登录状态 方法四:使用无头浏览器访问 正文 方法一:直接使用已知的c ...

  8. Python 模拟登录几种常见方法

    方法一:直接使用已知的cookie访问 优点: 简单,但需要先在浏览器登录 原理: 简单地说,cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端.因为http是一种无状态的 ...

  9. PHP模拟登录并获取数据

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

随机推荐

  1. normalize.css的使用

    normalize.css有下面这几个目的: 保护有用的浏览器默认样式而不是完全去掉它们一般化的样式:为大部分HTML元素提供修复浏览器自身的bug并保证各浏览器的一致性优化CSS可用性:用一些小技巧 ...

  2. .Net Core邮件发送之MailKit

    一 .在.Net Core中MailKit中提供了邮件的基础封装 它支持跨平台,并且支持 IMAP, POP3, SMTP 等协议 Nuget命令: Install-Package MailKit 官 ...

  3. tmux分屏幕

    1. tmux  a  -t  fly 连接上tmux 2. 左右分屏幕,ctrl+a ,再按% 上下分屏: ctrl+a, 再按“ 切换屏幕: ctrl+a, 再按o 关闭终端: ctrl+a, 再 ...

  4. .NET 并行编程——数据并行

    本文内容 并行编程 数据并行 环境 计算 PI 矩阵相乘 把目录中的全部图片复制到另一个目录 列出指定目录中的所有文件,包括其子目录 最近,对多线程编程,并行编程,异步编程,这三个概念有点晕了,之前我 ...

  5. wifipineapple获取用户上网信息

    ssh连接到wifipineapple: 输入连接信息:ssh root@172.16.42.1 输入密码:pineapplesareyummy 安装依赖基本环境: opkg update opkg ...

  6. 微软BI SSRS 2012 Metro UI Win 8 风格的报表课程案例全展示

    开篇介绍 微软BI SSRS 2012 Metro UI 高端报表视频教程 (http://www.hellobi.com/course/15)课程从2014年6月开始准备,于2014年9月在 天善B ...

  7. shell while内获取外部变量内容

    一.问题 问题很简单,看下面一段tmp.sh代码: #!/bin/sh x="this is the initial value of x" cat /tmp/tmp | whil ...

  8. PL/SQL学习笔记之记录

    一:记录 记录是一种高可以容纳不同数据类型的数据的数据结构. PL/SQL可以处理记录的以下几种类型: 基于数据表 基于游标的记录 用户自定义的记录 二:使用 %ROWTYPE属性 创建基于表格或基于 ...

  9. CSS中的偏僻知识点

    一.css中的calc 在CSS中有calc属性用于尺寸的计算,可以让百分比和像素值进行运算. div {width : calc(100% - 30px);} 为了兼容性 /*Firefox*/ - ...

  10. 启用phpstorm代码提示功能

    参考:http://www.dawnfly.cn/article-1-331.html mac下实际上将省电禁用即可