httpwebrequest 模拟登录 获取cookies
2个类,一个基类,一个构建头信息调用类
关于如何获取到post中的内容,你之需要用http抓包工具把你与目标网站的请求信息抓下来后,打开分析下按照抓下来的包中的数
据进行构建就行了
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace bot
{
public class Html
{
///
/// httpwebrequest类中的一些属性的集合
///
public struct RequestPPT
{
private string strAccept;
///
/// 获取或设置request类中的Accept属性
/// 用以设置接受的文件类型
///
public string Accept
{
get
{
return strAccept;
}
set
{
strAccept = value;
}
}
private string strContentType;
///
/// 获取或设置request类中的ContentType属性
/// 用以设置请求的媒体类型
///
public string ContentType
{
get
{
return strContentType;
}
set
{
strContentType = value;
}
}
///
/// 获取或设置request类中的UserAgent属性
/// 用以设置请求的客户端信息
///
private string strUserAgent;
public string UserAgent
{
get
{
return strUserAgent;
}
set
{
strUserAgent = value;
}
}
private string strMethod;
///
/// 获取或设置request类中的Method属性
/// 可以将 Method 属性设置为任何 HTTP 1.1 协议谓词:GET、HEAD、POST、PUT、DELETE、TRACE 或 OPTIONS。
/// 如果 ContentLength 属性被设置为 -1 以外的任何值,则必须将 Method 属性设置为上载数据的协议属性。
///
public string Method
{
get
{
return strMethod;
}
set
{
strMethod = value;
}
}
}
///
/// 构建一个httt请求以获取目标链接的cookies,需要传入目标的登录地址和相关的post信息,返回完成登录的cookies,以及返回的html内容
///
/// 登录页面的地址
/// post信息
/// 输出的html代码
/// 请求的标头所需要的相关属性设置
/// 请求完成后的cookies
public CookieCollection funGetCookie(string url, byte[] post, out string strHtml, RequestPPT rppt,string server)
{
CookieCollection ckclReturn = new CookieCollection();
CookieContainer cc = new CookieContainer();
HttpWebRequest hwRequest;
HttpWebResponse hwResponse;
//请求cookies的格式
//hwRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
//hwResponse = (HttpWebResponse)hwRequest.GetResponse();
//string cookie = hwResponse.Headers.Get("Set-Cookie");
//cookie = cookie.Split(';')[0];
//hwRequest = null;
//hwResponse = null;
//构建即将发送的包头
//cc.SetCookies(new Uri(server), cookie);
hwRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
hwRequest.CookieContainer = cc;
hwRequest.Accept = rppt.Accept;
hwRequest.ContentType = rppt.ContentType;
hwRequest.UserAgent = rppt.UserAgent;
hwRequest.Method = rppt.Method;
hwRequest.ContentLength = post.Length;
//写入标头
Stream stream;
stream = hwRequest.GetRequestStream();
stream.Write(post, 0, post.Length);
stream.Close();
//发送请求获取响应内容
try
{
hwResponse = (HttpWebResponse)hwRequest.GetResponse();
}
catch
{
strHtml = "";
return ckclReturn;
}
stream = hwResponse.GetResponseStream();
StreamReader sReader = new StreamReader(stream, Encoding.Default);
strHtml = sReader.ReadToEnd();
sReader.Close();
stream.Close();
//获取缓存内容
ckclReturn = hwResponse.Cookies;
return ckclReturn;
}
///
/// 根据已经获取的有效cookies来获取目标链接的内容
///
/// 目标链接的url
/// 已经获取到的有效cookies
/// 头属性的相关设置
/// 目标连接的纯文本:"txt/html"
public string funGetHtmlByCookies(string strUri, CookieCollection ccl, RequestPPT rppt)
{
CookieContainer cc = new CookieContainer();
HttpWebRequest hwRequest;
HttpWebResponse hwResponse;
//构建即将发送的包头
hwRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(strUri));
cc.Add(ccl);
hwRequest.CookieContainer = cc;
hwRequest.Accept = rppt.Accept;
hwRequest.ContentType = rppt.ContentType;
hwRequest.UserAgent = rppt.UserAgent;
hwRequest.Method = rppt.Method;
hwRequest.ContentLength = 0;
//发送请求获取响应内容
try
{
hwResponse = (HttpWebResponse)hwRequest.GetResponse();
}
catch
{
return "";
}
Stream stream;
stream = hwResponse.GetResponseStream();
StreamReader sReader = new StreamReader(stream, Encoding.Default);
string strHtml = sReader.ReadToEnd();
sReader.Close();
stream.Close();
//返回值
return strHtml;
}
///
/// 根据已经获取的有效cookies来获取目标链接的内容
///
/// 目标链接的url
///post的byte信息
/// 已经获取到的有效cookies
/// 头属性的相关设置
/// 目标连接的纯文本:"txt/html"
public string funGetHtmlByCookies(string strUri,byte[] post, CookieCollection ccl, RequestPPT rppt)
{
CookieContainer cc = new CookieContainer();
HttpWebRequest hwRequest;
HttpWebResponse hwResponse;
//构建即将发送的包头
hwRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(strUri));
cc.Add(ccl);
hwRequest.CookieContainer = cc;
hwRequest.Accept = rppt.Accept;
hwRequest.ContentType = rppt.ContentType;
hwRequest.UserAgent = rppt.UserAgent;
hwRequest.Method = rppt.Method;
hwRequest.ContentLength = post.Length;
//写入post信息
Stream stream;
stream = hwRequest.GetRequestStream();
stream.Write(post, 0, post.Length);
stream.Close();
//发送请求获取响应内容
try
{
hwResponse = (HttpWebResponse)hwRequest.GetResponse();
}
catch
{
return"" ;
}
stream = hwResponse.GetResponseStream();
StreamReader sReader = new StreamReader(stream, Encoding.Default);
string strHtml = sReader.ReadToEnd();
sReader.Close();
stream.Close();
//返回值
return strHtml;
}
}
} 第二个 using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Data;
using System.Xml;
using System.Text.RegularExpressions;
namespace bot
{
public class SisHtml :Html
{
public SisHtml()
{
}
/// <summary>
/// 设置主机ip地址
/// </summary>
public string Host
{
get {
return strHost;
}
set {
strHost = value;
}
}
private string strHost;
/// <summary>
/// 获取目标登录链接的cookies
/// </summary>
/// <param name="url">目标的登录链接</param>
/// <param name="dir">构造头的泛型键值对</param>
/// <param name="strHtml">登录后返回的页面内容</param>
/// <returns>登录后的cookies</returns>
public CookieCollection funGetCookie(string url, Dictionary<string, string> dir, out string strHtml)
{
CookieCollection cc = new CookieCollection();
RequestPPT rppt = new RequestPPT();
//构建post内容
string strPost = funMakePost(dir);
byte[] post = Encoding.Default.GetBytes(strPost);
//设置标头属性
rppt.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
rppt.ContentType = "application/x-www-form-urlencoded";
rppt.Method = "Post";
rppt.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
string server ="http://"+ new Uri(url).Host;
return cc = base.funGetCookie(url, post, out strHtml, rppt, server);
}
/// <summary>
/// 根据已经获取到cookies来获取目标链接的内容
/// </summary>
/// <param name="strUri">目标的url</param>
/// <param name="ccl">已经获取好的cookies</param>
/// <returns>目标url的纯文本:"txt/html"</returns>
public string funGetHtmlByCookies(string strUri,CookieCollection ccl )
{
RequestPPT rppt = new RequestPPT();
//设置头属性
rppt.Accept = "txt/html";
rppt.ContentType = "application/x-www-form-urlencoded";
rppt.Method = "Post";
rppt.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
return base.funGetHtmlByCookies(strUri, ccl, rppt);
}
/// <summary>
/// 投票帖子用的方法
/// </summary>
/// <param name="strHtml">投票帖子的htmlcode</param>
/// <param name="ccl">有效的cookies</param>
/// <returns>投票完成以后的htmlcode</returns>
public string funVote(string strHtml,CookieCollection ccl)
{
//判断是不是选取投票
try
{
strHtml = strHtml.Substring(strHtml.IndexOf("<form"), strHtml.LastIndexOf("</form>") - strHtml.IndexOf("<form") + 7);
}
catch
{
return "";
}
string strCheck = @"name=""pollanswers[]""";
//如果代码中包含关键信息说明没有被投票过
if(strHtml.IndexOf(strCheck)>0)
{
//获取post头的需求信息
string strFormHash = "77b49df4";
string strPollanswers;
strPollanswers = strHtml.Substring(strHtml.IndexOf(strCheck)+strCheck.Length, 20).Split('"')[1];
string strPollansubmit = "提交";
Dictionary<string,string>dir = new Dictionary<string,string>();
dir.Add("formhash",strFormHash);
dir.Add("pollanswers[]",strPollanswers);
dir.Add("pollsubmit",strPollansubmit);
string strPost = funMakePost(dir);
byte[] post = Encoding.Default.GetBytes(strPost);
//获取请求的路径
string strUrl= "http://"+Host+"/bbs/";
string strActionUrl =@"method=""post""";
strUrl+= strHtml.Substring(strHtml.IndexOf(strActionUrl)+strActionUrl.Length,100).Split('"')[1].Replace("amp;","");
//构建头
RequestPPT rppt = new RequestPPT();
rppt.Accept = "txt/html";
rppt.ContentType = "application/x-www-form-urlencoded";
rppt.Method = "Post";
rppt.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
strHtml = base.funGetHtmlByCookies(strUrl, post, ccl, rppt);
}
return strHtml;
}
/// <summary>
/// 根据泛型来构建字符串用于post
/// </summary>
/// <param name="dir">带有键值对的泛型</param>
/// <returns>构建完毕的字符串</returns>
private string funMakePost(Dictionary<string,string> dir)
{
string strPost="";
foreach (KeyValuePair<string, string> kvp in dir)
{
strPost += kvp.Key + "=";
if (kvp.Value == "")
{
strPost += "''";
}
else
{
strPost += kvp.Value;
}
strPost += "&";
}
strPost = strPost.Substring(0, strPost.Length - 1);
return strPost;
}
/// <summary>
/// 获取下一个列表页面的路径
/// </summary>
/// <param name="strHtml">当前页面的htmlcode</param>
/// <returns>下一个列表页面的路径</returns>
public string funGetNextUrl(string strHtml)
{
string strUrl = "";
//判断是否是列表型页面
if (strHtml.IndexOf("<form") != -1)
{
return strUrl;
}
string strKey =@"class=""next""";
strUrl = "http://"+Host+"/bbs/"+strHtml.Substring(strHtml.IndexOf(strKey) - 100, 100).Split('"')[1].Replace("amp;", "");
return strUrl;
}
public DataTable funGetListTable(string strHtml)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("Url");
dt.Columns.Add(dc);
DataRow dr ;
string strReg = @"viewthread.php(\S)+highlight=";
Regex rg = new Regex(strReg);
MatchCollection mc = rg.Matches(strHtml);
foreach (Match ms in mc)
{
dr = dt.NewRow();
dr[0] = "http://" + Host + "/bbs/" + ms.ToString().Replace("amp;", "");
dt.Rows.Add(dr);
}
return dt;
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/atlasroben/archive/2008/07/29/2729958.aspx
分享到:
相关推荐
HttpWebRequest模拟上传文件封装代码
利用httpWebRequest模拟登陆
C# asp.net http HttpWebRequest模拟浏览器请求下载文件到本地
模拟请求,基于HttpWebRequest封装好的一个类,自动记下和发送Cookie,你只管调用方法就行了,很实用
.net模拟登录博客园,使用httpWebRequest登录并发布随笔文章
详细的代码和注释 可以充分了解HttpWebRequest 操作网站 操作Cookie的过程和方法 可以扩展为很多的应用开发,比如百度文库财富自动获取、贴吧一键签到、管理;其他网站的一些功能开发;接口的开发、网页的抓取等等。
HttpHelper.cs(httpwebrequest访问网站助手) 1.提供比较全面的网站表单提交,上传下载等功能。...3.方便实现模拟登录,保存cookie。 4.代码规范易懂,使用方便。 如有不明白的地方,请联系QQ:271853927,有问必答。
.net通过HttpWebRequest模拟表单通过name/value形式提交参数和文件实例上传文件 通过HttpWebRequest类模拟网页请求,可向服务端提交多参数和多文件数据,参数和文件已key、value的形式进行上传。已集成完整的类库,...
HttpWebRequest详解HttpWebRequest详解HttpWebRequest详解
httpwebrequest调用webservice返回数据
asp.net 服务端代码以 xml utf-8的格式向指定地址post 数据并接收返回值 HttpWebRequest 简单的代码事例,可以自行扩展使用
使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用...
平时用浏览器看网页的时候,点击一下submit按钮的时候其实就是给服务器发送了一个POST请求。但是如何在自己的C#程序里面实现类似的功能呢?本文给出具体的实现方法并详细说明其实现难点。
httpwebrequest 封装类
控制台程序模拟浏览器请求,一次流程请求4次,请求的url从文件中随机读取,每次请求之间随机停5秒以内,关闭控制台之前一直循环执行流程
C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
window phone WebClient和HttpWebRequest 并解决gb2312乱码问题
httpwebrequest工具类 可以有来抓取网面 代码从网上获取
1.这是一个用HttpWebRequest类构建完整Http多部请求上传文件的示例 2.上传地址是金山文档预览的地址,所以,只要上传的是word、pdf、excel一类的文档,可以通过返回的地址直接在线预览,是一种偷懒的文档在线浏览...
C#中HttpWebRequest使用介绍 GET HTTP HTTPS 请求