Esempio n. 1
0
        /// <summary>
        /// Добавляет новый пост на сайт
        /// </summary>
        /// <param name="inputParam"></param>
        /// <param name="imgUploadResult"></param>
        /// <returns>Если отработал успешно, то true, инчае false</returns>
        async Task <bool> SendPost(SoftPostInput inputParam,
                                   SoftFileUploadResult imgUploadResult,
                                   string userHash,
                                   SoftPost post)
        {
            IEnumerable <KeyValuePair <string, string> > formContent = inputParam.FormData;
            var manualContent = new Dictionary <string, string>
            {
                { inputParam.AddPostFormNameHeader, post.Name },
                { inputParam.AddPostFormDescriptionHeader, post.Description + post.Spoilers },
                { inputParam.AddPostFormPosterHeader, imgUploadResult.Xfvalue },
                { inputParam.UserHashHttpHeaderName, userHash }
            };

            string startKey = inputParam.AddPostFormScreenshotTemplateStartHeader;
            string endKey   = inputParam.AddPostFormScreenshotTemplateEndHeader;

            for (int i = 1; i <= inputParam.AddPostFormMaxCountScreenshots &&
                 i <= post.Imgs.Count; i++)
            {
                manualContent.Add(startKey + i + endKey, post.Imgs[i - 1].ImgUri);
            }
            //todo: Нужно добавить обработку исключения на случай если строка слишком длинная https://stackoverflow.com/questions/38440631
            var content = new FormUrlEncodedContent(formContent.Union(manualContent));

            var result = await _httpClient.PostAsync(inputParam.AddPostAddress, content);

            return(result.IsSuccessStatusCode);
        }
Esempio n. 2
0
        /// <summary>
        /// Добавляет пост на сайт
        /// </summary>
        /// <param name="inputParam"></param>
        /// <returns>Если отработал успешно, то true, инчае false</returns>
        public async Task <PublishResult> AddPost(SoftPostInput inputParam)
        {
            SoftPost post =
                _context.SoftPosts
                .Include(el => el.Imgs)
                .SingleOrDefault(el => el.Id == inputParam.SoftPostId);

            if (post == null)
            {
                _logger.LogError("Не удалось найти указанный подготовленный пост в базе. SoftPost.Id = " + inputParam.SoftPostId);
                return(PublishResult.Error);
            }

            string userHash = await Authorize(inputParam);

            //Загружаем файл
            PublishResult torrentUploadResult = await UploadFile(inputParam,
                                                                 Path.GetFileName(post.TorrentFile),
                                                                 post.TorrentFile,
                                                                 userHash,
                                                                 inputParam.TorrentUploadQueryString);

            if (torrentUploadResult == PublishResult.Error)
            {
                _logger.LogError("Не удалось загрузить торрент файл на сайт");
                return(PublishResult.Error);
            }
            if (torrentUploadResult == PublishResult.FileExist)
            {
                _logger.LogError("Такой торрент файл уже загружен");
                return(PublishResult.FileExist);
            }

            //Загружаем постер
            SoftFileUploadResult imgUploadResult = await UploadPoster(inputParam,
                                                                      Path.GetFileName(post.PosterImg),
                                                                      post.PosterImg,
                                                                      userHash,
                                                                      inputParam.PosterUploadQueryString);

            if (imgUploadResult == null)
            {
                _logger.LogError("Не удалось загрузить постер на сайт");
                return(PublishResult.Error);
            }

            //Выкладываем
            bool sendPostResult = await SendPost(inputParam, imgUploadResult, userHash, post);

            if (!sendPostResult)
            {
                _logger.LogError("Не удалось отправить пост на сайт");
                return(PublishResult.Error);
            }
            return(PublishResult.Success);
        }
        public async Task <ActionResult <string> > AddPost([FromBody] SoftPostInput inputParam)
        {
            PublishResult result = await _softService.AddPost(inputParam);

            if (result == PublishResult.Success)
            {
                return(Ok("Пост успешно добавлен"));
            }

            return(BadRequest("Не удалось добавить пост"));
        }
