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"]); } }
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); })); }
/// <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); })); }