/// <summary>
        /// GETs url, logs in if we are logged out.
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public async Task <MyHttpWebResponse> GetUrl(string url)
        {
            MyHttpWebResponse response;
            string            responseText = null;

            do
            {
                if (responseText != null)
                {
                    await Login();
                }

                var request = MyHttpWebRequest.Create(url);
                request.CookieContainer = CookieContainer;
                request.Method          = "GET";

                await ThrottleBeforeRequestAsync();

                response = await request.GetResponseAsync();

                responseText = response.ResponseText;
            } while (IsLoggedIn(responseText) == false);

            return(response);
        }
        public async Task <string> PostJson(string url, object payload)
        {
            var requestText      = JsonConvert.SerializeObject(payload);
            var requsstTextBytes = Encoding.UTF8.GetBytes(requestText);

            var request = MyHttpWebRequest.Create(url);

            request.CookieContainer = CookieContainer;
            request.Method          = "POST";
            request.ContentType     = "application/json";
            request.GetRequestStream().Write(requsstTextBytes, 0, requsstTextBytes.Length);

            await ThrottleBeforeRequestAsync();

            var response = await request.GetResponseAsync();

            var responseText = response.ResponseText;

            return(responseText);
        }
        /// <summary>
        /// Login to the website with credentials.
        /// </summary>
        async Task Login()
        {
            Log.Trace("Logging in...");

            var request = MyHttpWebRequest.Create(loginPageUrl);

            request.CookieContainer = CookieContainer;
            request.Method          = "GET";

            await ThrottleBeforeRequestAsync();

            var response = await request.GetResponseAsync();

            var html      = response.HtmlDocument;
            var loginForm = html.GetElementbyId("aspnetForm");

            var form = new WebFormHandler(loginPageUrl, loginForm, CookieContainer);

            form.FillInput("ctl00$bcr$ctl03$ctl07$username", username);
            form.FillInput("ctl00$bcr$ctl03$ctl07$password", password);
            form.FillInput("ctl00$bcr$ctl03$ctl07$loginButton", "Sign in »");
            response = form.SubmitForm();

            if (IsLoggedIn(response.ResponseText))
            {
                Log.Trace("Successfully logged in...");
            }
            else
            {
                Log.Warn("Failed to log in...");
                Log.Trace("Resetting registry stored user details.");
                var registry = Registry.CurrentUser.CreateSubKey(this.GetType().FullName);
                registry.SetValue("username", "");
                registry.SetValue("password", "");
            }
        }
        protected void ButtonTwo_Click(object sender, EventArgs e)
        {
            if (!CheckAppSetting())
                return;

            txtMenuString.Text = GetMenu();

            SaveConfig();

            if (String.IsNullOrEmpty(txtMenuString.Text.Trim()))
            {
                ShowLog("请填写菜单信息");
                return;
            }
             //   if (MessageBox.Show("您确定要创建或更新菜单吗?", "确定更新", MessageBoxButtons.YesNo) != DialogResult.Yes) return;

            //1:获得token
            MyHttpWebRequest request = new MyHttpWebRequest();
            string token = GetToken();
            if (String.IsNullOrEmpty(token))
            {
                ShowLog("获取Token失败!");
                return;
            }
            //2:删除当前菜单
            string rtn = request.getPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + token);

            ShowLog("清除菜单返回:\r\n" + rtn);

            //3:创建菜单
            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("", txtMenuString.Text);
            rtn = request.post("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token, nvc, Encoding.UTF8);
            ShowLog("提交菜单返回:" + rtn);
        }
        protected void ButtonThree_Click(object sender, EventArgs e)
        {
            if (!CheckAppSetting())
                return;
             //   if (MessageBox.Show("您确定清除微信菜单吗?清除后您还可以重建菜单!", "确定清除", MessageBoxButtons.YesNo) != DialogResult.Yes) return;

            txtMenuString.Text = GetMenu();

            SaveConfig();

            MyHttpWebRequest request = new MyHttpWebRequest();
            string token = this.GetToken();
            if (String.IsNullOrEmpty(token))
            {
                ShowLog("获取Token失败!");
                return;
            }

            string rtn = request.getPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + token);

            ShowLog("清除菜单返回:\r\n" + rtn);
        }
        protected void ButtonOne_Click(object sender, EventArgs e)
        {
            if (!CheckAppSetting())
                return;

             //   if (MessageBox.Show("您确定要获菜单数据吗?获取后将会覆盖现在的菜单结构体内容!", "确定更新", MessageBoxButtons.YesNo) != DialogResult.Yes) return;

            MyHttpWebRequest request = new MyHttpWebRequest();
            string token = this.GetToken();
            if (String.IsNullOrEmpty(token))
            {
                ShowLog("获取Token失败!");
                return;
            }

            string rtn = request.getPage(String.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", token));

            try
            {
                LitJson.JsonData data = LitJson.JsonMapper.ToObject(rtn);
                if (!String.IsNullOrEmpty(data["errcode"].ToString()))
                {
                    ShowLog("获取菜单返回:\r\n" + rtn);
                }
                else
                {
                    txtMenuString.Text = rtn;
                }
            }
            catch (Exception ex)
            {
                txtMenuString.Text = rtn;
            }
        }
 /// <summary>
 /// 获取Token
 /// </summary>
 /// <returns></returns>
 private string GetToken()
 {
     if (!String.IsNullOrEmpty(Token))
     {
         if (DateTime.Now.Subtract(TokenTime).TotalSeconds < expires) return Token;
     }
     MyHttpWebRequest request = new MyHttpWebRequest();
     string rtn = request.getPage(String.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", txtAppid.Text, txtKey.Text));
     ShowLog("获取Token返回:" + rtn);
     try
     {
         LitJson.JsonData data = LitJson.JsonMapper.ToObject(rtn);
         Token = data["access_token"].ToString();
         TokenTime = DateTime.Now;
         expires = Convert.ToInt32(data["expires_in"].ToString());
         return Token;
     }
     catch (Exception ex)
     {
         ShowLog(ex.Message);
     }
     return "";
 }