Request() 공개 정적인 메소드

public static Request ( string url, string method, NameValueCollection data = null, CookieContainer cookies = null, NameValueCollection headers = null, string referer = APIEndpoints.COMMUNITY_BASE ) : string
url string
method string
data System.Collections.Specialized.NameValueCollection
cookies System.Net.CookieContainer
headers System.Collections.Specialized.NameValueCollection
referer string
리턴 string
예제 #1
0
        private bool _sendConfirmationAjax(Confirmation conf, string op)
        {
            string url         = APIEndpoints.COMMUNITY_BASE + "/mobileconf/ajaxop";
            string queryString = "?op=" + op + "&";

            queryString += GenerateConfirmationQueryParams(op);
            queryString += "&cid=" + conf.ID + "&ck=" + conf.Key;
            url         += queryString;

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);
            string referer = GenerateConfirmationURL();

            string response = SteamWeb.Request(url, "GET", null, cookies, null);

            if (response == null)
            {
                return(false);
            }

            SendConfirmationResponse confResponse = JsonConvert.DeserializeObject <SendConfirmationResponse>(response);

            return(confResponse.Success);
        }
예제 #2
0
        /// <summary>
        /// Refreshes the Steam session. Necessary to perform confirmations if your session has expired or changed.
        /// </summary>
        /// <returns></returns>
        public bool RefreshSession()
        {
            string url = APIEndpoints.MOBILEAUTH_GETWGTOKEN;
            NameValueCollection postData = new NameValueCollection();

            postData.Add("access_token", this.Session.OAuthToken);

            string response = SteamWeb.Request(url, "POST", postData);

            if (response == null)
            {
                return(false);
            }

            try
            {
                var refreshResponse = JsonConvert.DeserializeObject <RefreshSessionDataResponse>(response);
                if (refreshResponse == null || refreshResponse.Response == null || String.IsNullOrEmpty(refreshResponse.Response.Token))
                {
                    return(false);
                }

                string token       = this.Session.SteamID + "%7C%7C" + refreshResponse.Response.Token;
                string tokenSecure = this.Session.SteamID + "%7C%7C" + refreshResponse.Response.TokenSecure;

                this.Session.SteamLogin       = token;
                this.Session.SteamLoginSecure = tokenSecure;
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
예제 #3
0
        private ConfirmationDetailsResponse _getConfirmationDetails(Confirmation conf)
        {
            string url         = APIEndpoints.COMMUNITY_BASE + "/mobileconf/details/" + conf.ID + "?";
            string queryString = GenerateConfirmationQueryParams("details");

            url += queryString;

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);
            string referer = GenerateConfirmationURL();

            string response = SteamWeb.Request(url, "GET", null, cookies, null);

            if (String.IsNullOrEmpty(response))
            {
                return(null);
            }

            var confResponse = JsonConvert.DeserializeObject <ConfirmationDetailsResponse>(response);

            if (confResponse == null)
            {
                return(null);
            }
            return(confResponse);
        }
예제 #4
0
        private bool _addPhoneNumber()
        {
            string response = SteamWeb.Request(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax?op=add_phone_number&arg=" + WebUtility.UrlEncode(PhoneNumber), "GET", null, _cookies);
            var    addPhoneNumberResponse = JsonConvert.DeserializeObject <AddPhoneResponse>(response);

            return(addPhoneNumberResponse.Success);
        }
예제 #5
0
        private bool _sendMultiConfirmationAjax(Confirmation[] confs, string op)
        {
            string url = APIEndpoints.COMMUNITY_BASE + "/mobileconf/multiajaxop";

            string query = "op=" + op + "&" + GenerateConfirmationQueryParams(op);

            foreach (var conf in confs)
            {
                query += "&cid[]=" + conf.ID + "&ck[]=" + conf.Key;
            }

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);
            string referer = GenerateConfirmationURL();

            string response = SteamWeb.Request(url, "POST", query, cookies, null);

            if (response == null)
            {
                return(false);
            }

            SendConfirmationResponse confResponse = JsonConvert.DeserializeObject <SendConfirmationResponse>(response);

            return(confResponse.Success);
        }
예제 #6
0
        private bool _checkSMSCode(string smsCode)
        {
            var postData = new NameValueCollection();

            postData.Add("op", "check_sms_code");
            postData.Add("arg", smsCode);
            postData.Add("checkfortos", "0");
            postData.Add("skipvoip", "1");
            postData.Add("sessionid", _session.SessionID);

            string response = SteamWeb.Request(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax", "POST", postData, _cookies);

            if (response == null)
            {
                return(false);
            }

            var addPhoneNumberResponse = JsonConvert.DeserializeObject <AddPhoneResponse>(response);

            if (!addPhoneNumberResponse.Success)
            {
                Thread.Sleep(3500); //It seems that Steam needs a few seconds to finalize the phone number on the account.
                return(_hasPhoneAttached());
            }

            return(true);
        }
예제 #7
0
        public Confirmation[] FetchConfirmations()
        {
            string url = this.GenerateConfirmationURL();

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);

            string response = SteamWeb.Request(url, "GET", "", cookies);

            File.WriteAllText("test.txt", response);

            /*So you're going to see this abomination and you're going to be upset.
             * It's understandable. But the thing is, regex for HTML -- while awful -- makes this way faster than parsing a DOM, plus we don't need another library.
             * And because the data is always in the same place and same format... It's not as if we're trying to naturally understand HTML here. Just extract strings.
             * I'm sorry. */

            Regex confIDRegex   = new Regex("data-confid=\"(\\d+)\"");
            Regex confKeyRegex  = new Regex("data-key=\"(\\d+)\"");
            Regex confDescRegex = new Regex("<div>((Confirm|Trade with|Sell -) .+)</div>");

            if (response == null || !(confIDRegex.IsMatch(response) && confKeyRegex.IsMatch(response) && confDescRegex.IsMatch(response)))
            {
                if (response == null || !response.Contains("<div>Nothing to confirm</div>"))
                {
                    throw new WGTokenInvalidException();
                }

                return(new Confirmation[0]);
            }

            MatchCollection confIDs   = confIDRegex.Matches(response);
            MatchCollection confKeys  = confKeyRegex.Matches(response);
            MatchCollection confDescs = confDescRegex.Matches(response);

            List <Confirmation> ret = new List <Confirmation>();

            for (int i = 0; i < confIDs.Count; i++)
            {
                try
                {
                    string       confID   = confIDs[i].Groups[1].Value;
                    string       confKey  = confKeys[i].Groups[1].Value;
                    string       confDesc = HttpUtility.HtmlDecode(confDescs[i].Groups[1].Value);
                    Confirmation conf     = new Confirmation()
                    {
                        Description = confDesc,
                        ID          = confID,
                        Key         = confKey
                    };
                    ret.Add(conf);
                }
                catch { /*fak u*/ }
            }

            return(ret.ToArray());
        }
예제 #8
0
        public Confirmation[] FetchConfirmations()
        {
            string url = this.GenerateConfirmationURL();

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);

            string response = SteamWeb.Request(url, "GET", "", cookies);

            return(FetchConfirmationInternal(response));
        }
