Miao-Yunzai/apps/takeBirthdayPhoto.ts

156 lines
4.4 KiB
TypeScript
Raw Normal View History

2024-06-14 10:44:18 +08:00
import { plugin } from 'yunzai/core'
2024-06-17 23:04:18 +08:00
import { MysInfo } from 'yunzai/mys'
2024-06-14 10:44:18 +08:00
import fetch from 'node-fetch'
export class takeBirthdayPhoto extends plugin {
constructor() {
/**
*
name: '留影叙佳期',
dsc: '留影叙佳期',
*/
super({
priority: 5000,
rule: [
{
reg: '^#?(留影(叙佳期)?|((领)?((角色)?生日)(卡)?))$',
fnc: 'birthdaystar'
}
]
})
2024-06-17 23:04:18 +08:00
this.button = segment.button([{ text: '留影叙佳期', input: '#留影叙佳期' }])
2024-06-14 10:44:18 +08:00
}
async birthdaystar(e) {
let uid = await MysInfo.getUid(this.e)
if (!uid) return false
let ck = await MysInfo.checkUidBing(uid, this.e)
if (!ck) {
2024-06-17 23:04:18 +08:00
e.reply(
[
'请先绑定ck再使用本功能哦~',
segment.button([{ text: 'Cookie帮助', callback: '#Cookie帮助' }])
],
true
)
2024-06-14 10:44:18 +08:00
return true
}
this.region = await this.getServer(uid)
this.game_biz = this.region.includes('cn') ? 'hk4e_cn' : 'hk4e_global'
const e_hk4e_token = await this.getEHK4EToken(ck.ck, uid)
if (!e_hk4e_token) {
e.reply(['获取e-hk4e_token失败请刷新ck后再试~', this.button], true)
return true
}
2024-06-17 23:04:18 +08:00
const birthday_star_list = await this.getBirthdayStar(
uid,
e_hk4e_token,
ck.ck
)
2024-06-14 10:44:18 +08:00
if (!birthday_star_list) {
e.reply(['获取生日角色失败,请稍后再试~', this.button], true)
return true
}
if (birthday_star_list.length === 0) {
e.reply(['今天没有生日角色哦~', this.button], true)
return true
}
try {
for (const role of birthday_star_list) {
await e.reply(`正在获取${role.name}的图片,请稍等~`, true)
await e.reply(segment.image(role.take_picture))
2024-06-17 23:04:18 +08:00
const message = await this.getBirthdayStarImg(
uid,
e_hk4e_token,
ck.ck,
role.role_id
)
2024-06-14 10:44:18 +08:00
if (message != 'success') {
await e.reply([message, this.button])
return true
} else {
await e.reply(`获取${role.name}的图片成功~`, true)
}
}
} catch (error) {
2024-06-17 23:04:18 +08:00
await e.reply(
[`获取角色留影叙佳期图片失败可能是ck失效...`, this.button],
true
)
2024-06-14 10:44:18 +08:00
logger.error(error)
}
return true
}
async getEHK4EToken(ck, uid) {
2024-06-17 23:04:18 +08:00
const url = this.region.includes('cn')
? 'https://api-takumi.mihoyo.com/common/badge/v1/login/account'
: 'https://api-os-takumi.mihoyo.com/common/badge/v1/login/account'
2024-06-14 10:44:18 +08:00
const headers = {
2024-06-17 23:04:18 +08:00
'Cookie': ck,
2024-06-14 10:44:18 +08:00
'Content-Type': 'application/json;charset=UTF-8',
2024-06-17 23:04:18 +08:00
'Referer': 'https://webstatic.mihoyo.com/',
'Origin': 'https://webstatic.mihoyo.com'
2024-06-14 10:44:18 +08:00
}
const body = JSON.stringify({
uid: Number(uid),
game_biz: this.game_biz,
lang: 'zh-cn',
region: this.region
})
let res = await fetch(url, { method: 'POST', body, headers })
2024-06-17 23:04:18 +08:00
const e_hk4e_token = res.headers
.get('set-cookie')
.match(/e_hk4e_token=(.*?);/)[1]
2024-06-14 10:44:18 +08:00
res = await res.json()
if (res.retcode != 0) {
return false
}
return e_hk4e_token
}
async getServer(uid) {
switch (String(uid).slice(0, -8)) {
case '1':
case '2':
return 'cn_gf01'
case '5':
return 'cn_qd01'
case '6':
return 'os_usa'
case '7':
return 'os_euro'
case '8':
case '18':
return 'os_asia'
case '9':
return 'os_cht'
}
return 'cn_gf01'
}
async getBirthdayStar(uid, e_hk4e_token, ck) {
const headers = { Cookie: `e_hk4e_token=${e_hk4e_token};${ck}` }
const url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/index?lang=zh-cn&badge_uid=${uid}&badge_region=${this.region}&game_biz=${this.game_biz}&activity_id=20220301153521`
let res = await fetch(url, { headers })
res = await res.json()
return res.data.role
}
async getBirthdayStarImg(uid, e_hk4e_token, ck, role_id) {
const headers = { Cookie: `e_hk4e_token=${e_hk4e_token};${ck}` }
const url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/post_my_draw?lang=zh-cn&badge_uid=${uid}&badge_region=${this.region}&game_biz=${this.game_biz}&activity_id=20220301153521`
const body = JSON.stringify({ role_id: Number(role_id) })
let res = await fetch(url, { method: 'POST', body, headers })
res = await res.json()
if (res.retcode != 0) return res.message
else return 'success'
}
}