/*
* 当前版本:v3.3.16.07.01
* 主版本号 3.3
* 次版本号 16.07.01(更新日期)
* 玄机网C# 基类库 Http请求类
* 基础功能1:基于HttpWebRequest方式 同步/异步 提交数据 包含(Get/Post)
* 基础功能2:基于Wininet系统API方式提交数据 包含(Get/Post)
* 基础功能3:集合常用处理方法.处理页面结果/HTML数据更快捷
*
* Coding by 君临
* 07-12/2014
*
* 使用HttpCode时,请先引用 System.Web
* 如需使用系统自带的Json转换类库,则需要引用 System.Web.Extensions( Framework 2.0不需要 ) 具体方法请参考下文链接 与注释
*
* http://bbs.msdn5.com/thread-11-1-1.html
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Collections;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.IO.Compression;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Security.Cryptography;
//using System.Web.Script.Serialization; //Framework 2.0 下无效可删除 4.0需要本功能请自行开放.
/*
使用系统自带的Json转换C#实体类功能时
请手动再"引用"功能中加入 System.Web.Extensions
*/
namespace HttpCodeLib
{
///
/// Http请求操作类
///
public class HttpHelpers
{
#region 私有变量
///
/// HttpWebRequest对象用来发起请求
///
private HttpWebRequest request = null;
///
/// 获取响应流的数据对象
///
private HttpWebResponse response = null;
///
/// 结果参数
///
private HttpResults result = new HttpResults();
///
/// 应答结果承载的内存流
///
private MemoryStream _stream;
///
/// 承载读取数据流
///
private byte[] RawResponse;
#endregion
#region 同步方法
///
/// 采用httpwebrequest方式访问网络,根据传入的URl地址,得到响应的数据字符串。
///
/// 参数列表
/// 自动维护的字符串cookie
/// HttpResults 为返回结果
public HttpResults GetHtml(HttpItems objHttpItems, ref string cookie)
{
//调用专门读取数据的类
HttpResults res = GetHttpRequestData(objHttpItems);
cookie = new XJHTTP().UpdateCookie(cookie, res.Cookie);
res.Cookie = cookie;
return res;
}
///
///采用httpwebrequest方式访问网络,根据传入的URl地址,得到响应的数据字符串。
///
///参数列表
///HttpResults 为返回结果
public HttpResults GetHtml(HttpItems objHttpItems)
{
//调用专门读取数据的类
return GetHttpRequestData(objHttpItems);
}
///
/// 根据传入的数据,得到相应页面数据
///
/// 请求设置参数
/// 请求结果
private HttpResults GetHttpRequestData(HttpItems objHttpItems)
{
try
{
#region 设置请求参数
SetRequest(objHttpItems);
#endregion
#region 获得应答结果
response = (HttpWebResponse)request.GetResponse();
return GetResponesInfo(ref objHttpItems);
#endregion
}
catch (WebException ex)
{
#region 获取异常数据与结果
response = (HttpWebResponse)ex.Response;
if (response != null)
{
result.StatusCode = response.StatusCode;
result.StatusDescription = ex.Message;
}
else
{
result.StatusCode = HttpStatusCode.NotFound;
result.StatusDescription = ex.Message;
}
if (response != null)
{
return GetResponesInfo(ref objHttpItems);
}
#endregion
}
return result;
}
#endregion
#region 解析数据与处理数据
///
/// 处理响应结果
///
/// 请求设置参数
///
private HttpResults GetResponesInfo(ref HttpItems objHttpItems)
{
#region 设置返回结果
result.StatusCode = response.StatusCode;
result.StatusDescription = response.StatusDescription;
result.Header = response.Headers;
if (response.Cookies != null)
{
result.CookieCollection = response.Cookies;
}
if (response.ResponseUri != null)
{
result.ResponseUrl = response.ResponseUri.ToString();
}
if (response.Headers["set-cookie"] != null)
{
//自动剔除垃圾信息 直接返回正常数据
result.Cookie = new XJHTTP().ClearCookie(response.Headers["set-cookie"]);
}
//处理返回值Container
result.Container = objHttpItems.Container;
#endregion
#region 急速请求,不解析结果数据
if (objHttpItems.ResultType == ResultType.So)
{
return result;
}
#endregion
#region 应答结果转换为内存数据
using (_stream = new MemoryStream())
{
//GZIIP处理
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
{
_stream = GetMemoryStream(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
}
else
{
_stream = GetMemoryStream(response.GetResponseStream());
}
//获取Byte
RawResponse = _stream.ToArray();
}
#endregion
#region 如果设置返回结果类型则返回Byte数据
if (objHttpItems.ResultType == ResultType.Byte)
{
result.ResultByte = RawResponse;
return result;
}
#endregion
#region 处理编码结果
if (objHttpItems.Encoding == null)//如果用户没有指定编码格式
{
try
{
GetEncodingNew(ref objHttpItems);
}
catch
{
//从流中识别
Encoding ed = StreamEncoder.GetEncodingFromBytes(RawResponse);
if (ed != null)
{
objHttpItems.Encoding = ed;
}
else
{
//强制UTF8
objHttpItems.Encoding = Encoding.UTF8;
}
}
}
//得到返回的HTML
try
{
if (RawResponse.Length > 0)
{
result.Html = objHttpItems.Encoding.GetString(RawResponse);
}
else
{
result.Html = "HttpCode接收数据长度为0.请检查数据包";
}
response.Close();
}
catch
{
result.Html = "HttpCode接收数据出现异常.请检查数据包";
}
#endregion
return result;
}
///
/// 识别编码
///
///
private void GetEncodingNew(ref HttpItems objHttpItems)
{
string temp = Encoding.Default.GetString(RawResponse, 0, RawResponse.Length);
Match meta = Regex.Match(temp, " 2) ? meta.Groups[2].Value : string.Empty;
if (charter.IndexOf("\"") > 0)
{
charter = charter.Split('\"')[0];
}
if (charter.IndexOf(" ") > 0)
{
charter = charter.Split(' ')[0];
}
charter = charter.Replace("\"", string.Empty).Replace("'", string.Empty).Replace(";", string.Empty);
if (charter.Length > 0)
{
charter = charter.ToLower().Replace("iso-8859-1", "gbk");
if (string.IsNullOrEmpty(response.CharacterSet.Trim()) || response.CharacterSet.Trim().Contains("utf"))
{
objHttpItems.Encoding = Encoding.UTF8;
}
else
{
Encoding ed = StreamEncoder.GetEncodingFromBytes(RawResponse);
if (ed != null)
{
objHttpItems.Encoding = ed;
}
else
{
//强制UTF8
objHttpItems.Encoding = Encoding.UTF8;
}
}
}
else
{
if (response.CharacterSet != null)
{
if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
{
// encoding = Encoding.GetEncoding("gbk"); 直接改为UTF8编码
objHttpItems.Encoding = Encoding.GetEncoding("gbk");//Encoding.UTF8;
}
else
{
if (string.IsNullOrEmpty(response.CharacterSet.Trim()) || response.CharacterSet.Trim().Contains("utf"))
{
objHttpItems.Encoding = Encoding.UTF8;
}
else
{
objHttpItems.Encoding = Encoding.GetEncoding(response.CharacterSet);
}
}
}
else
{
Encoding ed = StreamEncoder.GetEncodingFromBytes(RawResponse);
if (ed != null)
{
objHttpItems.Encoding = ed;
}
else
{
//强制UTF8
objHttpItems.Encoding = Encoding.UTF8;
}
}
}
}
#endregion
#region 异步方法
///
///采用异步方式访问网络,根据传入的URl地址,得到响应的数据字符串。
///
/// 参数列表
/// 完成后的回调函数
public void AsyncGetHtml(HttpItems objHttpItems, Action callBack)
{
//调用专门读取数据的类
AsyncGetHttpRequestData(objHttpItems, callBack);
}
///
/// 异步获取响应数据
///
///
private void AsyncResponseData(IAsyncResult result)
{
AsyncHttpItem hrt = result.AsyncState as AsyncHttpItem;
if (System.Threading.Interlocked.Increment(ref hrt.atomLock) != 1)
return;
try
{
response = (HttpWebResponse)hrt.request.EndGetResponse(result);
hrt.result = GetResponesInfo(ref hrt.objHttpCodeItem);
hrt.result.Cookie = new XJHTTP().UpdateCookie(hrt.objHttpCodeItem.Cookie, hrt.result.Cookie);
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
if (response != null)
{
hrt.result.StatusCode = response.StatusCode;
hrt.result.StatusDescription = ex.Message;
}
else
{
hrt.result.StatusCode = HttpStatusCode.NotFound;
hrt.result.StatusDescription = ex.Message;
}
if (response != null)
{
hrt.result = GetResponesInfo(ref hrt.objHttpCodeItem);
}
}
hrt.callBack.Invoke(hrt.result);
}
///
/// 根据传入的参数,来异步发起请求
///
/// 请求设置参数
/// 回调函数
private void AsyncGetHttpRequestData(HttpItems objItems, Action callBack)
{
AsyncHttpItem hrt = new AsyncHttpItem();
SetRequest(objItems);
hrt.objHttpCodeItem = objItems;
hrt.request = request;
hrt.callBack = callBack;
try
{
IAsyncResult m_ar = hrt.request.BeginGetResponse(AsyncResponseData, hrt);
System.Threading.ThreadPool.RegisterWaitForSingleObject(m_ar.AsyncWaitHandle,
TimeoutCallback, hrt, objItems.Timeout, true);
}
catch
{
hrt.result.Html = "TimeOut";
}
}
///
/// 超时回调
///
/// HttpRequest对象
/// 超时判断
void TimeoutCallback(object state, bool timedOut)
{
AsyncHttpItem pa = state as AsyncHttpItem;
if (timedOut)
{
if (System.Threading.Interlocked.Increment(ref pa.atomLock) == 1)
{
pa.result.Html = "TimeOut";
pa.callBack.Invoke(pa.result);
}
}
}
#endregion
#region 通用数据方法
///
/// 获取流中的数据转换为内存流处理
///
/// 流
private MemoryStream GetMemoryStream(Stream streamResponse)
{
MemoryStream _stream = new MemoryStream();
int Length = 256;
Byte[] buffer = new Byte[Length];
int bytesRead = streamResponse.Read(buffer, 0, Length);
while (bytesRead > 0)
{
_stream.Write(buffer, 0, bytesRead);
bytesRead = streamResponse.Read(buffer, 0, Length);
}
return _stream;
}
///
/// 反射修改useUnsafeHeaderParsing
///
/// 设置的参数值
///
private bool SetAllowUnsafeHeaderParsing20(bool useUnsafe)
{
System.Reflection.Assembly aNetAssembly = System.Reflection.Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
if (aNetAssembly != null)
{
Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
if (aSettingsType != null)
{
object anInstance = aSettingsType.InvokeMember("Section",
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.NonPublic, null, null, new object[] { });
if (anInstance != null)
{
System.Reflection.FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (aUseUnsafeHeaderParsing != null)
{
aUseUnsafeHeaderParsing.SetValue(anInstance, useUnsafe);
return true;
}
}
}
}
return false;
}
///
/// 为请求准备参数
///
///参数列表
private void SetRequest(HttpItems objHttpItems)
{
#region 处理服务器提交协议错误
if (objHttpItems.UseUnsafe)
{
SetAllowUnsafeHeaderParsing20(objHttpItems.UseUnsafe);
}
#endregion
#region 设置证书
SetCer(objHttpItems);
#endregion
#region 设置Header参数 如果有则添加,如果失败,则重置数据
if (objHttpItems.Header.Count > 0)
{
try
{
request.Headers = objHttpItems.Header;
}
catch
{
request.Headers = new WebHeaderCollection();
}
}
#endregion
#region 添加 Ajax数据头
if (objHttpItems.IsAjax)
{
request.Headers.Add("x-requested-with: XMLHttpRequest");
}
#endregion
#region 设置代理
SetProxy(objHttpItems);
#endregion
#region 通用属性设置
//请求方式Get或者Post
request.Method = objHttpItems.Method;
request.Timeout = objHttpItems.Timeout;
request.ReadWriteTimeout = objHttpItems.ReadWriteTimeout;
//Accept
request.Accept = objHttpItems.Accept;
//ContentType返回类型
request.ContentType = objHttpItems.ContentType;
//UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
request.UserAgent = objHttpItems.UserAgent;
// 如果设置编码,则从设置结果读取
SetEncoding(objHttpItems);
//设置Cookie
SetCookie(objHttpItems);
//来源地址
request.Referer = objHttpItems.Referer;
//是否执行跳转功能
request.AllowAutoRedirect = objHttpItems.Allowautoredirect;
//设置最大连接
if (objHttpItems.Connectionlimit > 0)
{
request.ServicePoint.ConnectionLimit = objHttpItems.Connectionlimit;
System.Net.ServicePointManager.DefaultConnectionLimit = 1024;
}
//设置 post数据在大于1024时是否分包
request.ServicePoint.Expect100Continue = objHttpItems.Expect100Continue;
#endregion
#region 如果当前为Post则设置并提交数据
SetPostData(objHttpItems);
#endregion
}
///
/// 设置证书
///
/// 请求设置参数
private void SetCer(HttpItems objHttpItems)
{
if (!string.IsNullOrEmpty(objHttpItems.CerPath))
{
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
if (objHttpItems.IsEOFError)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
}
//初始化对像,并设置请求的URL地址
request = (HttpWebRequest)WebRequest.Create(GetUrl(objHttpItems.URL));
//创建证书文件
X509Certificate objx509 = new X509Certificate(objHttpItems.CerPath);
//添加到请求里
request.ClientCertificates.Add(objx509);
}
else
{
//初始化对像,并设置请求的URL地址
try
{
request = (HttpWebRequest)WebRequest.Create(GetUrl(objHttpItems.URL));
}
catch
{
throw new Exception("请检查输入的网址!");
}
}
}
///
/// 设置编码
///
/// Http参数
private void SetEncoding(HttpItems objHttpItems)
{
if (!string.IsNullOrEmpty(objHttpItems.EncodingStr))
{
//读取数据时的编码方式
objHttpItems.Encoding = System.Text.Encoding.GetEncoding(objHttpItems.EncodingStr);
}
}
///
/// 设置Cookie
///
/// Http参数
private void SetCookie(HttpItems objHttpItems)
{
if (!string.IsNullOrEmpty(objHttpItems.Cookie))
{
//字符串方式
request.Headers[HttpRequestHeader.Cookie] = objHttpItems.Cookie;
}
if (objHttpItems.CookieCollection != null)
{
//CookieCollection方式
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(objHttpItems.CookieCollection);
}
if (objHttpItems.Container != null)
{
//CookieContainer方式
request.CookieContainer = objHttpItems.Container;
}
}
///
/// 设置Post数据
///
/// Http参数
private void SetPostData(HttpItems objHttpItems)
{
//验证在得到结果时是否有传入数据
if (request.Method.Trim().ToLower() == "post")
{
//写入Byte类型
if (objHttpItems.PostDataType == PostDataType.Byte)
{
//验证在得到结果时是否有传入数据
if (objHttpItems.PostdataByte != null && objHttpItems.PostdataByte.Length > 0)
{
request.ContentLength = objHttpItems.PostdataByte.Length;
request.GetRequestStream().Write(objHttpItems.PostdataByte, 0, objHttpItems.PostdataByte.Length);
}
}//写入文件
else if (objHttpItems.PostDataType == PostDataType.FilePath)
{
using (StreamReader r = new StreamReader(objHttpItems.Postdata, objHttpItems.Encoding))
{
byte[] buffer = objHttpItems.PostEncoding.GetBytes(r.ReadToEnd());
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
}
else
{
if (!string.IsNullOrEmpty(objHttpItems.Postdata))
{
//写入字符串数据.如果希望修改提交时的编码.请修改objHttpItems.PostEncoding
byte[] buffer = objHttpItems.PostEncoding.GetBytes(objHttpItems.Postdata);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
}
}
}
///
/// 设置代理
///
/// 参数对象
private void SetProxy(HttpItems objHttpItems)
{
if (!string.IsNullOrEmpty(objHttpItems.ProxyIp))
{
WebProxy myProxy;
//设置代理服务器
if (objHttpItems.ProxyIp.Contains(":"))
{
string[] plist = objHttpItems.ProxyIp.Split(':');
myProxy = new WebProxy(plist[0].Trim(), Convert.ToInt32(plist[1].Trim()));
}
else
{
myProxy = new WebProxy(objHttpItems.ProxyIp, false);
}
if (!string.IsNullOrEmpty(objHttpItems.ProxyUserName) && !string.IsNullOrEmpty(objHttpItems.ProxyPwd))
{
myProxy.Credentials = new NetworkCredential(objHttpItems.ProxyUserName, objHttpItems.ProxyPwd);
}
request.Proxy = myProxy;
//设置安全凭证
request.Credentials = CredentialCache.DefaultNetworkCredentials;
}
else
{
request.Proxy = null;
}
}
///
/// 回调验证证书问题
///
/// 流对象
/// 证书
/// X509Chain
/// SslPolicyErrors
/// bool
public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
// 总是接受
return true;
}
///
/// 传入一个正确或不正确的URl,返回正确的URL
///
/// url
///
///
public string GetUrl(string URL)
{
if (!(URL.Contains("http://") || URL.Contains("https://")))
{
URL = "http://" + URL;
}
return URL;
}
///
/// 读取返回对象中数据,并返回Image格式图片
///
/// GetHtml后的请求结果
///
public Image GetImg(HttpResults hr)
{
return byteArrayToImage(hr.ResultByte);
}
///
/// 字节数组生成图片
///
/// 字节数组
/// 图片
private Image byteArrayToImage(byte[] Bytes)
{
if (Bytes == null)
{
return null;
}
using (MemoryStream ms = new MemoryStream(Bytes))
{
Image outputImg = Image.FromStream(ms);
return outputImg;
}
}
#endregion
}
///
/// Http请求参考类
///
public class HttpItems
{
string _URL;
///
/// 请求URL必须填写
///
public string URL
{
get { return _URL; }
set { _URL = value; }
}
string _Method = "GET";
///
/// 请求方式默认为GET方式
///
public string Method
{
get { return _Method; }
set { _Method = value; }
}
int _Timeout = 5000;
///
/// 默认请求超时时间
///
public int Timeout
{
get { return _Timeout; }
set { _Timeout = value; }
}
int _ReadWriteTimeout = 5000;
///
/// 默认写入Post数据超时间
///
public int ReadWriteTimeout
{
get { return _ReadWriteTimeout; }
set { _ReadWriteTimeout = value; }
}
string _Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
///
/// 请求标头值 默认为image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
///
public string Accept
{
get { return _Accept; }
set { _Accept = value; }
}
string _ContentType = "application/x-www-form-urlencoded";
///
/// 请求返回类型默认 application/x-www-form-urlencoded
///
public string ContentType
{
get { return _ContentType; }
set { _ContentType = value; }
}
string _UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0";
///
/// 客户端访问信息默认Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
///
public string UserAgent
{
get { return _UserAgent; }
set { _UserAgent = value; }
}
private Encoding _PostEncoding = Encoding.Default;
///
/// Post数据时的编码 默认为 Default,如需必要 请勿修改
///
public Encoding PostEncoding
{
get { return _PostEncoding; }
set { _PostEncoding = value; }
}
///
/// 默认的编码类型,如果不初始化,则为null,每次自动识别
///
public Encoding Encoding = null;
string _Encoding = string.Empty;
///
/// 返回数据编码默认为NUll,可以自动识别
///
public string EncodingStr
{
get { return _Encoding; }
set { _Encoding = value; }
}
private PostDataType _PostDataType = PostDataType.String;
///
/// Post的数据类型
///
public PostDataType PostDataType
{
get { return _PostDataType; }
set { _PostDataType = value; }
}
string _Postdata;
///
/// Post请求时要发送的字符串Post数据
///
public string Postdata
{
get { return _Postdata; }
set { _Postdata = value; }
}
private byte[] _PostdataByte = null;
///
/// Post请求时要发送的Byte类型的Post数据
///
public byte[] PostdataByte
{
get { return _PostdataByte; }
set { _PostdataByte = value; }
}
CookieCollection cookiecollection = null;
///
/// Cookie对象集合
///
public CookieCollection CookieCollection
{
get { return cookiecollection; }
set { cookiecollection = value; }
}
private CookieContainer _Container = null;
///
/// 自动处理cookie
///
public CookieContainer Container
{
get { return _Container; }
set { _Container = value; }
}
string _Cookie = string.Empty;
///
/// 请求时的Cookie
///
public string Cookie
{
get { return _Cookie; }
set { _Cookie = value; }
}
string _Referer = string.Empty;
///
/// 来源地址,上次访问地址
///
public string Referer
{
get { return _Referer; }
set { _Referer = value; }
}
string _CerPath = string.Empty;
///
/// 证书绝对路径
///
public string CerPath
{
get { return _CerPath; }
set { _CerPath = value; }
}
private Boolean isToLower = false;
///
/// 是否设置为全文小写
///
public Boolean IsToLower
{
get { return isToLower; }
set { isToLower = value; }
}
private Boolean isAjax = false;
///
/// 是否增加异步请求头
/// 对应协议 : x-requested-with: XMLHttpRequest
///
public Boolean IsAjax
{
get { return isAjax; }
set { isAjax = value; }
}
private Boolean allowautoredirect = true;
///
/// 支持跳转页面,查询结果将是跳转后的页面
///
public Boolean Allowautoredirect
{
get { return allowautoredirect; }
set { allowautoredirect = value; }
}
///
/// 当该属性设置为 true 时,使用 POST 方法的客户端请求应该从服务器收到 100-Continue 响应,以指示客户端应该发送要发送的数据。此机制使客户端能够在服务器根据请求报头打算拒绝请求时,避免在网络上发送大量的数据
///
private bool expect100Continue = false;
///
/// 当该属性设置为 true 时,使用 POST 方法的客户端请求应该从服务器收到 100-Continue 响应,以指示客户端应该发送要发送的数据。此机制使客户端能够在服务器根据请求报头打算拒绝请求时,避免在网络上发送大量的数据 默认False
///
public bool Expect100Continue
{
get { return expect100Continue; }
set { expect100Continue = value; }
}
private int connectionlimit = 1024;
///
/// 最大连接数
///
public int Connectionlimit
{
get { return connectionlimit; }
set { connectionlimit = value; }
}
private string proxyusername = string.Empty;
///
/// 代理Proxy 服务器用户名
///
public string ProxyUserName
{
get { return proxyusername; }
set { proxyusername = value; }
}
private string proxypwd = string.Empty;
///
/// 代理 服务器密码
///
public string ProxyPwd
{
get { return proxypwd; }
set { proxypwd = value; }
}
private string proxyip = string.Empty;
///
/// 代理 服务IP
///
public string ProxyIp
{
get { return proxyip; }
set { proxyip = value; }
}
private ResultType resulttype = ResultType.String;
///
/// 设置返回类型String和Byte
///
public ResultType ResultType
{
get { return resulttype; }
set { resulttype = value; }
}
private WebHeaderCollection header = new WebHeaderCollection();
///
/// 头数据
///
public WebHeaderCollection Header
{
get { return header; }
set { header = value; }
}
///
/// 如果提示以下错误,请设置为true
/// 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
///
public bool UseUnsafe { get; set; }
///
/// 如果提示以下错误,请设置为true
/// 从传输流收到意外的 EOF 或 0 个字节
///
public bool IsEOFError { get; set; }
}
///
/// Http返回参数类
///
public class HttpResults
{
///
/// 响应结果的URL(可获取自动跳转后地址)
/// 如果获取跳转后地址失败,请使用RedirectUrl属性,
/// 并设置HttpItems对象的Allowautoredirect =false;
///
public string ResponseUrl { get; set; }
///
/// 获取重定向的URL
/// 使用本属性时,请先关闭自动跳转属性
/// 设置方法如下:
/// 设置HttpItems对象的Allowautoredirect =false;
///
public string RedirectUrl
{
get
{
if (Header != null && Header.Count > 0)
{
if (!string.IsNullOrEmpty(Header["location"]))
{
return Header["location"].ToString();
}
return string.Empty;
}
return string.Empty;
}
}
CookieContainer _Container;
///
/// 自动处理Cookie集合对象
///
public CookieContainer Container
{
get { return _Container; }
set { _Container = value; }
}
string _Cookie = string.Empty;
///
/// Http请求返回的Cookie
///
public string Cookie
{
get { return _Cookie; }
set { _Cookie = value; }
}
CookieCollection cookiecollection = new CookieCollection();
///
/// Cookie对象集合
///
public CookieCollection CookieCollection
{
get { return cookiecollection; }
set { cookiecollection = value; }
}
private string html = string.Empty;
///
/// 返回的String类型数据 只有ResultType.String时才返回数据,其它情况为空
///
public string Html
{
get { return html; }
set { html = value; }
}
private byte[] resultbyte = null;
///
/// 返回的Byte数组 只有ResultType.Byte时才返回数据,其它情况为空
///
public byte[] ResultByte
{
get { return resultbyte; }
set { resultbyte = value; }
}
private WebHeaderCollection header = new WebHeaderCollection();
///
/// 头数据
///
public WebHeaderCollection Header
{
get { return header; }
set { header = value; }
}
///
/// Http请求后的状态码
///
public HttpStatusCode StatusCode;
///
/// 状态码的数字形式
///
public int StatusCodeNum
{
get { return Convert.ToInt32(StatusCode); }
}
private string _StatusDescription;
///
/// 详细状态描述
///
public string StatusDescription
{
get { return _StatusDescription; }
set { _StatusDescription = value; }
}
}
///
/// 异步实体类
///
class AsyncHttpItem
{
///
/// 请求结果类
///
public HttpResults result = new HttpResults();
///
/// HttpWebRequest对象用来发起请求
///
public HttpWebRequest request = null;
///
/// 异步回调函数
///
public Action callBack;
///
/// 基础请求设置类
///
public HttpItems objHttpCodeItem;
///
/// 原子锁
///
public int atomLock = 0;
}
///
/// 返回类型
///
public enum ResultType
{
String,//表示只返回字符串
Byte,//表示返回字符串和字节流
So//急速请求,仅返回数据头
}
///
/// Post的数据格式默认为string
///
public enum PostDataType
{
///
/// 字符串
///
String,//字符串
///
/// 字节流
///
Byte,//字符串和字节流
///
/// 文件路径
///
FilePath//表示传入的是文件
}
///
/// WinInet的方式请求数据
///
public class Wininet
{
#region WininetAPI
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SystemTime sysTime);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SystemTime sysTime);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern int InternetOpen(string strAppName, int ulAccessType, string strProxy, string strProxyBypass, int ulFlags);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern int InternetConnect(int ulSession, string strServer, int ulPort, string strUser, string strPassword, int ulService, int ulFlags, int ulContext);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern bool InternetCloseHandle(int ulSession);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern bool HttpAddRequestHeaders(int hRequest, string szHeasers, uint headersLen, uint modifiers);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern int HttpOpenRequest(int hConnect, string szVerb, string szURI, string szHttpVersion, string szReferer, string accetpType, int dwflags, int dwcontext);
[DllImport("wininet.dll")]
private static extern bool HttpSendRequestA(int hRequest, string szHeaders, int headersLen, string options, int optionsLen);
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private static extern bool InternetReadFile(int hRequest, byte[] pByte, int size, out int revSize);
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref System.UInt32 pcchCookieData, int dwFlags, IntPtr lpReserved);
#endregion
public string UserAgent = "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
private int _WininetTimeOut = 0;
///
/// Wininet超时时间 默认0 不设置超时,由于是自行实现(微软没修复超时的bug) 所以如果设置后,每次请求都会暂停.
///
public int WininetTimeOut
{
get { return _WininetTimeOut; }
set { _WininetTimeOut = value; }
}
#region 重载方法
///
/// 使用API获取本地时间
///
///
public DateTime GetLocalTime()
{
SystemTime sysTime = new SystemTime();
GetLocalTime(ref sysTime);
DateTime dt = new DateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
return dt;
}
///
/// 使用API设置本地时间
///
///
public void SetLocalTime(DateTime dt)
{
SystemTime sysTime = new SystemTime();
sysTime.wYear = (ushort)dt.Year;
sysTime.wMonth = (ushort)dt.Month;
sysTime.wDay = (ushort)dt.Day;
sysTime.wHour = (ushort)dt.Hour;
sysTime.wMinute = (ushort)dt.Minute;
sysTime.wSecond = (ushort)dt.Second;
SetLocalTime(ref sysTime);
}
///
/// WinInet 方式GET
///
/// 地址
///
public string GetData(string Url)
{
using (MemoryStream ms = GetHtml(Url, ""))
{
if (ms != null)
{
//无视编码
Match meta = Regex.Match(Encoding.Default.GetString(ms.ToArray()), " 1) ? meta.Groups[2].Value.ToUpper().Trim() : string.Empty;
if (c.IndexOf("\"") > 0)
{
c = c.Split('\"')[0];
}
if (c.Length > 2)
{
if (c.IndexOf("UTF-8") != -1)
{
return Encoding.GetEncoding("UTF-8").GetString(ms.ToArray());
}
}
return Encoding.GetEncoding("GBK").GetString(ms.ToArray());
}
else
{
return null;
}
}
}
///
/// 将内存流转换为字符串
///
/// 需要转换的流
///
public string GetDataPro(MemoryStream mstream)
{
using (MemoryStream ms = mstream)
{
if (ms != null)
{
//无视编码
Match meta = Regex.Match(Encoding.Default.GetString(ms.ToArray()), " 1) ? meta.Groups[2].Value.ToUpper().Trim() : string.Empty;
if (c.IndexOf("\"") > 0)
{
c = c.Split('\"')[0];
}
if (c.Length > 2)
{
if (c.IndexOf("UTF-8") != -1)
{
return Encoding.GetEncoding("UTF-8").GetString(ms.ToArray());
}
}
return Encoding.GetEncoding("GBK").GetString(ms.ToArray());
}
else
{
return null;
}
}
}
///
/// POST
///
/// 地址
/// 提交数据
///
public string PostData(string Url, string postData, StringBuilder Header = null)
{
using (MemoryStream ms = GetHtml(Url, postData, Header))
{
//无视编码
Match meta = Regex.Match(Encoding.Default.GetString(ms.ToArray()), " 1) ? meta.Groups[2].Value.ToUpper().Trim() : string.Empty;
if (c.IndexOf("\"") > 0)
{
c = c.Split('\"')[0];
}
if (c.Length > 2)
{
if (c.IndexOf("UTF-8") != -1)
{
return Encoding.GetEncoding("UTF-8").GetString(ms.ToArray());
}
}
return Encoding.GetEncoding("GBK").GetString(ms.ToArray());
}
}
///
/// GET(UTF-8)模式
///
/// 地址
///
public string GetUtf8(string Url)
{
using (MemoryStream ms = GetHtml(Url, ""))
{
return Encoding.GetEncoding("UTF-8").GetString(ms.ToArray());
}
}
///
/// POST(UTF-8)
///
/// 地址
/// 提交数据
///
public string PostUtf8(string Url, string postData, StringBuilder Header = null)
{
using (MemoryStream ms = GetHtml(Url, postData, Header))
{
return Encoding.GetEncoding("UTF-8").GetString(ms.ToArray());
}
}
///
/// 获取网页图片(Image)
///
/// 图片地址
///
public Image GetImage(string Url)
{
using (MemoryStream ms = GetHtml(Url, ""))
{
if (ms == null)
{
return null;
}
Image img = Image.FromStream(ms);
return img;
}
}
///
/// 获取网页图片(Image)
///
/// Stream流
///
public Image GetImage(MemoryStream mstream)
{
using (MemoryStream ms = mstream)
{
if (ms == null)
{
return null;
}
Image img = Image.FromStream(ms);
return img;
}
}
#endregion
#region 方法
///
/// 重载提交数据(允许使用代理)
///
/// 请求地址
/// 提交的数据(Get时为空)
/// 代理地址(IP:端口 例如 127.0.0.1:8888)
/// 设置cookie,例如 JS增加的cookie.如非需要可不填写
/// 设置数据头,如非需要可不填写
/// 是否允许跳转(允许3xx 跳转)
///
public MemoryStream GetHtmlPro(string Url, string Postdata, string proxy = null, string subcookie = null, string subheader = null, bool isMoved = true)
{
try
{
//声明部分变量
Uri uri = new Uri(Url);
//判断访问方式
string Method = "GET";
if (string.IsNullOrEmpty(Postdata))
{
Method = "GET";
}
else
{
Method = "POST";
}
//判断是否是https
bool https = Url.Substring(0, 5) == "https" ? true : false;
//判断是否开启代理访问
int hSession = 0;//会话句柄
if (string.IsNullOrEmpty(proxy))
{
hSession = InternetOpen(UserAgent, 1, string.Empty, string.Empty, 0);
}
else if (https)
{
hSession = InternetOpen(UserAgent, 3, proxy, string.Empty, 0);
}
else
{
hSession = InternetOpen(UserAgent, 3, "http=" + proxy, string.Empty, 0);
}
if (hSession == 0)
{
InternetCloseHandle(hSession);
return null;//Internet句柄获取失败则返回
}
int hConnect = InternetConnect(hSession, uri.Host, uri.Port, string.Empty, string.Empty, 3, 0, 0);//连接句柄
if (hConnect == 0)
{
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return null;//Internet连接句柄获取失败则返回
}
//请求标记
uint gettype = 2147483648 | 16;
//是否带入cookie
if (!string.IsNullOrEmpty(subcookie))
{
gettype = gettype | 524288;
}
//是否重定向,true重定向,false不重定向
if (!isMoved)
{
gettype = gettype | 2097152;
}
if (https)
{
gettype = gettype | 8388608;
}
else
{
gettype = gettype | 16384;
}
//取HTTP请求句柄
int hRequest = HttpOpenRequest(hConnect, Method, uri.PathAndQuery, "HTTP/1.1", string.Empty, string.Empty, (int)gettype, 0);//请求句柄
if (hRequest == 0)
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return null;//HTTP请求句柄获取失败则返回
}
//添加HTTP头
string sb = string.Empty;
if (string.IsNullOrEmpty(subheader))
{
//如果提交协议头为空则使用内置的
sb += "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
sb += "Content-Type:application/x-www-form-urlencoded\r\n";
sb += "Accept-Language:zh-cn\r\n";
sb += "Referer:" + Url;
}
else
{
sb = subheader;
}
//获取返回数据
if (string.Equals(Method, "GET", StringComparison.OrdinalIgnoreCase))
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, string.Empty, 0);
}
else
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, Postdata, Postdata.Length);
}
//处理返回数据
int revSize = 0;//计次
byte[] bytes = new byte[1024];
MemoryStream ms = new MemoryStream();
while (true)
{
bool readResult = InternetReadFile(hRequest, bytes, 1024, out revSize);
if (readResult && revSize > 0)
{
ms.Write(bytes, 0, revSize);
}
else
{
break;
}
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return ms;
}
catch (Exception)
{
throw;
}
}
///
/// 请求数据
///
/// 请求地址
/// 提交的数据
/// 请求头
///
private MemoryStream GetHtml(string Url, string Postdata, StringBuilder Header = null)
{
try
{
//声明部分变量
Uri uri = new Uri(Url);
string Method = "GET";
if (Postdata != "")
{
Method = "POST";
}
string UserAgent = "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
int hSession = InternetOpen(UserAgent, 1, "", "", 0);//会话句柄
if (hSession == 0)
{
InternetCloseHandle(hSession);
return null;//Internet句柄获取失败则返回
}
int hConnect = InternetConnect(hSession, uri.Host, uri.Port, "", "", 3, 0, 0);//连接句柄
if (hConnect == 0)
{
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return null;//Internet连接句柄获取失败则返回
}
//请求标记
int gettype = -2147483632;
if (Url.Substring(0, 5) == "https")
{
gettype = -2139095024;
}
else
{
gettype = -2147467248;
}
//取HTTP请求句柄
int hRequest = HttpOpenRequest(hConnect, Method, uri.PathAndQuery, "HTTP/1.1", "", "", gettype, 0);//请求句柄
if (hRequest == 0)
{
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return null;//HTTP请求句柄获取失败则返回
}
//添加HTTP头
StringBuilder sb = new StringBuilder();
if (Header == null)
{
sb.Append("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n");
sb.Append("Content-Type:application/x-www-form-urlencoded\r\n");
sb.Append("Accept-Language:zh-cn\r\n");
sb.Append("Referer:" + Url);
}
else
{
sb = Header;
}
//获取返回数据
if (string.Equals(Method, "GET", StringComparison.OrdinalIgnoreCase))
{
if (_WininetTimeOut > 0)
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, "", 0);
}));
th.Start();
th.Join(_WininetTimeOut); //阻塞
}
else
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, "", 0);
}
}
else
{
if (_WininetTimeOut > 0)
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, Postdata, Postdata.Length);
}));
th.Start();
th.Join(_WininetTimeOut); //阻塞
}
else
{
HttpSendRequestA(hRequest, sb.ToString(), sb.Length, Postdata, Postdata.Length);
}
}
//处理返回数据
int revSize = 0;//计次
byte[] bytes = new byte[1024];
MemoryStream ms = new MemoryStream();
while (true)
{
bool readResult = InternetReadFile(hRequest, bytes, 1024, out revSize);
if (readResult && revSize > 0)
{
ms.Write(bytes, 0, revSize);
}
else
{
break;
}
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
return ms;
}
catch (Exception)
{
return null;
}
}
#endregion
#region 获取webbrowser的cookies
///
/// 取出cookies
///
/// 完整的链接格式
///
public string GetCookies(string url)
{
uint datasize = 256;
StringBuilder cookieData = new StringBuilder((int)datasize);
if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x2000, IntPtr.Zero))
{
if (datasize < 0)
return null;
cookieData = new StringBuilder((int)datasize);
if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, IntPtr.Zero))
return null;
}
return cookieData.ToString() + ";";
}
#endregion
#region String与CookieContainer互转
///
/// 遍历CookieContainer
///
///
///
public List GetAllCookies(CookieContainer cc)
{
List lstCookies = new List();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c in colCookies) lstCookies.Add(c);
}
return lstCookies;
}
///
/// 将String转CookieContainer
///
///
///
///
public CookieContainer StringToCookie(string url, string cookie)
{
string[] arrCookie = cookie.Split(';');
CookieContainer cookie_container = new CookieContainer(); //加载Cookie
//try
//{
// foreach (string sCookie in arrCookie)
// {
// if (sCookie.IndexOf("expires") > 0)
// continue;
// cookie_container.SetCookies(new Uri(url), sCookie);
// }
//}
//catch
//{
foreach (string sCookie in arrCookie)
{
if (!string.IsNullOrEmpty(sCookie))
{
Cookie ck = new Cookie();
ck.Name = sCookie.Split('=')[0].Trim();
ck.Value = sCookie.Split('=')[1].Trim();
ck.Domain = url;
cookie_container.Add(ck);
}
}
//}
return cookie_container;
}
///
/// 将CookieContainer转换为string类型
///
///
///
public string CookieToString(CookieContainer cc)
{
System.Collections.Generic.List lstCookies = new System.Collections.Generic.List();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
StringBuilder sb = new StringBuilder();
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c in colCookies)
{
sb.Append(c.Name).Append("=").Append(c.Value).Append(";");
}
}
return sb.ToString();
}
#endregion
}
///
/// 系统时间结构体
///
public struct SystemTime
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMiliseconds;
}
///
/// 玄机网一键HTTP类库
/// 懒人库/快捷库
///
public class XJHTTP
{
HttpItems item = new HttpItems();
HttpHelpers http = new HttpHelpers();
Wininet wnet = new Wininet();
HttpResults hr;
#region Json序列化方法 Framework 2.0下无效 ,默认注释.如需启用 请参考类库文首提示
/*
///
/// 将指定的Json字符串转为指定的T类型对象
///
/// 字符串
/// 转换后的对象,失败为Null
public object JsonToObject(string jsonstr)
{
try
{
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Deserialize(jsonstr);
}
catch (Exception)
{
return null;
}
}
///
/// 将指定的对象转为Json字符串
///
/// 对象
/// 转换后的字符串失败为空字符串
public string ObjectToJson(object obj)
{
try
{
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Serialize(obj);
}
catch (Exception)
{
return string.Empty;
}
}*/
#endregion
#region 时间转换处理方法
///
/// 时间戳转为C#格式时间
///
/// Unix时间戳格式
/// C#格式时间
public DateTime GetTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
///
/// 获取JS时间戳 13位
///
///
public string GetTimeByJs()
{
Type obj = Type.GetTypeFromProgID("ScriptControl");
if (obj == null) return null;
object ScriptControl = Activator.CreateInstance(obj);
obj.InvokeMember("Language", BindingFlags.SetProperty, null, ScriptControl, new object[] { "JScript" });
string js = "function time(){return new Date().getTime()}";
obj.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { js });
return obj.InvokeMember("Eval", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "time()" }).ToString();
}
///
/// 返回13位时间戳 非JS方式
///
///
///
public string GetTimeByCSharp13(int nAddSecond = 0)
{
return (DateTime.UtcNow.AddSeconds(nAddSecond) - DateTime.Parse("1970-01-01 0:0:0")).TotalMilliseconds.ToString("0");
}
///
/// 获取时间戳 C# 10位
///
///
public string GetTimeByCSharp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
///
/// 指定时间转换时间戳
///
///
///
public string GetTimeToStamp(DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return ((time - startTime).TotalSeconds).ToString();
}
///
/// 使用API获取本地时间
///
/// 返回本地电脑的Datatime数据
public DateTime GetLocalTime()
{
return wnet.GetLocalTime();
}
///
/// 使用API设置本地时间
///
/// 需要设置的时间
public void SetLocalTime(DateTime dt)
{
wnet.SetLocalTime(dt);
}
///
/// 获取服务器返回的时间,如果Header中没有Date则返回当前时间
///
/// 请求结果对象
/// 返回本地时区Datatime数据
public DateTime GetServerTime(HttpResults hrs)
{
try
{
return GetTime4Gmt(hrs.Header["Date"].ToString());
}
catch
{
return DateTime.Now;
}
}
///
/// 本地时间转成GMT时间 (参数如果不传入则为当前时间)
/// 本地时间为:2011-9-29 15:04:39
/// 转换后的时间为:Thu, 29 Sep 2011 07:04:39 GMT
///
/// 参数如果不传入则为当前时间 DateTime.Now
///
public string GetTimeToGMTString(DateTime dt = default(DateTime))
{
if (dt == default(DateTime))
{
dt = DateTime.Now;
}
return dt.ToUniversalTime().ToString("r");
}
///
///本地时间转成GMT格式的时间(参数如果不传入则为当前时间)
///本地时间为:2011-9-29 15:04:39
///转换后的时间为:Thu, 29 Sep 2011 15:04:39 GMT+0800
///
/// 参数如果不传入则为当前时间 DateTime.Now
///
public string GetTimeToGMTFormat(DateTime dt = default(DateTime))
{
if (dt == default(DateTime))
{
dt = DateTime.Now;
}
return dt.ToString("r") + dt.ToString("zzz").Replace(":", "");
}
///
/// GMT时间转成本地时间
/// DateTime dt1 = GMT2Local("Thu, 29 Sep 2011 07:04:39 GMT");
/// 转换后的dt1为:2011-9-29 15:04:39
/// DateTime dt2 = GMT2Local("Thu, 29 Sep 2011 15:04:39 GMT+0800");
/// 转换后的dt2为:2011-9-29 15:04:39
///
/// 字符串形式的GMT时间
///
public DateTime GetTime4Gmt(string gmt)
{
DateTime dt = DateTime.MinValue;
try
{
string pattern = "";
if (gmt.IndexOf("+0") != -1)
{
gmt = gmt.Replace("GMT", "");
pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
}
if (gmt.ToUpper().IndexOf("GMT") != -1)
{
pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
}
if (pattern != "")
{
dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
dt = dt.ToLocalTime();
}
else
{
dt = Convert.ToDateTime(gmt);
}
}
catch
{
}
return dt;
}
#endregion
#region 字符串处理方法
///
/// 取文本中间
///
/// 原字符
/// 前面的文本
/// 后面的文本
///
public string GetStringMid(string allStr, string firstStr, string lastStr)
{
//取出前面的位置
int index1 = allStr.IndexOf(firstStr);
//取出后面的位置
int index2 = allStr.IndexOf(lastStr, index1 + firstStr.Length);
if (index1 < 0 || index2 < 0)
{
return "";
}
//定位到前面的位置
index1 = index1 + firstStr.Length;
//判断要取的文本的长度
index2 = index2 - index1;
if (index1 < 0 || index2 < 0)
{
return "";
}
//取出文本
return allStr.Substring(index1, index2);
}
///
/// 批量取文本中间
///
/// 原字符
/// 前面的文本
/// 后面的文本
/// 默认为万能表达式(.*?)
///
public List GetStringMids(string allStr, string firstStr, string lastStr, string regexCode = "(.*?)")
{
List list = new List();
string reString = string.Format("{0}{1}{2}", firstStr, regexCode, lastStr);
Regex reg = new Regex(reString);
MatchCollection mc = reg.Matches(allStr);
for (int i = 0; i < mc.Count; i++)
{
GroupCollection gc = mc[i].Groups; //得到所有分组
for (int j = 1; j < gc.Count; j++) //多分组
{
string temp = gc[j].Value;
if (!string.IsNullOrEmpty(temp))
{
list.Add(temp);
}
}
}
return list;
}
///
/// URL加密适用于淘宝中文编码算法
///
/// 明文
/// 密文
public string EnUrlMethod(string str)
{
byte[] buff = Encoding.Default.GetBytes(str);
string s = "";
for (int ix = 0; ix < buff.Length; ix++)
{
s += "%" + buff[ix].ToString("x2");
}
s = s.ToUpper(); //%62%62%73%2E%6D%73%64%6E%35%2E%63%6F%6D%D0%FE%BB%FA%C2%DB%CC%B3%B3%F6%C6%B7
return s;
}
///
/// Url编码,encoding默认为utf8编码
///
/// 需要编码的字符串
/// 指定编码类型
/// 编码后的字符串
public string UrlEncoding(string str, Encoding encoding = null)
{
if (encoding == null)
{
return System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
}
else
{
return System.Web.HttpUtility.UrlEncode(str, encoding);
}
}
///
/// URL解密适用于淘宝中文编码算法
///
/// 密文
/// 明文
public string DeUrlMethod(string str)
{
try
{
//改进后更适合的算法
List li2 = new List();
string[] strs = str.Split('%');
for (int j = 0; j < strs.Length; j++)
{
if (!string.IsNullOrEmpty(strs[j]))
{
li2.Add(Convert.ToByte(strs[j], 16));
}
}
string res = Encoding.Default.GetString(li2.ToArray());//bbs.msdn5.com玄机论坛出品
return res;
}
catch
{
return "Error";
}
}
///
/// Url解码,encoding默认为utf8编码
///
/// 需要解码的字符串
/// 指定解码类型
/// 解码后的字符串
public string UrlDecoding(string str, Encoding encoding = null)
{
if (encoding == null)
{
return System.Web.HttpUtility.UrlDecode(str, Encoding.UTF8);
}
else
{
return System.Web.HttpUtility.UrlDecode(str, encoding);
}
}
///
/// Html解码 支持 开头编码字符
///
/// 需要解码的字符
///
public string HtmlDecode(string str)
{
string[] strsx = str.Split('△');
if (strsx.Length > 1)
{
return FromUnicodeString(strsx[0], strsx[1].Trim());//Decode2Html(strsx[0], strsx[1].Trim());
}
else
{
return Decode2Html(str);
}
}
private string Decode2Html(string param, string sp = "")
{
string[] paramstr = param.Replace(sp, sp + " ").Replace(sp, "").Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
string str = string.Empty;
foreach (string item in paramstr)
{
try
{
str += (char)int.Parse(item, System.Globalization.NumberStyles.HexNumber);
}
catch
{
str += item;
continue;
}
}
// 如果失败请尝试这种办法 可解决变异HTML 开头非 :-> StringWriter myWriter = new StringWriter(); System.Web.HttpUtility.HtmlDecode(param,myWriter); return myWriter.ToString();
return str;
}
///
/// Html编码 将字符串编码为 开头字符
///
/// 需要编码的字符
///
public string HtmlEncode(string param)
{
string str = string.Empty;
foreach (char item in param.ToCharArray())
{
try
{
str += "" + Convert.ToInt32(item).ToString("x4") + " ";
}
catch
{
str += "ToHtml Error";
}
}
return str;
}
///
/// 取文本右边
/// 默认取出右边所有文本,如果需要取固定长度请设置 length参数
/// 异常则返回空字符串
///
/// 原始字符串
/// 需要确认位置的字符串
/// 默认0,如果设置按照设置的值取出数据
///
public string Right(string str, string right, int length = 0)
{
int pos = str.IndexOf(right, StringComparison.Ordinal);
if (pos < 0) return "";
int len = str.Length;
if (len - pos - right.Length <= 0) return "";
string result = "";
if (length == 0)
{
result = str.Substring(pos + right.Length, len - (pos + right.Length));
}
else
{
result = str.Substring(pos + right.Length, length);
}
return result;
}
///
/// 取文本左边
/// 默认取出左边所有文本,如果需要取固定长度请设置 length参数
/// 异常则返回空字符串
///
/// 原始字符串
/// 需要确认位置的字符串
/// 默认0,如果设置按照设置的值取出数据
///
public string Left(string str, string left, int length = 0)
{
var pos = str.IndexOf(left, StringComparison.Ordinal);
if (pos < 0) return "";
string result = "";
if (length == 0)
{
result = str.Substring(0, pos);
}
else
{
result = str.Substring(length, pos);
}
return result;
}
///
/// 取文本中间的其他写法
///
/// 原始Html
/// 开始字符串
/// 结束字符串
///
public string GetMidHtml(string html, string s, string e)
{
string rx = string.Format("{0}{1}{2}", s, RegexString.AllHtml, e);
if (Regex.IsMatch(html, rx, RegexOptions.IgnoreCase))
{
Match match = Regex.Match(html, rx, RegexOptions.IgnoreCase);
if (match != null && match.Groups.Count > 0)
{
return match.Groups[1].Value.Trim();
}
}
return string.Empty;
}
///
/// Unicode字符转汉字.
/// 默认处理 \u7384\u673a\u8bba\u575b
/// 如果遇到 &7384 &673a &8bba &575b 请对SplitString赋值为&ummary>
/// 原始字符串
/// 默认为u
/// 默认为;
/// 转换后结果
public string FromUnicodeString(string str, string SplitString = "u", string TrimStr = ";")
{
string regexCode = SplitString == "u" ? "\\\\u(\\w{1,4})" : SplitString + "(\\w{1,4})";
string reString = str;
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regexCode);
System.Text.RegularExpressions.MatchCollection mc = reg.Matches(reString);
for (int i = 0; i < mc.Count; i++)
{
try
{
var outs = (char)int.Parse(mc[i].Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
if (str.IndexOf(mc[i].Groups[0].Value + TrimStr) > 0)
{
//如果出现(封号);结尾则连带符号替换
str = str.Replace(mc[i].Groups[0].Value + TrimStr, outs.ToString());
}
else
{
str = str.Replace(mc[i].Groups[0].Value, outs.ToString());
}
}
catch
{
continue;
}
}
return str;
}
///
/// 汉字转Unicode字符 默认\u1234
/// 如需 &x1234 这种Html字符,请修改SplitString为&x
///
/// 需要转换的字符
/// 分隔结果
/// 转换后结果
public string GetUnicodeString(string param, string SplitString = "u")
{
string outStr = "";
for (int i = 0; i < param.Length; i++)
{
try
{
outStr += "\\" + SplitString + ((int)param[i]).ToString("x4");
}
catch
{
outStr += param[i];
continue;
}
}
return outStr;
}
///
/// 将字符串转换为base64格式 默认UTF8编码
///
/// 原始字符串
/// 编码
///
public string GetString2Base64(string str, Encoding encoding = null)
{
if (encoding == null)
{
encoding = Encoding.UTF8;
}
return Convert.ToBase64String(encoding.GetBytes(str));
}
///
/// base64字符串转换为普通格式 默认UTF8编码
///
/// 原始字符串
/// 编码
///
public string GetStringbyBase64(string str, Encoding encoding = null)
{
if (encoding == null)
{
encoding = Encoding.UTF8;
}
byte[] buffer = Convert.FromBase64String(str);
return encoding.GetString(buffer);
}
///
/// 将byte数组转换为AscII字符
///
///
///
public string GetAscii2string(byte[] b)
{
string str = "";
for (int i = 7; i < 19; i++)
{
str += (char)b[i];
}
return str;
}
///
/// 将字节数组转化为十六进制字符串,每字节表示为两位
///
///
///
public string Bytes2HexString(byte[] bytes, int start, int len)
{
string tmpStr = "";
for (int i = start; i < (start + len); i++)
{
tmpStr = tmpStr + bytes[i].ToString("X2");
}
return tmpStr;
}
///
/// 字符串转16进制
///
///
/// 返回十六进制代表的字符串
public string HexToStr(string mHex) // 返回十六进制代表的字符串
{
byte[] bTemp = System.Text.Encoding.Default.GetBytes(mHex);
string strTemp = "";
for (int i = 0; i < bTemp.Length; i++)
{
strTemp += bTemp[i].ToString("X");
}
return strTemp;
}
///
/// 将十六进制字符串转化为字节数组
///
///
///
public byte[] HexString2Bytes(string src)
{
byte[] retBytes = new byte[src.Length / 2];
for (int i = 0; i < src.Length / 2; i++)
{
retBytes[i] = byte.Parse(src.Substring(i * 2, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
}
return retBytes;
}
#endregion
#region Cookie维护处理方法
///
/// 合并Cookie,将cookie2与cookie1合并更新 返回字符串类型Cookie
///
/// 旧cookie
/// 新cookie
///
public string UpdateCookie(string cookie1, string cookie2)
{
StringBuilder sb = new StringBuilder();
Dictionary dicCookie = new Dictionary();
//遍历cookie1
if (!string.IsNullOrEmpty(cookie1))
{
foreach (string cookie in cookie1.Replace(',', ';').Split(';'))
{
if (!string.IsNullOrEmpty(cookie) && cookie.IndexOf('=') > 0)
{
string key = cookie.Split('=')[0].Trim();
string value = cookie.Substring(key.Length + 1).Trim();
dicCookie.Add(key, cookie);
}
}
}
if (!string.IsNullOrEmpty(cookie2))
{
//遍历cookie2
foreach (string cookie in cookie2.Replace(',', ';').Split(';'))
{
if (!string.IsNullOrEmpty(cookie) && cookie.IndexOf('=') > 0)
{
string key = cookie.Split('=')[0].Trim();
string value = cookie.Substring(key.Length + 1).Trim();
if (dicCookie.ContainsKey(key))
{
dicCookie[key] = cookie;
}
else
{
dicCookie.Add(key, cookie);
}
}
}
}
int i = 0;
foreach (var item in dicCookie)
{
i++;
if (i < dicCookie.Count)
{
sb.Append(item.Value + ";");
}
else
{
sb.Append(item.Value);
}
}
return sb.ToString();
}
///
/// 清理string类型Cookie.剔除无用项返回结果为null时遇见错误.
///
///
///
public string ClearCookie(string Cookies)
{
try
{
string rStr = string.Empty;
Cookies = Cookies.Replace(";", "; ");
Regex r = new Regex("(?<=,)(?[^ ]+=(?!deleted;)[^;]+);");
Match m = r.Match("," + Cookies);
while (m.Success)
{
rStr += m.Groups["cookie"].Value + ";";
m = m.NextMatch();
}
return rStr;
}
catch
{
return string.Empty;
}
}
///
/// 从Wininet中获取Cookie对象
///
///
///
public string GetCookieByWininet(string url)
{
return wnet.GetCookies(url);
}
///
/// 获取当前请求所有Cookie
///
///
/// Cookie集合
public List GetAllCookieByHttpItems(HttpItems items)
{
return wnet.GetAllCookies(items.Container);
}
///
/// 获取CookieContainer 中的所有对象
///
///
///
public List GetAllCookie(CookieContainer cc)
{
return wnet.GetAllCookies(cc);
}
///
/// 将 CookieContainer 对象转换为字符串类型
///
///
///
public string CookieTostring(CookieContainer cc)
{
return wnet.CookieToString(cc);
}
///
/// 将文字Cookie转换为CookieContainer 对象
///
///
///
///
public CookieContainer StringToCookie(string url, string cookie)
{
return wnet.StringToCookie(url, cookie);
}
///
/// 【不推荐使用】 推荐使用字符串方式维护Cookie
/// 将StringCookie 添加到 CookieContainer对象中
/// 当CookieContainer出现问题时请调用本方法修复 CookieContainer对象
/// 更新失败时,返回原来的CookieContainer对象
///
///
/// 需要更新的cookie_container
/// 字符串cookie
/// domain默认为空
///
public CookieContainer AddCookieToContainer(CookieContainer cookie_container, string cookie, string domain = "")
{
if (cookie_container == null)
{
cookie_container = new CookieContainer();
}
Regex reg = new Regex("domain=(.*?);");
string rdomain = string.Empty;
if (reg.IsMatch(cookie))
{
rdomain = reg.Match(cookie).Groups[1].Value;
}
else
{
// 有指定域名就用指定的
if (domain.Length > 0)
{
rdomain = domain;
}//匹配失败 如果cookie_container中的数据为0那么直接返回,本次更新失败
else if (cookie_container.Count > 0)
{
try
{
rdomain = new XJHTTP().GetAllCookie(cookie_container)[0].Domain; //得到原cookie_container中的domain. 如果失败,则返回原先对象
}
catch
{
return cookie_container;
}
}
}
string[] arrCookie = cookie.Split(';');
foreach (string sCookie in arrCookie)
{
string vsCookie = sCookie.Replace("HttpOnly,", "").Trim(); //剔除httponly
if (vsCookie.Contains("expires")) //去除过滤时间
{
continue;
}
if (vsCookie.Split(',').Length > 1) //去掉,分隔的cookie
{
vsCookie = vsCookie.Split(',')[1];
}
try
{
if (!string.IsNullOrEmpty(vsCookie))
{
Cookie ck = new Cookie();
ck.Name = vsCookie.Split(new Char[] { '=' }, 2)[0].Trim();
ck.Value = vsCookie.Split(new Char[] { '=' }, 2)[1].Trim();
ck.Domain = rdomain;
cookie_container.Add(ck);
}
}
catch
{
continue;
}
}
return cookie_container;
}
#endregion
#region 设置/删除IE(Webbrowser) Cookie 方法
///
/// 设置cookie
///
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
///
/// 获取cookie
///
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetGetCookie(
string url, string name, StringBuilder data, ref int dataSize);
///
/// 设置IE cookie
///
/// URL
/// Cookie
public void SetIeCookie(string GetUrl, string NewCookie)
{
//获取旧的
StringBuilder cookie = new StringBuilder(new String(' ', 2048));
int datasize = cookie.Length;
bool b = InternetGetCookie(GetUrl, null, cookie, ref datasize);
//删除旧的
foreach (string fileName in System.IO.Directory.GetFiles(System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies)))
{
if (fileName.ToLower().IndexOf(GetUrl) > 0)
{
System.IO.File.Delete(GetUrl);
}
}
//生成新的
foreach (string c in NewCookie.Split(';'))
{
string[] item = c.Split('=');
string name = item[0];
string value = item[1] + ";expires=Sun,22-Feb-2099 00:00:00 GMT";
InternetSetCookie(GetUrl, name, value);
InternetSetCookie(GetUrl, name, value);
InternetSetCookie(GetUrl, name, value);
}
}
///
/// 删除IE COOKIE
///
public void ClearIECookie()
{
CleanAll();
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
}
#region 删除IE COOKIE具体代码
public const int INTERNET_OPTION_END_BROWSER_SESSION = 42;
#region Web清理
[DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
/*
* 7 个静态函数
* 私有函数
* private bool FileDelete() : 删除文件
* private void FolderClear() : 清除文件夹内的所有文件
* private void RunCmd(): 运行内部命令
*
* 公有函数
* public void CleanCookie() : 删除Cookie
* public void CleanHistory() : 删除历史记录
* public void CleanTempFiles() : 删除临时文件
* public void CleanAll() : 删除所有
*
*
*
* */
//private
///
/// 删除一个文件,System.IO.File.Delete()函数不可以删除只读文件,这个函数可以强行把只读文件删除。
///
/// 文件路径
/// 成功为true
public bool FileDelete(string path)
{
//first set the File\'s ReadOnly to 0
//if EXP, restore its Attributes
System.IO.FileInfo file = new System.IO.FileInfo(path);
System.IO.FileAttributes att = 0;
bool attModified = false;
try
{
//### ATT_GETnSET
att = file.Attributes;
file.Attributes &= (~System.IO.FileAttributes.ReadOnly);
attModified = true;
file.Delete();
}
catch
{
if (attModified)
file.Attributes = att;
return false;
}
return true;
}
///
/// 删除文件夹
///
/// 文件夹路径
public void FolderClear(string path)
{
System.IO.DirectoryInfo diPath = new System.IO.DirectoryInfo(path);
foreach (System.IO.FileInfo fiCurrFile in diPath.GetFiles())
{
FileDelete(fiCurrFile.FullName);
}
foreach (System.IO.DirectoryInfo diSubFolder in diPath.GetDirectories())
{
FolderClear(diSubFolder.FullName); // Call recursively for all subfolders
}
}
///
/// 删除历史记录 Win7+ 需要管理员权限
///
public void CleanHistory()
{
string[] theFiles = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.History), "*", System.IO.SearchOption.AllDirectories);
foreach (string s in theFiles)
FileDelete(s);
RunCmd("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1");
}
///
/// 删除临时文件 Win7+ 需要管理员权限
///
public void CleanTempFiles()
{
FolderClear(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache));
RunCmd("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8");
}
///
/// 删除Cookie文件 Win7+ 需要管理员权限
///
public void CleanCookie()
{
string[] theFiles = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies), "*", System.IO.SearchOption.AllDirectories);
foreach (string s in theFiles)
FileDelete(s);
RunCmd("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
}
///
/// 删除全部 历史记录,Cookie,临时文件
///
public void CleanAll()
{
CleanHistory();
CleanCookie();
CleanTempFiles();
}
#endregion
///
/// 调用CMD执行命令
///
///
public void RunCmd(string cmd)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
// 关闭Shell的使用
p.StartInfo.UseShellExecute = false;
// 重定向标准输入
p.StartInfo.RedirectStandardInput = true;
// 重定向标准输出
p.StartInfo.RedirectStandardOutput = true;
//重定向错误输出
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine(cmd);
p.StandardInput.WriteLine("exit");
}
#endregion
#endregion
#region 其他方法
///
/// 执行js代码(JS代码,参数,调用方法名,方法名[默认Eval 可选Run])
///
/// JS代码
/// 参数
/// 调用方法名
/// 方法名:默认Eval 可选Run
///
public string RunJsMethod(string reString, string para, string MethodName, string Method = "Eval")
{
try
{
Type obj = Type.GetTypeFromProgID("ScriptControl");
if (obj == null) return string.Empty;
object ScriptControl = Activator.CreateInstance(obj);
obj.InvokeMember("Language", BindingFlags.SetProperty, null, ScriptControl, new object[] { "JScript" });
obj.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { reString });
object objx = obj.InvokeMember(Method, BindingFlags.InvokeMethod, null, ScriptControl, new object[] { string.Format("{0}({1})", MethodName, para) }).ToString();//执行结果
if (objx == null)
{
return string.Empty;
}
return objx.ToString();
}
catch (Exception ex)
{
string ErrorInfo = string.Format("执行JS出现错误: \r\n 错误描述: {0} \r\n 错误原因: {1} \r\n 错误来源:{2}", ex.Message, ex.InnerException.Message, ex.InnerException.Source);//异常信息
return ErrorInfo;
}
}
///
/// 打开指定URL openType:0使用IE打开,!=0 使用默认浏览器打开
///
/// 需要打开的地址
/// 0使用IE,其他使用默认
public void OpenUrl(string url, int openType = 0)
{
// 调用ie打开网页
if (openType == 0)
{
System.Diagnostics.Process.Start("IEXPLORE.EXE", url);
}
else
{
System.Diagnostics.Process.Start(url);
}
}
///
/// 字符串MD5加密
///
///
///
public string EncryptMD5String(string str)
{
using (MD5 md5String = MD5.Create())
{
StringBuilder sb = new StringBuilder();
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] md5Encrypt = md5String.ComputeHash(bytes);
for (int i = 0; i < md5Encrypt.Length; i++)
{
sb.Append(md5Encrypt[i].ToString("x2"));
}
return sb.ToString();
}
}
#endregion
#region Html处理方法
///
/// 获取所有的A标签
///
/// 要分析的Html代码
/// 返回一个List存储所有的A标签
public List GetAList(string html)
{
List list = null;
string ra = RegexString.Alist;
if (Regex.IsMatch(html, ra, RegexOptions.IgnoreCase))
{
list = new List();
foreach (Match item in Regex.Matches(html, ra, RegexOptions.IgnoreCase))
{
AItem a = null;
try
{
a = new AItem()
{
Href = item.Groups[1].Value,
Text = item.Groups[2].Value,
Html = item.Value,
Type = AType.Text
};
List imglist = GetImgList(a.Text);
if (imglist != null && imglist.Count > 0)
{
a.Type = AType.Img;
a.Img = imglist[0];
}
}
catch { continue; }
if (a != null)
{
list.Add(a);
}
}
}
return list;
}
///
/// 获取所有的Img标签
///
/// 要分析的Html代码
/// 返回一个List存储所有的Img标签
public List GetImgList(string html)
{
List list = null;
string ra = RegexString.ImgList;
if (Regex.IsMatch(html, ra, RegexOptions.IgnoreCase))
{
list = new List();
foreach (Match item in Regex.Matches(html, ra, RegexOptions.IgnoreCase))
{
ImgItem a = null;
try
{
a = new ImgItem()
{
Src = item.Groups[1].Value,
Html = item.Value
};
}
catch { continue; }
if (a != null)
{
list.Add(a);
}
}
}
return list;
}
///
/// 过滤html标签
///
/// html的内容
/// 处理后的文本
public string StripHTML(string html)
{
html = Regex.Replace(html, RegexString.Nscript, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled);
html = Regex.Replace(html, RegexString.Style, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled);
html = Regex.Replace(html, RegexString.Script, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled);
html = Regex.Replace(html, RegexString.Html, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled);
return html;
}
///
/// 过滤html中所有的换行符号
///
/// html的内容
/// 处理后的文本
public string ReplaceNewLine(string html)
{
return Regex.Replace(html, RegexString.NewLine, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
///
/// 提取网页Title
///
/// Html
/// 返回Title
public string GetHtmlTitle(string html)
{
if (Regex.IsMatch(html, RegexString.HtmlTitle))
{
return Regex.Match(html, RegexString.HtmlTitle).Groups[1].Value.Trim();
}
else
{
return string.Empty;
}
}
#endregion
#region 懒人方法
///
/// 文件下载[如果连接不是绝对路径存在跳转默认会自动跳转]
/// 会自动分析协议头中的filename
/// 如果分析失败则直接存储为默认名[默认为:.zip格式].
/// 成功返回true;
///
/// 下载地址
/// 保存绝对路径 如:c://download//
/// Cookie
/// 默认后缀
///
public bool DonwnLoad(string url, string paths, CookieContainer cc, string defaultName = ".zip")
{
try
{
item.URL = url;
item.Allowautoredirect = true;
item.ResultType = ResultType.Byte;
item.Container = cc;
//item.Container = wnet.StringToCookie(url, wnet.GetCookies(url));
hr = http.GetHtml(item);
string strname = hr.Header["Content-Disposition"].Split(new string[] { "filename=" }, StringSplitOptions.RemoveEmptyEntries)[1];
byte[] buffer = hr.ResultByte;
try
{
File.WriteAllBytes(paths + strname, buffer);
}
catch
{
File.WriteAllBytes(paths + defaultName, buffer);
}
return true;
}
catch
{
return false;
}
}
///
/// 文件下载[如果连接不是绝对路径存在跳转默认会自动跳转]
/// 会自动分析协议头中的filename
/// 如果分析失败则直接存储为默认名[默认为:.zip格式].
/// 成功返回true;
///
/// 下载地址
/// 保存绝对路径 如:c://download//
/// Ref Cookie 返回处理后的Cookie可再次使用
/// 编码默认utf8
/// 默认后缀[zip]
///
public bool WebClientDonwnLoad(string Url, string paths, string Referer, ref CookieContainer cc, Encoding Encoder = null, string defaultName = ".zip")
{
try
{
if (Encoder == null)
{
Encoder = Encoding.UTF8;
}
WebClient myClient = new WebClient();
myClient.Headers.Add("Accept: */*");
myClient.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E; .NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");
myClient.Headers.Add("Accept-Language: zh-cn");
myClient.Headers.Add("Content-Type: multipart/form-data");
myClient.Headers.Add("Accept-Encoding: gzip, deflate");
myClient.Headers.Add("Cache-Control: no-cache");
myClient.Headers.Add(CookieTostring(cc));
myClient.Encoding = Encoder;
byte[] buffer = myClient.DownloadData(Url);
string strname = myClient.Headers["Content-Disposition"].Split(new string[] { "filename=" }, StringSplitOptions.RemoveEmptyEntries)[1];
//处理cookie
cc = StringToCookie(Url, myClient.ResponseHeaders["Set-Cookie"].ToString());
try
{
File.WriteAllBytes(paths + strname, buffer);
}
catch
{
File.WriteAllBytes(paths + defaultName, buffer);
}
return true;
}
catch (Exception)
{
return false;
}
}
///
/// WebClient Post 上传
/// 用于上传类型为multipart/form-data
/// 如果上传失败,请检查协议头是否有自定义协议头.如Ajax头
///
/// 上传地址
/// referer
///
/// Cookie
/// 编码默认utf8
///
public string UploadPost(string Url, string Referer, string PostData, ref CookieContainer cc, Encoding Encoder = null)
{
if (Encoder == null)
{
Encoder = Encoding.UTF8;
}
string result = "";
WebClient myClient = new WebClient();
myClient.Headers.Add("Accept: */*");
myClient.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E; .NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");
myClient.Headers.Add("Accept-Language: zh-cn");
myClient.Headers.Add("Content-Type: multipart/form-data");
myClient.Headers.Add("Accept-Encoding: gzip, deflate");
myClient.Headers.Add("Cache-Control: no-cache");
myClient.Headers.Add(CookieTostring(cc));
myClient.Encoding = Encoder;
result = myClient.UploadString(Url, PostData);
//处理cookie
cc = StringToCookie(Url, myClient.ResponseHeaders["Set-Cookie"].ToString());
return result;
}
///
/// 普通请求.直接返回标准结果
///
/// 请求的URL
/// 返回结果
public HttpResults GetHtml(string url)
{
item.URL = url;
return http.GetHtml(item);
}
///
/// 普通请求.直接返回标准结果
///
/// 请求的URL
/// 代理IP地址
///
public HttpResults GetHtml(string url, string ipProxy)
{
item.URL = url;
item.ProxyIp = ipProxy;
return http.GetHtml(item);
}
///
/// 普通请求.直接返回标准结果
///
/// 请求的URL
/// 当前Cookie
///
public HttpResults GetHtml(string url, CookieContainer cc)
{
item.URL = url;
item.Container = cc;
return http.GetHtml(item);
}
///
/// 普通请求.直接返回标准结果
///
/// 请求的URL
/// 当前Cookie
///代理IP地址
///
public HttpResults GetHtml(string url, CookieContainer cc, string ipProxy)
{
item.URL = url;
item.ProxyIp = ipProxy;
item.Container = cc;
return http.GetHtml(item);
}
///
/// 普通请求.直接返回标准结果
///
/// 图片请求地址
/// 上一次请求地址
/// 当前Cookie
///
public HttpResults GetImage(string picurl, string referer, CookieContainer cc)
{
item.URL = picurl;
item.Referer = referer;
item.Container = cc;
item.ResultType = ResultType.Byte;
return http.GetHtml(item);
}
///
/// 普通请求.直接返回Image格式图像
///
/// 图片请求地址
/// 上一次请求地址
/// 当前Cookie
///
public Image GetImageByImage(string picurl, string referer, CookieContainer cc)
{
item.URL = picurl;
item.Referer = referer;
item.Container = cc;
item.ResultType = ResultType.Byte;
return http.GetImg(http.GetHtml(item));
}
///
/// 普通请求.直接返回标准结果
///
/// post地址
/// 上一次请求地址
/// 请求数据
/// 是否需要异步标识
/// 当前Cookie
///
public HttpResults PostHtml(string posturl, string referer, string postdata, bool IsAjax, CookieContainer cc)
{
item.URL = posturl;
item.Referer = referer;
item.Method = "Post";
item.IsAjax = IsAjax;
item.ResultType = ResultType.String;
item.Postdata = postdata;
item.Container = cc;
return http.GetHtml(item);
}
///
/// 异步POST请求 通过回调返回结果
///
/// 请求项
/// 回调地址
public void AsyncPostHtml(HttpItems objHttpItems, Action callBack)
{
http.AsyncGetHtml(objHttpItems, callBack);
}
///
/// 异步GET请求 通过回调返回结果
///
/// 请求项
/// 回调地址
public void AsyncGetHtml(HttpItems objHttpItems, Action callBack)
{
http.AsyncGetHtml(objHttpItems, callBack);
}
///
/// WinInet方式GET请求 直接返回网页内容
///
/// 请求地址
///
public string GetHtmlByWininet(string url)
{
return wnet.GetData(url);
}
///
/// WinInet方式GET请求(UTF8) 直接返回网页内容
///
/// 请求地址
///
public string GetHtmlByWininetUTF8(string url)
{
return wnet.GetUtf8(url);
}
///
/// WinInet方式POST请求 直接返回网页内容
///
/// 提交地址
/// 提交内容
///
public string POSTHtmlByWininet(string url, string postdata)
{
return wnet.PostData(url, postdata);
}
///
/// WinInet方式POST请求 直接返回网页内容
///
/// 提交地址
/// 提交内容
///
public string POSTHtmlByWininetUTF8(string url, string postdata)
{
return wnet.PostData(url, postdata);
}
///
/// WinInet方式请求 图片 直接返回Image
///
/// 提交地址
///
public Image GetImageByWininet(string url)
{
return wnet.GetImage(url);
}
#endregion
}
///
/// 正则表达式静态类
///
public class RegexString
{
///
/// 获取所有的A链接
///
public static readonly string Alist = "([\\s\\S]+?)";
///
/// 获取所有的Img标签
///
public static readonly string ImgList = "
([\\s\\S]*?)>";
///
/// 所有的Nscript
///
public static readonly string Nscript = "[\\s\\S]*?";
///
/// 所有的Style
///
public static readonly string Style = "";
///
/// 所有的Script
///
public static readonly string Script = "";
///
/// 所有的Html
///
public static readonly string Html = "<[\\s\\S]*?>";
///
/// 换行符号
///
public static readonly string NewLine = Environment.NewLine;
///
///获取网页编码
///
public static readonly string Enconding = "
/// 所有Html
///
public static readonly string AllHtml = "([\\s\\S]*?)";
///
/// title
///
public static readonly string HtmlTitle = "([\\s\\S]*?)";
}
///
/// 图片对象
///
public class ImgItem
{
///
/// 图片网址
///
public string Src { get; set; }
///
/// 图片标签Html
///
public string Html { get; set; }
}
///
/// A连接对象
///
public class AItem
{
///
/// 链接地址
///
public string Href { get; set; }
///
/// 链接文本
///
public string Text { get; set; }
///
/// 链接的图片
///
public ImgItem Img { get; set; }
///
/// 整个连接Html
///
public string Html { get; set; }
///
/// A链接的类型 文本/图像
///
public AType Type { get; set; }
}
///
/// A 标签类型
///
public enum AType
{
///
/// 文本链接(默认)
///
Text,
///
/// 图片链接
///
Img
}
///
/// 从流识别编码
///
public class StreamEncoder
{
///
/// 取得一个文本文件的编码方式。如果无法在文件头部找到有效的前导符,Encoding.Default将被返回。
///
/// 文件名。
///
public static Encoding GetEncoding(string fileName)
{
return GetEncoding(fileName, Encoding.Default);
}
///
/// 取得一个文本文件流的编码方式。
///
/// 文本文件流。
///
public static Encoding GetEncoding(FileStream stream)
{
return GetEncoding(stream, Encoding.Default);
}
///
/// 取得一个文本文件的编码方式。
///
/// 文件名。
/// 默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。
///
public static Encoding GetEncoding(string fileName, Encoding defaultEncoding)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
Encoding targetEncoding = GetEncoding(fs, defaultEncoding);
fs.Close();
return targetEncoding;
}
///
/// 取得一个文本文件流的编码方式。
///
/// 文本文件流。
/// 默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。
///
public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
{
Encoding targetEncoding = defaultEncoding;
if (stream != null && stream.Length >= 2)
{
//保存文件流的前4个字节
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
byte byte4 = 0;
//保存当前Seek位置
long origPos = stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
int nByte = stream.ReadByte();
byte1 = Convert.ToByte(nByte);
byte2 = Convert.ToByte(stream.ReadByte());
if (stream.Length >= 3)
{
byte3 = Convert.ToByte(stream.ReadByte());
}
if (stream.Length >= 4)
{
byte4 = Convert.ToByte(stream.ReadByte());
}
//根据文件流的前4个字节判断Encoding
//Unicode {0xFF, 0xFE};
//BE-Unicode {0xFE, 0xFF};
//UTF8 = {0xEF, 0xBB, 0xBF};
if (byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
{
targetEncoding = Encoding.BigEndianUnicode;
}
if (byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
{
targetEncoding = Encoding.Unicode;
}
if (byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
{
targetEncoding = Encoding.UTF8;
}
//恢复Seek位置
stream.Seek(origPos, SeekOrigin.Begin);
}
return targetEncoding;
}
public static System.Text.Encoding GetEncodingFromBytes(byte[] sen)
{
Stream stream = new MemoryStream(sen);
return GetEncoding(stream);
}
// 新增加一个方法,解决了不带BOM的 UTF8 编码问题
///
/// 通过给定的文件流,判断文件的编码类型
///
/// 文件流
/// 文件的编码类型
public static System.Text.Encoding GetEncoding(Stream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
Encoding reVal = Encoding.Default;
using (BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default))
{
byte[] ss = r.ReadBytes(4);
if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
{
reVal = Encoding.Unicode;
}
else
{
if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)
{
reVal = Encoding.UTF8;
}
else
{
int i;
int.TryParse(fs.Length.ToString(), out i);
ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss))
reVal = Encoding.UTF8;
}
}
r.Close();
return reVal;
}
}
///
/// 判断是否是不带 BOM 的 UTF8 格式
///
///
///
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
return false;
}
return true;
}
}
}