jmcomic 2.5.16__py3-none-any.whl → 2.5.18__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
jmcomic/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
  # 被依赖方 <--- 使用方
3
3
  # config <--- entity <--- toolkit <--- client <--- option <--- downloader
4
4
 
5
- __version__ = '2.5.16'
5
+ __version__ = '2.5.18'
6
6
 
7
7
  from .api import *
8
8
  from .jm_plugin import *
jmcomic/jm_client_impl.py CHANGED
@@ -92,7 +92,7 @@ class AbstractJmClient(
92
92
  jm_log(self.log_topic(), self.decode(url))
93
93
  else:
94
94
  # 图片url
95
- pass
95
+ self.update_request_with_specify_domain(kwargs, None, True)
96
96
 
97
97
  if domain_index != 0 or retry_count != 0:
98
98
  jm_log(f'req.retry',
@@ -133,7 +133,7 @@ class AbstractJmClient(
133
133
  """
134
134
  return resp
135
135
 
136
- def update_request_with_specify_domain(self, kwargs: dict, domain: str):
136
+ def update_request_with_specify_domain(self, kwargs: dict, domain: Optional[str], is_image: bool = False):
137
137
  """
138
138
  域名自动切换时,用于更新请求参数的回调
139
139
  """
@@ -463,7 +463,10 @@ class JmHtmlClient(AbstractJmClient):
463
463
 
464
464
  return resp
465
465
 
466
- def update_request_with_specify_domain(self, kwargs: dict, domain: Optional[str]):
466
+ def update_request_with_specify_domain(self, kwargs: dict, domain: Optional[str], is_image=False):
467
+ if is_image:
468
+ return
469
+
467
470
  latest_headers = kwargs.get('headers', None)
468
471
  base_headers = self.get_meta_data('headers', None) or JmModuleConfig.new_html_headers(domain)
469
472
  base_headers.update(latest_headers or {})
@@ -909,8 +912,10 @@ class JmApiClient(AbstractJmClient):
909
912
 
910
913
  return resp
911
914
 
912
- def update_request_with_specify_domain(self, kwargs: dict, domain: str):
913
- pass
915
+ def update_request_with_specify_domain(self, kwargs: dict, domain: Optional[str], is_image=False):
916
+ if is_image:
917
+ # 设置APP端的图片请求headers
918
+ kwargs['headers'] = {**JmModuleConfig.APP_HEADERS_TEMPLATE, **JmModuleConfig.APP_HEADERS_IMAGE}
914
919
 
915
920
  # noinspection PyMethodMayBeStatic
916
921
  def decide_headers_and_ts(self, kwargs, url):
@@ -930,7 +935,7 @@ class JmApiClient(AbstractJmClient):
930
935
  token, tokenparam = JmCryptoTool.token_and_tokenparam(ts)
931
936
 
932
937
  # 设置headers
933
- headers = kwargs.get('headers', None) or JmMagicConstants.APP_HEADERS_TEMPLATE.copy()
938
+ headers = kwargs.get('headers', None) or JmModuleConfig.APP_HEADERS_TEMPLATE.copy()
934
939
  headers.update({
935
940
  'token': token,
936
941
  'tokenparam': tokenparam,
jmcomic/jm_config.py CHANGED
@@ -59,50 +59,16 @@ class JmMagicConstants:
59
59
  SUB_SINGLE_JAPANESE = SUB_JAPANESE
60
60
  SUB_SINGLE_YOUTH = 'youth'
61
61
 
62
- # 分页大小
63
- PAGE_SIZE_SEARCH = 80
64
- PAGE_SIZE_FAVORITE = 20
65
-
66
62
  # 图片分割参数
67
63
  SCRAMBLE_220980 = 220980
68
64
  SCRAMBLE_268850 = 268850
69
65
  SCRAMBLE_421926 = 421926 # 2023-02-08后改了图片切割算法
70
66
 
71
- # 当本子没有作者名字时,顶替作者名字
72
- DEFAULT_AUTHOR = 'default_author'
73
-
74
67
  # 移动端API密钥
75
68
  APP_TOKEN_SECRET = '18comicAPP'
76
69
  APP_TOKEN_SECRET_2 = '18comicAPPContent'
77
70
  APP_DATA_SECRET = '185Hcomic3PAPP7R'
78
- APP_VERSION = '1.7.0'
79
- APP_HEADERS_TEMPLATE = {
80
- 'Accept-Encoding': 'gzip',
81
- 'user-agent': 'Mozilla/5.0 (Linux; Android 9; V1938CT Build/PQ3A.190705.11211812; wv) AppleWebKit/537.36 (KHTML, '
82
- 'like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36',
83
- }
84
-
85
- # 网页端headers
86
- HTML_HEADERS_TEMPLATE = {
87
- 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
88
- 'application/signed-exchange;v=b3;q=0.7',
89
- 'accept-language': 'zh-CN,zh;q=0.9',
90
- 'cache-control': 'no-cache',
91
- 'dnt': '1',
92
- 'pragma': 'no-cache',
93
- 'priority': 'u=0, i',
94
- 'referer': 'https://18comic.vip/',
95
- 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
96
- 'sec-ch-ua-mobile': '?0',
97
- 'sec-ch-ua-platform': '"Windows"',
98
- 'sec-fetch-dest': 'document',
99
- 'sec-fetch-mode': 'navigate',
100
- 'sec-fetch-site': 'none',
101
- 'sec-fetch-user': '?1',
102
- 'upgrade-insecure-requests': '1',
103
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 '
104
- 'Safari/537.36',
105
- }
71
+ APP_VERSION = '1.7.1'
106
72
 
107
73
 
108
74
  # 模块级别共用配置
@@ -123,33 +89,75 @@ class JmModuleConfig:
123
89
  # JM的异常网页code
124
90
  JM_ERROR_STATUS_CODE = {
125
91
  403: 'ip地区禁止访问/爬虫被识别',
126
- 500: '500: 禁漫服务器内部异常(可能是服务器过载,可以换个ip或稍后重试)',
92
+ 500: '500: 禁漫服务器内部异常(可能是服务器过载,可以切换ip或稍后重试)',
127
93
  520: '520: Web server is returning an unknown error (禁漫服务器内部报错)',
128
94
  524: '524: The origin web server timed out responding to this request. (禁漫服务器处理超时)',
129
95
  }
130
96
 
97
+ # 分页大小
98
+ PAGE_SIZE_SEARCH = 80
99
+ PAGE_SIZE_FAVORITE = 20
100
+
131
101
  # 图片分隔相关
132
102
  SCRAMBLE_CACHE = {}
133
103
 
104
+ # 当本子没有作者名字时,顶替作者名字
105
+ DEFAULT_AUTHOR = 'default_author'
106
+
107
+ APP_HEADERS_TEMPLATE = {
108
+ 'Accept-Encoding': 'gzip, deflate',
109
+ 'user-agent': 'Mozilla/5.0 (Linux; Android 9; V1938CT Build/PQ3A.190705.11211812; wv) AppleWebKit/537.36 (KHTML, '
110
+ 'like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36',
111
+ }
112
+
113
+ APP_HEADERS_IMAGE = {
114
+ 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
115
+ 'X-Requested-With': 'com.jiaohua_browser',
116
+ 'Referer': 'https://www.jmfreedomproxy.xyz/',
117
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
118
+ }
119
+
120
+ # 网页端headers
121
+ HTML_HEADERS_TEMPLATE = {
122
+ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
123
+ 'application/signed-exchange;v=b3;q=0.7',
124
+ 'accept-language': 'zh-CN,zh;q=0.9',
125
+ 'cache-control': 'no-cache',
126
+ 'dnt': '1',
127
+ 'pragma': 'no-cache',
128
+ 'priority': 'u=0, i',
129
+ 'referer': 'https://18comic.vip/',
130
+ 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
131
+ 'sec-ch-ua-mobile': '?0',
132
+ 'sec-ch-ua-platform': '"Windows"',
133
+ 'sec-fetch-dest': 'document',
134
+ 'sec-fetch-mode': 'navigate',
135
+ 'sec-fetch-site': 'none',
136
+ 'sec-fetch-user': '?1',
137
+ 'upgrade-insecure-requests': '1',
138
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 '
139
+ 'Safari/537.36',
140
+ }
134
141
  # cookies,目前只在移动端使用,因为移动端请求接口须携带,但不会校验cookies的内容。
135
142
  APP_COOKIES = None
136
143
 
137
144
  # 移动端图片域名
138
145
  DOMAIN_IMAGE_LIST = str_to_list('''
146
+ cdn-msp.jmapiproxy1.cc
147
+ cdn-msp.jmapiproxy2.cc
148
+ cdn-msp2.jmapiproxy2.cc
149
+ cdn-msp3.jmapiproxy2.cc
139
150
  cdn-msp.jmapinodeudzn.net
140
- cdn-msp2.jmapinodeudzn.net
141
- cdn-msp2.jmapiproxy3.cc
142
151
  cdn-msp3.jmapinodeudzn.net
143
152
 
144
153
  ''')
145
154
 
146
155
  # 移动端API域名
147
156
  DOMAIN_API_LIST = str_to_list('''
148
- www.jmapinodeudzn.xyz
149
- www.cdn-eldenringproxy.xyz
150
- www.cdn-eldenringproxy.me
151
- www.cdn-eldenringproxy.vip
152
- www.jmapinode.xyz
157
+ www.jmapidestiny.xyz
158
+ www.jmeadpoolcdn.one
159
+ www.jmeadpoolcdn.life
160
+
153
161
  ''')
154
162
 
155
163
  # 网页端域名配置
@@ -336,7 +344,7 @@ class JmModuleConfig:
336
344
  """
337
345
  网页端的headers
338
346
  """
339
- headers = JmMagicConstants.HTML_HEADERS_TEMPLATE.copy()
347
+ headers = cls.HTML_HEADERS_TEMPLATE.copy()
340
348
  headers.update({
341
349
  'authority': domain,
342
350
  'origin': f'https://{domain}',
jmcomic/jm_entity.py CHANGED
@@ -305,7 +305,8 @@ class JmPhotoDetail(DetailEntity, Downloadable):
305
305
  # 2. 值目前在网页端只在photo页面的图片标签的data-original属性出现
306
306
  # 这里的模拟思路是,获取到第一个图片标签的data-original,
307
307
  # 取出其query参数 → self.data_original_query_params, 该值未来会传递给 JmImageDetail
308
- self.data_original_query_params = self.get_data_original_query_params(data_original_0)
308
+ # self.data_original_query_params = self.get_data_original_query_params(data_original_0)
309
+ self.data_original_query_params = None
309
310
 
310
311
  @property
311
312
  def is_single_album(self) -> bool:
@@ -355,7 +356,7 @@ class JmPhotoDetail(DetailEntity, Downloadable):
355
356
  return self._author.strip()
356
357
 
357
358
  # 使用默认
358
- return JmMagicConstants.DEFAULT_AUTHOR
359
+ return JmModuleConfig.DEFAULT_AUTHOR
359
360
 
360
361
  def create_image_detail(self, index) -> JmImageDetail:
361
362
  # 校验参数
@@ -475,7 +476,7 @@ class JmAlbumDetail(DetailEntity, Downloadable):
475
476
  if len(self.authors) >= 1:
476
477
  return self.authors[0]
477
478
 
478
- return JmMagicConstants.DEFAULT_AUTHOR
479
+ return JmModuleConfig.DEFAULT_AUTHOR
479
480
 
480
481
  @property
481
482
  def id(self):
@@ -612,7 +613,7 @@ class JmSearchPage(JmPageContent):
612
613
 
613
614
  @property
614
615
  def page_size(self) -> int:
615
- return JmMagicConstants.PAGE_SIZE_SEARCH
616
+ return JmModuleConfig.PAGE_SIZE_SEARCH
616
617
 
617
618
  # 下面的方法是对单个album的包装
618
619
 
@@ -653,7 +654,7 @@ class JmFavoritePage(JmPageContent):
653
654
 
654
655
  @property
655
656
  def page_size(self) -> int:
656
- return JmMagicConstants.PAGE_SIZE_FAVORITE
657
+ return JmModuleConfig.PAGE_SIZE_FAVORITE
657
658
 
658
659
  def iter_folder_id_name(self) -> Generator[Tuple[str, str], None, None]:
659
660
  """
jmcomic/jm_plugin.py CHANGED
@@ -601,7 +601,7 @@ class FavoriteFolderExportPlugin(JmOptionPlugin):
601
601
  for page in page_data:
602
602
  for aid, extra in page.content:
603
603
  data.append(
604
- (aid, extra.get('author', '') or JmMagicConstants.DEFAULT_AUTHOR, extra['name'])
604
+ (aid, extra.get('author', '') or JmModuleConfig.DEFAULT_AUTHOR, extra['name'])
605
605
  )
606
606
 
607
607
  if len(data) == 0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jmcomic
3
- Version: 2.5.16
3
+ Version: 2.5.18
4
4
  Summary: Python API For JMComic (禁漫天堂)
5
5
  Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
6
6
  Author: hect0x7
@@ -0,0 +1,18 @@
1
+ jmcomic/__init__.py,sha256=mkj1JvIZueqk3MCGI4yyfXtA3Zxz0rWzBS7Vgxk8oY4,903
2
+ jmcomic/api.py,sha256=40mzFEVhR0h_Ta-ub8vMfJ9yx89yvL09XMv9zK0QUvA,3865
3
+ jmcomic/cl.py,sha256=PBSh0JndNFZw3B7WJPj5Y8SeFdKzHE00jIwYo9An-K0,3475
4
+ jmcomic/jm_client_impl.py,sha256=dJvlhBs0aPxGgH4wsXEFPamHTsxgrmGUytbnv8TQLYk,39523
5
+ jmcomic/jm_client_interface.py,sha256=5JFSZEvAffDPh7oo8GQNVbm_Hdlmy_KYvTwrkY-OSA4,19074
6
+ jmcomic/jm_config.py,sha256=6vjefeNuHH6CXCMYRUcAAH7_b7nnn_djf5blW8sjX-o,16643
7
+ jmcomic/jm_downloader.py,sha256=0r4z7FRnow6xkRy_WTv7nLQOhYdtZmoouw0BNrhngco,10397
8
+ jmcomic/jm_entity.py,sha256=yjGz55r2UwCIhQLUEBHhx3-MAipBYLHqn4ofnqvg1GI,19090
9
+ jmcomic/jm_exception.py,sha256=B9APE1jw23JBzCT12eV_imCZny3mNrSXju1p2IquaHA,4801
10
+ jmcomic/jm_option.py,sha256=wmoOIwffM8b8fKUufRslXK5-bynD1nPXqc1sotXLIzQ,21918
11
+ jmcomic/jm_plugin.py,sha256=HlsT94kKooTNEiWqGHukD0y86GToPpPWELhzU3rQ0lk,36359
12
+ jmcomic/jm_toolkit.py,sha256=jU83ujluX_NxqwI7wwgoirJ_ZE2UmPBGvZCyVYnCJvQ,29164
13
+ jmcomic-2.5.18.dist-info/LICENSE,sha256=kz4coTxZxuGxisK3W00tjK57Zh3RcMGq-EnbXrK7-xA,1064
14
+ jmcomic-2.5.18.dist-info/METADATA,sha256=vtCI_pzZnymEt1iMeBm-0_429ZaVOLThaseWUA54IHc,7064
15
+ jmcomic-2.5.18.dist-info/WHEEL,sha256=nCVcAvsfA9TDtwGwhYaRrlPhTLV9m-Ga6mdyDtuwK18,91
16
+ jmcomic-2.5.18.dist-info/entry_points.txt,sha256=tRbQltaGSBjejI0c9jYt-4SXQMd5nSDHcMvHmuTy4ow,44
17
+ jmcomic-2.5.18.dist-info/top_level.txt,sha256=puvVMFYJqIbd6NOTMEvOyugMTT8woBfSQyxEBan3zY4,8
18
+ jmcomic-2.5.18.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (73.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,18 +0,0 @@
1
- jmcomic/__init__.py,sha256=H9Ze9uEpJEaGjwXlspViliWWDFsTgN66TfaFI8ZaEBM,903
2
- jmcomic/api.py,sha256=40mzFEVhR0h_Ta-ub8vMfJ9yx89yvL09XMv9zK0QUvA,3865
3
- jmcomic/cl.py,sha256=PBSh0JndNFZw3B7WJPj5Y8SeFdKzHE00jIwYo9An-K0,3475
4
- jmcomic/jm_client_impl.py,sha256=UjWKyYF-pdYNbtw0FqvYQ0zsxGMySh8e9OIFZb1Xe7E,39188
5
- jmcomic/jm_client_interface.py,sha256=5JFSZEvAffDPh7oo8GQNVbm_Hdlmy_KYvTwrkY-OSA4,19074
6
- jmcomic/jm_config.py,sha256=CSl6s8rxyQq7bbhCCGnXtp8NMfZxabbByRYBvXlsH0s,16365
7
- jmcomic/jm_downloader.py,sha256=0r4z7FRnow6xkRy_WTv7nLQOhYdtZmoouw0BNrhngco,10397
8
- jmcomic/jm_entity.py,sha256=4B1NNFZ4dMlUguY4VpfG54C4h8l-uXk232Uj1RdQ1Ns,19049
9
- jmcomic/jm_exception.py,sha256=B9APE1jw23JBzCT12eV_imCZny3mNrSXju1p2IquaHA,4801
10
- jmcomic/jm_option.py,sha256=wmoOIwffM8b8fKUufRslXK5-bynD1nPXqc1sotXLIzQ,21918
11
- jmcomic/jm_plugin.py,sha256=4A3R4O6OHtG25wc5bLy-mkUJzC-qovH9GHv29mA-7MI,36361
12
- jmcomic/jm_toolkit.py,sha256=jU83ujluX_NxqwI7wwgoirJ_ZE2UmPBGvZCyVYnCJvQ,29164
13
- jmcomic-2.5.16.dist-info/LICENSE,sha256=kz4coTxZxuGxisK3W00tjK57Zh3RcMGq-EnbXrK7-xA,1064
14
- jmcomic-2.5.16.dist-info/METADATA,sha256=URI3NbsCbyDoAyEmX7aaEQSANnDgLRX7smtMpqeoMXo,7064
15
- jmcomic-2.5.16.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
16
- jmcomic-2.5.16.dist-info/entry_points.txt,sha256=tRbQltaGSBjejI0c9jYt-4SXQMd5nSDHcMvHmuTy4ow,44
17
- jmcomic-2.5.16.dist-info/top_level.txt,sha256=puvVMFYJqIbd6NOTMEvOyugMTT8woBfSQyxEBan3zY4,8
18
- jmcomic-2.5.16.dist-info/RECORD,,