private async Task <List <ArticleInfo> > GoogleSearch(List <ArticleInfo> myArticles) { // 구글 검색 키워드를 만든다 StringBuilder sb = new StringBuilder(); sb.Append('"'); sb.Append(await Clien.GetMyNickname()); sb.Append("님\" site:clien.net"); List <ArticleInfo> searchArticles = new List <ArticleInfo>(); string keyword = sb.ToString(); Console.WriteLine("구글에서 {0} 로 검색하여 내가 쓴 댓글이 있는 글도 수집합니다.", keyword); GoogleSearch search = new GoogleSearch(keyword, 100); while (true) { var searchResult = search.FetchResults(); searchResult.Wait(); foreach (var result in searchResult.Result) { try { // /url?q=http://webcache.googleusercontent.com/search%3Fhl%3Den%26q%3Dcache:phgR10UBmtYJ:http://powoy558vs.egloos.com/2422221%252B%25EB%2585%25B8%25EB%25A6%25AC%25EB%258B%2598%26num%3D100%26%26ct%3Dclnk&sa=U&ei=hzf4U9XsG5S48gW-iIHIDQ&ved=0CKcEECAwZw&usg=AFQjCNEZ3-BmuR67Y2UKzq6nuFHjGOySsQ // "/url?q=" 로 시작하므로 앞에 글자를 제거하자 var proxyUrl = HttpUtility.ParseQueryString(HttpUtility.HtmlDecode(result.Url.Substring(4))); var realUrl = HttpUtility.HtmlDecode(proxyUrl["q"]); // 게시판 URL일때만 큐에 넣어둔다. if (realUrl.IndexOf("board.php") >= 0) { int queryIndex = realUrl.IndexOf('?'); var queryString = HttpUtility.ParseQueryString(realUrl.Substring(queryIndex + 1)); var foundArticle = new ArticleInfo() { Subject = result.Title, ID = long.Parse(queryString["wr_id"]), Table = queryString["bo_table"] }; // 담겨진 요소를 캐시해서 배열에서 요소를 다시 찾아보는낭비를 줄여야하지만 // 이 프로그램은 이정도 성능 이슈는 상관없으므로 무시하자. if (myArticles.Where(x => (x.ID == foundArticle.ID && x.Table.Equals(foundArticle.Table))).Count() == 0) { searchArticles.Add(foundArticle); //Console.WriteLine("[구굴링 결과] {0}" + foundArticle.Subject); } } } catch (Exception e) { // 검색결과를 파싱하다가 나는 에러는 무시하자. } } if (search.HasNext == false) { break; } await Task.Delay(1000); } return(searchArticles); }