Esempio n. 4
0
        /// <summary>
        /// Подготавливаем и выкладываем пост
        /// </summary>
        /// <param name="itemType">Тип поста</param>
        /// <param name="itemId">Id поста</param>
        /// <returns>Если метод выполнен успешно - true, инчае false</returns>
        async Task <PublishResult> Send(string itemType, int itemId)
        {
            //Подготавливаем
            DriverToSoftInput driverInput =
                _context.DriverToSoftInputs
                .Single(el => el.Active && el.Type == itemType);

            driverInput.ParseItemId = itemId;
            SoftPost post = await _driverService.Convert(driverInput);

            if (post == null)
            {
                _logger.LogError($"Не удалось подготовить пост к публикации. {itemType}.Id = " + itemId);
                return(PublishResult.Error);
            }

            //Выкладываем
            SoftPostInput softPostInput =
                _context.SoftPostInputs
                .Single(el => el.Active);

            softPostInput.SoftPostId = post.Id;
            softPostInput.PosterUploadQueryString =
                _context.DictionaryValues
                .Where(el => el.DictionaryName == softPostInput.PosterUploadQueryStringId)
                .ToDictionary(k => k.Key, v => v.Value);
            softPostInput.TorrentUploadQueryString =
                _context.DictionaryValues
                .Where(el => el.DictionaryName == softPostInput.TorrentUploadQueryStringId)
                .ToDictionary(k => k.Key, v => v.Value);
            softPostInput.FormData =
                _context.DictionaryValues
                .Where(el => el.DictionaryName == softPostInput.FormDataId)
                .ToDictionary(k => k.Key, v => v.Value);
            softPostInput.AuthData =
                _context.DictionaryValues
                .Where(el => el.DictionaryName == softPostInput.AuthDataId)
                .ToDictionary(k => k.Key, v => v.Value);
            PublishResult result = await _softService.AddPost(softPostInput);

            if (result == PublishResult.Error)
            {
                _logger.LogError("Не удалось выложить пост на сайт. SoftPost.Id = " + post.Id);
                return(PublishResult.Error);
            }
            if (result == PublishResult.FileExist)
            {
                _logger.LogError("Не удалось выложить пост на сайт. Такой файл уже загружен.");
                return(PublishResult.FileExist);
            }
            return(PublishResult.Success);
        }
Esempio n. 5
0
        /// <summary>
        /// Загрузить файл на cайт
        /// </summary>
        /// <param name="inputParam"></param>
        /// <param name="httpFormFileHeader"></param>
        /// <param name="httpFormFileName"></param>
        /// <param name="fullPathFileOnServer"></param>
        /// <returns>Возвращает null, если что-то пошло не так</returns>
        async Task <PublishResult> UploadFile(SoftPostInput inputParam,
                                              string httpFormFileName,
                                              string fullPathFileOnServer,
                                              string userHash,
                                              Dictionary <string, string> queryString)
        {
            var         form    = new MultipartFormDataContent();
            HttpContent content = new StringContent(inputParam.AddPostFormFileHeader);

            form.Add(content, inputParam.AddPostFormFileHeader);

            content = new StreamContent(File.OpenRead(fullPathFileOnServer));
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name     = inputParam.AddPostFormFileHeader,
                FileName = httpFormFileName,
            };
            form.Add(content);

            var query = HttpUtility.ParseQueryString("");

            foreach (var item in queryString)
            {
                query[item.Key] = item.Value;
            }
            query[inputParam.AddPostFormFileHeader]  = httpFormFileName;
            query[inputParam.UserHashHttpHeaderName] = userHash;

            string fullAddrUploadFile = inputParam.UploadFileAddress + query.ToString();
            var    result             = await _httpClient.PostAsync(fullAddrUploadFile, form);

            string contents = await result.Content.ReadAsStringAsync();

            SoftFileUploadResult uploadResult = JsonConvert.DeserializeObject <SoftFileUploadResult>(contents);

            if (!uploadResult.Success)
            {
                if (contents.Contains("\"error\":\"Такой файл уже загружен на сайт!"))
                {
                    _logger.LogError("Такой файл уже загружен на сайт!");
                    return(PublishResult.FileExist);
                }
                _logger.LogError("Не удалось загрузить файл на сайт. Имя файла на сервере:" + fullPathFileOnServer);
                _logger.LogError("Returnbox = " + uploadResult.Returnbox);
                _logger.LogError("UploadResultContent = " + contents);
                return(PublishResult.Error);
            }
            return(PublishResult.Success);
        }
Esempio n. 6
0
        /// <summary>
        /// Авторизоваться на сайте
        /// </summary>
        /// <param name="inputParam">Параметры доступа к сайту</param>
        /// <returns>Возвращает хеш пользователя, который нужно добавлять к некоторым запросам. Если авторизвация не успешна - null</returns>
        async Task <string> Authorize(SoftPostInput inputParam)
        {
            IEnumerable <KeyValuePair <string, string> > formContent = inputParam.AuthData;
            var content = new FormUrlEncodedContent(formContent);

            HttpResponseMessage result = await _httpClient.PostAsync(inputParam.AddPostAddress, content);

            string htmlPage = await result.Content.ReadAsStringAsync();

            int startHash = htmlPage.IndexOf(inputParam.UserHashFindVarName)
                            + inputParam.UserHashFindVarName.Length
                            + inputParam.UserHashExStringCount;

            if (startHash == 0 || startHash == -1)
            {
                return(null);
            }
            return(htmlPage.Substring(startHash, inputParam.UserHashLength));
        }