HFrost0 / bilix

⚡️Lightning-fast async download tool for bilibili and more
Apache License 2.0
1.6k stars 166 forks source link

获取up主信息的api接口不稳定 #137

Closed yushiro closed 1 year ago

yushiro commented 1 year ago

bilix get_up "https://space.bilibili.com/522177045" --from-browser chrome

【up】辰南的羽毛球视界
2023-05-21 00:44:00,869 - WARNING - 参数,{'mid': '522177045', 'order': 'pubdate', 'ps': 30, 'pn': 1, 'keyword': None}
2023-05-21 00:44:01,064 - WARNING - 返回值:{'code': -403, 'message': '访问权限不足', 'ttl': 1}

Traceback (most recent call last):
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\bilix\download\utils.py", line 90, in wrapped
    return await func(client, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\bilix\sites\bilibili\api.py", line 166, in get_up_info
    up_name = info['data']['list']['vlist'][0]['author']
              ~~~~^^^^^^^^
KeyError: 'data'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Scripts\bilix.exe\__main__.py", line 7, in <module>
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\click\core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\click\core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\click\core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\bilix\cli\main.py", line 374, in main
    loop.run_until_complete(cor)
  File "C:\Users\i9700k\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 650, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\bilix\sites\bilibili\downloader.py", line 251, in get_up
    up_name, total_size, bv_ids = await api.get_up_info(self.client, url_or_mid, 1, ps, order, keyword)
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\i9700k\.virtualenvs\bilibili-BpYKjIOd\Lib\site-packages\bilix\download\utils.py", line 94, in wrapped
    raise APIParseError(e, func) from e
bilix.exception.APIParseError: APIParseError Caused by KeyError in <bilix.sites.bilibili.api:get_up_info>

我额外加了2行日志输出, 返回的信息如下:

2023-05-21 00:44:00,869 - WARNING - 参数,{'mid': '522177045', 'order': 'pubdate', 'ps': 30, 'pn': 1, 'keyword': None}
2023-05-21 00:44:01,064 - WARNING - 返回值:{'code': -403, 'message': '访问权限不足', 'ttl': 1}

如果多运行几次bilix, 偶尔能返回正确的值, 然后就可以正常下载了, 但大部分时候都是失败的, 这样的错误信息是近几天才出现的, 同样的代码, 我已经运行了1~2个月了, 之前一直没问题。

(bilibili-BpYKjIOd) F:\bilibili>bilix -v
Version 0.18.2
yushiro commented 1 year ago

修改过的get_up_info方法, 只是加了2个warn输出

@raise_api_error
async def get_up_info(client: httpx.AsyncClient, url_or_mid: str, pn=1, ps=30, order='pubdate', keyword=''):
    """
    获取up主信息

    :param url_or_mid:
    :param pn:
    :param ps:
    :param order:
    :param keyword:
    :param client:
    :return:
    """
    if url_or_mid.startswith('http'):
        mid = re.findall(r'/(\d+)', url_or_mid)[0]
    else:
        mid = url_or_mid
    params = {'mid': mid, 'order': order, 'ps': ps, 'pn': pn, 'keyword': keyword}
    #日志输出params的内容
    logging.warn(f"参数,{params}")
    res = await req_retry(client, 'https://api.bilibili.com/x/space/wbi/arc/search', params=params)
    info = json.loads(res.text)
    logging.warn(f"返回值:{info}")
    up_name = info['data']['list']['vlist'][0]['author']
    total_size = info['data']['page']['count']
    bv_ids = [i['bvid'] for i in info['data']['list']['vlist']]
    return up_name, total_size, bv_ids
HFrost0 commented 1 year ago

b站api有变动,等待后续修复

HFrost0 commented 1 year ago

各位如果自己有能力调整的,也欢迎PR

yushiro commented 1 year ago

基本找到临时解决方案了, 虽然修改了一下代码, 但目前的方案还不确定是否可以长期有效。 API请求带了w_rid这个散列值, 用的是MD5算法, 是把querystring排序后, 拼接上一个token, 然后MD5产生的。 token的生成算法也提取出来了, 但是有2个入参key还不确定是怎么来的, 虽然现在的b站并没有使用动态key, 每次发出来的请求, token都是一样的。 我使用一段时间再来回复这个方案是否可行。

HFrost0 commented 1 year ago

@yushiro 我看到有开发者也解决了这个问题,如bilicope,如果稳定运行欢迎PR

yushiro commented 1 year ago

感谢提醒,大致看了一下那个项目的代码,应该能够一劳永逸的解决这个问题,key是从另一个api接口获取的。 我照样子去修改一下。 btw:我不懂python,代码pr后,你可以自己看看怎么优化。 python代码都是让ai帮我从js转为py的