parsehub 2.1.7__tar.gz → 2.1.9__tar.gz

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.
Files changed (75) hide show
  1. {parsehub-2.1.7/src/parsehub.egg-info → parsehub-2.1.9}/PKG-INFO +30 -29
  2. {parsehub-2.1.7 → parsehub-2.1.9}/README.md +29 -28
  3. {parsehub-2.1.7 → parsehub-2.1.9}/pyproject.toml +1 -1
  4. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/base/ytdlp.py +7 -0
  5. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/bilibili.py +5 -2
  6. parsehub-2.1.9/src/parsehub/parsers/parser/kuaishou.py +89 -0
  7. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/twitter.py +2 -2
  8. parsehub-2.1.9/src/parsehub/provider_api/kuaishou.py +600 -0
  9. {parsehub-2.1.7 → parsehub-2.1.9/src/parsehub.egg-info}/PKG-INFO +30 -29
  10. {parsehub-2.1.7 → parsehub-2.1.9}/test/test_core_offline.py +1 -0
  11. parsehub-2.1.7/src/parsehub/parsers/parser/kuaishou.py +0 -31
  12. parsehub-2.1.7/src/parsehub/provider_api/kuaishou.py +0 -174
  13. {parsehub-2.1.7 → parsehub-2.1.9}/LICENSE +0 -0
  14. {parsehub-2.1.7 → parsehub-2.1.9}/setup.cfg +0 -0
  15. {parsehub-2.1.7 → parsehub-2.1.9}/src/__init__.py +0 -0
  16. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/__init__.py +0 -0
  17. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/cli.py +0 -0
  18. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/cli_config.py +0 -0
  19. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/config/__init__.py +0 -0
  20. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/config/config.py +0 -0
  21. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/errors.py +0 -0
  22. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/__init__.py +0 -0
  23. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/base/__init__.py +0 -0
  24. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/base/base.py +0 -0
  25. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/__init__.py +0 -0
  26. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/coolapk.py +0 -0
  27. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/douyin.py +0 -0
  28. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/facebook.py +0 -0
  29. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/instagram.py +0 -0
  30. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/pipix.py +0 -0
  31. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/snapchat.py +0 -0
  32. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/threads.py +0 -0
  33. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/tieba.py +0 -0
  34. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/tiktok.py +0 -0
  35. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/weibo.py +0 -0
  36. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/weixin.py +0 -0
  37. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/xhs.py +0 -0
  38. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/xiaoheihe.py +0 -0
  39. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/youtube.py +0 -0
  40. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/zhihu.py +0 -0
  41. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/parsers/parser/zuiyou.py +0 -0
  42. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/__init__.py +0 -0
  43. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/bilibili.py +0 -0
  44. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/coolapk.py +0 -0
  45. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/douyin.py +0 -0
  46. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/instagram.py +0 -0
  47. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/pipix.py +0 -0
  48. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/threads.py +0 -0
  49. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/tieba.py +0 -0
  50. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/tiktok.py +0 -0
  51. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/twitter.py +0 -0
  52. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/weibo.py +0 -0
  53. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/weixin.py +0 -0
  54. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/xhs.py +0 -0
  55. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/xiaoheihe.py +0 -0
  56. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/zhihu.py +0 -0
  57. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/provider_api/zuiyou.py +0 -0
  58. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/__init__.py +0 -0
  59. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/callback.py +0 -0
  60. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/media_file.py +0 -0
  61. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/media_ref.py +0 -0
  62. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/platform.py +0 -0
  63. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/post.py +0 -0
  64. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/types/result.py +0 -0
  65. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/utils/downloader.py +0 -0
  66. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/utils/helpers.py +0 -0
  67. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub/utils/media_info.py +0 -0
  68. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub.egg-info/SOURCES.txt +0 -0
  69. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub.egg-info/dependency_links.txt +0 -0
  70. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub.egg-info/entry_points.txt +0 -0
  71. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub.egg-info/requires.txt +0 -0
  72. {parsehub-2.1.7 → parsehub-2.1.9}/src/parsehub.egg-info/top_level.txt +0 -0
  73. {parsehub-2.1.7 → parsehub-2.1.9}/test/test_cli.py +0 -0
  74. {parsehub-2.1.7 → parsehub-2.1.9}/test/test_cli_config.py +0 -0
  75. {parsehub-2.1.7 → parsehub-2.1.9}/test/test_downloader.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: parsehub
