1+ import axios from "axios" ;
2+ import { ENV } from "./env.js" ;
3+
4+
5+ class Pan123 {
6+ constructor ( ) {
7+ this . regex = / h t t p s : \/ \/ w w w .1 2 3 6 8 4 .c o m \/ s \/ ( [ ^ \\ / ] + ) /
8+ this . api = 'https://www.123684.com/b/api/share/' ;
9+ this . loginUrl = 'https://login.123pan.com/api/user/sign_in' ;
10+ }
11+
12+ async init ( ) {
13+ if ( this . passport ) {
14+ console . log ( "获取盘123账号成功" )
15+ }
16+ if ( this . password ) {
17+ console . log ( "获取盘123密码成功" )
18+ }
19+ if ( this . auth ) {
20+ let info = JSON . parse ( CryptoJS . enc . Base64 . parse ( this . auth . split ( '.' ) [ 1 ] ) . toString ( CryptoJS . enc . Utf8 ) )
21+ if ( info . exp > Math . floor ( Date . now ( ) / 1000 ) ) {
22+ console . log ( "登录成功" )
23+ } else {
24+ console . log ( "登录过期,重新登录" )
25+ await this . loin ( )
26+ }
27+ } else {
28+ console . log ( "尚未登录,开始登录" )
29+ await this . loin ( )
30+ }
31+ }
32+
33+ get passport ( ) {
34+ return ENV . get ( 'pan_passport' )
35+ }
36+
37+ get password ( ) {
38+ return ENV . get ( 'pan_password' )
39+ }
40+
41+ get auth ( ) {
42+ return ENV . get ( 'pan_auth' )
43+ }
44+
45+ async loin ( ) {
46+ let data = JSON . stringify ( {
47+ "passport" : this . passport ,
48+ "password" : this . password ,
49+ "remember" : true
50+ } ) ;
51+ let config = {
52+ method : 'POST' ,
53+ url : this . loginUrl ,
54+ headers : {
55+ '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' ,
56+ 'Content-Type' : 'application/json' ,
57+ 'App-Version' : '43' ,
58+ 'Referer' : 'https://login.123pan.com/centerlogin?redirect_url=https%3A%2F%2Fwww.123684.com&source_page=website' ,
59+ } ,
60+ data : data
61+ } ;
62+
63+ let auth = ( await axios . request ( config ) ) . data
64+ ENV . set ( 'pan_auth' , auth . data . token )
65+ }
66+
67+ getShareData ( url ) {
68+ url = decodeURIComponent ( url ) ;
69+ const matches = this . regex . exec ( url ) ;
70+ if ( url . indexOf ( '?' ) > 0 ) {
71+ this . SharePwd = url . split ( '?' ) [ 1 ] . match ( / [ A - Z a - z 0 - 9 ] + / ) [ 0 ] ;
72+ console . log ( this . SharePwd )
73+ }
74+ if ( matches ) {
75+ if ( matches [ 1 ] . indexOf ( '?' ) > 0 ) {
76+ return matches [ 1 ] . split ( '?' ) [ 0 ]
77+ } else {
78+ return matches [ 1 ]
79+ }
80+
81+ }
82+ return null ;
83+ }
84+
85+ async getFilesByShareUrl ( shareKey ) {
86+ return await this . getShareInfo ( shareKey , this . SharePwd , 0 , 0 )
87+ }
88+
89+ async getShareInfo ( shareKey , SharePwd , next , ParentFileId ) {
90+ let filelist = [ ]
91+ let list = await axios . get ( this . api + "get" , {
92+ headers : { } ,
93+ params : {
94+ "limit" : "100" ,
95+ "next" : "0" ,
96+ "orderBy" : "file_name" ,
97+ "orderDirection" : "asc" ,
98+ "shareKey" : shareKey ,
99+ "SharePwd" : SharePwd ,
100+ "ParentFileId" : "0" ,
101+ "Page" : "1"
102+ }
103+ } ) ;
104+ if ( list . status === 200 ) {
105+ if ( list . data . code === 5103 ) {
106+ console . log ( list . data . message ) ;
107+ } else {
108+ let info = list . data . data ;
109+ let next = info . Next ;
110+ let infoList = info . InfoList
111+ for ( let i = 0 ; i < infoList . length ; i ++ ) {
112+ let data = infoList [ i ] ;
113+ if ( data . Category === 2 ) {
114+ filelist . push ( {
115+ ShareKey : shareKey ,
116+ FileId : data . FileId ,
117+ S3KeyFlag : data . S3KeyFlag ,
118+ Size : data . Size ,
119+ Etag : data . Etag ,
120+ FileName : data . FileName ,
121+ } )
122+ }
123+ let FileId = data . FileId
124+ let file = await this . getShareList ( shareKey , SharePwd , next , FileId ) ;
125+ filelist . push ( ...file )
126+ }
127+
128+ return filelist ;
129+ }
130+ }
131+ }
132+
133+ async getShareList ( shareKey , SharePwd , next , ParentFileId ) {
134+ let video = [ ]
135+ let infoList = ( await axios . get ( this . api + "get" , {
136+ headers : { } ,
137+ params : {
138+ "limit" : "100" ,
139+ "next" : next ,
140+ "orderBy" : "file_name" ,
141+ "orderDirection" : "asc" ,
142+ "shareKey" : shareKey ,
143+ "SharePwd" : SharePwd ,
144+ "ParentFileId" : ParentFileId ,
145+ "Page" : "1"
146+ }
147+ } ) ) . data . data . InfoList ;
148+ for ( let i = 0 ; i < infoList . length ; i ++ ) {
149+ let data = infoList [ i ] ;
150+ if ( data . Category === 2 ) {
151+ video . push ( {
152+ ShareKey : shareKey ,
153+ FileId : data . FileId ,
154+ S3KeyFlag : data . S3KeyFlag ,
155+ Size : data . Size ,
156+ Etag : data . Etag ,
157+ FileName : data . FileName ,
158+ } )
159+ } else {
160+ let FileId = data . FileId
161+ return await this . getShareList ( shareKey , SharePwd , next , FileId )
162+ }
163+ }
164+ return video ;
165+ }
166+
167+ async getDownload ( shareKey , FileId , S3KeyFlag , Size , Etag ) {
168+ await this . init ( ) ;
169+ let data = JSON . stringify ( {
170+ "ShareKey" : shareKey ,
171+ "FileID" : FileId ,
172+ "S3KeyFlag" : S3KeyFlag ,
173+ "Size" : Size ,
174+ "Etag" : Etag
175+ } ) ;
176+ let config = {
177+ method : 'POST' ,
178+ url : `${ this . api } download/info` ,
179+ headers : {
180+ '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' ,
181+ 'Authorization' : `Bearer ${ this . auth } ` ,
182+ 'Content-Type' : 'application/json;charset=UTF-8' ,
183+ 'platform' : 'android' ,
184+ } ,
185+ data : data
186+ } ;
187+ let down = ( await axios . request ( config ) ) . data . data
188+ return down . DownloadURL ;
189+ }
190+
191+ async getLiveTranscoding ( shareKey , FileId , S3KeyFlag , Size , Etag ) {
192+ await this . init ( ) ;
193+ let config = {
194+ method : 'GET' ,
195+ url : `https://www.123684.com/b/api/video/play/info` ,
196+ headers : {
197+ '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' ,
198+ 'Authorization' : `Bearer ${ this . auth } ` ,
199+ 'Content-Type' : 'application/json;charset=UTF-8' ,
200+ 'platform' : 'android' ,
201+ } ,
202+ params :{
203+ "etag" : Etag ,
204+ "size" : Size ,
205+ "from" : "1" ,
206+ "shareKey" : shareKey
207+ }
208+ } ;
209+ let down = ( await axios . request ( config ) ) . data . data . video_play_info
210+ let videoinfo = [ ]
211+ down . forEach ( item => {
212+ if ( item . url !== '' ) {
213+ videoinfo . push ( {
214+ name :item . resolution ,
215+ url :item . url
216+ } )
217+ }
218+ } )
219+ return videoinfo ;
220+ }
221+ }
222+
223+ export const Pan = new Pan123 ( ) ;
0 commit comments