import axios from "axios"; import {ENV} from "./env.js"; import {base64Decode} from "../libs_drpy/crypto-util.js"; class Pan123 { constructor() { this.regex = /https:\/\/(www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com)\/s\/([^\\/]+)/ this.api = 'https://www.123684.com/b/api/share/'; this.loginUrl = 'https://login.123pan.com/api/user/sign_in'; this.cate = '' } async init() { if(this.passport){ console.log("获取盘123账号成功") } if(this.password){ console.log("获取盘123密码成功") } if(this.auth){ let info = JSON.parse(CryptoJS.enc.Base64.parse(this.auth.split('.')[1]).toString(CryptoJS.enc.Utf8)) if(info.exp > Math.floor(Date.now() / 1000)){ console.log("登录成功") }else { console.log("登录过期,重新登录") await this.loin() } }else { console.log("尚未登录,开始登录") await this.loin() } } get passport(){ return ENV.get('pan_passport') } get password(){ return ENV.get('pan_password') } get auth(){ return ENV.get('pan_auth') } async loin(){ let data = JSON.stringify({ "passport": this.passport, "password": this.password, "remember": true }); let config = { method: 'POST', url: this.loginUrl, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', 'Content-Type': 'application/json', 'App-Version': '43', 'Referer': 'https://login.123pan.com/centerlogin?redirect_url=https%3A%2F%2Fwww.123684.com&source_page=website', }, data: data }; let auth = (await axios.request(config)).data ENV.set('pan_auth',auth.data.token) } getShareData(url){ url = decodeURIComponent(url); const matches = this.regex.exec(url); if(url.indexOf('?') > 0){ this.SharePwd = url.split('?')[1].match(/[A-Za-z0-9]+/)[0]; console.log(this.SharePwd) } if (matches) { if(matches[2].indexOf('?') > 0){ return matches[2].split('?')[0] }else { return matches[2].match(/www/g)?matches[1]:matches[2]; } } return null; } async getFilesByShareUrl(shareKey){ let file = {} let cate = await this.getShareInfo(shareKey, this.SharePwd, 0, 0) if(cate && Array.isArray(cate)){ await Promise.all(cate.map(async (item) => { if (!(item.filename in file)) { file[item.filename] = []; } const fileData = await this.getShareList(item.shareKey,item.SharePwd,item.next, item.fileId); if (fileData && fileData.length > 0) { file[item.filename].push(...fileData); } })); } // 过滤掉空数组 for (let key in file) { if (file[key].length === 0) { delete file[key]; } } return file; } async getShareInfo(shareKey,SharePwd,next,ParentFileId) { let cate = [] let list = await axios.get(this.api+"get",{ headers: {}, params: { "limit": "100", "next": next, "orderBy": "file_name", "orderDirection": "asc", "shareKey": shareKey, "SharePwd": SharePwd, "ParentFileId": ParentFileId, "Page": "1" } }); if(list.status === 200){ if(list.data.code === 5103){ console.log(list.data.message); }else { let info = list.data.data; let next = info.Next; let infoList = info.InfoList infoList.forEach(item => { if(item.Category === 0){ cate.push({ filename:item.FileName, shareKey:shareKey, SharePwd:SharePwd, next:next, fileId:item.FileId }); } }) let result = await Promise.all(cate.map(async (it)=> this.getShareInfo(shareKey,SharePwd,next, it.fileId))); result = result.filter(item => item !== undefined && item !== null); return [...cate,...result.flat()]; } } } async getShareList(shareKey,SharePwd,next,ParentFileId) { let video = [] let infoList = (await axios.get(this.api+"get",{ headers: {}, params: { "limit": "100", "next": next, "orderBy": "file_name", "orderDirection": "asc", "shareKey": shareKey, "SharePwd": SharePwd, "ParentFileId": ParentFileId, "Page": "1" } })).data.data.InfoList; infoList.forEach(it=>{ if(it.Category === 2){ video.push({ ShareKey: shareKey, FileId: it.FileId, S3KeyFlag: it.S3KeyFlag, Size: it.Size, Etag: it.Etag, FileName: it.FileName, }) } }) return video; } async getDownload(shareKey,FileId,S3KeyFlag,Size,Etag) { await this.init(); let data = JSON.stringify({ "ShareKey": shareKey, "FileID": FileId, "S3KeyFlag": S3KeyFlag, "Size": Size, "Etag": Etag }); let config = { method: 'POST', url: `${this.api}download/info`, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', 'Authorization': `Bearer ${this.auth}`, 'Content-Type': 'application/json;charset=UTF-8', 'platform': 'android', }, data: data }; let down = (await axios.request(config)).data.data return base64Decode((new URL(down.DownloadURL)).searchParams.get('params')); } async getLiveTranscoding(shareKey,FileId,S3KeyFlag,Size,Etag){ await this.init(); let config = { method: 'GET', url: `https://www.123684.com/b/api/video/play/info`, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', 'Authorization': `Bearer ${this.auth}`, 'Content-Type': 'application/json;charset=UTF-8', 'platform': 'android', }, params:{ "etag": Etag, "size": Size, "from": "1", "shareKey": shareKey } }; let down = (await axios.request(config)).data.data.video_play_info let videoinfo = [] down.forEach(item => { if(item.url!==''){ videoinfo.push({ name:item.resolution, url:item.url }) } }) return videoinfo; } } export const Pan = new Pan123();