-
[C#] Naver API 호출C#/기초 2025. 6. 5. 08:48
class News
class News { public string Title { get; set; } public string OriginalLink { get; set; } public string Link { get; set; } public string Description { get; set; } public DateTime Pubdate { get; set; } public News(string title, string originalLink, string link, string description, DateTime pubdate) { Title = title; OriginalLink = originalLink; Link = link; Description = description; Pubdate = pubdate; } public static News Make(XmlNode xn) { try { string title = Strip(xn.SelectSingleNode("title").InnerText); string olink = Strip(xn.SelectSingleNode("originallink").InnerText); string link = Strip(xn.SelectSingleNode("link").InnerText); string description = Strip(xn.SelectSingleNode("description").InnerText); DateTime pubdate = DateTime.Parse(xn.SelectSingleNode("pubDate").InnerText); return new News(title, olink, link, description, pubdate); } catch { return null; } } private static string Strip(string innerText) { int s = innerText.IndexOf("<"); int e = innerText.IndexOf(">"); while (s < e) { string b = innerText.Substring(0, s); string a = innerText.Substring(e + 1); innerText = b + a; s = innerText.IndexOf("<"); e = innerText.IndexOf(">"); } return innerText; } public override string ToString() { return Title; } }
class NaverNews
class NaverNews { public string SRC { get; set; } public string ID { get; set; } public string Secret { get; set; } public NaverNews(string iD, string secret) { this.ID = iD; this.Secret = secret; } public int Find(string src) { this.SRC = src; Stream stream; string url = $"https://openapi.naver.com/v1/search/news.xml?query={SRC}&sort=date"; XmlDocument xdoc = MakeXMLDocument(url, out stream); XmlNode node = xdoc.SelectSingleNode("rss"); XmlNode n = node.SelectSingleNode("channel"); int total = int.Parse(n.SelectSingleNode("total").InnerText); stream.Close(); return total; } private XmlDocument MakeXMLDocument(string url, out Stream stream) { WebRequest request = null; request = WebRequest.Create(url); request.Headers.Add("X-Naver-Client-Id", ID); request.Headers.Add("X-Naver-Client-Secret", Secret); WebResponse response = request.GetResponse(); stream = response.GetResponseStream(); XmlDocument xdoc = new XmlDocument(); xdoc.Load(stream); return xdoc; } public List<News> FindNewsToXML(int start, int display) { Stream stream; string url = $"https://openapi.naver.com/v1/search/news.xml?query={SRC}&display={display}&start={start}&sort=date"; XmlDocument xdoc = MakeXMLDocument(url, out stream); XmlNode node = xdoc.SelectSingleNode("rss"); XmlNode n = node.SelectSingleNode("channel"); XmlNodeList xnl = n.SelectNodes("item"); List<News> nc = new List<News>(); News news; foreach (XmlNode xn in xnl) { news = News.Make(xn); if (news == null) { break; } nc.Add(news); } stream.Close(); return nc; } private async Task<string> MakeJSONDocumentAsync(string url) { try { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("X-Naver-Client-Id", ID); client.DefaultRequestHeaders.Add("X-Naver-Client-Secret", Secret); using (var response = client.GetAsync(new Uri(url)).Result) { return await response.Content.ReadAsStringAsync(); } } catch { return null; } } private string MakeJSONDocument(string url) { string responseFromServer = string.Empty; try { WebRequest request = WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; request.Headers["X-Naver-Client-Id"] = ID; request.Headers["X-Naver-Client-Secret"] = Secret; using (WebResponse response = request.GetResponse()) using (Stream dataStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(dataStream)) responseFromServer = reader.ReadToEnd(); } catch { return null; } return responseFromServer; } public List<News> FindNewsJson(int start, int display) { string url = $"https://openapi.naver.com/v1/search/news.json?query={SRC}&display={display}&start={start}&sort=sim"; //var parseJson = JObject.Parse(MakeJSONDocument(url)); var parseJson = JObject.Parse(MakeJSONDocumentAsync(url).Result); // var QueryResultCount = Convert.ToInt32(parseJson["display"]); // var TotalResultCount = Convert.ToInt32(parseJson["total"]); List<News> news = JsonConvert.DeserializeObject<List<News>>(parseJson["items"].ToString()); return news; } public List<News> FindBlogsJson(int start, int display) { string url = $"https://openapi.naver.com/v1/search/blog.json?query={SRC}&display={display}&start={start}&sort=sim"; //var parseJson = JObject.Parse(MakeJSONDocument(url)); var parseJson = JObject.Parse(MakeJSONDocumentAsync(url).Result); // var QueryResultCount = Convert.ToInt32(parseJson["display"]); // var TotalResultCount = Convert.ToInt32(parseJson["total"]); List<News> news = JsonConvert.DeserializeObject<List<News>>(parseJson["items"].ToString()); return news; } }
mcpClient = await GetMcpClientAsync();
async Task<IMcpClient> GetMcpClientAsync() { try { // Create Sse MCP client connecting to our MCP server var mcpClient = await McpClientFactory.CreateAsync( new SseClientTransport( new SseClientTransportOptions { Name = "SseClientTest", Endpoint = new Uri("https://localhost:7051/sse"), } ) ); return mcpClient; } catch (Exception e) { Trace.WriteLine($"Error creating MCP client: {e.Message}"); return null; } }
GetNews
public async Task<IEnumerable<SearchedItem>> GetNews(string searchedText) { var searchedItems = new List<SearchedItem>(); try { var searchNaverNews = await mcpClient.CallToolAsync( "NaverNewsSearch", new Dictionary<string, object?>() { ["message"] = searchedText }, cancellationToken: CancellationToken.None); foreach (var item in searchNaverNews.Content) { var searchedItem = new SearchedItem { Name = item.Text?.Split('\n')[0], Content = item.Text?.Split('\n')[1], Link = item.Text?.Split('\n')[2], //Type = item.Text?.Split('\n')[3] ?? "Feature" }; searchedItems.Add(searchedItem); Trace.WriteLine("=============================================================================="); Trace.WriteLine($"Title: {item?.Text?.Split('\n')[0]}"); Trace.WriteLine($"Description: {item?.Text?.Split('\n')[1]}"); Trace.WriteLine($"Link: {item?.Text?.Split('\n')[2]}"); Trace.WriteLine($"PubDate: {item?.Text?.Split('\n')[3]}"); } } catch (Exception e) { Trace.WriteLine($"Error fetching news: {e.Message}"); } return searchedItems; }
C# 알아가기 (6. C# 네이버 API로 뉴스 정보 받아오기)
https://ehpub.co.kr/news-crawling-library-make-csharp-data-analysis/http://www.toughman.pe.kr/2017/05/c%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C
velog.io
https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8
검색 > 블로그 - Search API
검색 > 블로그 블로그 검색 개요 개요 검색 API와 블로그 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수 있는 API
developers.naver.com
728x90'C# > 기초' 카테고리의 다른 글
[C#] Configure C# language version (0) 2025.05.29 [C#] WebRequest to HttpClient Migration (0) 2025.05.28 [C#] ObservableCollection Addrange (0) 2025.05.14 [C#] warning disable (0) 2025.05.08 [C#] Return 반환 값 2개 (0) 2025.05.08 댓글