miao-plugin/tools/reli-data-sprider.js

134 lines
3.1 KiB
JavaScript
Raw Normal View History

import fs from 'fs'
import cheerio from 'cheerio'
import lodash from 'lodash'
import fetch from 'node-fetch'
const _path = process.cwd()
const artiIdx = {
Flower: 1,
Plume: 2,
Sands: 3,
Goblet: 4,
Circlet: 5
}
let getCharData = async function (url, key, name = '') {
url = 'https://genshin.honeyhunterworld.com/' + url
console.log('req' + key, url)
let req = await fetch(url)
let txt = await req.text()
const $ = cheerio.load(txt)
let ret = getBasic($, name)
name = ret.name
return ret
}
async function saveCharData (url, key, name) {
let data = await getCharData(url, key, name)
name = name || data.name
if (!name) {
console.log('角色名不存在' + url)
return
}
let charPath = `${_path}/plugins/miao-plugin/resources/meta/character/${data.name}/`
if (!fs.existsSync(charPath)) {
fs.mkdirSync(charPath)
}
fs.writeFileSync(`${charPath}data.json`, JSON.stringify(data, '', '\t'))
console.log(data.name + '下载完成')
}
function getEffect (txt) {
let regRet = /(\d) Piece:/.exec(txt)
if (regRet) {
return [regRet[1], txt.replace(regRet[0], '').trim().replace(/。$/, '')]
}
return []
}
async function getSets (id) {
const url = `https://genshin.honeyhunterworld.com/db/art/family/a_${id}/?lang=CHS`
let req = await fetch(url)
let txt = await req.text()
fs.writeFileSync('./test.html', txt)
let $ = cheerio.load(txt)
let sets = $('.wrappercont .add_stat_table:eq(0)')
let ret = {}
sets.find('td').each(function () {
let line = $(this)
let nRet = /\s*(.*?)\s+\(([^\s]+)/.exec(line.find('span').text())
let idRet = /a_(\d+)/.exec(line.find('a').attr('href'))
if (nRet && idRet) {
ret[`arti${artiIdx[nRet[2]]}`] = {
id: idRet[1],
name: nRet[1]
}
}
})
return ret
}
async function down () {
const url = 'https://genshin.honeyhunterworld.com/db/artifact/?lang=CHS'
let req = await fetch(url)
let txt = await req.text()
let $ = cheerio.load(txt)
let char = $('.art_stat_table_new')
let ret = {}
let tmp = {}
char.each(function () {
let trs = $(this).find('tr:gt(0)')
trs.each(function (idx) {
let self = $(this)
if (idx % 2 === 0) {
let na = self.find('td:eq(2) a')
let idRet = /a_(\d+)/.exec(na.attr('href'))
if (idRet) {
tmp = {
id: idRet[1],
name: na.text(),
sets: {},
effect: {}
}
} else {
tmp = { effect: {} }
}
}
let et = getEffect(self.find(`td:eq(${idx % 2 === 0 ? 4 : 1})`).text())
if (et && et[0]) {
tmp.effect[et[0]] = et[1]
}
if (idx % 2 === 1 && tmp.id) {
ret[tmp.id] = tmp
}
})
})
for (let idx in ret) {
let ds = ret[idx]
ds.sets = await getSets(ds.id)
console.log(`arti ${ds.id}:${ds.name} Done`)
}
let filePath = `${_path}/plugins/miao-plugin/resources/meta/reliquaries/`
fs.writeFileSync(`${filePath}data.json`, JSON.stringify(ret, '', '\t'))
}
// await saveCharData("https://genshin.honeyhunterworld.com/db/char/ayaka/?lang=CHS", "ayaka");
await down()