11from .jm_client_interface import *
22
33
4+ # noinspection PyAbstractClass
45class AbstractJmClient (
56 JmcomicClient ,
67 PostmanProxy ,
@@ -39,21 +40,32 @@ def request_with_retry(self,
3940 retry_count = 0 ,
4041 ** kwargs ,
4142 ):
43+ """
44+ 统一请求,支持重试
45+ @param request: 请求方法
46+ @param url: 图片url / path (/album/xxx)
47+ @param domain_index: 域名下标
48+ @param retry_count: 重试次数
49+ @param kwargs: 请求方法的kwargs
50+ """
4251 if domain_index >= len (self .domain_list ):
43- raise AssertionError ("All domains failed." )
44-
45- domain = self .domain_list [domain_index ]
52+ raise AssertionError (f"请求重试全部失败: [{ url } ], { self .domain_list } " )
4653
47- if not url .startswith (JmModuleConfig .PROT ):
54+ if url .startswith ('/' ):
55+ # path
56+ domain = self .domain_list [domain_index ]
4857 url = self .of_api_url (url , domain )
4958 jm_debug ('api' , url )
59+ else :
60+ # 图片url
61+ pass
5062
51- if domain_index != 0 and retry_count != 0 :
63+ if domain_index != 0 or retry_count != 0 :
5264 jm_debug (
53- f'请求重试 ' ,
65+ f'request_retry ' ,
5466 ', ' .join ([
5567 f'次数: [{ retry_count } /{ self .retry_times } ]' ,
56- f'域名: [{ domain } ( { domain_index } / { len ( self .domain_list ) } ) ]' ,
68+ f'域名: [{ domain_index } of { self .domain_list } ]' ,
5769 f'路径: [{ url } ]' ,
5870 f'参数: [{ kwargs if "login" not in url else "#login_form#" } ]'
5971 ])
@@ -64,10 +76,11 @@ def request_with_retry(self,
6476 except Exception as e :
6577 self .before_retry (e , kwargs , retry_count , url )
6678
67- if retry_count < self .retry_times :
68- return self .request_with_retry (request , url , domain_index , retry_count + 1 , ** kwargs )
69- else :
70- return self .request_with_retry (request , url , domain_index + 1 , 0 , ** kwargs )
79+ if retry_count < self .retry_times :
80+ return self .request_with_retry (request , url , domain_index , retry_count + 1 , ** kwargs )
81+ else :
82+ return self .request_with_retry (request , url , domain_index + 1 , 0 , ** kwargs )
83+
7184
7285 # noinspection PyMethodMayBeStatic, PyUnusedLocal
7386 def before_retry (self , e , kwargs , retry_count , url ):
@@ -237,7 +250,60 @@ def raise_request_error(cls, resp, msg: Optional[str] = None):
237250 raise AssertionError (msg )
238251
239252 def get_jm_image (self , img_url ) -> JmImageResp :
240- return JmImageResp (self .get (img_url ))
253+
254+ def get_if_fail_raise (url ):
255+ """
256+ 使用此方法包装 self.get
257+ """
258+ resp = JmImageResp (self .get (url ))
259+
260+ if resp .is_success :
261+ return resp
262+
263+ self .raise_request_error (
264+ resp .resp , resp .get_error_msg ()
265+ )
266+
267+ return resp
268+
269+ return self .request_with_retry (get_if_fail_raise , img_url )
270+
271+ def album_comment (self ,
272+ video_id ,
273+ comment ,
274+ originator = '' ,
275+ status = 'true' ,
276+ comment_id = None ,
277+ ** kwargs ,
278+ ) -> JmAcResp :
279+ data = {
280+ 'video_id' : video_id ,
281+ 'comment' : comment ,
282+ 'originator' : originator ,
283+ 'status' : status ,
284+ }
285+
286+ # 处理回复评论
287+ if comment_id is not None :
288+ data .pop ('status' )
289+ data ['comment_id' ] = comment_id
290+ data ['is_reply' ] = 1
291+ data ['forum_subject' ] = 1
292+
293+ jm_debug ('album_comment' ,
294+ f'{ video_id } : [{ comment } ]' +
295+ (f' to ({ comment_id } )' if comment_id is not None else '' )
296+ )
297+
298+ resp = self .post ('https://18comic.vip/ajax/album_comment' ,
299+ headers = JmModuleConfig .album_comment_headers ,
300+ data = data ,
301+ )
302+
303+ ret = JmAcResp (resp )
304+ jm_debug ('album_comment' , f'{ video_id } : [{ comment } ] ← ({ ret .model ().cid } )' )
305+
306+ return ret
241307
242308 @classmethod
243309 def require_resp_success_else_raise (cls , resp , req_url ):
0 commit comments