Showing
2 changed files
with
109 additions
and
25 deletions
... | @@ -30,14 +30,28 @@ var usernumber='';//usernumber 문자열 선언 | ... | @@ -30,14 +30,28 @@ var usernumber='';//usernumber 문자열 선언 |
30 | //system message | 30 | //system message |
31 | 31 | ||
32 | // | 32 | // |
33 | +//delivering variable | ||
34 | +var momentum;//기세 | ||
35 | +var terran_proficiency;//테란 숙련도 | ||
36 | +var zerg_proficiency;//저그 숙련도 | ||
37 | +var protoss_proficiency;//프로토스 숙련도 | ||
38 | +var primary_race;//주 종족 | ||
39 | +var win_rate;//시즌 전체 승률 | ||
40 | + | ||
41 | +var myrace;//내 종족 | ||
42 | +var enemyrace;//상대 종족 | ||
43 | +var recommend;//추천빌드(운영/타이밍/올인) | ||
44 | +// | ||
33 | 45 | ||
34 | r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성 | 46 | r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성 |
35 | - console.log("입력완료! 분석중...");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다. | 47 | + //question은 에러 제어 만들면 안된다. |
48 | + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다. | ||
36 | rtfw1=rtfw1+answer;//검색 url 구성 | 49 | rtfw1=rtfw1+answer;//검색 url 구성 |
37 | console.log(rtfw1);//테스트용 : 검색 url 확인 | 50 | console.log(rtfw1);//테스트용 : 검색 url 확인 |
38 | // | 51 | // |
39 | request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1 | 52 | request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1 |
40 | if(error){throw error};//에러처리 | 53 | if(error){throw error};//에러처리 |
54 | + console.log("request 1 processing"); | ||
41 | let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색 | 55 | let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색 |
42 | $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다. | 56 | $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다. |
43 | username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화 | 57 | username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화 |
... | @@ -80,9 +94,10 @@ var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매 | ... | @@ -80,9 +94,10 @@ var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매 |
80 | var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분 | 94 | var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분 |
81 | var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성 | 95 | var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성 |
82 | console.log(match_history_url);//테스트용 : 매치히스토리 url 출력 | 96 | console.log(match_history_url);//테스트용 : 매치히스토리 url 출력 |
83 | -request(match_history_url,(error,response,body)=>{//match history request request 3-1 | 97 | + |
98 | +request(match_history_url,(error,response,body)=>{//match history request request 3 | ||
84 | if(error){throw error};//에러처리 | 99 | if(error){throw error};//에러처리 |
85 | - console.log('request3-1 processing');//테스트용 : request 작동여부 출력 | 100 | + console.log('request3 processing');//테스트용 : request 작동여부 출력 |
86 | 101 | ||
87 | var obj1=JSON.parse(body);//request 결과를 JSON object로 변환 | 102 | var obj1=JSON.parse(body);//request 결과를 JSON object로 변환 |
88 | //console.log(obj.matches [0].map);//테스트용 : 하나에 접근 | 103 | //console.log(obj.matches [0].map);//테스트용 : 하나에 접근 |
... | @@ -91,47 +106,106 @@ $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 m | ... | @@ -91,47 +106,106 @@ $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 m |
91 | console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시 | 106 | console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시 |
92 | };//if 1v1 종료 | 107 | };//if 1v1 종료 |
93 | });//each function 종료 | 108 | });//each function 종료 |
94 | -});//request3-1종료 | ||
95 | 109 | ||
96 | var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/" | 110 | var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/" |
97 | var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; | 111 | var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; |
98 | var ladder_url=ladder_1+profileID+ladder_2; | 112 | var ladder_url=ladder_1+profileID+ladder_2; |
99 | console.log(ladder_url); | 113 | console.log(ladder_url); |
100 | -request(ladder_url,(error,response,body)=>{//ladder request request 3-2 | 114 | +request(ladder_url,(error,response,body)=>{//ladder request request 4 |
101 | if(error){throw error}; | 115 | if(error){throw error}; |
102 | - console.log('request3-2 processing'); | 116 | + console.log('request4 processing'); |
103 | var obj2=JSON.parse(body);//request 결과를 JSON object로 변환 | 117 | var obj2=JSON.parse(body);//request 결과를 JSON object로 변환 |
104 | - //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 | 118 | +// console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근 |
105 | - var wins=obj2.currentSeason[1].ladder[0].wins; | 119 | + var wins=obj2.currentSeason[2].ladder[0].wins; |
106 | - var losses=obj2.currentSeason[1].ladder[0].losses; | 120 | + var losses=obj2.currentSeason[2].ladder[0].losses; |
107 | - var winrate=wins/(wins+losses); | 121 | +win_rate=wins/(wins+losses); |
108 | //console.log(wins); | 122 | //console.log(wins); |
109 | //console.log(losses); | 123 | //console.log(losses); |
110 | - //console.log(winrate); | 124 | + //console.log(win_rate); |
111 | -});//request3-2종료 | ||
112 | 125 | ||
113 | var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"; | 126 | var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"; |
114 | var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; | 127 | var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; |
115 | var profile_url=profile_1+profileID+profile_2; | 128 | var profile_url=profile_1+profileID+profile_2; |
116 | console.log(profile_url); | 129 | console.log(profile_url); |
117 | -request(profile_url,(error,response,body)=>{//profile request request 3-3 | 130 | +request(profile_url,(error,response,body)=>{//profile request request 5 |
118 | if(error){throw error}; | 131 | if(error){throw error}; |
119 | - console.log('request3-3 processing'); | 132 | + console.log('request5 processing'); |
120 | var obj3=JSON.parse(body);//request 결과를 JSON object로 변환 | 133 | var obj3=JSON.parse(body);//request 결과를 JSON object로 변환 |
121 | //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 | 134 | //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 |
122 | - var primary_race=obj3.career.primaryRace; | 135 | +primary_race=obj3.career.primaryRace; |
123 | - console.log(primary_race); | 136 | + //console.log(primary_race); |
124 | var terran_level=obj3.swarmLevels.terran.level; | 137 | var terran_level=obj3.swarmLevels.terran.level; |
125 | var zerg_level=obj3.swarmLevels.zerg.level; | 138 | var zerg_level=obj3.swarmLevels.zerg.level; |
126 | var protoss_level=obj3.swarmLevels.protoss.level; | 139 | var protoss_level=obj3.swarmLevels.protoss.level; |
140 | + | ||
127 | //console.log(terran_level); | 141 | //console.log(terran_level); |
128 | //console.log(zerg_level); | 142 | //console.log(zerg_level); |
129 | //console.log(protoss_level); | 143 | //console.log(protoss_level); |
130 | -});//request3-3종료 | ||
131 | 144 | ||
132 | -});//request2종료 | 145 | +//build recommend algorithm |
146 | +var matchresults=[];//매치결과 담을 배열 선언 | ||
147 | +var momentum_win=0;//최근 10경기 중 승수 초기화 | ||
148 | +for (var i=0;i<25;i++){//매치히스토리는 최대 25개 | ||
149 | + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다. | ||
150 | + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입 | ||
151 | + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우 | ||
152 | + momentum_win=momentum_win+1;//그 승수를 카운트한다. | ||
153 | + }//if length11 종료 | ||
154 | +}//obj1 1v1 종료 | ||
155 | +}//for i 25 종료 | ||
156 | +//console.log(matchresults);//테스트용 : matchresults 출력 | ||
157 | +//console.log(momentum_win);//테스트용 : momentum_win 출력 | ||
158 | +if(momentum_win>=7){//7승 이상이면 상승세 | ||
159 | +momentum='상승세'; | ||
160 | +} | ||
161 | +if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체 | ||
162 | +momentum='정체중'; | ||
163 | +} | ||
164 | +if(momentum_win<4){//4승 미만이면 하락세 | ||
165 | +momentum='하락세'; | ||
166 | +} | ||
167 | +//console.log(momentum);//테스트용 : 기세 출력 | ||
133 | 168 | ||
169 | +if(terran_level<50){//테란 레벨 50 안되면 | ||
170 | + terran_proficiency='비숙련자'//테란 비숙련자 | ||
171 | +} else{ | ||
172 | + terran_proficiency='숙련자' | ||
173 | +} | ||
174 | +if(zerg_level<50){//저그 레벨 50 안되면 | ||
175 | + zerg_proficiency='비숙련자'//저그 비숙련자 | ||
176 | +} else{ | ||
177 | + zerg_proficiency='숙련자' | ||
178 | +} | ||
179 | +if(protoss_level<50){//프로토스 레벨 50 안되면 | ||
180 | + protoss_proficiency='비숙련자'//프로토스 비숙련자 | ||
181 | +} else{ | ||
182 | + protoss_proficiency='숙련자' | ||
183 | +} | ||
184 | +// | ||
185 | +//system message part | ||
186 | +console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다."); | ||
187 | +console.log("상대는 테란 '"+terran_proficiency+"'입니다."); | ||
188 | +console.log("상대는 저그 '"+zerg_proficiency+"'입니다."); | ||
189 | +console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다."); | ||
190 | +console.log("상대의 주 종족은 '"+primary_race+"'입니다."); | ||
191 | +console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다."); | ||
192 | +// | ||
193 | +//build recommend command | ||
194 | + | ||
195 | +// | ||
196 | + | ||
197 | +console.log('request5 done'); | ||
198 | +});//request5종료 | ||
199 | +console.log('request4 done'); | ||
200 | +});//request4종료 | ||
201 | +console.log('request3 done'); | ||
202 | +});//request3종료 | ||
203 | +console.log('request2 done'); | ||
204 | +});//request2종료 | ||
205 | +console.log('request1 done'); | ||
134 | });//request1 종료 | 206 | });//request1 종료 |
135 | 207 | ||
136 | - r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에. | 208 | +console.log('r.question done'); |
209 | +//console.log(terran_level); | ||
210 | +r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에. | ||
137 | });//r.question 끝 | 211 | });//r.question 끝 | ... | ... |
... | @@ -3,17 +3,27 @@ | ... | @@ -3,17 +3,27 @@ |
3 | -rtfw 한글검색 utf8 | 3 | -rtfw 한글검색 utf8 |
4 | -리그/region/realm 선택 | 4 | -리그/region/realm 선택 |
5 | 5 | ||
6 | +-처리순서 정리 | ||
7 | + | ||
6 | <정보> | 8 | <정보> |
7 | -상대 기세 : 최근 래더 10경기 결과로 추정 | 9 | +상대 기세 : 최근 래더 10경기 결과로 추정(7승이상:상승,4-7승:평온,3승이하:하락) |
8 | //맵별 승률 : 최근 래더 25경기 결과로 승률 50퍼센트가 넘는 맵 추정 | 10 | //맵별 승률 : 최근 래더 25경기 결과로 승률 50퍼센트가 넘는 맵 추정 |
9 | 종족별 숙련도 : 종족레벨 50 미만일경우 비숙련자 | 11 | 종족별 숙련도 : 종족레벨 50 미만일경우 비숙련자 |
10 | -주 종족 : | 12 | +주 종족 : 직접접근 |
11 | -이번시즌 전체 승률 : | 13 | +이번시즌 전체 승률 : 승패에 직접접근하여 계산 |
12 | 14 | ||
13 | <빌드추천 기준> | 15 | <빌드추천 기준> |
14 | -하락세/비숙련자-운영 | 16 | +하락세or비숙련자-운영 |
15 | -상승세/숙련자-올인 | 17 | +상승세or숙련자-올인 |
16 | -비등/이외-타이밍 | 18 | +비등or이외-타이밍 |
17 | 19 | ||
18 | <프로젝트 설명> | 20 | <프로젝트 설명> |
19 | 편법 아니고 빠른시간에 제공가능하다는 점 부각 | 21 | 편법 아니고 빠른시간에 제공가능하다는 점 부각 |
22 | +리그시스템상 승률은 50퍼센트로 수렴한다. 기세로 판단하는 것이 올바르다. | ||
23 | + | ||
24 | +<발견현상> | ||
25 | +-API의 json배열이 어느시점부로 바뀌는 현상(ladders에서) | ||
26 | +-김대엽 선수가 자꾸 움직임; | ||
27 | + | ||
28 | +<노하우> | ||
29 | +-request 병렬처리되니까 마트료시카처럼 안쪽에 넣어야 순서대로 처리 가능 | ... | ... |
-
Please register or login to post a comment