import axios from 'axios' import * as cheerio from 'cheerio' import express from 'express' import path from 'path' import fs from 'fs' const app = express() const __dirname = path.resolve() app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'src', 'index.html')) }) app.get('/query', async (req, res) => { let { name, force } = req.query if (force == undefined) { force = false } const data = getOilPriceJson(force) if (name) { const filteredData = data.filter(item => item.name.includes(name)) res.json(filteredData) } else { res.json(data) } }) app.listen(1933, () => { console.log('Server is running on port 1933') }); // 获取油价数据,若本地数据存在则读取本地数据,否则请求网络数据,并保存到本地以供后续使用。 // force 参数用于强制刷新本地数据 const getOilPriceJson = (force) => { const filename = new Date().format().split("T")[0].replaceAll("-", "").concat(".json") const filepath = path.join(__dirname, "data", filename) if (fs.existsSync(filepath) && !force) { const data = fs.readFileSync(filepath, "utf-8") return JSON.parse(data) } else { // 如果目录不存在,则创建目录 if (!fs.existsSync(path.join(__dirname, "data"))) { fs.mkdirSync(path.join(__dirname, "data"), { recursive: true }) } // 如果文件存在,则需要删除文件 if (fs.existsSync(filepath)) { fs.rmSync(filepath) } getOilPrice((data) => { data.push({ name: "更新时间", time: new Date().format() }) fs.writeFileSync(filepath, JSON.stringify(data), "utf-8") }) } } const getOilPrice = async (callback) => { const url = "https://www.xiaoxiongyouhao.com/fprice/" let data = [] const response = await axios.get(url) const $ = cheerio.load(response.data) // 解析 html 页面 $("table").each((i, elem) => { const table = $(elem) const rows = table.find("tr") rows.each((j, row) => { const cells = $(row).find("td") let rowData = {} cells.each((k, cell) => { switch (k) { case 0: rowData["name"] = rename($(cell).text()) break case 1: rowData["92#"] = $(cell).text() break case 2: rowData["95#"] = $(cell).text() break case 3: rowData["0#"] = $(cell).text() break default: rowData["other"] = $(cell).text() break } }) // 过滤掉空行 if (Object.keys(rowData).length > 0) { data.push(rowData); } }) }) callback(data) } // 统一地区名称 const rename = (name) => { name = name.replace("省", "") name = name.replace("市", "") name = name.replace("内蒙古自治区", "内蒙古") name = name.replace("广西壮族自治区", "广西") name = name.replace("西藏自治区", "西藏") name = name.replace("宁夏回族自治区", "宁夏") name = name.replace("新疆维吾尔自治区", "新疆") name = name.replace("香港特别行政区", "香港") name = name.replace("澳门特别行政区", "澳门") return name } // 为 Date 创建日期格式化方法 Date.prototype.format = function () { let fillZero = (num) => { return num < 10 ? "0" + num : num } let year = fillZero(this.getFullYear()) let month = fillZero(this.getMonth() + 1) let day = fillZero(this.getDate()) let hour = fillZero(this.getHours()) let minute = fillZero(this.getMinutes()) let second = fillZero(this.getSeconds()) return `${year}-${month}-${day}T${hour}:${minute}:${second}` }