/// <summary> /// 根据相传入的数据,得到相应页面数据 /// </summary> /// <param name="item">参数类对象</param> /// <returns>返回HttpResult类型</returns> public HttpResult GetHtml(HttpItem item) { //返回参数 HttpResult result = new HttpResult(); try { //准备参数 SetRequest(item); } catch (Exception ex) { //配置参数时出错 return new HttpResult() { Cookie = string.Empty, Header = null, Html = ex.Message, StatusDescription = "配置参数时出错:" + ex.Message }; } try { //请求数据 using (response = (HttpWebResponse)request.GetResponse()) { GetData(item, result); } } catch (WebException ex) { if (ex.Response != null) { using (response = (HttpWebResponse)ex.Response) { GetData(item, result); } } else { result.Html = ex.Message; } } catch (Exception ex) { result.Html = ex.Message; } if (item.IsToLower) result.Html = result.Html.ToLower(); return result; }
/// <summary> /// 设置编码 /// </summary> /// <param name="item">HttpItem</param> /// <param name="result">HttpResult</param> /// <param name="ResponseByte">byte[]</param> private void SetEncoding(HttpItem item, HttpResult result, byte[] ResponseByte) { //是否返回Byte类型数据 if (item.ResultType == ResultType.Byte) result.ResultByte = ResponseByte; //从这里开始我们要无视编码了 if (encoding == null) { Match meta = Regex.Match(Encoding.Default.GetString(ResponseByte), "<meta[^<]*charset=([^<]*)[\"']", RegexOptions.IgnoreCase); string c = string.Empty; if (meta != null && meta.Groups.Count > 0) { c = meta.Groups[1].Value.ToLower().Trim(); } if (c.Length > 2) { try { encoding = Encoding.GetEncoding(c.Replace("\"", string.Empty).Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk").Trim()); } catch { if (string.IsNullOrEmpty(response.CharacterSet)) { encoding = Encoding.UTF8; } else { encoding = Encoding.GetEncoding(response.CharacterSet); } } } else { if (string.IsNullOrEmpty(response.CharacterSet)) { encoding = Encoding.UTF8; } else { encoding = Encoding.GetEncoding(response.CharacterSet); } } } }
/// <summary> /// 获取数据的并解析的方法 /// </summary> /// <param name="item"></param> /// <param name="result"></param> private void GetData(HttpItem item, HttpResult result) { #region base //获取StatusCode result.StatusCode = response.StatusCode; //获取StatusDescription result.StatusDescription = response.StatusDescription; //获取Headers result.Header = response.Headers; //获取CookieCollection if (response.Cookies != null) result.CookieCollection = response.Cookies; //获取set-cookie if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"]; #endregion #region byte //处理网页Byte byte[] ResponseByte = GetByte(); #endregion #region Html if (ResponseByte != null & ResponseByte.Length > 0) { //设置编码 SetEncoding(item, result, ResponseByte); //得到返回的HTML result.Html = encoding.GetString(ResponseByte); } else { //没有返回任何Html代码 result.Html = string.Empty; } #endregion }
/// <summary> /// 根据相传入的数据,得到相应页面数据 /// </summary> /// <param name="item">参数类对象</param> /// <returns>返回HttpResult类型</returns> public HttpResult GetHtml(HttpItem item) { //返回参数 HttpResult result = new HttpResult(); try { //准备参数 SetRequest(item); } catch (Exception ex) { return new HttpResult() { Cookie = string.Empty, Header = null, Html = ex.Message, StatusDescription = "配置参数时出错:" + ex.Message }; } try { #region 得到请求的response using (response = (HttpWebResponse)request.GetResponse()) { result.StatusCode = response.StatusCode; result.StatusDescription = response.StatusDescription; result.Header = response.Headers; if (response.Cookies != null) result.CookieCollection = response.Cookies; if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"]; byte[] ResponseByte = null; using (MemoryStream _stream = new MemoryStream()) { //GZIIP处理 if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase)) { //开始读取流并设置编码方式 new GZipStream(response.GetResponseStream(), CompressionMode.Decompress).CopyTo(_stream, 10240); } else { //开始读取流并设置编码方式 response.GetResponseStream().CopyTo(_stream, 10240); } //获取Byte ResponseByte = _stream.ToArray(); } if (ResponseByte != null & ResponseByte.Length > 0) { //是否返回Byte类型数据 if (item.ResultType == ResultType.Byte) result.ResultByte = ResponseByte; //从这里开始我们要无视编码了 if (encoding == null) { Match meta = Regex.Match(Encoding.Default.GetString(ResponseByte), "<meta([^<]*)charset=([^<]*)[\"']", RegexOptions.IgnoreCase); string c = (meta.Groups.Count > 1) ? meta.Groups[2].Value.ToLower().Trim() : string.Empty; if (c.Length > 2) { try { if (c.IndexOf(" ") > 0) c = c.Substring(0, c.IndexOf(" ")); encoding = Encoding.GetEncoding(c.Replace("\"", "").Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk").Trim()); } catch { if (string.IsNullOrEmpty(response.CharacterSet)) encoding = Encoding.UTF8; else encoding = Encoding.GetEncoding(response.CharacterSet); } } else { if (string.IsNullOrEmpty(response.CharacterSet)) encoding = Encoding.UTF8; else encoding = Encoding.GetEncoding(response.CharacterSet); } } //得到返回的HTML result.Html = encoding.GetString(ResponseByte); } else { //得到返回的HTML result.Html = "本次请求并未返回任何数据"; } } #endregion } catch (WebException ex) { //这里是在发生异常时返回的错误信息 response = (HttpWebResponse)ex.Response; result.Html = ex.Message; if (response != null) { result.StatusCode = response.StatusCode; result.StatusDescription = response.StatusDescription; } } catch (Exception ex) { result.Html = ex.Message; } if (item.IsToLower) result.Html = result.Html.ToLower(); return result; }
/// <summary> /// 线程池抓取任务 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static void ExeTask(object obj) { CrawlTask sCrawlTask = obj as CrawlTask; CrawlResult sCrawlResult = new CrawlResult(sCrawlTask.ID, sCrawlTask.PlotKey, sCrawlTask.LineID); sCrawlTask.List.ForEach(t => { try { item.URL = t.Url; item.Method = "get"; result = httpHelper.GetHtml(item); sCrawlResult.List.Add(new CrawlResultDetail { Result = true, ID = t.ID, Ext = "html", Content = result.Html, Info = null }); if (DelayMin >= DelayMax) { DelayMax = DelayMin + 5000; } Thread.Sleep(new Random().Next(DelayMin, DelayMax)); } catch (Exception ee) { sCrawlResult.List.Add(new CrawlResultDetail { Result = false, ID = t.ID, Ext = "Error", Content = null, Info = ee.Message }); } }); lock (mLocker) { mTaskPool.Remove(sCrawlTask.ID); //界面设计 HostStatus sHostStatus; if (mHostDic.TryGetValue(sCrawlTask.Host, out sHostStatus)) { //sHostStatus.Total += sCrawlResult.List.Count; sHostStatus.TaskCount--; } } //发送任务回数据中心 WCFServer.SendingCrawlResult(sCrawlResult, sCrawlTask.Authority); }
/// <summary> /// 获取有权限的门禁列表 /// </summary> /// <param name="row"></param> /// <returns></returns> private string GetDoorList(DataRow row) { #region 获取基本传参 string CommID = string.Empty; if (row.Table.Columns.Contains("CommID")) { CommID = row["CommID"].ToString(); } string RoomID = string.Empty; if (row.Table.Columns.Contains("RoomID")) { RoomID = row["RoomID"].ToString(); } #endregion #region 获取小区配置和房间配置 Tb_Community tb_Community = GetCommunityByCommID(CommID); if (null == tb_Community) { return(new ApiResult(false, "未配置该小区").toJson()); } string erpConnStr = GetConnectionStr(tb_Community); LiLingEntranceConfig lilingEntranceConfig = null; dynamic RoomConfig = null; using (IDbConnection conn = new SqlConnection(erpConnStr)) { dynamic Config = conn.QueryFirstOrDefault("SELECT * FROM Tb_LiLing_Entrance_Config WHERE CommID = @CommID", new { CommID }); if (null == Config) { return(new ApiResult(false, "该小区未配置门禁信息").toJson()); } try { lilingEntranceConfig = JsonConvert.DeserializeObject <LiLingEntranceConfig>(Convert.ToString(Config.Config)); } catch (Exception) { return(new ApiResult(false, "门禁配置信息有误").toJson()); } if (null == lilingEntranceConfig) { return(new ApiResult(false, "门禁配置信息为空").toJson()); } RoomConfig = conn.QueryFirstOrDefault("SELECT CallNum,BlueNum,QRCodeNum FROM Tb_LiLing_Entrance_Room WHERE CommID = @CommID AND RoomID = @RoomID", new { CommID, RoomID }); if (null == RoomConfig) { return(new ApiResult(false, "房间权限配置信息为空").toJson()); } } string SERVER_URL = lilingEntranceConfig.ServerUrl; string CLIENT_USERNAME = lilingEntranceConfig.ClientUserName; string CLIENT_OSTYPE = lilingEntranceConfig.ClientOSType; string CLIENT_ID = lilingEntranceConfig.ClientID; string CLIENT_SECRET = lilingEntranceConfig.ClientSecret; #endregion #region 获取AccessToken string access_token = string.Empty; string sessionId = string.Empty; string Cookie = string.Empty; try { string param = $"client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&grant_type=client_credentials&userName={CLIENT_USERNAME}&osType={CLIENT_OSTYPE}"; HttpHelper http = new HttpHelper(); HttpItem item = new HttpItem() { URL = SERVER_URL + "/rest/accesstoken/getAccessToken", //URL 必需项 Method = "POST", //URL 可选项 默认为Get Timeout = 3000, //连接超时时间 可选项默认为100000 ReadWriteTimeout = 3000, //写入Post数据超时时间 可选项默认为30000 IsToLower = false, //得到的HTML代码是否转成小写 可选项默认转小写 ContentType = "application/x-www-form-urlencoded", PostEncoding = Encoding.UTF8, Cookie = Cookie, Postdata = param, //Post数据 可选项GET时不需要写 ResultType = ResultType.String, //返回数据类型,是Byte还是String ProtocolVersion = HttpVersion.Version11, //获取或设置用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11 }; HttpResult result = http.GetHtml(item); JObject jObj = JsonConvert.DeserializeObject <JObject>(result.Html); if (!"1".Equals(jObj["code"].ToString()) || !"success".Equals(jObj["state"].ToString())) { GetLog().Debug("LiLingEntrance:获取AccessToken失败:" + JsonConvert.SerializeObject(jObj)); return(new ApiResult(false, "获取AccessToken失败,请重试").toJson()); } access_token = (string)jObj["access_token"]; sessionId = (string)jObj["sessionId"]; Cookie = $"JSESSIONID={sessionId}"; } catch (Exception ex) { GetLog().Error(ex.Message + Environment.CommandLine + ex.StackTrace); return(new ApiResult(false, "获取AccessToken异常,请重试").toJson()); } #endregion #region 获取本项目蓝牙门禁信息 string neigh_no = lilingEntranceConfig.NeighStructure; List <string> DoorList = new List <string>(); try { string param = $"access_token={access_token}&neigh_no={neigh_no}"; HttpHelper http = new HttpHelper(); HttpItem item = new HttpItem() { URL = SERVER_URL + "/rest/api/third/getDoorList", //URL 必需项 Method = "POST", //URL 可选项 默认为Get Timeout = 3000, //连接超时时间 可选项默认为100000 ReadWriteTimeout = 3000, //写入Post数据超时时间 可选项默认为30000 IsToLower = false, //得到的HTML代码是否转成小写 可选项默认转小写 ContentType = "application/x-www-form-urlencoded", PostEncoding = Encoding.UTF8, Cookie = Cookie, Postdata = param, //Post数据 可选项GET时不需要写 ResultType = ResultType.String, //返回数据类型,是Byte还是String ProtocolVersion = HttpVersion.Version11, //获取或设置用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11 }; HttpResult result = http.GetHtml(item); JObject jObj = JsonConvert.DeserializeObject <JObject>(result.Html); if (!"1".Equals(jObj["code"].ToString()) || !"success".Equals(jObj["state"].ToString())) { GetLog().Debug("LiLingEntrance:获取小区门禁列表失败:" + JsonConvert.SerializeObject(jObj)); return(new ApiResult(false, "获取小区门禁列表失败,请重试").toJson()); } JArray door_list = (JArray)jObj["door_list"]; if (null != door_list) { foreach (JObject door in door_list) { DoorList.Add(door["door_name"].ToString()); } } } catch (Exception ex) { GetLog().Error(ex.Message + Environment.CommandLine + ex.StackTrace); return(new ApiResult(false, "获取小区门禁列表异常,请重试").toJson()); } #endregion return(new ApiResult(true, new { RoomConfig = RoomConfig, DoorList = DoorList }).toJson()); }