diff --git a/plugins/genshin/apps/takeBirthdayPhoto.js b/plugins/genshin/apps/takeBirthdayPhoto.js new file mode 100644 index 0000000..dea56c0 --- /dev/null +++ b/plugins/genshin/apps/takeBirthdayPhoto.js @@ -0,0 +1,142 @@ +import plugin from '../../../lib/plugins/plugin.js' +import gsCfg from '../model/gsCfg.js' +import axios from 'axios' + +export class takeBirthdayPhoto extends plugin { + constructor() { + super({ + name: '留影叙佳期', + dsc: '留影叙佳期', + /** https://oicqjs.github.io/oicq/#events */ + event: 'message', + priority: 5000, + rule: [ + { + /** 命令正则匹配 */ + reg: '#?留影叙佳期$', + /** 执行方法 */ + fnc: 'birthdaystar', + } + ] + }) + } + async birthdaystar(e) { + const { user_id } = e; + + const userInfo = await this.getCookie(user_id) + if (!userInfo) { + e.reply('请先绑定ck再使用本功能哦~', true); + return true; + } + + const e_hk4e_token = await this.getEHK4EToken(userInfo.ck, userInfo.uid) + if (!e_hk4e_token) { + e.reply('获取e-hk4e_token失败,请刷新ck后再试~', true); + return true; + } + + const birthday_star_list = await this.getBirthdayStar(userInfo.uid, e_hk4e_token, userInfo.ck); + if (!birthday_star_list) { + e.reply('获取生日角色失败,请稍后再试~', true); + return true; + } + + if (birthday_star_list.length === 0) { + e.reply('今天没有生日角色哦~', true); + return true; + } + + for (let role of birthday_star_list) { + await e.reply(`正在获取${role.name}的图片,请稍等~`, true); + await e.reply(segment.image(role.take_picture)) + let message = await this.getBirthdayStarImg(userInfo.uid, e_hk4e_token, userInfo.ck, role.role_id) + if (message != 'success') { + await e.reply(message) + return true + } else { + await e.reply(`获取${role.name}的图片成功~`, true); + } + } + + return true + } + + async getCookie(user_id) { + const userInfo = ((await gsCfg.getBingCk()).ckQQ)[user_id] + return userInfo + } + + async getEHK4EToken(ck, uid) { + const isCN = uid.toString().match(/^[125]/) ? true : false; + const url = isCN ? 'https://api-takumi.mihoyo.com/common/badge/v1/login/account' : 'https://api-os-takumi.mihoyo.com/common/badge/v1/login/account' + const game_biz = isCN ? 'hk4e_cn' : 'hk4e_global' + const region = await this.getServer(uid) + const header = { + 'Cookie': ck, + 'Content-Type': 'application/json;charset=UTF-8', + 'Referer': 'https://webstatic.mihoyo.com/', + 'Origin': 'https://webstatic.mihoyo.com' + } + const body = JSON.stringify({ + uid: Number(uid), + game_biz: game_biz, + lang: 'zh-cn', + region: region, + }) + let res = await axios.post(url, body, { headers: header }) + if (res.data.retcode != 0) { + return false + } + let e_hk4e_token = res.headers['set-cookie'].toString().match(/e_hk4e_token=(.*?);/)[1] + return e_hk4e_token + } + + async getServer(uid) { + switch (String(uid)[0]) { + case '1': + case '2': + return 'cn_gf01' + case '5': + return 'cn_qd01' + case '6': + return 'os_usa' + case '7': + return 'os_euro' + case '8': + return 'os_asia' + case '9': + return 'os_cht' + } + return 'cn_gf01' + } + + async getBirthdayStar(uid, e_hk4e_token, ck) { + let cookie = `e_hk4e_token=${e_hk4e_token};${ck}` + let badge_region = await this.getServer(uid) + let isCN = uid.toString().match(/^[125]/) ? true : false; + let game_biz = isCN ? 'hk4e_cn' : 'hk4e_global' + let header = { + 'Cookie': cookie, + } + let url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/index?lang=zh-cn&badge_uid=${uid}&badge_region=${badge_region}&game_biz=${game_biz}&activity_id=20220301153521` + let res = await axios.get(url, { headers: header }) + return res.data.data.role + } + + async getBirthdayStarImg(uid, e_hk4e_token, ck, role_id) { + let cookie = `e_hk4e_token=${e_hk4e_token};${ck}` + let badge_region = await this.getServer(uid) + let isCN = uid.toString().match(/^[125]/) ? true : false; + let game_biz = isCN ? 'hk4e_cn' : 'hk4e_global' + let header = { + 'Cookie': cookie, + } + let url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/post_my_draw?lang=zh-cn&badge_uid=${uid}&badge_region=${badge_region}&game_biz=${game_biz}&activity_id=20220301153521` + let res = await axios.post(url, { role_id: Number(role_id) }, { headers: header }) + if (res.data.retcode != 0) { + return res.data.message + } else { + return 'success' + } + } +} \ No newline at end of file