서민정

update crawling news and add style

...@@ -2,15 +2,4 @@ ...@@ -2,15 +2,4 @@
2 ## CHATBOT WITH CRAWLING 2 ## CHATBOT WITH CRAWLING
3 3
4 front 4 front
5 -- [x] Modify card component
6 -- [x] Remove card message on dialogflow
7 -- [ ] Modify Intent on dialogflow
8 -- [ ] Add additional functions on dialogflow
9 -- [x] Show video list on front (card compo)
10 -
11 -back
12 -- [ ] Modify crawling.js to deal with null data
13 -- [ ] Dealing with Event queries
14 -- [ ] 가수와 관련되지 않은 영상이 포함될 땐?
15 -- [ ] 배포 어떻게 할것인가
16 -- [ ] 전반적인 내용 완전히 이해하기 (구조 등)
...\ No newline at end of file ...\ No newline at end of file
5 +- 뉴스 크롤링 후 이미지 사이자 80*80 인 것을 원본으로 변환할 수 있는 방법은..?
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -15,7 +15,7 @@ function Chatbot() { ...@@ -15,7 +15,7 @@ function Chatbot() {
15 useEffect(() => { 15 useEffect(() => {
16 16
17 eventQuery('001_Welcome') 17 eventQuery('001_Welcome')
18 - eventQuery('002_Intro') 18 + .then(eventQuery('002_Intro'))
19 19
20 }, []) 20 }, [])
21 21
...@@ -54,6 +54,7 @@ function Chatbot() { ...@@ -54,6 +54,7 @@ function Chatbot() {
54 response = await Axios.post('/api/related/textQuery', textQueryVariables) 54 response = await Axios.post('/api/related/textQuery', textQueryVariables)
55 } 55 }
56 else if(inputString === '소식'){ //@가수명_소식 56 else if(inputString === '소식'){ //@가수명_소식
57 + console.log("뉴스들어옴")
57 response = await Axios.post('/api/news/textQuery', textQueryVariables) 58 response = await Axios.post('/api/news/textQuery', textQueryVariables)
58 } 59 }
59 60
...@@ -182,12 +183,6 @@ function Chatbot() { ...@@ -182,12 +183,6 @@ function Chatbot() {
182 </div> 183 </div>
183 } 184 }
184 185
185 -
186 - // template for card message
187 -
188 -
189 -
190 -
191 } 186 }
192 187
193 const renderMessage = (returnedMessages) => { 188 const renderMessage = (returnedMessages) => {
...@@ -207,7 +202,7 @@ function Chatbot() { ...@@ -207,7 +202,7 @@ function Chatbot() {
207 height: 650, width: 700, 202 height: 650, width: 700,
208 border: '3px solid black', borderRadius: '7px' 203 border: '3px solid black', borderRadius: '7px'
209 }}> 204 }}>
210 - <div style={{ height: 594, width: '100%', overflow: 'auto' }}> 205 + <div style={{ height: 594, width: '100%', overflow: 'auto'}}>
211 206
212 207
213 {renderMessage(messagesFromRedux)} 208 {renderMessage(messagesFromRedux)}
...@@ -217,7 +212,7 @@ function Chatbot() { ...@@ -217,7 +212,7 @@ function Chatbot() {
217 <input 212 <input
218 style={{ 213 style={{
219 margin: 0, width: '100%', height: 50, 214 margin: 0, width: '100%', height: 50,
220 - borderRadius: '4px', padding: '5px', fontSize: '1rem' 215 + borderRadius: '4px', padding: '5px', fontSize: '1rem', fontFamily: 'KyoboHand'
221 }} 216 }}
222 placeholder="Send a message..." 217 placeholder="Send a message..."
223 onKeyPress={keyPressHanlder} 218 onKeyPress={keyPressHanlder}
......
...@@ -8,11 +8,12 @@ function CardComponent(props) { ...@@ -8,11 +8,12 @@ function CardComponent(props) {
8 console.log("props" ,props) 8 console.log("props" ,props)
9 return ( 9 return (
10 <Card 10 <Card
11 - style={{ width: 200 }} 11 + style={{ width: 180}}
12 cover={ 12 cover={
13 <img 13 <img
14 alt={props.cardInfo.description} 14 alt={props.cardInfo.description}
15 - src={props.cardInfo.image} /> 15 + src={props.cardInfo.image}
16 + />
16 } 17 }
17 actions={[ 18 actions={[
18 <a target="_blank" rel="noopener noreferrer" href={props.cardInfo.link}> 19 <a target="_blank" rel="noopener noreferrer" href={props.cardInfo.link}>
...@@ -29,32 +30,4 @@ function CardComponent(props) { ...@@ -29,32 +30,4 @@ function CardComponent(props) {
29 30
30 ) 31 )
31 } 32 }
32 -
33 -
34 -/*
35 -function CardComponent(props) {
36 - return (
37 - <Card
38 - style={{ width: 300 }}
39 - cover={
40 - <img
41 - alt={props.cardInfo.fields.description.stringValue}
42 - src={props.cardInfo.fields.image.stringValue} />
43 - }
44 - actions={[
45 - <a target="_blank" rel="noopener noreferrer" href={props.cardInfo.fields.link.stringValue}>
46 - <Icon type="ellipsis" key="ellipsis" />
47 - </a>
48 - ]}
49 - >
50 - <Meta
51 - title={props.cardInfo.fields.title.stringValue}
52 - description={props.cardInfo.fields.description.stringValue}
53 - />
54 -
55 - </Card>
56 -
57 - )
58 -}
59 -*/
60 export default CardComponent 33 export default CardComponent
......
1 -@import url('https://fonts.googleapis.com/css2?family=Nanum+Gothic&display=swap'); 1 +@font-face {
2 + font-family: 'KyoboHand';
3 + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_20-04@1.0/KyoboHand.woff') format('woff');
4 + font-weight: normal;
5 + font-style: normal;
6 +}
7 +
2 * { 8 * {
3 word-break: keep-all; 9 word-break: keep-all;
4 overflow-wrap: break-word; 10 overflow-wrap: break-word;
...@@ -8,26 +14,30 @@ ...@@ -8,26 +14,30 @@
8 html, 14 html,
9 body { 15 body {
10 max-height: 800px; 16 max-height: 800px;
17 + font-family: 'KyoboHand';
11 } 18 }
12 19
13 body { 20 body {
14 margin: 0; 21 margin: 0;
15 padding: 0; 22 padding: 0;
16 - font-family: Nanum Gothic,Lato, Helvetica Neue, Arial, Helvetica, sans-serif; 23 + font-family: 'KyoboHand','Nanum Gothic',Lato, Helvetica Neue, Arial, Helvetica, sans-serif;
17 -webkit-font-smoothing: antialiased; 24 -webkit-font-smoothing: antialiased;
18 } 25 }
19 26
20 .ant-list-item-meta-content { 27 .ant-list-item-meta-content {
21 max-width: 500px; 28 max-width: 500px;
22 overflow-x: scroll; 29 overflow-x: scroll;
30 + font-family: 'KyoboHand';
23 } 31 }
24 32
25 .ant-list-item-meta-title { 33 .ant-list-item-meta-title {
26 font-size: 20px !important; 34 font-size: 20px !important;
35 + font-family: 'KyoboHand';
27 } 36 }
28 37
29 .ant-list-item-meta-description { 38 .ant-list-item-meta-description {
30 display: flex; 39 display: flex;
31 color: black !important; 40 color: black !important;
41 + font-family: 'KyoboHand';
32 } 42 }
33 43
......
...@@ -9,16 +9,20 @@ const cheerio = require('cheerio'); ...@@ -9,16 +9,20 @@ const cheerio = require('cheerio');
9 9
10 router.post('/textQuery', async(req,res)=>{ 10 router.post('/textQuery', async(req,res)=>{
11 const result = req.body.text; 11 const result = req.body.text;
12 - var name = result.substring(1) 12 + var i = 0;
13 + for(i; i < result.length; i++){
14 + if(result[i] === '_') break;
15 + }
16 + var name = result.substr(1,i-1);
13 17
14 - var url = 'https://tv.naver.com/search/clip?query=' //naverTV의 링크 18 + var url = 'https://search.naver.com/search.naver?query=' //naverTV의 링크
15 - var sort = '&sort=date' 19 + var where = '&where=news'
16 - url = url + name + sort 20 + url = url + name + where
17 url = encodeURI(url) 21 url = encodeURI(url)
18 console.log("url is ",url) 22 console.log("url is ",url)
19 const getHtml = async() => { 23 const getHtml = async() => {
20 try{ 24 try{
21 - return await axios.get(url); //axios.get 함수를 이용해서 비동기로 네이버티비의 해당 가수의 최신 영상 html 파일을 가져온다. 25 + return await axios.get(url); //axios.get 함수를 이용해서 비동기로 네이버 뉴스 중 해당 가수의 이름이 들어간 최신 뉴스 html 파일을 가져온다.
22 } catch(error){ 26 } catch(error){
23 console.log("error! check your code"); 27 console.log("error! check your code");
24 } 28 }
...@@ -26,20 +30,21 @@ router.post('/textQuery', async(req,res)=>{ ...@@ -26,20 +30,21 @@ router.post('/textQuery', async(req,res)=>{
26 30
27 getHtml() 31 getHtml()
28 .then(html => { 32 .then(html => {
29 - let videoList = []; 33 + let newsList = [];
30 const $ = cheerio.load(html.data); 34 const $ = cheerio.load(html.data);
31 - const $bodyList = $("div.src_wrap div.thl ").children("div.thl_a"); 35 + const $bodyList = $("div.news").children("ul.type01").children("li");
36 +
32 37
33 $bodyList.each(function(i, elem){ 38 $bodyList.each(function(i, elem){
34 - videoList[i] = { 39 + newsList[i] = {
35 - description : "naverTV", 40 + description : "네이버 검색 기사",
36 - image : $(this).find('a.cds_thm').children('img').attr('src'), 41 + title : $(this).find('a._sp_each_title').attr('title'),
37 - title : $(this).find('a.cds_thm').attr('title'), 42 + link : $(this).find('a._sp_each_title').attr('href'),
38 - link : "https://tv.naver.com/" + $(this).find('a.cds_thm').attr('href') 43 + image : $(this).find('a.sp_thmb').children('img').attr('src')
39 } 44 }
40 }) 45 })
41 46
42 - data = videoList.filter(n => n.title); 47 + data = newsList.filter(n => n.title);
43 data = JSON.stringify(data.slice(0,3)) 48 data = JSON.stringify(data.slice(0,3))
44 49
45 res.send(data); 50 res.send(data);
......
...@@ -24,7 +24,7 @@ router.post('/textQuery', async(req,res)=>{ ...@@ -24,7 +24,7 @@ router.post('/textQuery', async(req,res)=>{
24 console.log("url is ",url) 24 console.log("url is ",url)
25 const getHtml = async() => { 25 const getHtml = async() => {
26 try{ 26 try{
27 - return await axios.get(url); //axios.get 함수를 이용해서 비동기로 네이버티비의 해당 가수의 최신 영상 html 파일을 가져온다. 27 + return await axios.get(url); //axios.get 함수를 이용해서 비동기로 네이버티비의 해당 가수의 이름과 정확도가 높은 html 파일을 가져온다.
28 } catch(error){ 28 } catch(error){
29 console.log("error! check your code"); 29 console.log("error! check your code");
30 } 30 }
......