123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- 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();
|