miao-plugin/tools/char-ambr.js

174 lines
5.6 KiB
JavaScript

import fs from 'fs'
import cheerio from 'cheerio'
import lodash from 'lodash'
import fetch from 'node-fetch'
import ImgDownloader from './sprider/ImgDown.js'
import CharData from './sprider/CharDataAmber.js'
import { Data } from '../components/index.js'
import tId from './sprider/TalentId.js'
import testData from './test.js'
const _path = process.cwd()
const _root = _path + '/plugins/miao-plugin/'
const _mRoot = _root + 'resources/meta/material/'
let mData = {}
if (fs.existsSync(_mRoot + 'data.json')) {
mData = JSON.parse(fs.readFileSync(_mRoot + 'data.json', 'utf8'))
}
const tElems = ['anemo', 'geo', 'electro', 'dendro']
let getCharData = async function (id, key, name = '', _id = id) {
let url = `https://api.ambr.top/v2/chs/avatar/100000${id}`
console.log('req: ' + url)
let req = await fetch(url)
let reqData = await req.json()
reqData = reqData.data
console.log(reqData.id)
let data = CharData.getBasic(reqData)
name = name || data.name
let imgs = new ImgDownloader(name)
let attr = CharData.getDetailAttr(reqData)
data.baseAttr = {}
data.growAttr = {}
let talentId
let talentKey
let detail = CharData.getDetail(reqData)
let { talent, cons } = detail
data.talentKey = talentKey || lodash.invert(lodash.mapValues(talent, (t) => t.id))
data.talentId = talentId
data.talentCons = CharData.getConsTalent(talent, cons)
return {
data,
details: [detail],
imgs
}
}
function checkName (name) {
let charPath = `resources/meta/character/${name}/`
Data.createDir(charPath)
if (name === '旅行者') {
for (let idx in tElems) {
Data.createDir(`${charPath}${tElems[idx]}/icons`)
}
} else {
Data.createDir(`${charPath}/icons`)
}
Data.createDir(`${charPath}/imgs`)
let data = Data.readJSON(`${charPath}/data.json`)
return data.ver * 1 > 1
}
async function saveCharData (id) {
let { data, details, imgs } = await getCharData(id)
let name = data.name
if (!name) {
console.log(`角色名不存在${id}:${name}`)
return
}
Data.createDir(`resources/meta/character/${name}/`)
let charPath = `${_path}/plugins/miao-plugin/resources/meta/character/${name}/`
fs.writeFileSync(`${charPath}data.json`, JSON.stringify(data, '', 2))
if (details.length === 1) {
fs.writeFileSync(`${charPath}detail.json`, JSON.stringify(details[0], '', 2))
} else if (data.id === 20000000) {
for (let idx in details) {
let detail = details[idx]
fs.writeFileSync(`${charPath}/${detail.elem}/detail.json`, JSON.stringify(detail, '', 2))
}
}
console.log(data.name + '数据下载完成')
if (![10000005, 10000007].includes(data.id)) {
await imgs.download()
console.log(data.name + '图像全部下载完成')
}
}
async function down (name = '', force = false) {
if (name === '') {
name = lodash.keys(charData).join(',')
}
let names = name.split(',')
for (let id in charData) {
let ds = charData[id]
if (!names.includes(id) && !names.includes(ds.key) && !names.includes(ds.name)) {
continue
}
await saveCharData(id)
}
fs.writeFileSync(`${_mRoot}data.json`, JSON.stringify(mData, '', 2))
}
const charData = {
2: { key: 'ayaka', name: '神里绫华' },
3: { key: 'qin', name: '琴' },
4: { key: 'playergirl', name: '旅行者', id: 7 },
5: { key: 'playerboy', name: '空' },
6: { key: 'lisa', name: '丽莎' },
7: { key: 'playergirl', name: '荧' },
14: { key: 'barbara', name: '芭芭拉' },
15: { key: 'kaeya', name: '凯亚' },
16: { key: 'diluc', name: '迪卢克' },
20: { key: 'razor', name: '雷泽' },
21: { key: 'ambor', name: '安柏' },
22: { key: 'venti', name: '温迪' },
23: { key: 'xiangling', name: '香菱' },
24: { key: 'beidou', name: '北斗' },
25: { key: 'xingqiu', name: '行秋' },
26: { key: 'xiao', name: '魈' },
27: { key: 'ningguang', name: '凝光' },
29: { key: 'klee', name: '可莉' },
30: { key: 'zhongli', name: '钟离' },
31: { key: 'fischl', name: '菲谢尔' },
32: { key: 'bennett', name: '班尼特' },
33: { key: 'tartaglia', name: '达达利亚' },
34: { key: 'noel', name: '诺艾尔' },
35: { key: 'qiqi', name: '七七' },
36: { key: 'chongyun', name: '重云' },
37: { key: 'ganyu', name: '甘雨' },
38: { key: 'albedo', name: '阿贝多' },
39: { key: 'diona', name: '迪奥娜' },
41: { key: 'mona', name: '莫娜' },
42: { key: 'keqing', name: '刻晴' },
43: { key: 'sucrose', name: '砂糖' },
44: { key: 'xinyan', name: '辛焱' },
45: { key: 'rosaria', name: '罗莎莉亚' },
46: { key: 'hutao', name: '胡桃' },
47: { key: 'kazuha', name: '枫原万叶' },
48: { key: 'feiyan', name: '烟绯' },
49: { key: 'yoimiya', name: '宵宫' },
50: { key: 'tohma', name: '托马' },
51: { key: 'eula', name: '优菈' },
52: { key: 'shougun', name: '雷电将军' },
53: { key: 'sayu', name: '早柚' },
54: { key: 'kokomi', name: '珊瑚宫心海' },
55: { key: 'gorou', name: '五郎' },
56: { key: 'sara', name: '九条裟罗' },
57: { key: 'itto', name: '荒泷一斗' },
58: { key: 'yae', name: '八重神子' },
59: { key: 'heizo', name: '鹿野院平藏' },
60: { key: 'yelan', name: '夜兰' },
62: { key: 'aloy', name: '埃洛伊' },
63: { key: 'shenhe', name: '申鹤' },
64: { key: 'yunjin', name: '云堇' },
65: { key: 'shinobu', name: '久岐忍' },
66: { key: 'ayato', name: '神里绫人' },
67: { key: 'collei', name: '柯莱' },
68: { key: 'dori', name: '多莉' },
69: { key: 'tighnari', name: '提纳里' },
70: { key: 'nilou', name: '妮露' },
71: { key: 'cyno', name: '赛诺' },
72: { key: 'candace', name: '坎蒂丝' },
73: '纳西妲',
74: '莱依拉'
}
await down('73,74', true)