Esempio n. 1
0
        public async Task <InstaPostList> GetUserPostsByUsernameAsync(string username, int pageCount = 0)
        {
            var    posts    = new InstaPostList();
            string mediaUrl = $"{InstaApiConstants.INSTAGRAM_URL}{username}{InstaApiConstants.MEDIA}";
            string json;

            var stream = await _httpClient.GetStreamAsync(mediaUrl);

            using (var reader = new StreamReader(stream))
            {
                json = reader.ReadToEnd();
            }

            var instaresponse = JsonConvert.DeserializeObject <InstaResponse>(json);
            var converter     = ConvertersFabric.GetPostsConverter(instaresponse);

            posts.AddRange(converter.Convert());
            var pages = 1;

            while (instaresponse.MoreAvailable && pages <= pageCount)
            {
                pages++;
                instaresponse = _getUserPostsResponseWithMaxId(instaresponse.GetLastId());
                converter     = ConvertersFabric.GetPostsConverter(instaresponse);
                posts.AddRange(converter.Convert());
            }
            return(posts);
        }
Esempio n. 2
0
        public async Task <IResult <InstaDirectInboxThread> > GetDirectInboxThreadAsync(string threadId)
        {
            ValidateUser();
            ValidateLoggedIn();
            try
            {
                var directInboxUri = UriCreator.GetDirectInboxThreadUri(threadId);
                var request        = HttpHelper.GetDefaultRequest(HttpMethod.Get, directInboxUri, _deviceInfo);
                var response       = await _httpClient.SendAsync(request);

                var json = await response.Content.ReadAsStringAsync();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    return(Result.Fail("", (InstaDirectInboxThread)null));
                }
                var threadResponse = JsonConvert.DeserializeObject <InstaDirectInboxThreadResponse>(json,
                                                                                                    new InstaThreadDataConverter());
                var converter = ConvertersFabric.GetDirectThreadConverter(threadResponse);
                return(Result.Success(converter.Convert()));
            }
            catch (Exception exception)
            {
                return(Result.Fail <InstaDirectInboxThread>(exception));
            }
        }
Esempio n. 3
0
        public async Task <IResult <InstaUser> > GetCurrentUserAsync()
        {
            ValidateUser();
            ValidateLoggedIn();
            var     instaUri   = UriCreator.GetCurrentUserUri();
            dynamic jsonObject = new JObject();

            jsonObject._uuid      = _deviceInfo.DeviceGuid;
            jsonObject._uid       = _user.LoggedInUder.Pk;
            jsonObject._csrftoken = _user.CsrfToken;
            var fields = new Dictionary <string, string>
            {
                { "_uuid", _deviceInfo.DeviceGuid.ToString() },
                { "_uid", _user.LoggedInUder.Pk },
                { "_csrftoken", _user.CsrfToken }
            };
            var request = HttpHelper.GetDefaultRequest(HttpMethod.Post, instaUri, _deviceInfo);

            request.Content = new FormUrlEncodedContent(fields);
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var user          = JsonConvert.DeserializeObject <InstaCurrentUserResponse>(json);
                var converter     = ConvertersFabric.GetUserConverter(user.User);
                var userConverted = converter.Convert();

                return(Result.Success(userConverted));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaUser)null));
        }
Esempio n. 4
0
        public async Task <IResult <InstaFeed> > GetTagFeedAsync(string tag, int maxPages = 0)
        {
            ValidateUser();
            ValidateLoggedIn();
            var userFeedUri = UriCreator.GetTagFeedUri(tag);
            var request     = HttpHelper.GetDefaultRequest(HttpMethod.Get, userFeedUri, _deviceInfo);
            var response    = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var feedResponse = JsonConvert.DeserializeObject <InstaMediaListResponse>(json,
                                                                                          new InstaMediaListDataConverter());
                var converter = ConvertersFabric.GetMediaListConverter(feedResponse);
                var tagFeed   = new InstaFeed();
                tagFeed.Medias.AddRange(converter.Convert());
                var nextId = feedResponse.NextMaxId;
                while (feedResponse.MoreAvailable && tagFeed.Pages < maxPages)
                {
                    var nextMedia = await GetTagFeedWithMaxIdAsync(tag, nextId);

                    if (!nextMedia.Succeeded)
                    {
                        Result.Success($"Not all pages was downloaded: {nextMedia.Info.Message}", tagFeed);
                    }
                    nextId    = nextMedia.Value.NextMaxId;
                    converter = ConvertersFabric.GetMediaListConverter(nextMedia.Value);
                    tagFeed.Medias.AddRange(converter.Convert());
                    tagFeed.Pages++;
                }
                return(Result.Success(tagFeed));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaFeed)null));
        }
