Showing
3 changed files
with
267 additions
and
0 deletions
app.js
0 → 100644
| 1 | +//http연동 | ||
| 2 | +var express=require('express'); | ||
| 3 | +var app=express(); | ||
| 4 | +var router=require('./router/main')(app); | ||
| 5 | + | ||
| 6 | +app.set('views', __dirname + '/views'); | ||
| 7 | +app.set('view engine', 'ejs'); | ||
| 8 | +app.engine('html', require('ejs').renderFile); | ||
| 9 | + | ||
| 10 | +var server=app.listen(3000,function(){ | ||
| 11 | + console.log("Express server has started on port 3000"); | ||
| 12 | + | ||
| 13 | + });//app listen 꿑 | ||
| 14 | + | ||
| 15 | +// | ||
| 16 | +/* | ||
| 17 | +var readline=require('readline');//입력받기 위한 모듈 | ||
| 18 | +var r=readline.createInterface({input:process.stdin,output:process.stdout});//키보드 입출력 정의 | ||
| 19 | +var rtfw1="http://www.rankedftw.com/search/?name=";//rtfw에서 기본 검색 url | ||
| 20 | +var rtfw2="http://www.rankedftw.com/player/"//rtfw 번호 기반 특정 플레이어 검색 url | ||
| 21 | +var league='silver_2'; | ||
| 22 | +var region='KR'; | ||
| 23 | +// | ||
| 24 | +var cheerio=require('cheerio');//cheerio모듈 사용 | ||
| 25 | +var request=require('request');//request모듈 사용 | ||
| 26 | +var fs=require('fs');//파일시스템 사용 | ||
| 27 | +// | ||
| 28 | +//request 1 variable | ||
| 29 | +var username='';//username문자열 선언 | ||
| 30 | +var userleague='';//userleague 문자열 선언 | ||
| 31 | +var userregion='';//userregion 문자열 선언 | ||
| 32 | +var usernumber='';//usernumber 문자열 선언 | ||
| 33 | +// | ||
| 34 | +//request 2 variable | ||
| 35 | + | ||
| 36 | +// | ||
| 37 | +//request 3-1 variable | ||
| 38 | + | ||
| 39 | +// | ||
| 40 | +//request 3-2 variable | ||
| 41 | + | ||
| 42 | +// | ||
| 43 | +//request 3-3 variable | ||
| 44 | + | ||
| 45 | +// | ||
| 46 | +//system message | ||
| 47 | + | ||
| 48 | +// | ||
| 49 | +//delivering variable | ||
| 50 | +var momentum;//기세 | ||
| 51 | +var terran_proficiency;//테란 숙련도 | ||
| 52 | +var zerg_proficiency;//저그 숙련도 | ||
| 53 | +var protoss_proficiency;//프로토스 숙련도 | ||
| 54 | +var primary_race;//주 종족 | ||
| 55 | +var win_rate;//시즌 전체 승률 | ||
| 56 | + | ||
| 57 | +var myrace;//내 종족 | ||
| 58 | +var enemyrace;//상대 종족 | ||
| 59 | +var recommend;//추천빌드(운영/타이밍/올인) | ||
| 60 | +// | ||
| 61 | + | ||
| 62 | +r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성 | ||
| 63 | + //question은 에러 제어 만들면 안된다. | ||
| 64 | + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다. | ||
| 65 | + rtfw1=rtfw1+answer;//검색 url 구성 | ||
| 66 | + console.log(rtfw1);//테스트용 : 검색 url 확인 | ||
| 67 | +// | ||
| 68 | +request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1 | ||
| 69 | + if(error){throw error};//에러처리 | ||
| 70 | + console.log("request 1 processing"); | ||
| 71 | + let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색 | ||
| 72 | + $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다. | ||
| 73 | + username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화 | ||
| 74 | + userleague=$(this).find('.league').text().trim();//league클래스를 찾아 공백빼고 텍스트화 | ||
| 75 | + userregion=$(this).find('.region').text().trim();//region클래스를 찾아 공백빼고 텍스트화 | ||
| 76 | + if((username===answer)&&(userregion===region)){//아직 리그 구현 안함-리그는 그림으로 비교 | ||
| 77 | + console.log(`${username}`);//테스트용 : 유저네임 출력 | ||
| 78 | + console.log(`${userregion}`);//테스트용 : 유저리전 출력 | ||
| 79 | + var usernumber=$(this).toString().slice(29,43);//rtfw에서 사용하는 사용자번호를 문자열로 넉넉히 자름 | ||
| 80 | + var localindex1=usernumber.search('/');//첫번째 슬레시 발견하는 인덱스 검출 | ||
| 81 | + usernumber=usernumber.slice(localindex1+1);//앞부분 슬래시 자른다. | ||
| 82 | + var localindex2=usernumber.search('/')-localindex1+1;//두번째 슬레시 발견하는 인덱스 검출 | ||
| 83 | + usernumber=usernumber.slice(0,localindex2);//뒷부분 슬래시 자른다. | ||
| 84 | + console.log(`${usernumber}`);//테스트용 : 유저넘버 출력 | ||
| 85 | + if(rtfw2.length>33){//하나라도 붙어있으면 | ||
| 86 | + rtfw2=rtfw2;//아무것도 안한다. | ||
| 87 | + }else{//그렇지않고 아무것도 안붙어있으면 | ||
| 88 | + rtfw2=rtfw2+usernumber+'/';//rtfw2 url갱신 | ||
| 89 | + } | ||
| 90 | + console.log(rtfw2);//테스트용 : rtfw2 출력 | ||
| 91 | + }//이름서버리그비교if종료 | ||
| 92 | + });//ul a find문 종료 | ||
| 93 | + | ||
| 94 | + var profileID=''; | ||
| 95 | + request(rtfw2,(error,response,body)=>{//rtfw2 url 불러오기 request 2 | ||
| 96 | + if(error){throw error};//에러처리 | ||
| 97 | + console.log('request2 processing');//테스트용 : request2 실행여부 출력 | ||
| 98 | + let $ = cheerio.load(body);//rtfw2가 body이다. $로 jquery방식으로 html탐색 | ||
| 99 | + $('.content').find('.bnet-link').each(function(index,elem){//content 클래스 안의 bnet-link클래스를 포함하는 요소를 찾는다. | ||
| 100 | + profileID=$(this).toString().slice(62,72);//얻고자 하는 profileID를 포함하여 앞뒤로 적당히 자른다. | ||
| 101 | + var localindex3=profileID.search('/');//첫번째 슬레시 발견하는 인덱스 검출 | ||
| 102 | + profileID=profileID.slice(localindex3+1);//앞부분 슬래시 자른다. | ||
| 103 | + var localindex4=profileID.search('/')-localindex3;//두번째 슬레시 발견하는 인덱스 검출 | ||
| 104 | + profileID=profileID.slice(0,localindex4);//뒷부분 슬래시 자른다. | ||
| 105 | + console.log(`${profileID}`);//테스트용 : profileID 출력 | ||
| 106 | + //profileID=encodeURI(encodeURIComponent(profileID));//한글처리부 | ||
| 107 | + });//a bnetlink 종료 | ||
| 108 | +//console.log(`${profileID}`);//테스트용 : profileID 출력 | ||
| 109 | + | ||
| 110 | +var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매치히스토리 url 앞부분 | ||
| 111 | +var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분 | ||
| 112 | +var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성 | ||
| 113 | +console.log(match_history_url);//테스트용 : 매치히스토리 url 출력 | ||
| 114 | + | ||
| 115 | +request(match_history_url,(error,response,body)=>{//match history request request 3 | ||
| 116 | + if(error){throw error};//에러처리 | ||
| 117 | + console.log('request3 processing');//테스트용 : request 작동여부 출력 | ||
| 118 | + | ||
| 119 | +var obj1=JSON.parse(body);//request 결과를 JSON object로 변환 | ||
| 120 | +//console.log(obj.matches [0].map);//테스트용 : 하나에 접근 | ||
| 121 | +$(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 match들과 인덱스 사용 | ||
| 122 | + if(match.type=='1v1'){//경기타입이 1대1인 경우에만 관심있다. | ||
| 123 | + console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시 | ||
| 124 | +};//if 1v1 종료 | ||
| 125 | +});//each function 종료 | ||
| 126 | + | ||
| 127 | +var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/" | ||
| 128 | +var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; | ||
| 129 | +var ladder_url=ladder_1+profileID+ladder_2; | ||
| 130 | +console.log(ladder_url); | ||
| 131 | +request(ladder_url,(error,response,body)=>{//ladder request request 4 | ||
| 132 | + if(error){throw error}; | ||
| 133 | + console.log('request4 processing'); | ||
| 134 | + var obj2=JSON.parse(body);//request 결과를 JSON object로 변환 | ||
| 135 | +// console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근 | ||
| 136 | + var wins=obj2.currentSeason[2].ladder[0].wins; | ||
| 137 | + var losses=obj2.currentSeason[2].ladder[0].losses; | ||
| 138 | +win_rate=wins/(wins+losses); | ||
| 139 | + //console.log(wins); | ||
| 140 | + //console.log(losses); | ||
| 141 | + //console.log(win_rate); | ||
| 142 | + | ||
| 143 | +var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"; | ||
| 144 | +var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"; | ||
| 145 | +var profile_url=profile_1+profileID+profile_2; | ||
| 146 | +console.log(profile_url); | ||
| 147 | +request(profile_url,(error,response,body)=>{//profile request request 5 | ||
| 148 | + if(error){throw error}; | ||
| 149 | + console.log('request5 processing'); | ||
| 150 | + var obj3=JSON.parse(body);//request 결과를 JSON object로 변환 | ||
| 151 | + //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근 | ||
| 152 | +primary_race=obj3.career.primaryRace; | ||
| 153 | + //console.log(primary_race); | ||
| 154 | + var terran_level=obj3.swarmLevels.terran.level; | ||
| 155 | + var zerg_level=obj3.swarmLevels.zerg.level; | ||
| 156 | + var protoss_level=obj3.swarmLevels.protoss.level; | ||
| 157 | + | ||
| 158 | + //console.log(terran_level); | ||
| 159 | + //console.log(zerg_level); | ||
| 160 | + //console.log(protoss_level); | ||
| 161 | + | ||
| 162 | +//build recommend algorithm | ||
| 163 | +var matchresults=[];//매치결과 담을 배열 선언 | ||
| 164 | +var momentum_win=0;//최근 10경기 중 승수 초기화 | ||
| 165 | +for (var i=0;i<25;i++){//매치히스토리는 최대 25개 | ||
| 166 | + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다. | ||
| 167 | + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입 | ||
| 168 | + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우 | ||
| 169 | + momentum_win=momentum_win+1;//그 승수를 카운트한다. | ||
| 170 | + }//if length11 종료 | ||
| 171 | +}//obj1 1v1 종료 | ||
| 172 | +}//for i 25 종료 | ||
| 173 | +//console.log(matchresults);//테스트용 : matchresults 출력 | ||
| 174 | +//console.log(momentum_win);//테스트용 : momentum_win 출력 | ||
| 175 | +if(momentum_win>=7){//7승 이상이면 상승세 | ||
| 176 | +momentum='상승세'; | ||
| 177 | +} | ||
| 178 | +if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체 | ||
| 179 | +momentum='정체중'; | ||
| 180 | +} | ||
| 181 | +if(momentum_win<4){//4승 미만이면 하락세 | ||
| 182 | +momentum='하락세'; | ||
| 183 | +} | ||
| 184 | +//console.log(momentum);//테스트용 : 기세 출력 | ||
| 185 | + | ||
| 186 | +if(terran_level<50){//테란 레벨 50 안되면 | ||
| 187 | + terran_proficiency='비숙련자'//테란 비숙련자 | ||
| 188 | +} else{ | ||
| 189 | + terran_proficiency='숙련자' | ||
| 190 | +} | ||
| 191 | +if(zerg_level<50){//저그 레벨 50 안되면 | ||
| 192 | + zerg_proficiency='비숙련자'//저그 비숙련자 | ||
| 193 | +} else{ | ||
| 194 | + zerg_proficiency='숙련자' | ||
| 195 | +} | ||
| 196 | +if(protoss_level<50){//프로토스 레벨 50 안되면 | ||
| 197 | + protoss_proficiency='비숙련자'//프로토스 비숙련자 | ||
| 198 | +} else{ | ||
| 199 | + protoss_proficiency='숙련자' | ||
| 200 | +} | ||
| 201 | +// | ||
| 202 | +//system message part | ||
| 203 | +console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다."); | ||
| 204 | +console.log("상대는 테란 '"+terran_proficiency+"'입니다."); | ||
| 205 | +console.log("상대는 저그 '"+zerg_proficiency+"'입니다."); | ||
| 206 | +console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다."); | ||
| 207 | +console.log("상대의 주 종족은 '"+primary_race+"'입니다."); | ||
| 208 | +console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다."); | ||
| 209 | +// | ||
| 210 | +//build recommend command | ||
| 211 | + | ||
| 212 | +// | ||
| 213 | + | ||
| 214 | +console.log('request5 done'); | ||
| 215 | +});//request5종료 | ||
| 216 | +console.log('request4 done'); | ||
| 217 | +});//request4종료 | ||
| 218 | +console.log('request3 done'); | ||
| 219 | +});//request3종료 | ||
| 220 | +console.log('request2 done'); | ||
| 221 | +});//request2종료 | ||
| 222 | +console.log('request1 done'); | ||
| 223 | +});//request1 종료 | ||
| 224 | + | ||
| 225 | +console.log('r.question done'); | ||
| 226 | +//console.log(terran_level); | ||
| 227 | +r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에. | ||
| 228 | +});//r.question 끝 | ||
| 229 | +*/ |
router/main.js
0 → 100644
This diff is collapsed. Click to expand it.
views/example.ejs
0 → 100644
| 1 | +<!DOCTYPE html> | ||
| 2 | +<html lang="ko-kr"> | ||
| 3 | +<head> | ||
| 4 | + <meta charset="utf-8"> | ||
| 5 | + <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> | ||
| 6 | + <link href="/static/core/style.css" rel="stylesheet" media="screen"> | ||
| 7 | + <script async="" src="//www.google-analytics.com/analytics.js"></script> | ||
| 8 | + <script type="text/javascript" async="" src="//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"></script> | ||
| 9 | + <title>StarCraft 2 Build Recommendation Project</title> | ||
| 10 | +<body> | ||
| 11 | + | ||
| 12 | +<h1><%= data%></h1> | ||
| 13 | + | ||
| 14 | + | ||
| 15 | +<p stype="fond-family:verdana;">StarCraft 2 Build Recommendation Project</p> | ||
| 16 | +<img src="logoIMG.jpg" alt="StarCraft2 LOGO image"> | ||
| 17 | +<br> | ||
| 18 | +<br> | ||
| 19 | + | ||
| 20 | +<div class="col-md-3"> | ||
| 21 | + <form id="searchform" action method="get"> | ||
| 22 | + <div id="div_id_race" class="form-group"> | ||
| 23 | + <label for="id_sort_by" class="control-label "> | ||
| 24 | + 종족 | ||
| 25 | + </label> | ||
| 26 | + <div class="controls"> | ||
| 27 | + <select class="select form-control" id="id_sort_by" name="sort_by"> | ||
| 28 | + <option value="t">테란</option> | ||
| 29 | + <option value="r">저그</option> | ||
| 30 | + <option value="a">프로토스</option> | ||
| 31 | + </select> | ||
| 32 | +</div> | ||
| 33 | +<a class="btn btn-primary" href="/build/create/">빌드</a> | ||
| 34 | +<br> | ||
| 35 | +<br> | ||
| 36 | +<a href="https://starcraft2.com/ko-kr/game">Official Site</a> | ||
| 37 | +</body> | ||
| 38 | +</html> |
-
Please register or login to post a comment