bilibili-api icon indicating copy to clipboard operation
bilibili-api copied to clipboard

[漏洞] video_uploader.py中的VideoUploader.start()函数隐藏原始报错信息

Open Alkaid-C opened this issue 11 months ago • 3 comments

Python 版本: 3.12.3

模块版本: 17.1.4

运行环境: Linux

模块路径: bilibili_api.video_uploader

解释器: cpython

使用的网络请求库: aiohttp ...

我试图使用以下代码上传视频:

    uploader = video_uploader.VideoUploader(...)
    try:
        asyncio.run(uploader.start())
    except Exception as e:
        print(f"视频上传失败: {str(e)}")

得到报错:

视频上传失败: 

即,{str(e)}为空。这让我感到十分困惑。

于是我查看了start()的具体实现,不再直接调用start(),而是调用被start()封装起来的_main()。修改后的代码如下:

    uploader = video_uploader.VideoUploader(...)
    try:
        uploader.line=asyncio.run(video_uploader._choose_line(uploader.line))
        asyncio.run(uploader._main())
    except Exception as e:
        print(f"视频上传失败: {str(e)}")

得到的报错为:

视频上传失败:  接口返回错误代码:21138,信息:超出当前可用分p视频数上限。
{'code': 21138, 'message': '超出当前可用分p视频数上限', 'ttl': 1}

显然这次我获得了真正的报错信息。 经查询,这个报错是我所用的账号创作者等级过低所致,并不是bilibili-api本身的bug。

但问题是start()这个封装不知何故隐藏了_main()所给出的原始报错信息,使得我第一次运行时得到的报错代码为空。我认为这是一个bug。 我一开始怀疑是AsyncEvent.dispatch()的问题,但我自己初步翻了翻AsyncEvent.dispatch()的实现,好像没有发现问题。

Alkaid-C avatar May 29 '25 04:05 Alkaid-C

考虑 raise 一下原来代码中的 Exception 看看是何方神圣?

Nemo2011 avatar May 29 '25 11:05 Nemo2011

可能要等两天...这个东西疑似是随机出现的(或者说,因为什么本地无法控制的原因概率出现) 我前两天做了一个最小化demo,没能复现(有正常报错),把旧的生产脚本原样运行了一遍,没能复现。我本来都在考虑close这个issue了

但是今天在新版的生产脚本里又出现了“视频上传失败:(空的报错内容)”,但这次被隐藏的报错信息和上次应该不一样,因为现在的新版生产脚本不会试图上传分p视频了(生产脚本仍然在用{str(e)},因为我实际上不是在print(),是接了qq机器人,它会在报错的时候给我发qq消息) 我现在把生产脚本也改成raise e了,期待下次再出现能抓住真身吧...

Alkaid-C avatar Jun 02 '25 20:06 Alkaid-C

猜一下:ServerDisconnectedError

Nemo2011 avatar Jun 07 '25 07:06 Nemo2011