6/18/ds/18js/js/gitcafe.js

228 lines
6.7 KiB
JavaScript

/*
* @File : gitcafe.js
* @Author : jade
* @Date : 2024/1/18 9:56
* @Email : jadehh@1ive.com
* @Software : Samples
* @Desc : 阿里纸条
*/
import {_, load} from "../lib/cat.js";
import {Spider} from "./spider.js";
import {detailContent, initAli, playContent} from "../lib/ali.js";
import * as Utils from "../lib/utils.js";
import {VodDetail, VodShort} from "../lib/vod.js";
class GitCafeSpider extends Spider {
constructor() {
super();
this.siteUrl = "https://ali.gitcafe.ink"
}
getName() {
return "🦊┃阿里纸条┃🦊"
}
getAppName() {
return "阿里纸条"
}
getJSName() {
return "gitcafe"
}
getType() {
return 3
}
async getApiUrl() {
let html = await this.fetch(this.siteUrl, null, this.getHeader())
if (!_.isEmpty(html)) {
let paper_js_url = Utils.getStrByRegex(/<script src='(.*?)'><\/script>/, html)
let paper_js_content = await this.fetch(paper_js_url, null, this.getHeader())
return {
"api": "https:" + Utils.getStrByRegex(/ return '(.*?)' \+ /, paper_js_content) + new Date().getTime(),
"search_api": Utils.getStrByRegex(/const SEARCH_API = '(.*?)';/, paper_js_content)
}
}
}
async getContentJson() {
let url_json = await this.getApiUrl()
let content = await this.fetch(url_json["api"], null, this.getHeader())
this.search_api = url_json["search_api"]
if (!_.isEmpty(content)) {
return JSON.parse(content)
}
}
async spiderInit() {
this.content_json = await this.getContentJson()
this.token_dic = await this.load_cache()
}
async init(cfg) {
await this.spiderInit()
await super.init(cfg);
await initAli(this.cfgObj["token"]);
}
async parseClassFromJson(obj) {
let data_list = Object.keys(obj["data"]).slice(0, 19)
for (const data_key of data_list) {
this.classes.push({"type_name": obj["data"][data_key]["name"], "type_id": data_key})
}
}
async parseVodShortListFromJson(obj) {
let vod_list = []
let class_id_list = this.getClassIdList()
for (const data_obj of obj) {
let vodShort = new VodShort()
if (class_id_list.includes(data_obj["cat"])) {
vodShort.vod_id = JSON.stringify(data_obj)
vodShort.vod_name = data_obj["title"]
vodShort.vod_remarks = data_obj["date"]
vod_list.push(vodShort)
}
}
return vod_list
}
async parseVodDetailfromJson(obj) {
let classNamesList = this.getClassNameList()
let classIdList = this.getClassIdList()
let vodDetail = new VodDetail()
vodDetail.vod_name = obj["title"]
vodDetail.vod_remarks = obj["creatime"] ?? obj["date"]
vodDetail.type_name = classNamesList[classIdList.indexOf(obj["cat"])]
vodDetail.vod_content = obj["des"]
let ali_url = "https://www.aliyundrive.com/s/" + obj["alikey"]
let aliVodDetail = await detailContent([ali_url])
vodDetail.vod_play_url = aliVodDetail.vod_play_url
vodDetail.vod_play_from = aliVodDetail.vod_play_from
return vodDetail
}
async setClasses() {
await this.parseClassFromJson(this.content_json)
}
async setHomeVod() {
this.homeVodList = await this.parseVodShortListFromJson(this.content_json["info"]["new"])
}
async setDetail(id) {
let content_json = JSON.parse(id)
this.vodDetail = await this.parseVodDetailfromJson(content_json)
}
async setCategory(tid, pg, filter, extend) {
this.vodList = await this.parseVodShortListFromJson(this.content_json["data"][tid]["catdata"])
}
async setSearch(wd, quick) {
await this.refreshToken();
let params = {
"action": "search", "from": "web", "token": this.token_dic["token"], "keyword": wd
}
let content = await this.post(this.search_api, params, this.getHeader())
if (!_.isEmpty(content)) {
let content_json = JSON.parse(content)
this.vodList = await this.parseVodShortListFromJson(content_json["data"])
}
}
async refreshToken() {
let this_time = new Date().getTime()
if (_.isEmpty(this.token_dic["token"])) {
await this.get_token()
await this.jadeLog.debug("Token为空,刷新Token")
} else if (this_time - parseInt(this.token_dic["date"]) > 24 * 60 * 60 * 1000) {
await this.jadeLog.debug(`Token到期,上次获取Token时间为:${this_time},当前时间为:${parseInt(this.token_dic["date"])},刷新Token`)
await this.get_token()
} else {
await this.jadeLog.debug(`Token仍然有效,无需刷新`, true)
}
}
async get_token() {
try {
let params = {
"action": "get_token", "from": "web",
}
let content = await this.post(this.search_api, params, this.getHeader())
if (!_.isEmpty(content)) {
let content_json = JSON.parse(content)
let this_time = new Date().getTime()
this.token_dic["token"] = content_json["data"]
this.token_dic["date"] = this_time.toString()
await this.write_cache()
}
} catch (e) {
await this.jadeLog.error("获取Token失败,失败原因为:" + e)
}
}
async write_cache() {
await local.set("gitcafe_token", "token", JSON.stringify(this.token_dic))
}
async load_cache() {
try {
let str = await local.get("gitcafe_token", "token")
return JSON.parse(str)
} catch (e) {
return {"token": "", "date": ""}
}
}
async play(flag, id, flags) {
return await playContent(flag, id, flags);
}
}
let spider = new GitCafeSpider()
async function init(cfg) {
await spider.init(cfg)
}
async function home(filter) {
return await spider.home(filter)
}
async function homeVod() {
return await spider.homeVod()
}
async function category(tid, pg, filter, extend) {
return await spider.category(tid, pg, filter, extend)
}
async function detail(id) {
return await spider.detail(id)
}
async function play(flag, id, flags) {
return await spider.play(flag, id, flags)
}
async function search(wd, quick) {
return await spider.search(wd, quick)
}
export function __jsEvalReturn() {
return {
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
};
}
export {spider}