TikTokDownload
TikTokDownload copied to clipboard
下载Tiktok 报错 AttributeError: 'dict' object has no attribute 'get_video_info'
描述出现的错误
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ in _run_module_as_main:198 │
│ in _run_code:88 │
│ │
│ in main
.""" │
│ ❱ 1157 │ │ return self.main(*args, **kwargs) │
│ 1158 │
│ 1159 │
│ 1160 class Command(BaseCommand): │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\core.py:1078 in main │
│ │
│ 1075 │ │ try: │
│ 1076 │ │ │ try: │
│ 1077 │ │ │ │ with self.make_context(prog_name, args, **extra) as ctx: │
│ ❱ 1078 │ │ │ │ │ rv = self.invoke(ctx) │
│ 1079 │ │ │ │ │ if not standalone_mode: │
│ 1080 │ │ │ │ │ │ return rv │
│ 1081 │ │ │ │ │ # it's not safe to ctx.exit(rv)
here! │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\core.py:1688 in invoke │
│ │
│ 1685 │ │ │ │ super().invoke(ctx) │
│ 1686 │ │ │ │ sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) │
│ 1687 │ │ │ │ with sub_ctx: │
│ ❱ 1688 │ │ │ │ │ return _process_result(sub_ctx.command.invoke(sub_ctx)) │
│ 1689 │ │ │
│ 1690 │ │ # In chain mode we create the contexts step by step, but after the │
│ 1691 │ │ # base command has been invoked. Because at that point we do not │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\core.py:1434 in invoke │
│ │
│ 1431 │ │ │ echo(style(message, fg="red"), err=True) │
│ 1432 │ │ │
│ 1433 │ │ if self.callback is not None: │
│ ❱ 1434 │ │ │ return ctx.invoke(self.callback, **ctx.params) │
│ 1435 │ │
│ 1436 │ def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: │
│ 1437 │ │ """Return a list of completions for the incomplete value. Looks │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\core.py:783 in invoke │
│ │
│ 780 │ │ │
│ 781 │ │ with augment_usage_errors(__self): │
│ 782 │ │ │ with ctx: │
│ ❱ 783 │ │ │ │ return __callback(*args, **kwargs) │
│ 784 │ │
│ 785 │ def forward( │
│ 786 │ │ __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\decorators.py:33 in new_func │
│ │
│ 30 │ """ │
│ 31 │ │
│ 32 │ def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": │
│ ❱ 33 │ │ return f(get_current_context(), *args, **kwargs) │
│ 34 │ │
│ 35 │ return update_wrapper(new_func, f) │
│ 36 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\apps\tiktok\cli.py:469 in tiktok │
│ │
│ 466 │ │
│ 467 │ # 添加app_name到kwargs │
│ 468 │ kwargs["app_name"] = "tiktok" │
│ ❱ 469 │ ctx.invoke(set_cli_config, **kwargs) │
│ 470 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\core.py:783 in invoke │
│ │
│ 780 │ │ │
│ 781 │ │ with augment_usage_errors(__self): │
│ 782 │ │ │ with ctx: │
│ ❱ 783 │ │ │ │ return __callback(*args, **kwargs) │
│ 784 │ │
│ 785 │ def forward( │
│ 786 │ │ __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\click\decorators.py:33 in new_func │
│ │
│ 30 │ """ │
│ 31 │ │
│ 32 │ def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": │
│ ❱ 33 │ │ return f(get_current_context(), *args, **kwargs) │
│ 34 │ │
│ 35 │ return update_wrapper(new_func, f) │
│ 36 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\cli\cli_commands.py:135 in set_cli_config │
│ │
│ 132 │ │
│ 133 │ with RichConsoleManager().progress: │
│ 134 │ │ try: │
│ ❱ 135 │ │ │ asyncio.run(run_app(kwargs)) │
│ 136 │ │ except APIError as e: │
│ 137 │ │ │ logger.error(e.display_error()) │
│ 138 │
│ │
│ C:\Users\Wang\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py:194 in run │
│ │
│ 191 │ │ │ "asyncio.run() cannot be called from a running event loop") │
│ 192 │ │
│ 193 │ with Runner(debug=debug, loop_factory=loop_factory) as runner: │
│ ❱ 194 │ │ return runner.run(main) │
│ 195 │
│ 196 │
│ 197 def cancel_all_tasks(loop): │
│ │
│ C:\Users\Wang\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py:118 in run │
│ │
│ 115 │ │ │
│ 116 │ │ self.interrupt_count = 0 │
│ 117 │ │ try: │
│ ❱ 118 │ │ │ return self.loop.run_until_complete(task) │
│ 119 │ │ except exceptions.CancelledError: │
│ 120 │ │ │ if self.interrupt_count > 0: │
│ 121 │ │ │ │ uncancel = getattr(task, "uncancel", None) │
│ │
│ C:\Users\Wang\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py:685 in │
│ run_until_complete │
│ │
│ 682 │ │ if not future.done(): │
│ 683 │ │ │ raise RuntimeError('Event loop stopped before Future completed.') │
│ 684 │ │ │
│ ❱ 685 │ │ return future.result() │
│ 686 │ │
│ 687 │ def stop(self): │
│ 688 │ │ """Stop running the event loop. │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\cli\cli_commands.py:143 in run_app │
│ │
│ 140 async def run_app(kwargs): │
│ 141 │ app_name = kwargs["app_name"] │
│ 142 │ app_module = importlib.import_module(f"f2.apps.{app_name}.handler") │
│ ❱ 143 │ await app_module.main(kwargs) │
│ 144 │
│ 145 │
│ 146 if name == "main": │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\apps\tiktok\handler.py:665 in main │
│ │
│ 662 async def main(kwargs): │
│ 663 │ mode = kwargs.get("mode") │
│ 664 │ if mode in mode_function_map: │
│ ❱ 665 │ │ await mode_function_mapmode │
│ 666 │ else: │
│ 667 │ │ logger.error(("不存在该模式: {0}").format(mode)) │
│ 668 │ │ rich_console.print(("不存在该模式: {0}").format(mode)) │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\apps\tiktok\handler.py:234 in handler_one_video │
│ │
│ 231 │ │ │ ) │
│ 232 │ │ │
│ 233 │ │ async with AsyncVideoDB("tiktok_videos.db") as vdb: │
│ ❱ 234 │ │ │ await self.get_or_add_video_data(aweme_data, vdb) │
│ 235 │ │ │
│ 236 │ │ logger.debug(("单个视频数据: {0}".format(aweme_data))) │
│ 237 │
│ │
│ D:\Code\PY\Tiktok\venv\Lib\site-packages\f2\apps\tiktok\handler.py:137 in get_or_add_video_data │
│ │
│ 134 │ │ """ │
│ 135 │ │ │
│ 136 │ │ # 尝试从数据库中获取作品数据 │
│ ❱ 137 │ │ local_video_data = await db.get_video_info(aweme_data.get("aweme_id", None)) │
│ 138 │ │ │
│ 139 │ │ # 如果作品不在数据库中,将其添加到数据库 │
│ 140 │ │ if not local_video_data: │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
bug复现
DEBUG 主配置参数:{'cookie': None, 'max_connections': 5, 'max_counts': 0, 'max_retries': 5, 'max_tasks': 5, 'naming': '{create}{desc}',
'page_counts': 5, 'path': 'Download', 'timeout': 10, 'proxies': {'http': None, 'https': None}}
DEBUG 自定义配置参数:{'cookie':
'ak_bmsc=C80A038595DF604050E84E
'timeout': None, 'url': 'https://vt.tiktok.com/ZSFS8bXhS/'}
DEBUG CLI参数:{'cookie':
'ak_bmsc=C8 app_theme=light'}
DEBUG 开始爬取视频: 7328332762635603207
DEBUG 作品详情接口地址:https://www.tikt
DEBUG 响应状态码: 200
DEBUG 视频ID: None 视频文案: None 作者: None
DEBUG 用户信息接口地址:https://www.tiktoCM9WX7rr
DEBUG 响应状态码: 200
截图
如果适用,添加屏幕截图以帮助解释您的问题。
桌面(请填写以下信息): -操作系统:windows11 64bit -vpn代理:开启 -项目版本:0.0.1.4 -py版本:3.12.2 -依赖库的版本:[出错的库版本号]
附文 在此处添加有关此问题的其他备注。
https://github.com/Johnserf-Seed/f2/issues/45
非常感谢大佬的快速回复,我按提示修改了代码,现在变成了一直是403,内容长度为0。 按您在那个问题的回复是节点或者VPN软件的问题。可是我这里浏览器是可以正常打开视频的,我试了我的几十个节点,多家机场,都是403,内容为0。
45048DD1B616BBAFA10FAF57&ply_type=2&policy=2&signature=4d6adcc0df95a64a701a5b0f9360177e&tk=tt_chain_token在服务 总内容长度为:0 字节
WARNING 内容长度为0,跳过下载 💛 [ 丢失 ]:2024-01-26 17-13-59_...__#MASHLE__video.mp4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0% • 0/? bytes ? ETA
(venv) D:\Code\PY\Tiktok>
非常感谢大佬的快速回复,我按提示修改了代码,现在变成了一直是403,内容长度为0。 按您在那个问题的回复是节点或者VPN软件的问题。可是我这里浏览器是可以正常打开视频的,我试了我的几十个节点,多家机场,都是403,内容为0。
45048DD1B616BBAFA10FAF57&ply_type=2&policy=2&signature=4d6adcc0df95a64a701a5b0f9360177e&tk=tt_chain_token在服务 总内容长度为:0 字节
WARNING 内容长度为0,跳过下载 💛 [ 丢失 ]:2024-01-26 17-13-59_...__#MASHLE__video.mp4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0% • 0/? bytes ? ETA
(venv) D:\Code\PY\Tiktok>
这个情况是因人而异的,但是访问403就是网络方面的情况,这个比较复杂可能和证书,cookie,风控等等都有关系,需要自己慢慢排查了。
非常感谢大佬的快速回复,我按提示修改了代码,现在变成了一直是403,内容长度为0。 按您在那个问题的回复是节点或者VPN软件的问题。可是我这里浏览器是可以正常打开视频的,我试了我的几十个节点,多家机场,都是403,内容为0。
45048DD1B616BBAFA10FAF57&ply_type=2&policy=2&signature=4d6adcc0df95a64a701a5b0f9360177e&tk=tt_chain_token在服务 总内容长度为:0 字节
WARNING 内容长度为0,跳过下载 💛 [ 丢失 ]:2024-01-26 17-13-59_...__#MASHLE__video.mp4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0% • 0/? bytes ? ETA (venv) D:\Code\PY\Tiktok>
这个情况是因人而异的,但是访问403就是网络方面的情况,这个比较复杂可能和证书,cookie,风控等等都有关系,需要自己慢慢排查了。
感谢大佬回复,你这个效率真是让人感动。从早期版本就在用了,真心感谢大佬的付出。我再研究研究