| | <!DOCTYPE html> |
| | <html> |
| | <head> |
| | <meta charset="utf-8"> |
| | <title>My static Space</title> |
| | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> |
| | <link rel="preconnect" href="https://rsms.me/"> |
| | <link rel="stylesheet" href="https://rsms.me/inter/inter.css"> |
| | <link rel="preconnect" href="https://fonts.googleapis.com"> |
| | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| | <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;200;300;400;500;600;700;800;900&display=swap"> |
| | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.0/github-markdown.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
| | <style> |
| | |
| | |
| | |
| | |
| | body { |
| | margin: 0; |
| | background-color: #ffffff; |
| | width: 100%; |
| | } |
| | @media (prefers-color-scheme: dark) { |
| | body { |
| | background-color: #0d1117; |
| | } |
| | } |
| | body, .markdown-body, button { |
| | font-family: 'Inter', 'Noto Sans JP', sans-serif !important; |
| | } |
| | .markdown-body { |
| | box-sizing: border-box; |
| | width: 100%; |
| | max-width: 960px; |
| | margin-right: auto; |
| | margin-left: auto; |
| | padding: 1rem; |
| | } |
| | .markdown-body table { |
| | |
| | } |
| | .markdown-body table th, .markdown-body table td { |
| | padding: 0px 13px; |
| | } |
| | </style> |
| | </head> |
| | <body> |
| | <div class="markdown-body"> |
| | <h1>MiHoMo API Test</h1> |
| | <div class="parsedAPI_input"> |
| | <p><span>Input UID: </span><input type="text" id="uidInputBox" name="uid" required minlength="9" maxlength="9" size="9" value="802415000"/> <button type="button" name="runBtn1" id="runBtn1" onclick="runBtn1Click()">Run</button></p> |
| | <p class="connectingLabelRoot" id="connectingLabelRoot" style="display: none;"><span class="connectingLabelChild" id="connectingLabelNowProgress" style="display: none;">Connecting... </span><span class="connectingLabelChild" id="connectingLabelOk" style="display: none;"></span></p> |
| | </div> |
| | <div id="responseDataPlaceholder"> |
| | <h2>player (truncated)</h2> |
| | <table> |
| | <thead> |
| | <tr> |
| | <th>key</th> |
| | <th>value</th> |
| | </tr> |
| | </thead> |
| | <tbody id="responseDataPlaceholderPlayer"> |
| | </tbody> |
| | </table> |
| | <h2>characters (truncated)</h2> |
| | <table> |
| | <thead> |
| | <tr> |
| | <th>key</th> |
| | <th>value</th> |
| | </tr> |
| | </thead> |
| | <tbody id="responseDataPlaceholderCharacters"> |
| | </tbody> |
| | </table> |
| | </div> |
| | </div> |
| | <script> |
| | const StarRailResBaseUrl = 'https://raw.githubusercontent.com/Mar-7th/StarRailRes/master/'; |
| | const apiConnectTimeout = 15000; |
| | const apiConnectUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; |
| | const apiConnectDefaultHeader = { |
| | 'Cache-Control': apiConnectUserAgent, |
| | 'Access-Control-Allow-Origin': '*', |
| | }; |
| | |
| | window.addEventListener('load', async function(){ |
| | |
| | }); |
| | |
| | async function runBtn1Click () { |
| | |
| | const uidInputValue = document.querySelector('#uidInputBox').value; |
| | document.querySelector('#connectingLabelRoot').style.display = 'block'; |
| | document.querySelector('#connectingLabelNowProgress').style.display = 'inline'; |
| | document.querySelector('#connectingLabelOk').style.display = 'inline'; |
| | const apiResponseData = await apiConnect({ |
| | 'method': 'get', |
| | 'url': `https://corsproxy.io/?${encodeURIComponent(`https://api.mihomo.me/sr_info_parsed/${uidInputValue}?lang=jp&version=v2`)}`, |
| | 'headers': apiConnectDefaultHeader, |
| | 'timeout': apiConnectTimeout |
| | }); |
| | console.log(apiResponseData); |
| | |
| | |
| | if (apiResponseData) { |
| | document.querySelector('#connectingLabelOk').innerHTML = `OK (Time: ${Math.ceil(apiResponseData.apiConnectionTime)} ms)`; |
| | htmlBuildFromApiData(apiResponseData); |
| | } else { |
| | document.querySelector('#connectingLabelOk').innerHTML = `Failed`; |
| | } |
| | } |
| | |
| | async function apiConnect (axiosObj) { |
| | |
| | let connectionTimerStart = performance.now(); |
| | try { |
| | const response = await axios(axiosObj); |
| | let connectionTimerEnd = performance.now(); |
| | return { |
| | 'apiConnectionTime': connectionTimerEnd - connectionTimerStart, |
| | 'response': response.data |
| | }; |
| | } catch (error) { |
| | let connectionTimerEnd = performance.now(); |
| | console.error(`API request failed: ${error.code}`); |
| | alert(`API request failed: ${error.code}`); |
| | |
| | throw error; |
| | return null; |
| | } |
| | } |
| | |
| | function htmlBuildFromApiData (apiResponseData) { |
| | const fakeClone01 = document.querySelector('#responseDataPlaceholderPlayer').cloneNode(false); |
| | const fakeClone02 = document.querySelector('#responseDataPlaceholderCharacters').cloneNode(false); |
| | document.querySelector('#responseDataPlaceholderPlayer').parentNode.replaceChild(fakeClone01, document.querySelector('#responseDataPlaceholderPlayer')); |
| | document.querySelector('#responseDataPlaceholderCharacters').parentNode.replaceChild(fakeClone02, document.querySelector('#responseDataPlaceholderCharacters')); |
| | let inputDataKeyList = [ |
| | 'player.uid', |
| | 'player.nickname', |
| | 'player.signature', |
| | 'player.level', |
| | 'player.world_level', |
| | 'player.friend_count', |
| | 'player.avatar.icon', |
| | 'player.is_display', |
| | 'player.space_info.memory_data.level', |
| | 'player.space_info.memory_data.chaos_level', |
| | 'player.space_info.universe_level', |
| | 'player.space_info.challenge_data.maze_group_index', |
| | 'player.space_info.challenge_data.pre_maze_group_index', |
| | 'player.space_info.pass_area_progress', |
| | 'player.space_info.light_cone_count', |
| | 'player.space_info.avatar_count', |
| | 'player.space_info.achievement_count', |
| | ]; |
| | for (let i = 0; i < inputDataKeyList.length; i++) { |
| | document.querySelector('#responseDataPlaceholderPlayer').appendChild(trElAddReturn(apiResponseData.response, inputDataKeyList[i])); |
| | } |
| | for (let i = 0; i < apiResponseData.response.characters.length; i++) { |
| | let inputDataKeyList2 = [ |
| | `characters.${i}.name`, |
| | `characters.${i}.rarity`, |
| | `characters.${i}.rank`, |
| | `characters.${i}.level`, |
| | `characters.${i}.promotion`, |
| | `characters.${i}.icon`, |
| | `characters.${i}.preview`, |
| | `characters.${i}.portrait`, |
| | `characters.${i}.path.name`, |
| | `characters.${i}.path.icon`, |
| | `characters.${i}.element.name`, |
| | `characters.${i}.element.icon`, |
| | `characters.${i}.light_cone.name`, |
| | `characters.${i}.light_cone.rarity`, |
| | `characters.${i}.light_cone.rank`, |
| | `characters.${i}.light_cone.level`, |
| | `characters.${i}.light_cone.promotion`, |
| | `characters.${i}.light_cone.icon`, |
| | `characters.${i}.light_cone.preview`, |
| | `characters.${i}.light_cone.portrait`, |
| | `characters.${i}.light_cone.path.name`, |
| | `characters.${i}.light_cone.path.icon`, |
| | ]; |
| | for (let j = 0; j < inputDataKeyList2.length; j++) { |
| | document.querySelector('#responseDataPlaceholderCharacters').appendChild(trElAddReturn(apiResponseData.response, inputDataKeyList2[j])); |
| | } |
| | } |
| | } |
| | |
| | function trElAddReturn (inputData, objKey) { |
| | const imageDetectRegex = /\.(png|jpg|jpeg|webp|gif|bmp)$/i; |
| | const tr = document.createElement('tr'); |
| | const tdKey = document.createElement('td'); |
| | const tdValue = document.createElement('td'); |
| | tdKey.innerHTML = objKey; |
| | |
| | let keyParts = objKey.split('.'); |
| | let value = inputData; |
| | for (let i = 0; i < keyParts.length; i++) { |
| | |
| | if (!isNaN(keyParts[i])) { |
| | keyParts[i] = parseInt(keyParts[i], 10); |
| | } |
| | value = value[keyParts[i]]; |
| | } |
| | if (imageDetectRegex.test(value)) { |
| | const imageEl = document.createElement('img'); |
| | imageEl.src = StarRailResBaseUrl + value; |
| | tdValue.appendChild(imageEl); |
| | } else { |
| | tdValue.innerHTML = value; |
| | } |
| | tr.appendChild(tdKey); |
| | tr.appendChild(tdValue); |
| | return tr; |
| | } |
| | </script> |
| | </body> |
| | </html> |