You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

680 lines
20 KiB

3 years ago
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace learun.wechat
{
/// <summary>
/// 版 本 EasyCode EC管理后台
/// Copyright (c) 2019-present EC管理有限公司
/// 创建人:tobin
/// 日 期:2019.11.06
/// 描 述:http请求
/// </summary>
public class HttpHelper
{
/// <summary>
/// 是否是调试
/// </summary>
public bool Debug { get; set; }
/// <summary>
/// cookies
/// </summary>
public CookieCollection Cookies
{
get { return _cookies; }
}
/// <summary>
/// 清空cookies
/// </summary>
public void ClearCookies()
{
_cookies = new CookieCollection();
}
private CookieCollection _cookies = new CookieCollection();
private static readonly string DefaultUserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
/// <summary>
/// 创建GET方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="Referer">重定向</param>
/// <param name="headers">头部信息</param>
/// <returns></returns>
public async Task<HttpWebResponse> CreateGetHttpResponse(string url, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
if (Debug)
{
Console.Write("Start Get Url:{0} ", url);
}
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
HttpWebRequest request;
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "GET";
request.Headers["Pragma"] = "no-cache";
request.Accept = "text/html, application/xhtml+xml, */*";
request.Headers["Accept-Language"] = "en-US,en;q=0.5";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = DefaultUserAgent;
request.Referer = Referer;
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value * 1000;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
else
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(Cookies);
}
var v = await request.GetResponseAsync() as HttpWebResponse;
Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
Cookies.Add(v.Cookies);
if (Debug)
{
Console.WriteLine("OK");
}
return v;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="Referer">重定向</param>
/// <param name="headers">头部信息</param>
/// <returns></returns>
public async Task<HttpWebResponse> CreatePostHttpResponse(string url, IDictionary<string, string> parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
if (Debug)
{
Console.Write("Start Post Url:{0} ", url);
foreach (KeyValuePair<string, string> keyValuePair in parameters)
{
Console.Write(",{0}:{1}", keyValuePair.Key, keyValuePair.Value);
}
}
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
request.Referer = Referer;
request.Headers["Accept-Language"] = "en-US,en;q=0.5";
request.UserAgent = DefaultUserAgent;
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Pragma"] = "no-cache";
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
else
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(Cookies);
}
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value * 1000;
}
request.Expect = string.Empty;
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
var buffer = CraeteParameter(parameters);
byte[] data = requestEncoding.GetBytes(buffer.ToString());
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
stream.Dispose();
}
var v = await request.GetResponseAsync() as HttpWebResponse;
Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
Cookies.Add(v.Cookies);
if (Debug)
{
Console.WriteLine("OK");
}
return v;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="Referer">重定向</param>
/// <param name="headers">头部信息</param>
/// <returns></returns>
public async Task<HttpWebResponse> CreatePostHttpResponse(string url, string parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
if (Debug)
{
Console.Write("Start Post Url:{0} ,parameters:{1} ", url, parameters);
}
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5");
request.Method = "POST";
request.Accept = "text/html, application/xhtml+xml, */*";
request.Referer = Referer;
request.Headers["Accept-Language"] = "en-US,en;q=0.5";
request.UserAgent = DefaultUserAgent;
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Pragma"] = "no-cache";
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
else
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(Cookies);
}
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value * 1000;
}
request.Expect = string.Empty;
//如果需要POST数据
if (!string.IsNullOrEmpty(parameters))
{
byte[] data = requestEncoding.GetBytes(parameters);
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
stream.Dispose();
}
var v = await request.GetResponseAsync() as HttpWebResponse;
Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
Cookies.Add(v.Cookies);
if (Debug)
{
Console.WriteLine("OK");
}
return v;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="filePath">文件路径</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="Referer">重定向</param>
/// <param name="headers">头部信息</param>
/// <returns></returns>
public async Task<HttpWebResponse> CreatePostFileHttpResponse(string url, string filePath, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
if (Debug)
{
Console.Write("Start Post Url:{0} ", url);
}
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
request.Referer = Referer;
request.Headers["Accept-Language"] = "en-US,en;q=0.5";
request.UserAgent = DefaultUserAgent;
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Pragma"] = "no-cache";
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
else
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(Cookies);
}
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value * 1000;
}
request.Expect = string.Empty;
//如果需要POST数据
if (!string.IsNullOrEmpty(filePath))
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
BinaryReader r = new BinaryReader(fs);
//时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
//请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(fs.Name);
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
request.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
request.ContentLength = length;
//开始上传时间
DateTime startTime = DateTime.Now;
byte[] filecontent = new byte[fs.Length];
fs.Read(filecontent, 0, filecontent.Length);
using (Stream stream = request.GetRequestStream())
{
//发送请求头部消息
stream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
stream.Write(filecontent, 0, filecontent.Length);
//添加尾部的时间戳
stream.Write(boundaryBytes, 0, boundaryBytes.Length);
}
}
}
var v = await request.GetResponseAsync() as HttpWebResponse;
Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
Cookies.Add(v.Cookies);
if (Debug)
{
Console.WriteLine("OK");
}
return v;
}
/// <summary>
/// 创建参数
/// </summary>
/// <param name="parameters">参数</param>
/// <returns></returns>
public static string CraeteParameter(IDictionary<string, string> parameters)
{
StringBuilder buffer = new StringBuilder();
foreach (string key in parameters.Keys)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
return buffer.ToString().TrimStart('&');
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
/// <summary>
/// post请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="responseEncoding">发送HTTP响应时所用的编码</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="Referer">重定向</param>
/// <param name="headers">头部信息</param>
/// <returns></returns>
public async Task<string> Post(string url, IDictionary<string, string> parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
HttpWebResponse response = await CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers);
try
{
StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding);
string res = reader.ReadToEnd();
reader.Close();
reader.Dispose();
return res;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// post请求
/// </summary>
/// <param name="url"></param>
/// <param name="parameters"></param>
/// <param name="requestEncoding"></param>
/// <param name="responseEncoding"></param>
/// <param name="timeout"></param>
/// <param name="userAgent"></param>
/// <param name="cookies"></param>
/// <param name="Referer"></param>
/// <param name="headers"></param>
/// <returns></returns>
public async Task<string> Post(string url, string parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
HttpWebResponse response = await CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers);
try
{
StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding);
string res = reader.ReadToEnd();
reader.Close();
reader.Dispose();
return res;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// post请求
/// </summary>
/// <param name="url"></param>
/// <param name="filePath"></param>
/// <param name="responseEncoding"></param>
/// <param name="timeout"></param>
/// <param name="userAgent"></param>
/// <param name="cookies"></param>
/// <param name="Referer"></param>
/// <param name="headers"></param>
/// <returns></returns>
public async Task<string> PostFile(string url, string filePath, Encoding responseEncoding,
int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "",
Dictionary<string, string> headers = null)
{
HttpWebResponse response = await CreatePostFileHttpResponse(url, filePath, timeout, userAgent, cookies, Referer,
headers);
try
{
StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding);
string res = reader.ReadToEnd();
reader.Close();
reader.Dispose();
return res;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// get请求
/// </summary>
/// <param name="url"></param>
/// <param name="responseEncoding"></param>
/// <param name="timeout"></param>
/// <param name="userAgent"></param>
/// <param name="cookies"></param>
/// <param name="Referer"></param>
/// <param name="headers"></param>
/// <returns></returns>
public async Task<string> Get(string url, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
HttpWebResponse response = await CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers);
try
{
StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding);
string res = reader.ReadToEnd();
reader.Close();
reader.Dispose();
return res;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// get请求
/// </summary>
/// <param name="url"></param>
/// <param name="timeout"></param>
/// <param name="userAgent"></param>
/// <param name="cookies"></param>
/// <param name="Referer"></param>
/// <param name="headers"></param>
/// <returns></returns>
public async Task<(byte[] by, Dictionary<string, string> header)> GetFile(string url, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
{
HttpWebResponse response = await CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers);
Dictionary<string, string> header = new Dictionary<string, string>();
foreach (string key in response.Headers.AllKeys)
{
header.Add(key, response.Headers[key]);
}
try
{
Stream st = response.GetResponseStream();
byte[] by = new byte[response.ContentLength];
st.Read(by, 0, by.Length);
st.Close();
return (by, header);
}
catch (Exception)
{
return (null, header);
}
}
}
}