Esempio n. 5
0
        public async Task <IResult <InstaUser> > GetUserAsync(string username)
        {
            ValidateUser();
            var userUri = UriCreator.GetUserUri(username);
            var request = HttpHelper.GetDefaultRequest(HttpMethod.Get, userUri, _deviceInfo);

            request.Properties.Add(new KeyValuePair <string, object>(InstaApiConstants.HEADER_TIMEZONE,
                                                                     InstaApiConstants.TIMEZONE_OFFSET.ToString()));
            request.Properties.Add(new KeyValuePair <string, object>(InstaApiConstants.HEADER_COUNT, "1"));
            request.Properties.Add(new KeyValuePair <string, object>(InstaApiConstants.HEADER_RANK_TOKEN, _user.RankToken));
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var userInfo = JsonConvert.DeserializeObject <InstaSearchUserResponse>(json);
                var user     = userInfo.Users?.FirstOrDefault(u => u.UserName == username);
                if (user == null)
                {
                    string errorMessage = $"Can't find this user: {username}";
                    _logger.Write(errorMessage);
                    return(Result.Fail <InstaUser>(errorMessage));
                }
                var converter = ConvertersFabric.GetUserConverter(user);
                return(Result.Success(converter.Convert()));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaUser)null));
        }
Esempio n. 6
0
        public async Task <InstaUser> GetUserAsync(string username)
        {
            string userUrl = $"{InstaApiConstants.INSTAGRAM_URL}{username}{InstaApiConstants.GET_ALL_POSTFIX}";
            IObjectConverter <InstaUser, InstaResponseUser> converter = null;
            var stream = await _httpClient.GetStreamAsync(userUrl);

            using (var reader = new StreamReader(stream))
            {
                var json          = reader.ReadToEnd();
                var root          = JObject.Parse(json);
                var userObject    = root["user"];
                var instaresponse = JsonConvert.DeserializeObject <InstaResponseUser>(userObject.ToString());
                converter = ConvertersFabric.GetUserConverter(instaresponse);
            }
            return(converter.Convert());
        }
Esempio n. 7
0
        public async Task <IResult <InstaRecipients> > GetRankedRecipientsAsync()
        {
            var userUri  = UriCreator.GetRankedRecipientsUri();
            var request  = HttpHelper.GetDefaultRequest(HttpMethod.Get, userUri, _deviceInfo);
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var responseRecipients = JsonConvert.DeserializeObject <InstaRecipientsResponse>(json,
                                                                                                 new InstaRecipientsDataConverter("ranked_recipients"));
                var converter = ConvertersFabric.GetRecipientsConverter(responseRecipients);
                return(Result.Success(converter.Convert()));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaRecipients)null));
        }
Esempio n. 8
0
        public async Task <InstaMedia> GetMediaByCodeAsync(string postCode)
        {
            string mediaUrl =
                $"{InstaApiConstants.INSTAGRAM_URL}{InstaApiConstants.P_SUFFIX}{postCode}{InstaApiConstants.GET_ALL_POSTFIX}";
            var stream = await _httpClient.GetStreamAsync(mediaUrl);

            InstaResponseMedia mediaResponse;

            using (var reader = new StreamReader(stream))
            {
                var json        = reader.ReadToEnd();
                var root        = JObject.Parse(json);
                var mediaObject = root["media"];
                mediaResponse = JsonConvert.DeserializeObject <InstaResponseMedia>(mediaObject.ToString());
            }
            var converter = ConvertersFabric.GetSingleMediaConverter(mediaResponse);

            return(converter.Convert());
        }
