Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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!");
            }
        }