private string playsafeLogin(string id, string pass, string skey)
        {
            try
            {
                string response = this.DownloadString("https://tw.newlogin.beanfun.com/login/playsafe_form.aspx?skey=" + skey);
                Regex  regex    = new Regex("id=\"__VIEWSTATE\" value=\"(.*)\" />");
                if (!regex.IsMatch(response))
                {
                    this.errmsg = "LoginNoViewstate"; return(null);
                }
                string viewstate = regex.Match(response).Groups[1].Value;
                regex = new Regex("id=\"__EVENTVALIDATION\" value=\"(.*)\" />");
                if (!regex.IsMatch(response))
                {
                    this.errmsg = "LoginNoEventvalidation"; return(null);
                }
                string eventvalidation = regex.Match(response).Groups[1].Value;
                response = this.DownloadString("https://tw.newlogin.beanfun.com/generic_handlers/get_security_otp.ashx?d=" + GetCurrentTime(1));
                regex    = new Regex("<playsafe_otp>(\\w+)</playsafe_otp>");
                if (!regex.IsMatch(response))
                {
                    this.errmsg = "LoginNoSotp"; return(null);
                }
                string sotp = regex.Match(response).Groups[1].Value;

                PlaySafe ps = null;
                try
                {
                    ps = new PlaySafe();
                }
                catch (Exception e)
                {
                    this.errmsg = "LoginNoPSDriver";
                    return(null);
                }
                var readername = ps.GetReader();
                if (readername == null)
                {
                    this.errmsg = "LoginNoReaderName"; return(null);
                }
                if (ps.cardType == null)
                {
                    this.errmsg = "LoginNoCardType"; return(null);
                }

                string original  = null;
                string signature = null;
                if (ps.cardType == "F")
                {
                    ps.cardid = ps.GetPublicCN(readername);
                    if (ps.cardid == null)
                    {
                        this.errmsg = "LoginNoCardId"; return(null);
                    }
                    var opinfo = ps.GetOPInfo(readername, pass);
                    if (opinfo == null)
                    {
                        this.errmsg = "LoginNoOpInfo"; return(null);
                    }
                    original  = ps.cardType + "~" + sotp + "~" + id + "~" + opinfo;
                    signature = ps.EncryptData(readername, pass, original);
                    if (signature == null)
                    {
                        this.errmsg = "LoginNoEncryptedData"; return(null);
                    }
                }
                else if (ps.cardType == "G")
                {
                    original  = ps.cardType + "~" + sotp + "~" + id + "~";
                    signature = ps.FSCAPISign(pass, original);
                }
                NameValueCollection payload = new NameValueCollection();
                payload.Add("__EVENTTARGET", "");
                payload.Add("__EVENTARGUMENT", "");
                payload.Add("__VIEWSTATE", viewstate);
                payload.Add("__EVENTVALIDATION", eventvalidation);
                payload.Add("card_check_id", ps.cardid);
                payload.Add("original", original);
                payload.Add("signature", signature);
                payload.Add("serverotp", sotp);
                payload.Add("t_AccountID", id);
                payload.Add("t_Password", pass);
                payload.Add("btn_login", "Login");

                response = Encoding.UTF8.GetString(this.UploadValues("https://tw.newlogin.beanfun.com/login/playsafe_form.aspx?skey=" + skey, payload));
                regex    = new Regex("akey=(.*)");
                if (!regex.IsMatch(this.ResponseUri.ToString()))
                {
                    this.errmsg = "LoginNoAkey"; return(null);
                }
                return(ps.cardid + " " + regex.Match(this.ResponseUri.ToString()).Groups[1].Value);
            }
            catch (Exception e)
            {
                this.errmsg = "LoginUnknown\n\n" + e.Message + "\n" + e.StackTrace;
                return(null);
            }
        }
        private string playsafeLogin(string id, string pass, string skey)
        {
            try
            {
                string response = this.DownloadString("https://tw.newlogin.beanfun.com/login/playsafe_form.aspx?skey=" + skey);
                Regex regex = new Regex("id=\"__VIEWSTATE\" value=\"(.*)\" />");
                if (!regex.IsMatch(response))
                { this.errmsg = "LoginNoViewstate"; return null; }
                string viewstate = regex.Match(response).Groups[1].Value;
                regex = new Regex("id=\"__EVENTVALIDATION\" value=\"(.*)\" />");
                if (!regex.IsMatch(response))
                { this.errmsg = "LoginNoEventvalidation"; return null; }
                string eventvalidation = regex.Match(response).Groups[1].Value;
                response = this.DownloadString("https://tw.newlogin.beanfun.com/generic_handlers/get_security_otp.ashx?d=" + GetCurrentTime(1));
                regex = new Regex("<playsafe_otp>(\\w+)</playsafe_otp>");
                if (!regex.IsMatch(response))
                { this.errmsg = "LoginNoSotp"; return null; }
                string sotp = regex.Match(response).Groups[1].Value;

                PlaySafe ps = new PlaySafe();
                var readername = ps.GetReader();
                if (readername == null)
                { this.errmsg = "LoginNoReaderName"; return null; }
                if (ps.cardType == null)
                { this.errmsg = "LoginNoCardType"; return null; }

                string original = null;
                string signature = null;
                if (ps.cardType == "F")
                {
                    ps.cardid = ps.GetPublicCN(readername);
                    if (ps.cardid == null)
                    { this.errmsg = "LoginNoCardId"; return null; }
                    var opinfo = ps.GetOPInfo(readername, pass);
                    if (opinfo == null)
                    { this.errmsg = "LoginNoOpInfo"; return null; }
                    original = ps.cardType + "~" + sotp + "~" + id + "~" + opinfo;
                    signature = ps.EncryptData(readername, pass, original);
                    if (signature == null)
                    { this.errmsg = "LoginNoEncryptedData"; return null; }
                }
                else if (ps.cardType == "G")
                {
                    original = ps.cardType + "~" + sotp + "~" + id + "~";
                    signature = ps.FSCAPISign(pass, original);
                }
                NameValueCollection payload = new NameValueCollection();
                payload.Add("__EVENTTARGET", "");
                payload.Add("__EVENTARGUMENT", "");
                payload.Add("__VIEWSTATE", viewstate);
                payload.Add("__EVENTVALIDATION", eventvalidation);
                payload.Add("card_check_id", ps.cardid);
                payload.Add("original", original);
                payload.Add("signature", signature);
                payload.Add("serverotp", sotp);
                payload.Add("t_AccountID", id);
                payload.Add("t_Password", pass);
                payload.Add("btn_login", "Login");
                
                response = Encoding.UTF8.GetString(this.UploadValues("https://tw.newlogin.beanfun.com/login/playsafe_form.aspx?skey=" + skey, payload));
                regex = new Regex("akey=(.*)");
                if (!regex.IsMatch(this.ResponseUri.ToString()))
                { this.errmsg = signature; return null; }
                return ps.cardid + " " + regex.Match(this.ResponseUri.ToString()).Groups[1].Value;
            }
            catch (Exception e)
            {
                this.errmsg = "LoginUnknown\n\n" + e.Message + "\n" + e.StackTrace;
                return null;
            }
        }