Showing
1 changed file
with
100 additions
and
0 deletions
| ... | @@ -94,6 +94,99 @@ const getCharacterInfo = async function(nickname, characterCode) { | ... | @@ -94,6 +94,99 @@ const getCharacterInfo = async function(nickname, characterCode) { |
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | +const analyzeEquipment = async function(nickname, characterCode, job) { | ||
| 98 | + try { | ||
| 99 | + const resp = await axios.get("https://maplestory.nexon.com/Common/Character/Detail/" + encodeURI(nickname) + "/Equipment?p=" + characterCode); | ||
| 100 | + | ||
| 101 | + if (resp.data.indexOf("공개하지 않은 정보입니다.") > 0) { | ||
| 102 | + throw new Error("private_character"); | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + const { JSDOM } = require('jsdom'); | ||
| 106 | + const dom = new JSDOM(resp.data); | ||
| 107 | + const $ = (require('jquery'))(dom.window); | ||
| 108 | + | ||
| 109 | + // 아케인심볼 분석 | ||
| 110 | + let majorArcane = 0; | ||
| 111 | + const arcaneURLs = []; | ||
| 112 | + $(".tab03_con_wrap .arcane_weapon_wrap .item_pot li span a").each(async function() { | ||
| 113 | + arcaneURLs.push("https://maplestory.nexon.com" + $(this).attr("href")); | ||
| 114 | + }); | ||
| 115 | + | ||
| 116 | + for (let i = 0; i < arcaneURLs.length; i++) { | ||
| 117 | + const equipmentResp = await axios.get(arcaneURLs[i], { | ||
| 118 | + headers: { | ||
| 119 | + 'X-Requested-With': 'XMLHttpRequest' | ||
| 120 | + } | ||
| 121 | + }); | ||
| 122 | + | ||
| 123 | + const equipmentDom = new JSDOM(equipmentResp.data.view); | ||
| 124 | + const $equipment = (require('jquery'))(equipmentDom.window); | ||
| 125 | + | ||
| 126 | + majorArcane += parseInt($equipment(".stet_info ul li:eq(2) .point_td font:eq(0)").text().substring(1)); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + // 장비 분석 | ||
| 130 | + const jobModel = require('../model/job'); | ||
| 131 | + | ||
| 132 | + let damagePercent = 0; | ||
| 133 | + let majorPercent = 0; | ||
| 134 | + let attackPowerPercent = 0; | ||
| 135 | + const equipmentURLs = []; | ||
| 136 | + $(".tab01_con_wrap .weapon_wrap .item_pot li span a").each(async function() { | ||
| 137 | + equipmentURLs.push("https://maplestory.nexon.com" + $(this).attr("href")); | ||
| 138 | + }); | ||
| 139 | + | ||
| 140 | + for (let i = 0; i < equipmentURLs.length; i++) { | ||
| 141 | + const equipmentResp = await axios.get(equipmentURLs[i], { | ||
| 142 | + headers: { | ||
| 143 | + 'X-Requested-With': 'XMLHttpRequest' | ||
| 144 | + } | ||
| 145 | + }); | ||
| 146 | + | ||
| 147 | + const equipmentDom = new JSDOM(equipmentResp.data.view); | ||
| 148 | + const $equipment = (require('jquery'))(equipmentDom.window); | ||
| 149 | + | ||
| 150 | + $equipment(".stet_info ul li").each(function() { | ||
| 151 | + const regexMajor1 = new RegExp(`${jobModel[job].major} : \\+(\\d)%`); | ||
| 152 | + const regexMajor2 = new RegExp(`올스탯 : \\+(\\d)%`); | ||
| 153 | + const regexAttackPower = (jobModel[job].major == "INT") ? | ||
| 154 | + new RegExp(`마력 : \\+(\\d)%`) : | ||
| 155 | + new RegExp(`공격력 : \\+(\\d)%`); | ||
| 156 | + const regexDamage = new RegExp(`데미지 : \\+(\\d)%`); | ||
| 157 | + | ||
| 158 | + if ($(this).find(".stet_th span").text() == "올스탯") { | ||
| 159 | + majorPercent += parseInt($(this).find(".point_td font:eq(0)").text().substring(1)); | ||
| 160 | + } else if ($(this).find(".stet_th span").text().indexOf("잠재옵션") >= 0) { | ||
| 161 | + const values = $(this).find(".point_td").html().split("<br>"); | ||
| 162 | + for (let j = 0; j < values.length; j++) { | ||
| 163 | + const value = values[j].trim(); | ||
| 164 | + let regexResult; | ||
| 165 | + | ||
| 166 | + if (regexResult = (regexMajor1.exec(value) || regexMajor2.exec(value))) { | ||
| 167 | + majorPercent += parseInt(regexResult[1]); | ||
| 168 | + } else if (regexResult = regexAttackPower.exec(value)) { | ||
| 169 | + attackPowerPercent += parseInt(regexResult[1]); | ||
| 170 | + } else if (regexResult = regexDamage.exec(value)) { | ||
| 171 | + damagePercent += parseInt(regexResult[1]); | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + }) | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + return { | ||
| 179 | + majorArcane: majorArcane, | ||
| 180 | + majorPercent: majorPercent, | ||
| 181 | + attackPowerPercent: attackPowerPercent, | ||
| 182 | + damagePercent: damagePercent | ||
| 183 | + }; | ||
| 184 | + } catch (error) { | ||
| 185 | + console.log(error); | ||
| 186 | + return false; | ||
| 187 | + } | ||
| 188 | +} | ||
| 189 | + | ||
| 97 | module.exports = { | 190 | module.exports = { |
| 98 | getCharacter: async function(req, res) { | 191 | getCharacter: async function(req, res) { |
| 99 | if (!req.query.nickname) { | 192 | if (!req.query.nickname) { |
| ... | @@ -115,6 +208,13 @@ module.exports = { | ... | @@ -115,6 +208,13 @@ module.exports = { |
| 115 | return; | 208 | return; |
| 116 | } | 209 | } |
| 117 | 210 | ||
| 211 | + const analysisEquipment = await analyzeEquipment(nickname, characterCode, characterInfo.character.job); | ||
| 212 | + if (!analysisEquipment) { | ||
| 213 | + res.status(403).send(); | ||
| 214 | + return; | ||
| 215 | + } | ||
| 216 | + console.log(analysisEquipment); | ||
| 217 | + | ||
| 118 | res.send(characterInfo); | 218 | res.send(characterInfo); |
| 119 | } | 219 | } |
| 120 | }; | 220 | }; |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment