1
1
from fastapi import APIRouter , Cookie , Response
2
+ from bs4 import BeautifulSoup
3
+ import re
2
4
3
5
from core .JMRequests import JMRequests , JMToolUtils
4
6
from models .mirrors import ApiList
5
7
from models .user import Login_Form
6
- from models .requests import StandardResponse
8
+ from models .requests import SearchInfo , StandardResponse
7
9
from models .sort import JMSortRule
8
10
from models .album import JMComicInfo , TinyComicInfo , Origin
9
11
10
12
11
- router = APIRouter (
12
- prefix = "/jm"
13
- )
13
+ router = APIRouter (prefix = "/jm" )
14
14
15
15
16
16
@router .post ("/login" , response_model = StandardResponse )
17
- async def jm_login (body : Login_Form , response : Response , api_mirror : str = Cookie (default = ApiList [0 ])):
17
+ async def jm_login (
18
+ body : Login_Form , response : Response , api_mirror : str = Cookie (default = ApiList [0 ])
19
+ ):
18
20
# 登录
19
21
login_form = {
20
22
"username" : body .username ,
21
23
"password" : body .password ,
22
24
"key" : "0b931a6f4b5ccc3f8d870839d07ae7b2" ,
23
25
"login_remember" : "on" ,
24
26
"view_mode_debug" : 1 ,
25
- "view_mode" : None
27
+ "view_mode" : None ,
26
28
}
27
29
28
30
req = JMRequests (api_mirror )
@@ -35,19 +37,21 @@ async def jm_login(body: Login_Form, response: Response, api_mirror: str = Cooki
35
37
36
38
37
39
@router .get ("/album" , response_model = StandardResponse )
38
- async def jm_getAlbum (album_id : str , AVS : str = Cookie (default = "" ), remember : str = Cookie (default = "" ), api_mirror : str = Cookie (default = ApiList [0 ])):
40
+ async def jm_getAlbum (
41
+ album_id : str ,
42
+ AVS : str = Cookie (default = "" ),
43
+ remember : str = Cookie (default = "" ),
44
+ api_mirror : str = Cookie (default = ApiList [0 ]),
45
+ ):
39
46
# 漫画信息
40
- req = JMRequests (api_mirror , {
41
- "AVS" : AVS ,
42
- "remember" : remember
43
- })
47
+ req = JMRequests (api_mirror , {"AVS" : AVS , "remember" : remember })
44
48
45
49
req_body = {
46
50
"key" : "0b931a6f4b5ccc3f8d870839d07ae7b2" ,
47
51
"view_mode_debug" : 1 ,
48
52
"view_mode" : "null" ,
49
53
"comicName" : "" ,
50
- "id" : album_id
54
+ "id" : album_id ,
51
55
}
52
56
53
57
res = await req .get ("/album" , params = req_body )
@@ -57,103 +61,141 @@ async def jm_getAlbum(album_id: str, AVS: str = Cookie(default=""), remember: st
57
61
assert res .data is not None
58
62
59
63
album_info = JMComicInfo (
60
- album_id = res .data ["id" ], name = res .data ["name" ], author = res .data ["author" ],
61
- cover = f"/media/albums/{ res .data ['id' ]} _3x4.jpg" , description = res .data ["description" ],
62
- total_views = res .data ["total_views" ], total_likes = res .data ["likes" ],
63
- total_comments = res .data ["comment_total" ], series = res .data ["series" ],
64
- tags = res .data ["tags" ], is_favor = res .data ["is_favorite" ], is_liked = res .data ["liked" ],
64
+ album_id = res .data ["id" ],
65
+ name = res .data ["name" ],
66
+ author = res .data ["author" ],
67
+ cover = f"/media/albums/{ res .data ['id' ]} _3x4.jpg" ,
68
+ description = res .data ["description" ],
69
+ total_views = res .data ["total_views" ],
70
+ total_likes = res .data ["likes" ],
71
+ total_comments = res .data ["comment_total" ],
72
+ series = res .data ["series" ],
73
+ tags = res .data ["tags" ],
74
+ is_favor = res .data ["is_favorite" ],
75
+ is_liked = res .data ["liked" ],
65
76
related_list = [
66
- TinyComicInfo (item ["id" ], name = item ["name" ], author = JMToolUtils .AuthorStr2List (
67
- item ["author" ]), cover = f"/media/albums/{ item ['id' ]} _3x4.jpg" , origin = Origin .JMComic ).__dict__ () for item in res .data ["related_list" ]],
68
- series_id = res .data ["series_id" ], works = res .data ["works" ], actors = res .data ["actors" ]
77
+ TinyComicInfo (
78
+ item ["id" ],
79
+ name = item ["name" ],
80
+ author = JMToolUtils .AuthorStr2List (item ["author" ]),
81
+ cover = f"/media/albums/{ item ['id' ]} _3x4.jpg" ,
82
+ origin = Origin .JMComic ,
83
+ ).__dict__ ()
84
+ for item in res .data ["related_list" ]
85
+ ],
86
+ series_id = res .data ["series_id" ],
87
+ works = res .data ["works" ],
88
+ actors = res .data ["actors" ],
69
89
).__dict__ ()
70
90
return StandardResponse (status_code = 200 , data = album_info )
71
91
except AssertionError :
72
92
return StandardResponse (status_code = res .status_code , error_msg = res .error_msg )
73
93
74
94
75
- @router .get ("/chapters" , response_model = StandardResponse )
76
- async def jm_getChapters (album_id : str , AVS : str = Cookie (default = "" ), remember : str = Cookie (default = "" ), api_mirror : str = Cookie (default = ApiList [0 ])):
95
+ @router .get ("/album/chapter" , response_model = StandardResponse )
96
+ async def jm_getChapters (
97
+ album_id : str ,
98
+ AVS : str = Cookie (default = "" ),
99
+ remember : str = Cookie (default = "" ),
100
+ api_mirror : str = Cookie (default = ApiList [0 ]),
101
+ ):
77
102
# 章节信息
78
- req = JMRequests (api_mirror , {
79
- "AVS" : AVS ,
80
- "remember" : remember
81
- })
103
+ req = JMRequests (api_mirror , {"AVS" : AVS , "remember" : remember })
82
104
83
105
req_body = {
84
106
"key" : "0b931a6f4b5ccc3f8d870839d07ae7b2" ,
85
107
"view_mode_debug" : 1 ,
86
108
"view_mode" : "null" ,
87
109
"comicName" : "" ,
88
110
"skip" : "" ,
89
- "id" : album_id
111
+ "id" : album_id ,
90
112
}
91
113
92
- res = await req .get ("/chapter " , params = req_body )
114
+ res = await req .get ("/chapters " , params = req_body )
93
115
await req .close ()
94
116
95
117
try :
96
118
assert res .data is not None
97
- return StandardResponse (status_code = 200 , data = res .data )
119
+ if res .data ["series" ] == []:
120
+ return StandardResponse (status_code = 200 , data = [album_id ])
121
+ else :
122
+ return StandardResponse (
123
+ status_code = 200 ,
124
+ data = [item ["id" ] for item in res .data ["series" ]],
125
+ )
98
126
except AssertionError :
99
127
return StandardResponse (status_code = res .status_code , error_msg = res .error_msg )
100
128
101
129
102
- @router .get ("/img_list" , response_model = StandardResponse )
103
- async def jm_getImagesList (chapter_id : str , AVS : str = Cookie (default = "" ), remember : str = Cookie (default = "" ), api_mirror : str = Cookie (default = ApiList [0 ])):
130
+ @router .get ("/comic" , response_model = StandardResponse )
131
+ async def jm_getComic (
132
+ chapter_id : str ,
133
+ AVS : str = Cookie (default = "" ),
134
+ remember : str = Cookie (default = "" ),
135
+ api_mirror : str = Cookie (default = ApiList [0 ]),
136
+ ):
104
137
# 图片列表
105
- req = JMRequests (api_mirror ,{
106
- "AVS" : AVS ,
107
- "remember" : remember
108
- })
109
-
110
- req_body = {
111
- "id" :chapter_id ,
112
- "mode" : "vertical" ,
113
- "page" : 0 ,
114
- "app_img_shunt" : "NaN"
115
- }
116
- # Alert! GetContent is desgined for the unencrypted data, but Chapter's data is encrypted, so you need to use Get instead.
117
- res = await req .getContent ("/chapter_view_template" ,params = req_body )
138
+ req = JMRequests (api_mirror , {"AVS" : AVS , "remember" : remember })
139
+
140
+ req_body = {"id" : chapter_id , "mode" : "vertical" , "page" : 0 , "app_img_shunt" : "NaN" }
141
+
142
+ res = await req .getContent ("/chapter_view_template" , params = req_body )
118
143
await req .close ()
119
144
120
145
try :
121
146
assert res .data is not None
122
- return StandardResponse (status_code = 200 , data = res .data )
147
+ document = BeautifulSoup (res .data , "lxml" )
148
+ img_list = []
149
+ for container in document .find_all ("div" , class_ = "center scramble-page" ):
150
+ img_list .append (container .attrs ["id" ])
151
+
152
+ mo = re .search (r"(?<=var scramble_id = )\w+" , res .data .decode ("utf-8" ))
153
+ if mo is None :
154
+ scramble_id = 220980
155
+ else :
156
+ scramble_id = int (mo .group ())
157
+ return StandardResponse (
158
+ status_code = 200 , data = {"scramble_id" : scramble_id , "img_list" : img_list }
159
+ )
123
160
except AssertionError :
124
161
return StandardResponse (status_code = res .status_code , error_msg = res .error_msg )
125
-
126
162
127
163
128
164
@router .get ("/logout" , response_model = StandardResponse )
129
165
async def jm_logout (response : Response ):
130
166
# 登出
131
- cookies = {
132
- "AVS" : "" ,
133
- "remember" : ""
134
- }
167
+ cookies = {"AVS" : "" , "remember" : "" }
135
168
for cookie in cookies :
136
169
response .set_cookie (cookie , "" )
137
170
138
171
return StandardResponse (status_code = 200 , data = "Success" )
139
172
140
173
141
174
@router .get ("/favor" , response_model = StandardResponse )
142
- async def jm_getFavor (page : int = 1 , sort : JMSortRule = JMSortRule .Time , fid : str = "0" , AVS : str = Cookie (default = "" ), remember : str = Cookie (default = "" ),
143
- api_mirror : str = Cookie (default = ApiList [0 ])):
175
+ async def jm_getFavor (
176
+ page : int = 1 ,
177
+ sort : JMSortRule = JMSortRule .Time ,
178
+ fid : str = "0" ,
179
+ AVS : str = Cookie (default = "" ),
180
+ remember : str = Cookie (default = "" ),
181
+ api_mirror : str = Cookie (default = ApiList [0 ]),
182
+ ):
144
183
# 获取收藏夹
145
- req = JMRequests (api_mirror , {
146
- "AVS" : AVS ,
147
- "remember" : remember ,
148
- })
184
+ req = JMRequests (
185
+ api_mirror ,
186
+ {
187
+ "AVS" : AVS ,
188
+ "remember" : remember ,
189
+ },
190
+ )
149
191
150
192
req_body = {
151
193
"key" : "0b931a6f4b5ccc3f8d870839d07ae7b2" ,
152
194
"view_mode_debug" : 1 ,
153
195
"view_mode" : "null" ,
154
196
"page" : page ,
155
197
"folder_id" : fid ,
156
- "o" : sort
198
+ "o" : sort ,
157
199
}
158
200
159
201
res = await req .get ("/favorite" , params = req_body )
@@ -163,29 +205,38 @@ async def jm_getFavor(page: int = 1, sort: JMSortRule = JMSortRule.Time, fid: st
163
205
assert res .data is not None
164
206
fav_list = list ()
165
207
for item in res .data ["list" ]:
166
- fav_list .append (TinyComicInfo (album_id = item ["id" ], name = item ["name" ], origin = Origin .JMComic ,
167
- categories = TinyComicInfo .JM_categories_formatter (
168
- [item ["category" ], item ["category_sub" ]]),
169
- cover = f"/media/albums/{ item ['id' ]} _3x4.jpg" ,
170
- author = JMToolUtils .AuthorStr2List (item ["author" ])).__dict__ ())
208
+ fav_list .append (
209
+ TinyComicInfo (
210
+ album_id = item ["id" ],
211
+ name = item ["name" ],
212
+ origin = Origin .JMComic ,
213
+ categories = TinyComicInfo .JM_categories_formatter (
214
+ [item ["category" ], item ["category_sub" ]]
215
+ ),
216
+ cover = f"/media/albums/{ item ['id' ]} _3x4.jpg" ,
217
+ author = JMToolUtils .AuthorStr2List (item ["author" ]),
218
+ ).__dict__ ()
219
+ )
171
220
return StandardResponse (status_code = res .status_code , data = fav_list )
172
221
except :
173
222
return StandardResponse (status_code = res .status_code , error_msg = res .error_msg )
174
223
175
224
176
225
@router .post ("/favor/{album_id}" , response_model = StandardResponse )
177
- async def jm_addFavor (album_id : str , AVS : str = Cookie (default = "" ), remember : str = Cookie (default = "" ), api_mirror : str = Cookie (default = ApiList [0 ])):
226
+ async def jm_addFavor (
227
+ album_id : str ,
228
+ AVS : str = Cookie (default = "" ),
229
+ remember : str = Cookie (default = "" ),
230
+ api_mirror : str = Cookie (default = ApiList [0 ]),
231
+ ):
178
232
# 添加收藏
179
- req = JMRequests (api_mirror , {
180
- "AVS" : AVS ,
181
- "remember" : remember
182
- })
233
+ req = JMRequests (api_mirror , {"AVS" : AVS , "remember" : remember })
183
234
184
235
req_body = {
185
236
"key" : "0b931a6f4b5ccc3f8d870839d07ae7b2" ,
186
237
"view_mode_debug" : 1 ,
187
238
"view_mode" : "null" ,
188
- "aid" : album_id
239
+ "aid" : album_id ,
189
240
}
190
241
191
242
res = await req .post ("/favorite" , data = req_body )
0 commit comments