예제 #9
0
        public Confirmation[] FetchConfirmations()
        {
            string url = this.GenerateConfirmationURL();

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);

            string response = SteamWeb.Request(url, "GET", "", cookies);

            /*So you're going to see this abomination and you're going to be upset.
             * It's understandable. But the thing is, regex for HTML -- while awful -- makes this way faster than parsing a DOM, plus we don't need another library.
             * And because the data is always in the same place and same format... It's not as if we're trying to naturally understand HTML here. Just extract strings.
             * I'm sorry. */

            Regex confRegex = new Regex("<div class=\"mobileconf_list_entry\" id=\"conf[0-9]+\" data-confid=\"(\\d+)\" data-key=\"(\\d+)\" data-type=\"(\\d+)\" data-creator=\"(\\d+)\"");

            if (response == null || !confRegex.IsMatch(response))
            {
                if (response == null || !response.Contains("<div>Nothing to confirm</div>"))
                {
                    throw new WGTokenInvalidException();
                }

                return(new Confirmation[0]);
            }

            MatchCollection confirmations = confRegex.Matches(response);

            List <Confirmation> ret = new List <Confirmation>();

            foreach (Match confirmation in confirmations)
            {
                if (confirmation.Groups.Count != 5)
                {
                    continue;
                }

                ulong confID, confKey, confCreator;
                int   confType;
                if (!ulong.TryParse(confirmation.Groups[1].Value, out confID) ||
                    !ulong.TryParse(confirmation.Groups[2].Value, out confKey) ||
                    !int.TryParse(confirmation.Groups[3].Value, out confType) ||
                    !ulong.TryParse(confirmation.Groups[4].Value, out confCreator))
                {
                    continue;
                }

                ret.Add(new Confirmation(confID, confKey, confType, confCreator));
            }

            return(ret.ToArray());
        }
예제 #10
0
        public Confirmation[] FetchConfirmations()
        {
            string url = this._generateConfirmationURL();

            CookieContainer cookies = new CookieContainer();

            this.Session.AddCookies(cookies);

            string response = SteamWeb.Request(url, "GET", null, cookies);

            /*So you're going to see this abomination and you're going to be upset.
             * It's understandable. But the thing is, regex for HTML -- while awful -- makes this way faster than parsing a DOM, plus we don't need another library.
             * And because the data is always in the same place and same format... It's not as if we're trying to naturally understand HTML here. Just extract strings.
             * I'm sorry. */

            Regex confIDRegex   = new Regex("data-confid=\"(\\d+)\"");
            Regex confKeyRegex  = new Regex("data-key=\"(\\d+)\"");
            Regex confDescRegex = new Regex("<div>((Confirm|Trade with) .+)</div>");

            if (!(confIDRegex.IsMatch(response) && confKeyRegex.IsMatch(response) && confDescRegex.IsMatch(response)))
            {
                return(new Confirmation[0]);
            }

            MatchCollection confIDs   = confIDRegex.Matches(response);
            MatchCollection confKeys  = confKeyRegex.Matches(response);
            MatchCollection confDescs = confDescRegex.Matches(response);

            List <Confirmation> ret = new List <Confirmation>();

            for (int i = 0; i < confIDs.Count; i++)
            {
                string       confID   = confIDs[i].Groups[1].Value;
                string       confKey  = confKeys[i].Groups[1].Value;
                string       confDesc = confDescs[i].Groups[1].Value;
                Confirmation conf     = new Confirmation()
                {
                    ConfirmationDescription = confDesc,
                    ConfirmationID          = confID,
                    ConfirmationKey         = confKey
                };
                ret.Add(conf);
            }

            return(ret.ToArray());
        }