3
- Version: 2.1.7
3
+ Version: 2.1.9
4
4
  Summary: 轻量、异步、开箱即用的社交媒体聚合解析库
5
5
  Author-email: 梓澪 <zilingmio@gmail.com>
6
6
  License: MIT
@@ -72,27 +72,27 @@ Dynamic: license-file
72
72
 
73
73
  ## 🌐 支持平台
74
74
 
75
- | 平台 | 视频 | 图文 | 其他 |
76
- |-----------------|:--:|:--:|---------------|
77
- | **Twitter / X** | ✅ | ✅ | 📝 文章 |
78
- | **Instagram** | ✅ | ✅ | |
79
- | **YouTube** | ✅ | | 🎵 音乐 |
80
- | **Facebook** | ✅ | | |
81
- | **Threads** | ✅ | ✅ | |
82
- | **Bilibili** | ✅ | | 📝 动态 |
83
- | **抖音** | ✅ | ✅ | ☀️日常 |
84
- | **TikTok** | ✅ | ✅ | |
85
- | **微博** | ✅ | ✅ | |
86
- | **小红书** | ✅ | ✅ | |
87
- | **贴吧** | ✅ | ✅ | |
88
- | **微信公众号** | | ✅ | |
89
- | **快手** | ✅ | | |
90
- | **酷安** | | ✅ | |
91
- | **皮皮虾** | ✅ | ✅ | |
92
- | **最右** | ✅ | ✅ | |
93
- | **小黑盒** | ✅ | ✅ | |
94
- | **Snapchat** | ✅ | | |
95
- | **知乎** | ✅ | ✅ | 🐶 问答, 专栏, 圈子 |
75
+ | 平台 | 视频 | 图文 | 其他 |
76
+ |-----------------|:----:|:----:|---------------------|
77
+ | **Twitter / X** | ✅ | ✅ | 📝 文章 |
78
+ | **Instagram** | ✅ | ✅ | |
79
+ | **YouTube** | ✅ | | 🎵 音乐 |
80
+ | **Facebook** | ✅ | | |
81
+ | **Threads** | ✅ | ✅ | |
82
+ | **Bilibili** | ✅ | | 📝 动态 |
83
+ | **抖音** | ✅ | ✅ | ☀️日常 |
84
+ | **TikTok** | ✅ | ✅ | |
85
+ | **微博** | ✅ | ✅ | |
86
+ | **小红书** | ✅ | ✅ | |
87
+ | **贴吧** | ✅ | ✅ | |
88
+ | **微信公众号** | | ✅ | |
89
+ | **快手** | ✅ | ✅ | |
90
+ | **酷安** | | ✅ | |
91
+ | **皮皮虾** | ✅ | ✅ | |
92
+ | **最右** | ✅ | ✅ | |
93
+ | **小黑盒** | ✅ | ✅ | |
94
+ | **Snapchat** | ✅ | | |
95
+ | **知乎** | ✅ | ✅ | 🐶 问答, 专栏, 圈子 |
96
96
 
97
97
  ## 📦 安装
98
98
 
@@ -134,14 +134,14 @@ ph d "https://example.com/post/1"
134
134
 
135
135
  #### 常用命令
136
136
 
137
- | 命令 | 说明 |
138
- |--------------------------------------------------|-------------|
139
- | `ph ls` | 查看支持的平台 |
137
+ | 命令 | 说明 |
138
+ |--------------------------------------------------|------------------------|
139
+ | `ph ls` | 查看支持的平台 |
140
140
  | `ph set proxy <platform> <proxy>` | 设置解析代理和下载代理 |
141
- | `ph set proxy <platform> <proxy> --for download` | 只设置下载代理 |
142
- | `ph set cookie <platform>` | 保存平台 Cookie |
143
- | `ph set list` | 查看配置列表 |
144
- | `ph set show <platform>` | 查看平台配置 |
141
+ | `ph set proxy <platform> <proxy> --for download` | 只设置下载代理 |
142
+ | `ph set cookie <platform>` | 保存平台 Cookie |
143
+ | `ph set list` | 查看配置列表 |
144
+ | `ph set show <platform>` | 查看平台配置 |
145
145
 
146
146
  配置会自动按平台应用到后续解析和下载; 临时覆盖时仍可直接传参数:
147
147
 
