256 lines
6.0 KiB
JavaScript
256 lines
6.0 KiB
JavaScript
// xingya
|
|
|
|
const CryptoJS = createCryptoJS()
|
|
|
|
let appConfig = {
|
|
ver: 1,
|
|
title: '星芽短劇',
|
|
site: 'https://app.whjzjx.cn',
|
|
tabs: [
|
|
{
|
|
name: '热播剧',
|
|
ext: {
|
|
id: 2,
|
|
},
|
|
},
|
|
{
|
|
name: '会员专享',
|
|
ext: {
|
|
id: 8,
|
|
},
|
|
},
|
|
{
|
|
name: '星选好剧',
|
|
ext: {
|
|
id: 7,
|
|
},
|
|
},
|
|
{
|
|
name: '新剧',
|
|
ext: {
|
|
id: 3,
|
|
},
|
|
},
|
|
{
|
|
name: '阳光剧场',
|
|
ext: {
|
|
id: 5,
|
|
},
|
|
},
|
|
],
|
|
}
|
|
|
|
async function getConfig() {
|
|
return jsonify(appConfig)
|
|
}
|
|
|
|
async function getCards(ext) {
|
|
ext = argsify(ext)
|
|
let cards = []
|
|
let { id, page = 1 } = ext
|
|
let url = `${appConfig.site}/cloud/v2/theater/home_page?theater_class_id=${id}&type=1&page_num=${page}&page_size=24`
|
|
let headers = await getHeader()
|
|
|
|
const { data } = await $fetch.get(url, {
|
|
headers: headers,
|
|
})
|
|
|
|
let list = argsify(data).data.list
|
|
list.forEach((e) => {
|
|
let item = e.theater
|
|
let id = item.id.toString()
|
|
cards.push({
|
|
vod_id: id,
|
|
vod_name: item.title,
|
|
vod_pic: item.cover_url,
|
|
vod_remarks: `${item.total}集全`,
|
|
ext: {
|
|
id,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: cards,
|
|
})
|
|
}
|
|
|
|
async function getTracks(ext) {
|
|
ext = argsify(ext)
|
|
let tracks = []
|
|
let id = ext.id
|
|
let url = `${appConfig.site}/v2/theater_parent/detail?theater_parent_id=${id}`
|
|
let headers = await getHeader()
|
|
|
|
const { data } = await $fetch.get(url, {
|
|
headers: headers,
|
|
})
|
|
|
|
let playlist = argsify(data).data.theaters
|
|
playlist.forEach((e) => {
|
|
let name = e.num.toString()
|
|
let url = e.son_video_url
|
|
tracks.push({
|
|
name,
|
|
pan: '',
|
|
ext: {
|
|
url,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: [
|
|
{
|
|
title: '默认分组',
|
|
tracks,
|
|
},
|
|
],
|
|
})
|
|
}
|
|
|
|
async function getPlayinfo(ext) {
|
|
ext = argsify(ext)
|
|
let url = ext.url
|
|
|
|
return jsonify({ urls: [url] })
|
|
}
|
|
|
|
async function search(ext) {
|
|
ext = argsify(ext)
|
|
let cards = []
|
|
|
|
let text = encodeURIComponent(ext.text)
|
|
let url = appConfig.site + '/v3/search'
|
|
let headers = await getHeader()
|
|
headers['Content-Type'] = 'application/json'
|
|
let body = {
|
|
text: encodeURIComponent(text),
|
|
}
|
|
|
|
// const { data } = await axios.post(url, body, {
|
|
// headers: headers,
|
|
// })
|
|
const { data } = await $fetch.post(url, body, {
|
|
headers: headers,
|
|
})
|
|
|
|
const list = argsify(data).data.theater.search_data
|
|
|
|
list.forEach((e) => {
|
|
let item = e
|
|
let id = item.id.toString()
|
|
cards.push({
|
|
vod_id: id,
|
|
vod_name: item.title,
|
|
vod_pic: item.cover_url,
|
|
vod_remarks: `${item.total}集全`,
|
|
ext: {
|
|
id,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: cards,
|
|
})
|
|
}
|
|
|
|
async function getHeader() {
|
|
let header = {
|
|
'User-Agent': 'okhttp/4.10.0',
|
|
'Accept-Encoding': 'gzip',
|
|
'x-app-id': '7',
|
|
platform: '1',
|
|
manufacturer: 'asus',
|
|
version_name: '3.3.1',
|
|
user_agent:
|
|
'Mozilla/5.0 (Linux; Android 14; Zenfone 5Z Build/AP2A.240705.005; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.165 Mobile Safari/537.36',
|
|
dev_token:
|
|
'Bsg4gWzOoQc9UEvsnDHZWNlpphiWxQ9MIDNUZIqU6k_irRIWCyYEABtuSI5OBkJ9gDNLzcr1wBQSku05JgYmeQN-lmGn94m-On-JSrqecxcFQdU8VkskVkugV4qUF_mW1sHjcYWeXbfdHM5b2VytKSUCRzlJ-Ix4QuRrll15Rmxo*',
|
|
app_version: '3.3.1',
|
|
device_platform: 'android',
|
|
personalized_recommend_status: '1',
|
|
device_type: 'Zenfone+5Z',
|
|
device_brand: 'asus',
|
|
os_version: '14',
|
|
channel: 'default',
|
|
raw_channel: 'default',
|
|
oaid: '',
|
|
msa_oaid: '',
|
|
uuid: 'randomUUID_9e91d3ce-8658-4d6e-9d1b-6f351611163d',
|
|
device_id: '2885ce2d34c9634b287ab022f2f3a6cfb',
|
|
ab_id: '',
|
|
support_h265: '1',
|
|
}
|
|
|
|
let token = $cache.get('xingya')
|
|
// $print(`token: ${token}`)
|
|
|
|
if (token) {
|
|
let currentTime = Math.floor(Date.now() / 1000)
|
|
let exp = decodeJWT(token).payload.exp
|
|
if (currentTime > exp) {
|
|
token = ''
|
|
}
|
|
}
|
|
|
|
if (!token) {
|
|
token = await getJWT(header)
|
|
$cache.set('xingya', token)
|
|
}
|
|
|
|
header['authorization'] = token
|
|
return header
|
|
}
|
|
|
|
async function getJWT(header) {
|
|
const login = `https://u.shytkjgs.com/user/v1/account/login`
|
|
let headers = header
|
|
headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
|
|
const { data } = await $fetch.post(
|
|
login,
|
|
{ device: headers.device_id },
|
|
{
|
|
headers: headers,
|
|
}
|
|
)
|
|
const jwt = argsify(data).data.token
|
|
// $print(`jwt: ${jwt}`)
|
|
return jwt
|
|
}
|
|
|
|
function decodeJWT(token) {
|
|
function base64UrlDecode(str) {
|
|
// Replace URL-safe characters with Base64 characters
|
|
let base64 = str.replace(/-/g, '+').replace(/_/g, '/')
|
|
// Add padding if necessary
|
|
while (base64.length % 4) {
|
|
base64 += '='
|
|
}
|
|
// Decode Base64 string
|
|
return base64Decode(base64)
|
|
}
|
|
|
|
// Split JWT into parts
|
|
const parts = token.split('.')
|
|
if (parts.length !== 3) {
|
|
throw new Error('Invalid JWT token')
|
|
}
|
|
|
|
// Decode header and payload
|
|
const header = JSON.parse(base64UrlDecode(parts[0]))
|
|
const payload = JSON.parse(base64UrlDecode(parts[1]))
|
|
|
|
return {
|
|
header: header,
|
|
payload: payload,
|
|
signature: parts[2],
|
|
}
|
|
}
|
|
|
|
function base64Decode(text) {
|
|
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))
|
|
}
|