const path = require('path'); const axios = require('axios'); const { extractDOM } = require("./jsDom.js"); let basicGfsList = []; let gfsFile = ""; let rootPage = {}; let cycleList = []; const { leftlon, rightlon, toplat, bottomlat } = require("./region.js"); /** * * @param {String} degree 气象模型精度,需自己找可选值,非要列举几个的话: ["gfs_0p25","gfs_0p50","gfs_1p00"] * @param {Number} step 步进数值,此参数不需要传入,自行递归 * @returns */ async function getGrib2FileUrl(degree = "gfs_1p00", step = 0) { if (basicGfsList.length) { gfsFile = basicGfsList[0 + step]; const cyclePage = await axios.get(`https://nomads.ncep.noaa.gov/find_subdirs_files.php?ds=${degree}&path=&subdir_num=0&subdir_name=${gfsFile}`); cycleList = extractDOM(`${cyclePage.data}`, ".selectable .subdir_1"); } else { rootPage = await axios.get(`https://nomads.ncep.noaa.gov/gribfilter.php?ds=${degree}`); const gfsList = extractDOM(rootPage.data, "#div_subdir_0 .subdir_0"); for (let i = 0; i < gfsList.length; i++) { basicGfsList.push(gfsList[i].innerHTML); } gfsFile = basicGfsList[0 + step]; cycleList = extractDOM(rootPage.data, "#div_subdir_1 .subdir_1"); } const optionPage = await axios.get(`https://nomads.ncep.noaa.gov/find_subdirs_files.php?ds=${degree}&path=/${basicGfsList[0 + step]}&subdir_num=1&subdir_name=${cycleList[0].innerHTML}`); const optionList = extractDOM(`${optionPage.data}`, "#file_selector option"); if (optionList) { let grb2FileList = []; for (let i = 1; i < optionList.length; i++) { grb2FileList.push({ url: `https://nomads.ncep.noaa.gov/cgi-bin/filter_${degree}.pl?dir=/${basicGfsList[0 + step]}/${cycleList[0].innerHTML}/atmos&file=${optionList[i].getAttribute("value")}&all_var=on&all_lev=on&toplat=${toplat}&leftlon=${leftlon}&rightlon=${rightlon}&bottomlat=${bottomlat}`, filePath: path.join(__dirname, `../model/grib2/${degree}/${basicGfsList[0 + step]}/${cycleList[0].innerHTML}`), fileName: optionList[i].getAttribute("value"), }); } const urls = JSON.parse(JSON.stringify(grb2FileList)); basicGfsList = []; gfsFile = ""; rootPage = {}; return urls; } else { console.log(`${degree}第${step}个模型内未找到数据,切换下一个模型`); return getGrib2FileUrl(degree, ++step); } } // 提取DOM元素函数 module.exports = { getGrib2FileUrl }