Esempio n. 9
0
        public async Task <IResult <InstaFeed> > GetUserTimelineFeedAsync(int maxPages = 0)
        {
            ValidateUser();
            ValidateLoggedIn();
            var userFeedUri = UriCreator.GetUserFeedUri();
            var request     = HttpHelper.GetDefaultRequest(HttpMethod.Get, userFeedUri, _deviceInfo);
            var response    = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            var feed = new InstaFeed();

            if (response.StatusCode != HttpStatusCode.OK)
            {
                return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaFeed)null));
            }
            var feedResponse = JsonConvert.DeserializeObject <InstaFeedResponse>(json,
                                                                                 new InstaFeedResponseDataConverter());
            var converter     = ConvertersFabric.GetFeedConverter(feedResponse);
            var feedConverted = converter.Convert();

            feed.Medias.AddRange(feedConverted.Medias);
            var nextId = feedResponse.NextMaxId;

            while (feedResponse.MoreAvailable && feed.Pages < maxPages)
            {
                if (string.IsNullOrEmpty(nextId))
                {
                    break;
                }
                var nextFeed = await GetUserFeedWithMaxIdAsync(nextId);

                if (!nextFeed.Succeeded)
                {
                    Result.Success($"Not all pages was downloaded: {nextFeed.Info.Message}", feed);
                }
                nextId = nextFeed.Value.NextMaxId;
                feed.Medias.AddRange(
                    nextFeed.Value.Items.Select(ConvertersFabric.GetSingleMediaConverter).Select(conv => conv.Convert()));
                feed.Pages++;
            }
            return(Result.Success(feed));
        }
Esempio n. 10
0
        public async Task <InstaUserFeed> GetUserFeedAsync(int pageCount)
        {
            if (!IsUserAuthenticated)
            {
                throw new Exception("user must be authenticated");
            }
            var feedUrl = $"{InstaApiConstants.INSTAGRAM_URL.TrimEnd('/')}{InstaApiConstants.GET_ALL_POSTFIX}";
            var request = HttpHelper.GetDefaultRequest(HttpMethod.Get, new Uri(feedUrl));

            request.Headers.Add(InstaApiConstants.HEADER_XCSRFToken, _user.Token);
            request.Headers.Add(InstaApiConstants.HEADER_XInstagramAJAX, "1");
            request.Headers.Add(InstaApiConstants.HEADER_XRequestedWith, InstaApiConstants.HEADER_XMLHttpRequest);
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            var feedResponse = JsonConvert.DeserializeObject <InstaFeedResponse>(json);
            var converter    = ConvertersFabric.GetFeedConverter(feedResponse);

            return(converter.Convert());
        }
Esempio n. 11
0
        public async Task <IResult <InstaMediaList> > GetUserMediaAsync(string username, int maxPages = 0)
        {
            ValidateUser();
            if (maxPages == 0)
            {
                maxPages = int.MaxValue;
            }
            var user     = GetUser(username).Value;
            var instaUri = UriCreator.GetUserMediaListUri(user.Pk);
            var request  = HttpHelper.GetDefaultRequest(HttpMethod.Get, instaUri, _deviceInfo);
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var mediaResponse = JsonConvert.DeserializeObject <InstaMediaListResponse>(json,
                                                                                           new InstaMediaListDataConverter());
                var converter = ConvertersFabric.GetMediaListConverter(mediaResponse);
                var mediaList = converter.Convert();
                var nextId    = mediaResponse.NextMaxId;
                while (mediaResponse.MoreAvailable && mediaList.Pages < maxPages)
                {
                    instaUri = UriCreator.GetMediaListWithMaxIdUri(user.Pk, nextId);
                    var nextMedia = await GetUserMediaListWithMaxIdAsync(instaUri);

                    if (!nextMedia.Succeeded)
                    {
                        Result.Success($"Not all pages was downloaded: {nextMedia.Info.Message}", mediaList);
                    }
                    nextId = nextMedia.Value.NextMaxId;
                    mediaList.AddRange(converter.Convert());
                    mediaList.Pages++;
                }
                return(Result.Success(mediaList));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaMediaList)null));
        }
Esempio n. 12
0
        public async Task <IResult <InstaMedia> > GetMediaByCodeAsync(string mediaCode)
        {
            ValidateUser();
            var mediaUri = UriCreator.GetMediaUri(mediaCode);
            var request  = HttpHelper.GetDefaultRequest(HttpMethod.Get, mediaUri, _deviceInfo);
            var response = await _httpClient.SendAsync(request);

            var json = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var mediaResponse = JsonConvert.DeserializeObject <InstaMediaListResponse>(json,
                                                                                           new InstaMediaListDataConverter());
                if (mediaResponse.Medias?.Count != 1)
                {
                    string errorMessage = $"Got wrong media count for request with media id={mediaCode}";
                    _logger.Write(errorMessage);
                    return(Result.Fail <InstaMedia>(errorMessage));
                }
                var converter = ConvertersFabric.GetSingleMediaConverter(mediaResponse.Medias.FirstOrDefault());
                return(Result.Success(converter.Convert()));
            }
            return(Result.Fail(GetBadStatusFromJsonString(json).Message, (InstaMedia)null));
        }
Esempio n. 13
0
        public async Task <IResult <bool> > LoginAsync()
        {
            ValidateUser();
            ValidateRequestMessage();
            try
            {
                var csrftoken     = string.Empty;
                var firstResponse = await _httpClient.GetAsync(_httpClient.BaseAddress);

                var cookies = _httpHandler.CookieContainer.GetCookies(_httpClient.BaseAddress);
                foreach (Cookie cookie in cookies)
                {
                    if (cookie.Name == InstaApiConstants.CSRFTOKEN)
                    {
                        csrftoken = cookie.Value;
                    }
                }
                _user.CsrfToken = csrftoken;
                var instaUri  = UriCreator.GetLoginUri();
                var signature = $"{_requestMessage.GenerateSignature()}.{_requestMessage.GetMessageString()}";
                var fields    = new Dictionary <string, string>
                {
                    { InstaApiConstants.HEADER_IG_SIGNATURE, signature },
                    { InstaApiConstants.HEADER_IG_SIGNATURE_KEY_VERSION, InstaApiConstants.IG_SIGNATURE_KEY_VERSION }
                };
                var request = HttpHelper.GetDefaultRequest(HttpMethod.Post, instaUri, _deviceInfo);
                request.Content = new FormUrlEncodedContent(fields);
                request.Properties.Add(InstaApiConstants.HEADER_IG_SIGNATURE, signature);
                request.Properties.Add(InstaApiConstants.HEADER_IG_SIGNATURE_KEY_VERSION,
                                       InstaApiConstants.IG_SIGNATURE_KEY_VERSION);
                var response = await _httpClient.SendAsync(request);

                var json = await response.Content.ReadAsStringAsync();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var loginInfo =
                        JsonConvert.DeserializeObject <InstaLoginResponse>(json);
                    IsUserAuthenticated = loginInfo.User != null && loginInfo.User.UserName == _user.UserName;
                    var converter = ConvertersFabric.GetUserConverter(loginInfo.User);
                    _user.LoggedInUder = converter.Convert();
                    _user.RankToken    = $"{_user.LoggedInUder.Pk}_{_requestMessage.phone_id}";
                    return(Result.Success(true));
                }
                else
                {
                    var loginInfo = GetBadStatusFromJsonString(json);
                    if (loginInfo.ErrorType == "checkpoint_logged_out")
                    {
                        return(Result.Fail("Please go to instagram.com and confirm checkpoint",
                                           ResponseType.CheckPointRequired, false));
                    }
                    if (loginInfo.ErrorType == "login_required")
                    {
                        return(Result.Fail("Please go to instagram.com and check if you account marked as unsafe",
                                           ResponseType.LoginRequired, false));
                    }
                    if (loginInfo.ErrorType == "Sorry, too many requests.Please try again later")
                    {
                        return(Result.Fail("Please try again later, maximum amount of requests reached",
                                           ResponseType.LoginRequired, false));
                    }
                    return(Result.Fail(loginInfo.Message, false));
                }
            }
            catch (Exception exception)
            {
                return(Result.Fail(exception.Message, false));
            }
        }