Beispiel #1
0
        internal static void GetDeleteFlowArticleParameters(string html, GalleryType gallType, out Dictionary <string, string> delete_Params, out string lately_gallery)
        {
            HtmlDocument doc = new HtmlDocument();

            doc.LoadHtml(html);

            delete_Params = new Dictionary <string, string>();

            HtmlNode deleteNode = null;

            lately_gallery = null;

            try
            {
                deleteNode = doc.GetElementbyId("id").ParentNode.SelectSingleNode(".//form");
                if (gallType == GalleryType.Normal)
                {
                    lately_gallery = doc.GetElementbyId("lately_gallery").GetAttributeValue("value", "");
                }
            }
            catch { }

            if (deleteNode == null)
            {
                if (html.Contains("/error/deleted"))
                {
                    throw new Exception("이미 삭제된 글입니다.");
                }
                else
                {
                    throw new Exception("알 수 없는 오류입니다.");
                }
            }

            foreach (HtmlNode input in deleteNode.ParentNode.Descendants("input").Where(n => n.GetAttributeValue("type", "") == "hidden"))
            {
                delete_Params.Add(input.GetAttributeValue("name", ""), input.GetAttributeValue("value", ""));
            }

            string jsParamName, jsParamValue, jsEncCode;
            string jsScript = "";

            foreach (HtmlNode scriptNode in doc.DocumentNode.Descendants("script"))
            {
                jsScript += scriptNode.InnerHtml;
            }

            if (jsScript == "")
            {
                throw new Exception("알 수 없는 오류입니다.");
            }
            JSParser.ParseAdditionalDeleteParameter(jsScript, gallType, out jsEncCode, out jsParamName, out jsParamValue);

            delete_Params.Add(jsParamName, jsParamValue);
            if (gallType == GalleryType.Normal)
            {
                delete_Params["service_code"] = Crypt.DecryptCode(jsEncCode, delete_Params["service_code"]);
            }
        }
Beispiel #2
0
        internal static async Task <ParameterStorage> GetLoginParameterAsync(string src)
        {
            return(await Task.Run(async() =>
            {
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(src);

                string jsScript = "";

                foreach (HtmlNode scriptNode in doc.DocumentNode.Descendants("script"))
                {
                    jsScript += scriptNode.InnerHtml;
                }

                if (jsScript == "")
                {
                    throw new Exception("로그인 파라미터를 불러오는데 실패하였습니다.");
                }

                // 로그인시 필요한 파라미터 정보들을 가져옴
                return await JSParser.GetLoginParameterAsync(jsScript);
            }));
        }
Beispiel #3
0
        /// <summary>
        /// 삭제할 글의 파라미터를 가져오는 함수
        /// </summary>
        /// <param name="html">글 삭제 페이지의 HTML 소스</param>
        /// <param name="gallType">갤러리 구분</param>
        /// <param name="delete_Params">글 삭제에 필요한 파라미터</param>
        /// <param name="lately_gallery">최근 방문한 갤러리</param>
        internal static async Task <Tuple <ParameterStorage, string> > GetDeleteArticleParameterAsync(string html, GalleryType gallType)
        {
            return(await Task.Run(async() =>
            {
                string lately_gallery = null;
                ParameterStorage delete_Params = new ParameterStorage();

                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);

                HtmlNode deleteNode = null;
                try
                {
                    deleteNode = doc.GetElementbyId("id").ParentNode.SelectSingleNode(".//form");
                    lately_gallery = doc.GetElementbyId("lately_gallery").GetAttributeValue("value", "");
                }
                catch { }

                // 삭제 노드가 없는 경우 이미 삭제된 글이거나 오류
                if (deleteNode == null)
                {
                    if (html.Contains("/error/deleted"))
                    {
                        throw new Exception("이미 삭제된 글입니다.");
                    }
                    else if (doc.GetElementbyId("password_confirm") != null)
                    {
                        throw new Exception("이미 삭제된 글입니다.");
                    }
                    else
                    {
                        throw new Exception("알 수 없는 오류입니다.");
                    }
                }

                // 회원글인데 비밀번호 입력하는 페이지인 경우 이미 삭제된 글
                if (deleteNode.Attributes["action"].Value.Contains("delete_password_submit"))
                {
                    throw new Exception("이미 삭제된 글입니다.");
                }

                foreach (HtmlNode input in deleteNode.ParentNode.Descendants("input").Where(n => n.GetAttributeValue("type", "") == "hidden"))
                {
                    delete_Params.Push(input.GetAttributeValue("name", ""), input.GetAttributeValue("value", ""));
                }

                string jsEncCode;
                ParameterStorage jsParam;
                string jsScript = "";

                foreach (HtmlNode scriptNode in doc.DocumentNode.Descendants("script"))
                {
                    jsScript += scriptNode.InnerHtml;
                }

                if (jsScript == "")
                {
                    throw new Exception("알 수 없는 오류입니다.");
                }

                // 글 삭제시 실행되는 스크립트의 추가 값을 가져옴
                var parseResult = await JSParser.GetDeleteGalleryArticleParameterAsync(jsScript, gallType);
                jsEncCode = parseResult.Item1;
                jsParam = parseResult.Item2;

                delete_Params.Push(jsParam);
                if (gallType == GalleryType.Normal)
                {
                    delete_Params["service_code"] = Cryption.DecryptCode(jsEncCode, delete_Params["service_code"]);
                }

                return new Tuple <ParameterStorage, string>(delete_Params, lately_gallery);
            }));
        }