128 lines
3.6 KiB
JavaScript
128 lines
3.6 KiB
JavaScript
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}`
|
|
}
|