/// <summary> /// Connects imgur's upload/checkcaptcha endpoint to check if a captcha has to be solved before uploading an image, will return false if a captcha has to be solved or if any exceptions ocurred /// </summary> /// <param name="cookies">Cookies needed to complete the request</param> /// <param name="imgurData">Imgur album data to be collected from the endpoint if no captcha is required</param> /// <param name="errorMessage">Error message to be reported to the user if any exceptions were thrown</param> /// <returns></returns> private bool checkCaptcha(CookieContainer cookies, ref ImgurAlbumData imgurData, ref string errorMessage) { const string captchaUrl = "http://imgur.com/upload/checkcaptcha"; var data = new ImgurAlbumData(); try { var task = Task.Factory.StartNew(() => { var captchaRequest = WebRequest.Create(captchaUrl) as HttpWebRequest; if (captchaRequest != null) { var captchaPostString = "total_uploads=1&create_album=true"; captchaRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; captchaRequest.Method = "POST"; captchaRequest.CookieContainer = cookies; captchaRequest.Accept = "*/*"; captchaRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; captchaRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"; captchaRequest.Referer = "http://imgur.com"; captchaRequest.KeepAlive = true; var captchaCustomHeaders = captchaRequest.Headers; captchaCustomHeaders.Add("Accept-Language", "en;q=0.8"); captchaCustomHeaders.Add("origin", "http://imgur.com"); captchaCustomHeaders.Add("x-requested-with", "XMLHttpRequest"); var captchaBytes = Encoding.ASCII.GetBytes(captchaPostString); captchaRequest.ContentLength = captchaBytes.Length; using (var os = captchaRequest.GetRequestStream()) { os.Write(captchaBytes, 0, captchaBytes.Length); } var adS3Response = captchaRequest.GetResponse() as HttpWebResponse; if (adS3Response != null && adS3Response.StatusCode == HttpStatusCode.OK) { using (var s = adS3Response.GetResponseStream()) { if (s != null) { using ( // ReSharper disable once AssignNullToNotNullAttribute var sr = new StreamReader(s, Encoding.UTF8) ) { data = JsonConvert.DeserializeObject <ImgurAlbumData>(sr.ReadToEnd()); } } } } } }); try { task.Wait(); } catch (AggregateException ae) { if (ae.InnerException != null) { errorMessage = ae.InnerException.Message + Environment.NewLine + ae.StackTrace; } else { errorMessage = ae.Message + Environment.NewLine + ae.StackTrace; } ae.Handle(x => false); } } catch (Exception e) { if (e.InnerException != null) { errorMessage = e.InnerException.Message + Environment.NewLine + e.StackTrace; } else { errorMessage = e.Message + Environment.NewLine + e.StackTrace; } return(false); } if (data == null) { return(false); } imgurData = data; return(imgurData.Success); }
/// <summary> /// Upload image to Imgur. /// </summary> /// <param name="isSocial">Sets if the string is for a social network post.</param> /// <returns>A Task object to be used in async methods</returns> private async Task UploadImage(bool isSocial) { //If string.IsNullOrEmpty(_imgurUrl) == true it means that user hasn't uploaded any images while current program's execution if (string.IsNullOrEmpty(_imgurUrl)) { var cookies = GetCookies(); var imgurData = new ImgurAlbumData(); var imgurImageData = new ImgurImageData(); var errorMessage = string.Empty; ProgressLabel.Content = "Checking captcha"; ProgressLabel.Visibility = Visibility.Visible; GeneralProgressBar.Visibility = Visibility.Visible; //Check if imgur asks for captcha first if (!checkCaptcha(cookies, ref imgurData, ref errorMessage)) { MessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } else { //We have an OK and album data from imgur to upload images if (imgurData.Success) { //Generate image ProgressLabel.Content = "Generating image"; var file = new FileInfo(CreateImage(true)); if (File.Exists(file.FullName)) { ProgressLabel.Content = "Uploading image"; //Upload image using as a multipart form var task = Task.Factory.StartNew(() => { using (var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) { var data = new byte[fs.Length]; fs.Read(data, 0, data.Length); var postParameters = new Dictionary <string, object> { { "new_album_id", imgurData.Data.NewAlbumId }, { "file", new FormUpload.FileParameter(data, file.Name, MimeMapping.GetMimeMapping(file.FullName)) } }; using (var s = FormUpload.MultipartFormDataPost("http://imgur.com/upload", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", postParameters, cookies) .GetResponseStream()) { if (s != null) { using (var sr = new StreamReader(s, Encoding.UTF8)) { imgurImageData = JsonConvert.DeserializeObject <ImgurImageData>(sr.ReadToEnd()); } } } } }); //Wait for task completion await task; //If it isn't for a social site, show a textbox to allow the user to copy imgur's URL if (!isSocial) { ImgurDataGrid.Visibility = Visibility.Visible; ImgurUrlTxtBx.Text = $"http://imgur.com/{imgurImageData.Data.Hash}"; _imgurUrl = ImgurUrlTxtBx.Text; } //Otherwise store it for future use (to avoid unneeded HTTP calls) else { ImgurUrlTxtBx.Text = $"http://imgur.com/{imgurImageData.Data.Hash}"; _imgurUrl = ImgurUrlTxtBx.Text; } File.Delete(file.FullName); } else { MessageBox.Show("File does not exist on the specified directory!", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } else { MessageBox.Show("Try again later!", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } ProgressLabel.Content = ""; ProgressLabel.Visibility = Visibility.Hidden; GeneralProgressBar.Visibility = Visibility.Hidden; } else { //Just show a textbox to allow the user to copy imgur's URL if (!isSocial) { ImgurDataGrid.Visibility = Visibility.Visible; } } }