예제 #11
0
        private bool _hasPhoneAttached()
        {
            var postData = new NameValueCollection();

            postData.Add("op", "has_phone");
            postData.Add("arg", "null");
            postData.Add("sessionid", _session.SessionID);

            string response = SteamWeb.Request(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax", "POST", postData, _cookies);

            if (response == null)
            {
                return(false);
            }

            var hasPhoneResponse = JsonConvert.DeserializeObject <HasPhoneResponse>(response);

            return(hasPhoneResponse.HasPhone);
        }
예제 #12
0
        private bool _checkEmailConfirmation()
        {
            var postData = new NameValueCollection();

            postData.Add("op", "email_confirmation");
            postData.Add("arg", "");
            postData.Add("sessionid", _session.SessionID);

            string response = SteamWeb.Request(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax", "POST", postData, _cookies);

            if (response == null)
            {
                return(false);
            }

            var emailConfirmationResponse = JsonConvert.DeserializeObject <AddPhoneResponse>(response);

            return(emailConfirmationResponse.Success);
        }
예제 #13
0
        private bool _checkSMSCode(string smsCode)
        {
            var postData = new NameValueCollection();

            postData.Add("op", "check_sms_code");
            postData.Add("arg", smsCode);
            postData.Add("sessionid", _session.SessionID);

            string response = SteamWeb.Request(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax", "POST", postData, _cookies);

            if (response == null)
            {
                return(false);
            }

            var addPhoneNumberResponse = JsonConvert.DeserializeObject <AddPhoneResponse>(response);

            return(addPhoneNumberResponse.Success);
        }
예제 #14
0
        public Confirmation[] FetchConfirmations()
        {
            if (fetchingLock.WaitOne(500))
            {
                try
                {
                    int msec = (int)Math.Floor(10000 - DateTime.Now.Subtract(lastConfirmationFetchTime).TotalMilliseconds);
                    if (msec > 0)
                    {
                        Thread.Sleep(msec);
                    }
                    string url = this.GenerateConfirmationURL();

                    CookieContainer cookies = new CookieContainer();
                    this.Session.AddCookies(cookies);

                    string response = SteamWeb.Request(url, "GET", "", cookies);
                    lastConfirmationFetchTime = DateTime.Now;

                    /*So you're going to see this abomination and you're going to be upset.
                     *  It's understandable. But the thing is, regex for HTML -- while awful -- makes this way faster than parsing a DOM, plus we don't need another library.
                     *  And because the data is always in the same place and same format... It's not as if we're trying to naturally understand HTML here. Just extract strings.
                     *  I'm sorry. */

                    Regex confRegex = new Regex("<div class=\"mobileconf_list_entry\" id=\"conf[0-9]+\" data-confid=\"(\\d+)\" data-key=\"(\\d+)\" data-type=\"(\\d+)\" data-creator=\"(\\d+)\"");
                    if (response == null || !confRegex.IsMatch(response))
                    {
                        if (response == null || !response.Contains("<div>Nothing to confirm</div>"))
                        {
                            throw new WGTokenInvalidException();
                        }

                        return(new Confirmation[0]);
                    }

                    MatchCollection confirmations = confRegex.Matches(response);

                    List <Confirmation> ret = new List <Confirmation>();
                    foreach (Match confirmation in confirmations)
                    {
                        if (confirmation.Groups.Count != 5)
                        {
                            continue;
                        }

                        if (!ulong.TryParse(confirmation.Groups[1].Value, out ulong confID) ||
                            !ulong.TryParse(confirmation.Groups[2].Value, out ulong confKey) ||
                            !int.TryParse(confirmation.Groups[3].Value, out int confType) ||
                            !ulong.TryParse(confirmation.Groups[4].Value, out ulong confCreator))
                        {
                            continue;
                        }

                        ret.Add(new Confirmation(confID, confKey, confType, confCreator));
                    }

                    return(ret.ToArray());
                }
                finally
                {
                    fetchingLock.ReleaseMutex();
                }
            }
            else
            {
                //kinda nothing to confirm, don't bother it will probably be confirmed by another thread.
                return(new Confirmation[0]);
            }
        }