/// <summary> /// 获取城市天气信息 /// </summary> /// <param name="cityId">天气城市代号</param> /// <returns>返回城市天气信息,参数无法解析会返回null</returns> public WeatherInfo GetWeatherInfo(string cityId) { string getUrl = string.Format("http://www.weather.com.cn/data/cityinfo/{0}.html", cityId); JObject weatherResult = SimulateRequest.HttpGet <JObject>(getUrl); string weatherStr = weatherResult["weatherinfo"]?.ToString(); if (!string.IsNullOrWhiteSpace(weatherStr)) { ClimateInfo climate = JsonConvert.DeserializeObject <ClimateInfo>(weatherStr); if (climate != null) { WeatherInfo weatherSky = new WeatherInfo() { CityId = climate.cityid, CityName = climate.city, TempMin = climate.temp1, TempMax = climate.temp2, WeatherDesc = climate.weather, WindImg1 = climate.img1, WindImg2 = climate.img2, Time = climate.ptime }; } } return(null); }
/// <summary> /// 随机获取笑话 /// </summary> /// <returns>随机笑话数据集合</returns> public JuHeResponse <JokesData> RandomJokes() { string url = string.Format("http://v.juhe.cn/joke/randJoke.php?key={0}", JuHeOptions.AppKey); JuHeResponse <JokesData> jokesDataResult = SimulateRequest.HttpGet <JuHeResponse <JokesData> >(url); return(jokesDataResult); }
/// <summary> /// 获取城市天空气象信息 /// </summary> /// <returns>返回天空气象信息,参数无法解析会返回null</returns> public WeatherSky GetWeatherSky(string cityId) { string getUrl = string.Format("http://www.weather.com.cn/data/sk/{0}.html", cityId); JObject weatherResult = SimulateRequest.HttpGet <JObject>(getUrl); string weatherStr = weatherResult["weatherinfo"]?.ToString(); if (!string.IsNullOrWhiteSpace(weatherStr)) { SkyClimate skyClimate = JsonConvert.DeserializeObject <SkyClimate>(weatherStr); if (skyClimate != null) { WeatherSky weatherSky = new WeatherSky() { CityId = skyClimate.cityid, CityName = skyClimate.city, Condition = skyClimate.njd, Humidity = skyClimate.SD, Sm = skyClimate.sm, Temperature = skyClimate.temp, Time = skyClimate.time, WindDirection = skyClimate.WD, WindGrade = skyClimate.WS, WindPower = skyClimate.AP, WindGradeE = skyClimate.WSE, IsRadar = skyClimate.isRadar, Radar = skyClimate.Radar }; } } return(null); }
/// <summary> /// 获取天气服务提供的区域信息 /// </summary> /// <param name="level">区域等级</param> /// <param name="areaCode">区域代号,当level=1时请默认留空</param> /// <returns>区域信息</returns> public List <AreaCodeName> SearchAreaCode(AreaLevel level, string areaCode = "") { string redisKey = string.Format(RedisKeyPrefix.AREA_CODE_LIST, level, areaCode); List <AreaCodeName> areaInfoList = redisHelper.StringGet <List <AreaCodeName> >(redisKey);//先从缓存中读取 if (areaInfoList != null) { return(areaInfoList); } string getUrl = string.Format("http://www.weather.com.cn/data/list3/city{0}.xml?level={1}", areaCode, (int)level); string areaStr = SimulateRequest.HttpGet(getUrl); string[] areaResultAry = areaStr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); areaInfoList = areaResultAry.Select(areaResult => { string[] areaAry = areaResult.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); return(new AreaCodeName { Code = areaAry[0], Name = areaAry[1] }); }).ToList(); if (areaInfoList != null && areaInfoList.Count > 0) { redisHelper.StringSet(redisKey, areaInfoList, TimeSpan.FromSeconds(CacheTime.Term_S)); } return(areaInfoList); }
/// <summary> /// 直接去微信获取AccessToken /// </summary> /// <returns>微信提供的AccessToken</returns> private string GetWeChatAccessToken() { if (WeChatConfig == null) { throw new NullReferenceException("请使用构造ConnectLinkUp(idOrAppId),或初始化Initialize(idOrAppId)"); } string accessToken = String.Empty; string appId = WeChatConfig.AppID; string secret = WeChatConfig.AppSecret; string url = String.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, secret); string resultStr = SimulateRequest.HttpGet(url); WeChatResult <AccessToken> accessTokenResult = new WeChatResult <AccessToken>(resultStr); if (accessTokenResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"直接去微信获取AccessToken,GetWeChatAccessToken(),{accessTokenResult}"); } else { accessToken = accessTokenResult.resultData.access_token; string accessTokenKey = string.Format(RedisKeyPrefix.WECHAT_ACCESS_TOKEN, appId); int validTime = accessTokenResult.resultData.expires_in - 600;//有效时间提前10分钟 redisHelper.StringSet(accessTokenKey, accessTokenResult.resultData, TimeSpan.FromSeconds(validTime)); } return(accessToken); }
/// <summary> /// 直接去微信获取AccessToken /// </summary> /// <returns>微信提供的AccessToken</returns> private string GetWeixinAccessToken() { logObj.Info("直接去微信获取AccessToken,GetWeixinAccessToken()"); string accessToken = String.Empty; string appId = ConfigurationManager.AppSettings["AppID"]; string secret = ConfigurationManager.AppSettings["AppSecret"]; string url = String.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, secret); string resultStr = SimulateRequest.HttpGet(url); var resultObj = JsonConvert.DeserializeObject <JObject>(resultStr); if (resultObj["errcode"] != null) { logObj.Info("直接去微信获取AccessToken,GetWeixinAccessToken(),微信服务报错"); var errorCode = new WeixinErrorInfo(resultObj["errcode"].ToString()); logObj.Warn(string.Format("{0}【errmsg:{1}】", errorCode.ToString(), resultObj["errmsg"].ToString())); } else { accessToken = resultObj["access_token"].ToString(); logObj.InfoFormat("直接去微信获取AccessToken,GetWeixinAccessToken(),微信access_token:{0}", accessToken); } WeChatDataManage.InsertWeChatData(new WeChatData() { Key = "AccessToken", Value = resultStr }); logObj.Info("直接去微信获取AccessToken,GetWeixinAccessToken(),返回:" + accessToken); return(accessToken); }
/// <summary> /// 查找最新笑话数据 /// </summary> /// <param name="pageIndex">当前页数,默认1</param> /// <param name="pageSize">每次返回条数,默认1,最大20</param> /// <returns>最新笑话数据集合</returns> public JuHeResponse <JokesData> SearchNewestJokes(int pageIndex = 1, int pageSize = 20) { string url = string.Format("http://v.juhe.cn/joke/content/text.php?key={0}&page={1}&pagesize={2}", JuHeOptions.AppKey, pageIndex, pageSize); JuHeResponse <JokesData> jokesDataResult = SimulateRequest.HttpGet <JuHeResponse <JokesData> >(url); return(jokesDataResult); }
/// <summary> /// 获取逆地理编码信息 /// </summary> /// <param name="reGeoCodeParam">逆地理编码所需参数</param> /// <returns>逆地理编码信息</returns> public ReGeoCodeResult GetReGeoCode(ReGeoCodeParam reGeoCodeParam) { string getUrl = "https://restapi.amap.com/v3/geocode/geo?{0}"; string paras = QueryHelper.ToQueryString(reGeoCodeParam); getUrl = string.Format(getUrl, paras); ReGeoCodeResult reGeoCodeResult = SimulateRequest.HttpGet <ReGeoCodeResult>(getUrl); return(reGeoCodeResult); }
/// <summary> /// 获取设置的行业信息 /// </summary> /// <returns>公众号设置的行业信息</returns> public WeChatResult <IndustryQuery> GetIndustry() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=" + accessToken; WeChatResult <IndustryQuery> weChatResult = SimulateRequest.HttpGet <WeChatResult <IndustryQuery> >(url); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取设置的行业信息GetIndustry,微信服务报错:{weChatResult}"); } return(weChatResult); }
/// <summary> /// 获取公众号已添加的模板列表 /// </summary> /// <returns>公众号获得的模板列表</returns> public WeChatResult <TemplateListInfo> SearchTemplate() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + accessToken; WeChatResult <TemplateListInfo> weChatResult = SimulateRequest.HttpGet <WeChatResult <TemplateListInfo> >(url); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取公众号已添加的模板列表SearchTemplate,微信服务报错:{weChatResult}"); } return(weChatResult); }
/// <summary> /// 获取城市天气详情信息 /// </summary> /// <param name="cityId">天气城市代号</param> /// <returns>城市天气详情信息</returns> public CityWeather GetCityWeather(string cityId) { string getUrl = string.Format("http://wthrcdn.etouch.cn/WeatherApi?citykey={0}", cityId); string weatherXml = SimulateRequest.HttpGet(getUrl); if (string.IsNullOrWhiteSpace(weatherXml)) { throw new WeatherException(-200, "请求到的天气数据Xml为空!"); } CityWeather cityWeather = XmlConvert.DeserializeObject <CityWeather>(weatherXml); return(cityWeather); }
/// <summary> /// 获取素材总数 /// </summary> /// <returns>微信服务返回的数量结果</returns> public WeChatResult <MaterialCount> GetMaterialCount() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=" + accessToken; string resultStr = SimulateRequest.HttpGet(url); WeChatResult <MaterialCount> weChatResult = new WeChatResult <MaterialCount>(resultStr); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"获取素材总数GetMaterialCount,微信服务报错:{weChatResult}"); } return(weChatResult); }
/// <summary> /// 获取所有客服账号,获取公众号中所设置的客服基本信息,包括客服工号、客服昵称、客服登录账号 /// </summary> /// <param name="account">账号,如:[email protected]</param> /// <param name="nickName">昵称,如:客服1</param> /// <param name="password">客服登录密码,内部会转成md5</param> /// <returns>删除的微信结果</returns> public WeChatResult <KFAccountInfo> SearchKFList() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=" + accessToken; string resultStr = SimulateRequest.HttpGet(url); WeChatResult <KFAccountInfo> weChatResult = new WeChatResult <KFAccountInfo>(resultStr); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取所有客服账号SearchKFList,微信服务报错:{weChatResult}"); } return(weChatResult); }
/// <summary> /// 获取群发速度 /// </summary> /// <returns>发送状态查询结果</returns> public WeChatResult <GroupSendSpeed> GetSendSpeed() { string accessToken = connect.GetAccessToken(); string url = $"https://api.weixin.qq.com/cgi-bin/message/mass/speed/get?access_token={accessToken}"; WeChatResult <GroupSendSpeed> weChatResult = SimulateRequest .HttpGet <WeChatResult <GroupSendSpeed> >(url); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取群发速度GetSendSpeed,微信服务报错:{weChatResult}"); } return(weChatResult); }
/// <summary> /// 删除默认菜单,同时删除全部个性化菜单 /// </summary> /// <returns>微信服务返回的删除结果</returns> public WeChatResult DeleteMenu() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + accessToken; string resultStr = SimulateRequest.HttpGet(url); WeChatResult deleteResult = new WeChatResult(resultStr); if (deleteResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"删除默认菜单DeleteMenu(),微信服务报错:{deleteResult}"); } return(deleteResult); }
/// <summary> /// 查找当前公众号使用的自定义菜单的配置,包括API设置的菜单和公众平台官网通过网站功能发布的菜单 /// </summary> /// <returns>自定义菜单的配置JObject信息</returns> public WeChatResult <JObject> SearchCustomMenu() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=" + accessToken; string resultStr = SimulateRequest.HttpGet(url); WeChatResult <JObject> customMenuResult = new WeChatResult <JObject>(resultStr); if (customMenuResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"查找当前公众号使用的自定义菜单的配置SearchCustomMenu(),微信服务报错:{customMenuResult}"); } return(customMenuResult); }
/// <summary> /// 获取公众号的自动回复规则 /// </summary> /// <returns>自动回复规则</returns> public WeChatResult <JObject> GetAutoReplyRule() { string url = "https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info?access_token={0}"; string accessToken = connect.GetAccessToken(); url = String.Format(url, accessToken); WeChatResult <JObject> weChatResult = SimulateRequest.HttpGet <WeChatResult <JObject> >(url); if (weChatResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取微信服务器IP地址GetWeChatServerIP(),微信服务报错:{weChatResult}"); } return(weChatResult); }
//private static List<MenuButton> LimitMenuNum(List<MenuButton> menuButtonList) //{ // //开始生成微信菜单按钮的请求字符串 // int minLength = Math.Min(menuButtonList.Count, 3); // if (menuButtonList.Count > 3) // menuButtonList = menuButtonList.Take(3).ToList();//最多包括3个一级菜单 // menuButtonList.ForEach(menuBtn => // { // if (menuBtn is ParentButton) // { // var parentBtn = menuBtn as ParentButton; // if (parentBtn.sub_button != null && parentBtn.sub_button.Count > 5) // parentBtn.sub_button = parentBtn.sub_button.Take(5).ToList();//每个一级菜单最多包含5个二级菜单 // } // }); // return menuButtonList; //} /// <summary> /// 获取默认菜单和全部个性化菜单信息 /// </summary> /// <returns>微信服务返回的菜单信息</returns> public WeChatResult <MenuQueryInfo> SearchMenu() { string accessToken = connect.GetAccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + accessToken; string resultStr = SimulateRequest.HttpGet(url); WeChatResult <MenuQueryInfo> menuResult = new WeChatResult <MenuQueryInfo>(resultStr); if (menuResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(GetType().FullName, $"获取默认菜单和全部个性化菜单信息SearchMenu(),微信服务报错:{menuResult}"); return(menuResult); } JObject menuJobj = JObject.Parse(resultStr); JToken ordinaryMenu = menuJobj["menu"];//一个默认菜单 if (ordinaryMenu == null) { return(menuResult); } JArray menuButtonArray = ordinaryMenu["button"] as JArray;//默认菜单中的1~3个主菜单 if (menuButtonArray == null) { return(menuResult); } MenuQueryInfo menuQueryInfo = menuResult.resultData; AnalysisMenuButton(menuButtonArray, menuQueryInfo.menu.button); JArray personalMenuArray = menuJobj["conditionalmenu"] as JArray;//多个个性化菜单 if (personalMenuArray == null) { return(menuResult); } foreach (JToken personalMenu in personalMenuArray) { if (personalMenu == null) { return(menuResult); } int index = personalMenuArray.IndexOf(personalMenu); JArray personalButtonArray = personalMenu["button"] as JArray;//默认菜单中的1~3个主菜单 if (personalButtonArray == null) { return(menuResult); } AnalysisMenuButton(personalMenu["button"] as JArray, menuQueryInfo.conditionalmenu[index].button); } return(menuResult); }
/// <summary> /// 查找指定时间前发布的笑话数据 /// </summary> /// <param name="splitTime">指定分隔时间</param> /// <param name="timeFilter">数据排列方式,默认指定时间之后</param> /// <param name="pageIndex">当前页数,默认1</param> /// <param name="pageSize">每次返回条数,默认1,最大20</param> /// <returns>指定时间前发布的笑话数据集合</returns> public JuHeResponse <JokesData> SearchTimeJokes(DateTime splitTime, JuHeTimeFilter timeFilter = JuHeTimeFilter.After, int pageIndex = 1, int pageSize = 20) { string sort = "asc"; if (timeFilter == JuHeTimeFilter.Before)//聚合的排序与我们的习惯相反 { sort = "desc"; } long time = TimeHelper.GetTime(splitTime); string url = string.Format("http://v.juhe.cn/joke/content/list.php?key={0}&page={1}&pagesize={2}&sort={3}&time={4}", JuHeOptions.AppKey, pageIndex, pageSize, sort, time); JuHeResponse <JokesData> jokesDataResult = SimulateRequest.HttpGet <JuHeResponse <JokesData> >(url); return(jokesDataResult); }
/// <summary> /// 获取微信服务器IP地址(公众号基于安全等考虑,需要获知微信服务器的IP地址列表) /// </summary> /// <returns>微信服务器的IP地址列表</returns> public WeChatResult <WeChatIPInfo> GetWeChatServerIP() { //如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息 string url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={0}";//http请求方式: GET string accessToken = this.GetAccessToken(); url = String.Format(url, accessToken); string resultStr = SimulateRequest.HttpGet(url); WeChatResult <WeChatIPInfo> serviceIPResult = new WeChatResult <WeChatIPInfo>(resultStr); if (serviceIPResult.errcode != WeChatErrorCode.SUCCESS) { SystemLogHelper.Warn(MethodBase.GetCurrentMethod(), $"获取微信服务器IP地址GetWeChatServerIP(),微信服务报错:{serviceIPResult}"); } return(serviceIPResult); }
/// <summary> /// 获取天气服务提供的区域信息 /// </summary> /// <param name="level">区域等级</param> /// <param name="areaCode">区域代号,当level=1时请默认留空</param> /// <returns>区域信息</returns> public List <AreaCodeName> SearchAreaCode(AreaLevel level, string areaCode = "") { string getUrl = string.Format("http://www.weather.com.cn/data/list3/city{0}.xml?level={1}", areaCode, (int)level); string areaStr = SimulateRequest.HttpGet(getUrl); string[] areaResultAry = areaStr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); List <AreaCodeName> areaInfoList = areaResultAry.Select(areaResult => { string[] areaAry = areaResult.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); return(new AreaCodeName { Code = areaAry[0], Name = areaAry[1] }); }).ToList(); return(areaInfoList); }
/// <summary> /// 获取城市天气详情信息 /// </summary> /// <param name="cityId">天气城市代号</param> /// <returns>城市天气详情信息</returns> public WeatherDetail GetWeatherDetail(string cityId) { string getUrl = string.Format("http://wthrcdn.etouch.cn/weather_mini?citykey={0}", cityId); JObject weatherResult = SimulateRequest.HttpGet <JObject>(getUrl); string statusStr = weatherResult["status"]?.ToString(); int.TryParse(statusStr, out int status); if (1000 == status) { string weatherStr = weatherResult["data"]?.ToString(); if (!string.IsNullOrWhiteSpace(weatherStr)) { WeatherDetail weatherDetail = JsonConvert.DeserializeObject <WeatherDetail>(weatherStr); if (weatherDetail != null) { if (!string.IsNullOrWhiteSpace(weatherDetail?.yesterday?.fl)) { weatherDetail.yesterday.fl = weatherDetail.yesterday.fl.Replace("<![CDATA[", "").Replace("]]", ""); } if (weatherDetail.forecast != null) { weatherDetail.forecast.ForEach(todaySky => { if (!string.IsNullOrWhiteSpace(todaySky?.fengli)) { todaySky.fengli = todaySky.fengli.Replace("<![CDATA[", "").Replace("]]", ""); } }); } } } } else { throw new WeatherException(status, weatherResult["desc"]?.ToString()); } return(null); }