示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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);
        }
示例#11
0
        /// <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);
        }
示例#12
0
        /// <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);
        }
示例#17
0
        /// <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);
        }
示例#19
0
        /// <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);
        }
示例#21
0
        /// <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);
        }
示例#22
0
        /// <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);
        }