/// <summary> /// Queries Reddit to get the S3 data required for <see cref="UploadImage"/> /// </summary> /// <param name="ad">Advertisement to be created</param> /// <param name="adUh">Reddit's advertisement creation page modhash</param> /// <returns></returns> private AdS3Json GetAdS3Data(Advertisement ad, string adUh) { string adS3PostString = $"kind=thumbnail&link=&filepath={Uri.EscapeDataString(ad.ThumbnailName)}&uh={adUh}&ajax=true&raw_json=1"; const string adS3Url = "https://www.reddit.com/api/ad_s3_params.json"; var adS3Request = WebRequest.Create(adS3Url) as HttpWebRequest; AdS3Json adS3Data = new AdS3Json(); if (adS3Request != null) { adS3Request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; adS3Request.Method = "POST"; adS3Request.CookieContainer = Cookies; adS3Request.Accept = "application/json, text/javascript, */*; q=0.01"; adS3Request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; adS3Request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"; adS3Request.Referer = "https://www.reddit.com/"; adS3Request.Timeout = 15000; var adS3CustomHeaders = adS3Request.Headers; adS3CustomHeaders.Add("accept-language", "en;q=0.4"); adS3CustomHeaders.Add("origin", "https://www.reddit.com"); adS3CustomHeaders.Add("x-requested-with", "XMLHttpRequest"); var adS3Bytes = Encoding.ASCII.GetBytes(adS3PostString); adS3Request.ContentLength = adS3Bytes.Length; using (var os = adS3Request.GetRequestStream()) { os.Write(adS3Bytes, 0, adS3Bytes.Length); } var adS3Response = adS3Request.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.GetEncoding(adS3Response.CharacterSet)) ) { adS3Data = JsonConvert.DeserializeObject <AdS3Json>(sr.ReadToEnd()); } } } } } return(adS3Data); }
/// <summary> /// Upload advertisement's image to Reddit's AWS S3 bucket /// </summary> /// <param name="adS3Data">Object containing all the info needed for the authentication to S3</param> /// <param name="imgPathText">Image's path</param> /// <param name="ad">Advertisement to be created</param> private void UploadImage(AdS3Json adS3Data, string imgPathText, Advertisement ad) { var imgPath = Path.Combine(imgPathText, ad.ThumbnailName); if (File.Exists(imgPath)) { using (var fs = new FileStream(imgPath, FileMode.Open, FileAccess.Read)) { var data = new byte[fs.Length]; fs.Read(data, 0, data.Length); var postParameters = new Dictionary <string, object> { { "acl", "public-read" }, { "key", adS3Data.Fields[1].Value }, { "X-Amz-Credential", adS3Data.Fields[2].Value }, { "X-Amz-Algorithm", adS3Data.Fields[3].Value }, { "X-Amz-Date", adS3Data.Fields[4].Value }, { "success_action_status", adS3Data.Fields[5].Value }, { "content-type", adS3Data.Fields[6].Value }, { "x-amz-storage-class", adS3Data.Fields[7].Value }, { "x-amz-meta-ext", adS3Data.Fields[8].Value }, { "policy", adS3Data.Fields[9].Value }, { "X-Amz-Signature", adS3Data.Fields[10].Value }, { "x-amz-security-token", adS3Data.Fields[11].Value }, { "file", new FormUpload.FileParameter(data, ad.ThumbnailName, adS3Data.Fields[6].Value) } }; FormUpload.MultipartFormDataPost("https://reddit-client-uploads.s3.amazonaws.com/", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", postParameters); } } else { throw new FileNotFoundException("File does not exist on the specified directory!"); } }