public override void GetPage(GachonUser guser, PostItem post) { HtmlDocument dom = guser.VisitPage(post.url); post.Title = ParseSupport.StringFromHtml(dom.DocumentNode.SelectSingleNode("//td[@class='tit']").InnerText); post.Content = ParseSupport.StringFromHtml(dom.DocumentNode.SelectSingleNode("//td[contains(@class,'text')]").InnerText); }
public static GachonUser GetObject(string ID, string password) { /* * 동시에 여러 쓰레드에서 같은 아이디에 대해 새로 로그인하는경우 문제가 있습니다. * 지금은 이 함수 전체에 lock을 걸어 해결하지만, 더 나은 성능을 위해서는 * 각각의 유저에 대해 lock을 진행할 필요가 있습니다. */ lock (Login_Lock) { if (GachonObjects.AllUser.ContainsKey(ID)) { if (GachonObjects.AllUser[ID].password == password) { return(GachonObjects.AllUser[ID]); } else { return(null); } } else { GachonUser user = new GachonUser(ID, password); if (user.LoginOk) { GachonObjects.AllUser.Add(ID, user); return(user); } else { return(null); } } } }
public override void GetPage(GachonUser guser, PostItem post) { HtmlDocument dom = guser.VisitPage(post.url); post.Title = ParseSupport.StringFromHtmlNode(dom.DocumentNode.SelectSingleNode("//div[@class='subject']")); post.Content = ParseSupport.StringFromHtmlNode(dom.DocumentNode.SelectSingleNode("//div[@class='ubboard']//div[contains(@class,'text_to_html')]")); }
public override List <PostItem> GetList(GachonUser guser, BoardType board) { List <PostItem> result = new List <PostItem>(); HtmlDocument dom = guser.VisitPage(board.url); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//div[@class='list']//table//tr"); //timer.Print(); if (sets != null) { foreach (HtmlNode node in sets) { if (node.InnerText.IndexOf("No registered post") < 0 && node.InnerText.IndexOf("등록된 게시글이 없습니다") < 0 && node.ChildNodes["th"] == null) { HtmlNodeCollection datas = node.SelectNodes(".//td"); string url = ParseSupport.StringFromHtml(datas[1].ChildNodes["a"].Attributes["href"].Value); result.Insert(0, new PostItem(board) { url = url, source = this, no = Int32.Parse(datas[0].InnerText), Title = ParseSupport.StringFromHtml(datas[1].InnerText), Publisher = datas[2].InnerText, time = DateTime.Parse(datas[3].InnerText) }); } } } return(result); }
public void Update(GachonUser guser) { // 자기 자신에게 락을 걸고 수행. // 락을 걸지 않으면 동시에 여러 쓰레드가 업데이트 요청시 중복된 결과 반환 가능성 존재. lock (this) { PageSearch(guser); } }
public void CombineTakeUser(GachonUser gachonUser) { if (!gachonUser.Takes.Contains(this)) { gachonUser.Takes.Add(this); } if (!Users.Contains(gachonUser)) { Users.Add(gachonUser); } }
/// <summary> /// 해당 유저를 강의 수강생으로 연결해주는 과정입니다. /// </summary> /// <param name="gachonUser"></param> public void CombineTakeUser(GachonUser gachonUser) { if (!gachonUser.Takes.Contains(this)) { gachonUser.Takes.Add(this); //해당 강의를 유저가 수강하는 강의 목록에 추가 } if (!Users.Contains(gachonUser)) { Users.Add(gachonUser); //해당 강의에도 수강 학생 등록 } }
/// <summary> /// 새로운 게시글이 있는지 확인합니다. /// 탐색 세션은 기존에 GachonUser로 로그인중인 유저중 한명을 랜덤으로 선택합니다. /// </summary> public void CheckNewPost() { if (Users.Count > 0) { Random rd = new Random(); int a = rd.Next(Users.Count); GachonUser gu = Users[a]; foreach (Site site in Sites.Values) { site.Update(gu); } } }
/// <summary> /// 공지사항, 자유게시판 등 메뉴를 읽어오는 함수입니다. /// </summary> /// <param name="guser"></param> public override void SearchMenu(GachonUser guser) { if (boards.Count == 0)// 값이 없을때만 실행 { // 웹사이트의 메뉴부분의 주소를 읽어옵니다. Uri baseuri = new Uri(SiteUrl + "board/list.jsp?Menu_seq=0&Forum_seq=" + ID); HtmlDocument dom = guser.VisitPage(baseuri); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//ul[@class='dep']/li/a"); if (sets == null) { throw new NoConnectPageError("연결이 정상적으로 이뤄지지 않음"); } #region 각 메뉴의 종류를 분류하여 게시판 타입을 지정해줍니다. foreach (HtmlNode node in sets) { string menu_title = node.InnerText; string href = ParseSupport.StringFromHtml(node.Attributes["href"].Value); switch (menu_title) { case "공지사항": boards.Add(new BoardType(BoardType.PostType.Notice, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "강의자료실": case "토론/시험자료실": boards.Add(new BoardType(BoardType.PostType.Lecture, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "레포트제출실": boards.Add(new BoardType(BoardType.PostType.Homework, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "HOME": break; default: boards.Add(new BoardType(BoardType.PostType.ETC, menu_title, new Uri(baseuri, href))); break; } } #endregion } }
public override void SearchMenu(GachonUser guser) { Uri baseuri = new Uri("https://cafe.naver.com/" + ID); HtmlDocument dom = guser.VisitPage(baseuri, Encoding.Default); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//ul[@class='cafe-menu-list']//li"); foreach (HtmlNode node in sets) { string menu_title = ParseSupport.StringFromHtml(node.InnerText); if (node.ChildNodes["a"] == null) { continue; } string href = node.ChildNodes["a"].Attributes["href"].Value; if (menu_title.IndexOf("공모전") >= 0 || menu_title.IndexOf("공지") >= 0) { NewBoard(BoardType.PostType.Notice, menu_title, baseuri, href); } } }
public override void SearchMenu(GachonUser guser) { Uri baseuri = new Uri("http://cyber.gachon.ac.kr/mod/ubboard/index.php?id=" + ID); HtmlDocument dom = guser.VisitPage(baseuri); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//div[contains(@class,'boards')]//tr/td[1]"); foreach (HtmlNode node in sets) { string menu_title = ParseSupport.StringFromHtml(node.InnerText); if (node.ChildNodes["a"] == null) { continue; } string href = node.ChildNodes["a"].Attributes["href"].Value; if (menu_title.IndexOf("Announcements") >= 0 || menu_title.IndexOf("공지") >= 0) { NewBoard(BoardType.PostType.Notice, menu_title, baseuri, href); } } }
/// <summary> /// (네이버 카페) 게시글의 목록을 가져옵니다. /// </summary> /// <param name="guser"></param> /// <param name="board"></param> /// <returns></returns> public override List <PostItem> GetList(GachonUser guser, BoardType board) { List <PostItem> result = new List <PostItem>(); HtmlDocument dom = guser.VisitPage(board.url, Encoding.Default); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//div[@id='main-area']//tr"); //timer.Print(); if (sets != null) { foreach (HtmlNode node in sets) { //등록된 게시글이 존재하면 if (node.InnerText.IndexOf("No registered post") < 0 && node.InnerText.IndexOf("등록된 게시글이 없습니다") < 0 && node.ChildNodes["th"] == null) { HtmlNodeCollection datas = node.SelectNodes("./td"); HtmlNodeCollection TitleDivs = datas[0].SelectNodes("./div"); //data Count가 5일 때 원하는 배열의 값이 순서대로 들어있음 if ((datas.Count == 5) && (TitleDivs[0].InnerText.IndexOf("공지") == -1)) { TitleDivs[1] = TitleDivs[1].SelectSingleNode(".//a"); datas[1] = datas[1].SelectSingleNode(".//a"); string url = ParseSupport.StringFromHtml(TitleDivs[1].Attributes["href"].Value); //새로운 PostItem 생성 result.Insert(0, new PostItem(board) { url = url, source = this, no = Int32.Parse(TitleDivs[0].InnerText), Title = ParseSupport.StringFromHtml(TitleDivs[1].InnerText).Trim(), Publisher = datas[1].InnerText.Trim(), time = DateTime.Parse(datas[2].InnerText), }); } } } } return(result); }
public override void SearchMenu(GachonUser guser) { if (boards.Count == 0)// 값이 없을때만 실행 { Uri baseuri = new Uri(SiteUrl + "board/list.jsp?Menu_seq=0&Forum_seq=" + ID); HtmlDocument dom = guser.VisitPage(baseuri); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//ul[@class='dep']/li/a"); foreach (HtmlNode node in sets) { string menu_title = node.InnerText; string href = ParseSupport.StringFromHtml(node.Attributes["href"].Value); switch (menu_title) { case "공지사항": boards.Add(new BoardType(BoardType.PostType.Notice, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "강의자료실": case "토론/시험자료실": boards.Add(new BoardType(BoardType.PostType.Lecture, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "레포트제출실": boards.Add(new BoardType(BoardType.PostType.Homework, menu_title, new Uri(baseuri, href).AbsoluteUri)); break; case "HOME": break; default: boards.Add(new BoardType(BoardType.PostType.ETC, menu_title, new Uri(baseuri, href))); break; } } } }
public void PageSearch(GachonUser guser) { if (ReadBoardList == false) { ReadBoardList = true; try { SearchMenu(guser); } catch (NoConnectPageError E) { ReadBoardList = false; return; } #region 메뉴별 가장 최근의 게시글 번호 갱신 (article 테이블에서 sitetype, siteid, board_name 으로 그룹화) MysqlNode node = new MysqlNode(GachonOption.MysqlOption, "select sitetype, siteid, board_name, max(no) as NO from article where siteType = ?sitetype and siteid = ?siteid group by sitetype, siteid, board_name;"); node["sitetype"] = Type; node["siteid"] = ID; using (node.ExecuteReader()) { while (node.Read()) { string find_menuName = node.GetString("board_name"); int find_count = node.GetInt("no"); foreach (BoardType board in boards) { if (board.name == find_menuName) { board.LastNo = find_count; break; } } } } #endregion } foreach (BoardType board in boards) { List <PostItem> items = null; try { items = GetList(guser, board); } catch (NoConnectPageError e) { } if (items != null) { for (int i = 0; i < items.Count; i++) { if (board.LastNo < items[i].no) { if (GachonOption.VisitPage) { GetPage(guser, items[i]); //아이템 정보를 읽어서 갱신 } NewPostEvent(items[i]); board.LastNo = items[i].no; } } // 혹시 게시글이 삭제됬을경우 마지막 방문 게시글을 되돌린다. int this_last_no = 0; if (items.Count > 0) { this_last_no = items[items.Count - 1].no; } if (board.LastNo > this_last_no) { board.LastNo = this_last_no; } } } }
public abstract void GetPage(GachonUser guserm, PostItem item);
public abstract List <PostItem> GetList(GachonUser guser, BoardType board);
public abstract void SearchMenu(GachonUser guser);
/// <summary> /// 메뉴 안 게시글 목록을 읽어오는 함수입니다. /// </summary> /// <param name="guser"></param> /// <param name="board">메뉴</param> /// <returns></returns> public override List <PostItem> GetList(GachonUser guser, BoardType board) { //Timer timer = new Timer(Type+ID + "["+ board.url+"]", 5); List <PostItem> result = new List <PostItem>(); HtmlDocument dom = guser.VisitPage(board.url); HtmlNodeCollection sets = dom.DocumentNode.SelectNodes("//div[@class='boardlist']/table/tbody/tr"); //timer.Print(); if (sets != null) { foreach (HtmlNode node in sets) { //등록된 게시글이 존재하면 if (node.InnerText.IndexOf("등록된 글이") < 0) { //게시글의 주소를 얻음 HtmlNodeCollection datas = node.SelectNodes(".//td"); string url = datas[1].SelectSingleNode(".//a").Attributes["href"].Value; url = ParseSupport.StringFromHtml(url); string no = null; //javascript:go page()의 파라미터를 통해 주소를 얻음 if (url.IndexOf("java") == 0) { Regex reg = new Regex(@"javascript:goPage\([0-9]+,([0-9]+)\)"); no = reg.Match(url).Groups[1].Value; url = board.url.Replace("list.jsp", "view.jsp") + "&article_no=" + no; } //그 외에는 절대경로를 얻어냄 else { Uri uri = new Uri(new Uri(board.url), url); url = uri.AbsoluteUri; no = ParseSupport.UrlQueryParser(url)["article_no"].ToString(); } PostItem item; #region 레포트 제출실 메뉴일 경우 if (board.type == BoardType.PostType.Homework) { //각 list의 정보를 포함한 PostItem 객체를 생성한다 //레포트 제출실의 경우 제출 인원, 마감날짜의 정보가 일반 게시글과 다르기 때문에 분류하였음 item = new PostItem(BoardType.PostType.Homework, board.name) { source = this, url = url, no = Int32.Parse(no), Title = ParseSupport.StringFromHtml(datas[1].InnerText), time = DateTime.Now, s_time = DateTime.Parse(datas[2].InnerText.Substring(0, 10)), e_time = DateTime.Parse(datas[2].InnerText.Substring(13, 10)), num_submitted = Int32.Parse(datas[5].InnerText.Split('/')[0]), Publisher = "관리자" }; } #endregion #region 그 외의 메뉴 (공지사항, 강의자료실 등) else { item = new PostItem(board.type, board.name) { source = this, url = url, no = Int32.Parse(no), Title = ParseSupport.StringFromHtml(datas[1].InnerText), Publisher = datas[2].InnerText, time = DateTime.Parse(datas[3].InnerText) }; } result.Insert(0, item); #endregion } } } return(result); }
public override void GetPage(GachonUser guserm, PostItem item) { }