@@ -336,6 +336,7 @@ uv run pytest
336
336
  - [SocialSisterYi/bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
337
337
  - [Nemo2011/bilibili-api](https://github.com/Nemo2011/bilibili-api)
338
338
  - [cv-cat/ZhihuApis](https://github.com/cv-cat/ZhihuApis)
339
+ - [ucmao/media-parser](https://github.com/ucmao/media-parser)
339
340
 
340
341
  ## 📜 开源协议
341
342
 
@@ -30,27 +30,27 @@
30
30
 
31
31
  ## 🌐 支持平台
32
32
 
33
- | 平台 | 视频 | 图文 | 其他 |
34
- |-----------------|:--:|:--:|---------------|
35
- | **Twitter / X** | ✅ | ✅ | 📝 文章 |
36
- | **Instagram** | ✅ | ✅ | |
37
- | **YouTube** | ✅ | | 🎵 音乐 |
38
- | **Facebook** | ✅ | | |
39
- | **Threads** | ✅ | ✅ | |
40
- | **Bilibili** | ✅ | | 📝 动态 |
41
- | **抖音** | ✅ | ✅ | ☀️日常 |
42
- | **TikTok** | ✅ | ✅ | |
43
- | **微博** | ✅ | ✅ | |
44
- | **小红书** | ✅ | ✅ | |
45
- | **贴吧** | ✅ | ✅ | |
46
- | **微信公众号** | | ✅ | |
47
- | **快手** | ✅ | | |
48
- | **酷安** | | ✅ | |
49
- | **皮皮虾** | ✅ | ✅ | |
50
- | **最右** | ✅ | ✅ | |
51
- | **小黑盒** | ✅ | ✅ | |
52
- | **Snapchat** | ✅ | | |
53
- | **知乎** | ✅ | ✅ | 🐶 问答, 专栏, 圈子 |
33
+ | 平台 | 视频 | 图文 | 其他 |
34
+ |-----------------|:----:|:----:|---------------------|
35
+ | **Twitter / X** | ✅ | ✅ | 📝 文章 |
36
+ | **Instagram** | ✅ | ✅ | |
37
+ | **YouTube** | ✅ | | 🎵 音乐 |
38
+ | **Facebook** | ✅ | | |
39
+ | **Threads** | ✅ | ✅ | |
40
+ | **Bilibili** | ✅ | | 📝 动态 |
41
+ | **抖音** | ✅ | ✅ | ☀️日常 |
42
+ | **TikTok** | ✅ | ✅ | |
43
+ | **微博** | ✅ | ✅ | |
44
+ | **小红书** | ✅ | ✅ | |
45
+ | **贴吧** | ✅ | ✅ | |
46
+ | **微信公众号** | | ✅ | |
47
+ | **快手** | ✅ | ✅ | |
48
+ | **酷安** | | ✅ | |
49
+ | **皮皮虾** | ✅ | ✅ | |
50
+ | **最右** | ✅ | ✅ | |
51
+ | **小黑盒** | ✅ | ✅ | |
52
+ | **Snapchat** | ✅ | | |
53
+ | **知乎** | ✅ | ✅ | 🐶 问答, 专栏, 圈子 |
54
54
 
55
55
  ## 📦 安装
56
56
 
@@ -92,14 +92,14 @@ ph d "https://example.com/post/1"
92
92
 
93
93
  #### 常用命令
94
94
 
95
- | 命令 | 说明 |
96
- |--------------------------------------------------|-------------|
97
- | `ph ls` | 查看支持的平台 |
95
+ | 命令 | 说明 |
96
+ |--------------------------------------------------|------------------------|
97
+ | `ph ls` | 查看支持的平台 |
98
98
  | `ph set proxy <platform> <proxy>` | 设置解析代理和下载代理 |
99
- | `ph set proxy <platform> <proxy> --for download` | 只设置下载代理 |
100
- | `ph set cookie <platform>` | 保存平台 Cookie |
101
- | `ph set list` | 查看配置列表 |
102
- | `ph set show <platform>` | 查看平台配置 |
99
+ | `ph set proxy <platform> <proxy> --for download` | 只设置下载代理 |
100
+ | `ph set cookie <platform>` | 保存平台 Cookie |
101
+ | `ph set list` | 查看配置列表 |
102
+ | `ph set show <platform>` | 查看平台配置 |
103
103
 
104
104
  配置会自动按平台应用到后续解析和下载; 临时覆盖时仍可直接传参数:
105
105
 
@@ -294,6 +294,7 @@ uv run pytest
294
294
  - [SocialSisterYi/bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
295
295
  - [Nemo2011/bilibili-api](https://github.com/Nemo2011/bilibili-api)
296
296
  - [cv-cat/ZhihuApis](https://github.com/cv-cat/ZhihuApis)
297
+ - [ucmao/media-parser](https://github.com/ucmao/media-parser)
297
298
 
298
299
  ## 📜 开源协议
299
300
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "parsehub"
3
- version = "2.1.7"
3
+ version = "2.1.9"
4
4
  description = "轻量、异步、开箱即用的社交媒体聚合解析库"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12.0"
@@ -395,6 +395,13 @@ class YtParser(BaseParser, register=False):
395
395
  except Exception as e:
396
396
  raise ParseError(f"解析视频信息失败: {str(e)}") from e
397
397
 
398
+ if dl.get("live_status") in (
399
+ "is_live",
400
+ "is_upcoming",
401
+ "was_live",
402
+ ):
403
+ raise ParseError("不支持直播")
404
+
398
405
  if dl.get("_type") == "playlist":
399
406
  entries = dl.get("entries") or []
400
407
  if not entries:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import re
4
4
  from pathlib import Path
5
5
  from typing import Any, cast
6
- from urllib.parse import parse_qs, urlparse
6
+ from urllib.parse import parse_qs, parse_qsl, urlencode, urlparse
7
7
 
8
8
  from loguru import logger
9
9
 
@@ -76,7 +76,10 @@ class BiliParse(BaseParser):
76
76
  if self._is_bvid(url):
77
77
  return f"https://www.bilibili.com/video/{url}"
78
78
  else:
79
- return await super().get_raw_url(url, **kwargs)
79
+ raw_url = await super().get_raw_url(url, **kwargs)
80
+ u = urlparse(raw_url)
81
+ q = urlencode([(k, v) for k, v in parse_qsl(u.query) if (k, v) != ("p", "1")])
82
+ return u._replace(query=q).geturl()
80
83
 
81
84
  @staticmethod
82
85
  async def is_dynamic(url: str) -> str | None:
@@ -0,0 +1,89 @@
1
+ from loguru import logger
2
+
3
+ from ...provider_api.kuaishou import KuaiShouAPI, KuaishouParser
4
+ from ...types import ImageParseResult, ImageRef, ParseError, Platform, VideoParseResult, VideoRef
5
+ from ...utils.helpers import SecretCookie
6
+ from ..base.base import BaseParser
7
+
8
+ COOKIE = SecretCookie(
9
+ "kpf=PC_WEB; clientid=3; did=web_bfbcdb2f5b3dc663a745deabafcf61e6; kwpsecproductname=kuaishou-"
10
+ "vision; didv=1773330035000; kwpsecproductname=kuaishou-vision; userId=446442483; kuaishou.serv"
11
+ "er.webday7_st=ChprdWFpc2hvdS5zZXJ2ZXIud2ViZGF5Ny5zdBKwAeuBbGjVcz39sj4G7d7P54r9C1etC_QftYb2I1X"
12
+ "Mg01WSbw9NefL7E6EmwkYxHf70B9BM3Oyk20kFv1Y0xnRcfHtGNHYUHkmKguP6cvFeACofr2zPAZYRchRkndIBk5qExOl"
13
+ "kr4FSoGpY-WqXeibapHNEbfZTLZl_QkQA4aGWotSZpBMv6wR3RxZWiMv60xc-CIndGICJbbRAaRGZNxz7QBj2Mr-SeU2o"
14
+ "0bVi7esnD1AGhKquV16S9dezebl5ZuYo_R_JKgiIAidQF8n526Yos_GTgm3KrGknnEbkK-NMiNvTw3YBehZKAUwAQ; kua"
15
+ "ishou.server.webday7_ph=f3720606882f1d7a76ab1ab52a489c4d44a1; bUserId=1000583835422; ktrace-c"
16
+ "ontext=1|MS44Nzg0NzI0NTc4Nzk2ODY5Ljg3MTE4OTQ4LjE3NzM1NzExNTEyMjQuNDQ0OTc1MTI=|MS44Nzg0NzI0NTc4"
17
+ "Nzk2ODY5LjUxNTU3MjM4LjE3NzM1NzExNTEyMjQuNDQ0OTc1MTM=|0|webservice-user-growth-node|webservice|"
18
+ "true|src-Js; kwssectoken=BIjmefxxiTpXOdz9/RQ6Gl7cR5/0J7xaPzJ18udJgBSLTrJy4O7LhrYtbeeHGW+AOJrI6"
19
+ "P8LQnioDWSuuQxV8Q==; kwscode=75d440673de879734b8700f363119968b4fabb4eb0369b1607e206d8e8c1ac9d;"
20
+ " kpn=KUAISHOU_VISION; kwfv1=PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P9G98YPf8jPBQSweS0+nr9"
21
+ "G0mD8B+fP/L98/qlPe4f8eDI8f8jwBGh8BPAPfLEGALhGf+f+AYj+e4jPfLl+AY0G/cI+/Q0G0DEPfc98/mjw/pSPBbjGA"
22
+ "rh8erl+ezfG/HlP0zf+0b0+n+DGnpj+0HI+9Qj+0p0PeDF+ADIPeL7+W==; kwssectoken=IMLS/eg005i6IUbIoIB/7W"
23
+ "Byh8ciKMPUXULQ3a5/m3dK5D9ez8He/oMP2QLhil52v7Bk3O0CO2g6t5R/5XjSCw==; kwscode=75d440673de879734b"
24
+ "8700f363119968b4fabb4eb0369b1607e206d8e8c1ac9d"
25
+ )
26
+
27
+
28
+ class KuaiShouParser(BaseParser):
29
+ __platform__ = Platform.KUAISHOU
30
+ __supported_type__ = ["视频", "图文"]
31
+ __match__ = r"^(http(s)?://)?(www|v|live|v\.m)\.(kuaishou|chenzhongtech).com/.+"
32
+ __redirect_keywords__ = ["v.kuaishou", "/f/"]
33
+
34
+ async def _do_parse(self, raw_url: str) -> VideoParseResult | ImageParseResult:
35
+ ksp = await KuaishouParser.create(
36
+ raw_url, proxy=self.proxy, cookie=self.cookie.get_value() or COOKIE.get_value()
37
+ )
38
+ cover = ksp.get_cover_photo_url()
39
+ if ksp.page_type == "VIDEO":
40
+ try:
41
+ content = ksp.get_title_content()
42
+ video = ksp.get_real_video_url()
43
+ except Exception as e:
44
+ logger.error(f"快手 HTML 解析失败, 尝试 API 解析: {e}")
45
+ else:
46
+ if not video:
47
+ raise ParseError("-1 快手解析失败")
48
+
49
+ return VideoParseResult(
50
+ title=content,
51
+ video=VideoRef(
52
+ url=video.url,
53
+ thumb_url=cover,
54
+ duration=video.d,
55
+ height=video.h,
56
+ width=video.w,
57
+ ),
58
+ )
59
+
60
+ ks = KuaiShouAPI(self.cookie.get_value() or COOKIE.get_value(), self.proxy)
61
+ try:
62
+ result = await ks.get_video_info(raw_url)
63
+ except Exception as e:
64
+ raise ParseError(f"-2 快手解析失败: {e}") from e
65
+ else:
66
+ return VideoParseResult(
67
+ title=result.title,
68
+ video=VideoRef(
69
+ url=result.video_url,
70
+ thumb_url=result.thumb_url,
71
+ duration=result.duration,
72
+ height=result.height,
73
+ width=result.width,
74
+ ),
75
+ )
76
+ else:
77
+ content = ksp.get_title_content()
78
+ img = ksp.get_image_list()
79
+ if img:
80
+ return ImageParseResult(
81
+ title=content, photo=[ImageRef(url=i.url, height=i.h, width=i.w, ext=i.e) for i in img]
82
+ )
83
+ if cover:
84
+ return ImageParseResult(title=content, photo=[ImageRef(url=cover)])
85
+
86
+ raise ParseError("快手解析失败 -3")
87
+
88
+
89
+ __all__ = ["KuaiShouParser"]
@@ -39,13 +39,13 @@ class TwitterParser(BaseParser):
39
39
  try:
40
40
  tweet = await x.fetch_tweet(url)
41
41
  except Exception as e:
42
- if any(s in str(e) for s in ("error -2",)):
42
+ if any(s in str(e) for s in ("error -2", "error -3")):
43
43
  if cookie := self.cookie.get_value():
44
44
  x2 = Twitter(self.proxy, cookie=cookie)
45
45
  try:
46
46
  tweet = await x2.fetch_tweet(url)
47
47
  except Exception as e2:
48
- raise ParseError(f"Twitter 账号可能已被封禁\n\n使用的Cookie: {self.cookie}") from e2
48
+ raise ParseError(f"Twitter 账号无权限或已被封禁\n\n使用的 Cookie: {self.cookie}") from e2
49
49
  else:
50
50
  raise ParseError(str(e)) from e
51
51
  else: