/// <summary> /// Login to store more cookies /// </summary> /// <param name="username"></param> /// <param name="password"></param> public LoginResult LogIn() { try { // Get bootstrap cookie var bootstrapRequest = HttpRequestBuilder.Get("https://www.instagram.com/accounts/login/", mCoockieC); bootstrapRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; bootstrapRequest.Headers["Upgrade-Insecure-Requests"] = "1"; using (var bootstrapResponse = bootstrapRequest.GetResponse() as HttpWebResponse) { mCoockieC.Add(bootstrapResponse.Cookies); } } catch (Exception bex) { Debug.WriteLine("Bootstrap progress meet exception " + bex.Message); throw bex; } try { var data = $"username={Username}&password={Password}"; var content = Encoding.ASCII.GetBytes(data); var request = HttpRequestBuilder.Post("https://www.instagram.com/accounts/login/ajax/", mCoockieC); // Missing referer get 403 - forbiden status code request.Referer = "https://www.instagram.com/accounts/login/"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = content.Length; request.KeepAlive = true; request.Headers["Origin"] = "https://www.instagram.com"; request.Headers["X-CSRFToken"] = mCoockieC.GetCookies(new Uri("https://www.instagram.com"))["csrftoken"].Value; request.Headers["X-Instagram-AJAX"] = "1"; request.Headers["X-Requested-With"] = "XMLHttpRequest"; // Send login data using (var requestStream = request.GetRequestStream()) { requestStream.Write(content, 0, content.Length); using (var response = request.GetResponse() as HttpWebResponse) using (var responsStream = response.GetResponseStream()) using (var streamReader = new StreamReader(responsStream)) { var responseData = streamReader.ReadToEnd(); return(JsonConvert.DeserializeObject <LoginResult>(responseData)); } } } catch (Exception ex) { Debug.WriteLine("Login progress occur exception " + ex.Message); throw ex; } }
/// <summary> /// Update user profile /// </summary> /// <param name="user"></param> /// <returns>dynamic data maybe dangerous but i think some time dangerous is good LOL!!! - cause i'm lazy</returns> private UpdateProfileResult UpdateProfile(ProfileResult profile) { Debug.WriteLine("Update profile"); string chainingEnable = "", data = ""; try { chainingEnable = profile.form_data.chaining_enabled ? "on" : "off"; data = $"first_name={WebUtility.UrlEncode(profile.form_data.first_name)}&email={profile.form_data.email}&username={WebUtility.UrlEncode(profile.form_data.username)}&phone_number={WebUtility.UrlEncode(profile.form_data.phone_number)}&gender={profile.form_data.gender}&biography={WebUtility.UrlEncode(profile.form_data.biography)}&external_url={WebUtility.UrlEncode(profile.form_data.external_url)}&chaining_enabled={chainingEnable}"; } catch (Exception ex) { Debug.WriteLine(ex.Message); throw; } try { var content = Encoding.ASCII.GetBytes(data); var request = HttpRequestBuilder.Post("https://www.instagram.com/accounts/edit/", mCoockieC); request.Referer = "https://www.instagram.com/accounts/edit/"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = content.Length; request.KeepAlive = true; request.Headers["Origin"] = "https://www.instagram.com"; // maybe exception if mCookieC not contain csrftoken request.Headers["X-CSRFToken"] = mCoockieC.GetCookies(new Uri("https://www.instagram.com"))["csrftoken"].Value; request.Headers["X-Instagram-AJAX"] = "1"; request.Headers["X-Requested-With"] = "XMLHttpRequest"; using (var requestStream = request.GetRequestStream()) { requestStream.Write(content, 0, content.Length); using (var response = request.GetResponse() as HttpWebResponse) { mCoockieC.Add(response.Cookies); using (var responseStream = response.GetResponseStream()) using (var streamReader = new StreamReader(responseStream)) { // If we get result, it always return status ok. Otherwise, exception will occur. var responseData = streamReader.ReadToEnd(); return(JsonConvert.DeserializeObject <UpdateProfileResult>(responseData)); } } } } catch (Exception ex) { // When you change your username with existed username, you will receive 404 error // and obviously exception will occur. In this case, just return false Debug.WriteLine(ex.Message); throw ex; } }
/// <summary> /// Report - return Models.ReportResult /// </summary> /// <param name="postId"></param> /// <returns></returns> public ReportResult Report(string postId, ReportReasonId reasonId) { var data = "reason_id=" + (int)reasonId; var content = Encoding.ASCII.GetBytes(data); var request = HttpRequestBuilder.Post($"https://www.instagram.com/media/{postId}/flag/", mCoockieC); request.ContentType = "application/x-www-form-urlencoded"; request.Referer = $"https://www.instagram.com/"; request.ContentLength = content.Length; request.Headers["X-CSRFToken"] = mCoockieC.GetCookies(new Uri("https://www.instagram.com"))["csrftoken"].Value; request.Headers["X-Instagram-AJAX"] = "1"; request.Headers["X-Requested-With"] = "XMLHttpRequest"; try { using (var stream = request.GetRequestStream()) { stream.Write(content, 0, content.Length); } using (var response = request.GetResponse() as HttpWebResponse) { mCoockieC.Add(response.Cookies); if (request.HaveResponse) { using (var responseStream = response.GetResponseStream()) using (var streamReader = new StreamReader(responseStream)) { var responseData = streamReader.ReadToEnd(); return(JsonConvert.DeserializeObject <ReportResult>(responseData)); } } else { throw new WebException("no response"); } } } catch (Exception ex) { Debug.WriteLine(ex.Message); throw ex; } }
/// <summary> /// Like /// </summary> /// <param name="postId"></param> /// <returns></returns> public LikeResult Like(string postId) { // Note that to get postId, you simple get postlink then add /?__a=1 // result return is jsonresult contain all infomation about this post. // you can like, comment,... example // https://www.instagram.com/p/BHtOw-7gKGs/?__a=1 var request = HttpRequestBuilder.Post($"https://www.instagram.com/web/likes/{postId}/like/", mCoockieC); request.Referer = $"https://www.instagram.com"; request.Headers["X-CSRFToken"] = mCoockieC.GetCookies(new Uri("https://www.instagram.com"))["csrftoken"].Value; request.Headers["X-Instagram-AJAX"] = "1"; request.Headers["X-Requested-With"] = "XMLHttpRequest"; try { using (var response = request.GetResponse() as HttpWebResponse) { mCoockieC.Add(response.Cookies); if (request.HaveResponse) { using (var responseStream = response.GetResponseStream()) using (var streamReader = new StreamReader(responseStream)) { var responseData = streamReader.ReadToEnd(); return(JsonConvert.DeserializeObject <Models.LikeResult>(responseData)); } } else { throw new WebException("no response"); } } } catch (Exception ex) { Debug.WriteLine(ex.Message); throw ex; } }
/// <summary> /// Follow /// </summary> /// <param name="username"></param> /// <returns></returns> public FollowResult Follow(string username) { Debug.WriteLine("Following " + username); var publicInfo = GetPublicInfo(username); var request = HttpRequestBuilder.Post($"https://www.instagram.com/web/friendships/{publicInfo.user.id}/follow/", mCoockieC); request.Referer = $"https://www.instagram.com/{publicInfo.user.username}/"; request.Headers["X-CSRFToken"] = mCoockieC.GetCookies(new Uri("https://www.instagram.com"))["csrftoken"].Value; request.Headers["X-Instagram-AJAX"] = "1"; request.Headers["X-Requested-With"] = "XMLHttpRequest"; try { using (var response = request.GetResponse() as HttpWebResponse) { mCoockieC.Add(response.Cookies); if (request.HaveResponse) { using (var responseStream = response.GetResponseStream()) using (var streamReader = new StreamReader(responseStream)) { var responseData = streamReader.ReadToEnd(); return(JsonConvert.DeserializeObject <FollowResult>(responseData)); } } else { throw new WebException("no response"); } } } catch (Exception ex) { Debug.WriteLine(ex.Message); throw ex; } }