jmcomic 2.5.16__py3-none-any.whl → 2.5.17__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 +1 -1
- jmcomic/jm_client_impl.py +11 -6
- jmcomic/jm_config.py +44 -37
- jmcomic/jm_entity.py +6 -5
- jmcomic/jm_plugin.py +1 -1
- {jmcomic-2.5.16.dist-info → jmcomic-2.5.17.dist-info}/METADATA +1 -1
- jmcomic-2.5.17.dist-info/RECORD +18 -0
- {jmcomic-2.5.16.dist-info → jmcomic-2.5.17.dist-info}/WHEEL +1 -1
- jmcomic-2.5.16.dist-info/RECORD +0 -18
- {jmcomic-2.5.16.dist-info → jmcomic-2.5.17.dist-info}/LICENSE +0 -0
- {jmcomic-2.5.16.dist-info → jmcomic-2.5.17.dist-info}/entry_points.txt +0 -0
- {jmcomic-2.5.16.dist-info → jmcomic-2.5.17.dist-info}/top_level.txt +0 -0
jmcomic/__init__.py
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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,14 +89,55 @@ class JmModuleConfig:
|
|
|
123
89
|
# JM的异常网页code
|
|
124
90
|
JM_ERROR_STATUS_CODE = {
|
|
125
91
|
403: 'ip地区禁止访问/爬虫被识别',
|
|
126
|
-
500: '500:
|
|
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
|
|
|
@@ -336,7 +343,7 @@ class JmModuleConfig:
|
|
|
336
343
|
"""
|
|
337
344
|
网页端的headers
|
|
338
345
|
"""
|
|
339
|
-
headers =
|
|
346
|
+
headers = cls.HTML_HEADERS_TEMPLATE.copy()
|
|
340
347
|
headers.update({
|
|
341
348
|
'authority': domain,
|
|
342
349
|
'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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
604
|
+
(aid, extra.get('author', '') or JmModuleConfig.DEFAULT_AUTHOR, extra['name'])
|
|
605
605
|
)
|
|
606
606
|
|
|
607
607
|
if len(data) == 0:
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
jmcomic/__init__.py,sha256=VdvSEKf4FpDU-iU1wj1priUxBHKOez5Uji0NJjdkQy4,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=5LnfiNkRvqcHm0HiHY76uSDiYefflBt2We620ct7QrY,16651
|
|
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.17.dist-info/LICENSE,sha256=kz4coTxZxuGxisK3W00tjK57Zh3RcMGq-EnbXrK7-xA,1064
|
|
14
|
+
jmcomic-2.5.17.dist-info/METADATA,sha256=j23NN6-5POvBxN96VB_WVhqKdCcyVoVX5-0KMkwJono,7064
|
|
15
|
+
jmcomic-2.5.17.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
|
|
16
|
+
jmcomic-2.5.17.dist-info/entry_points.txt,sha256=tRbQltaGSBjejI0c9jYt-4SXQMd5nSDHcMvHmuTy4ow,44
|
|
17
|
+
jmcomic-2.5.17.dist-info/top_level.txt,sha256=puvVMFYJqIbd6NOTMEvOyugMTT8woBfSQyxEBan3zY4,8
|
|
18
|
+
jmcomic-2.5.17.dist-info/RECORD,,
|
jmcomic-2.5.16.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|