Git Product home page Git Product logo

nemo2011 / bilibili-api Goto Github PK

View Code? Open in Web Editor NEW
1.8K 1.8K 163.0 187.58 MB

哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api

Home Page: https://nemo2011.github.io/bilibili-api/

License: GNU General Public License v3.0

Python 96.10% HTML 1.94% JavaScript 1.19% CSS 0.44% Makefile 0.06% Vue 0.28%
api bilibili bilibili-api python spider

bilibili-api's People

Contributors

alanduzzz avatar amtoaer avatar atkghost avatar bakashigure avatar boxie123 avatar david082321 avatar dependabot[bot] avatar drelf2018 avatar ericsell avatar gary2018x avatar heavenelegy avatar iconfehu avatar imldy avatar l-trump avatar limn2o4 avatar littleblacklb avatar lyzhang0113 avatar mengguojia avatar mizar6 avatar moyuscript avatar mz289 avatar nemo2011 avatar nooblong avatar sudoskys avatar timg233 avatar tzfc avatar valkjsaaa avatar whille avatar whitepaper233 avatar z0z0r4 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bilibili-api's Issues

【漏洞】投稿上传报错分块上传失败

Python 版本: 3.9.13

模块版本: 10.1.0/10.2.0b5

运行环境: Ubuntu 20.04.4 LTS

模块路径: bilibili_api.video_uploader

**报错信息:'分块上传失败'

{'name': 'PRE_CHUNK', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 807403520, 'chunk_number': 77, 'total_chunk_count': 496}}
{'name': 'PRE_CHUNK', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 817889280, 'chunk_number': 78, 'total_chunk_count': 496}}
{'name': 'PRE_CHUNK', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 828375040, 'chunk_number': 79, 'total_chunk_count': 496}}
{'name': 'CHUNK_FAILED', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 807403520, 'chunk_number': 77, 'total_chunk_count': 496, 'info': '分块上传失败'}}
{'name': 'CHUNK_FAILED', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 828375040, 'chunk_number': 79, 'total_chunk_count': 496, 'info': '分块上传失败'}}
{'name': 'CHUNK_FAILED', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x7f8264089c70>, 'offset': 817889280, 'chunk_number': 78, 'total_chunk_count': 496, 'info': '分块上传失败'}}

自6月27日左右开始,位于不同省份,使用不同账号,但运行环境相同的机器,均出现这种现象。原MoyuScript的是一开始两年左右没这个问题,6月27出现首次后,尝试继续使用了一段时间,因为是概率性的(下面有解释)。后来更换到这个新的库,依旧会出现这种情况。

比如这个496块差不多5G的视频投稿,他会从0到496,不断上传,不断返回这个分块上传失败,再从0开始循环。时间久了(持续上传10小时左右)甚至会被B站暂时封ip,返回403,才会停下来。(虽然显示分块上传失败,网关显示上行速度是有常规投稿上传时的速度的)

已经触发这个现象而失败的文件,无论怎么上传,都会这样。如果改一下文件名(文件名纯数字),再运行一次,就有概率能成功。它是要么全程没问题,要么一上来就出现这个分块上传失败,直至结束。如果改名字后运行还是失败,再改一下名字,再上传,还是有概率成功。大概是60-70%的概率能成功。

【提问】如何应对Cookies中的SESSDATA和bili_jct频繁刷新

Python 版本: 3.8.5

模块版本: 3.1.3

运行环境: Linux


无论是在3.1.3的bilibili_api.utils.Verify,抑或是当前最新版的bilibili_api.utils.Credential,用户认证都需要用到Cookies中的SESSDATA和bili_jct。尽管这种方式和大多SDK的AK/SK认证不同,但在过去两年左右时间里,我们的服务使用bilibili_api进行自动上传视频总是能成功,这归功于Cookies中的SESSDATA和bili_jct在很长一段时间保持不变。
但最近,总会因为SESSDATA和bili_jct频繁变动,导致自动上传视频失败。
因此,我想了解了解SESSDATA和bili_jct的刷新机制,以及如何去避免因SESSDATA和bili_jct刷新而造成的上传失效,或者还有其他方法能实现用户持久的认证吗?
希望能尽快收到回复,感谢!

我很好奇为什么VPN会导致解码错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 73: invalid start byte

代码:
import asyncio
from bilibili_api import video

async def main():
# 实例化 Video 类
v = video.Video(bvid="BV1uv411q7Mv")
# 获取信息
info = await v.get_info()
# 打印信息
print(info)

if name == 'main':
asyncio.get_event_loop().run_until_complete(main())

【提问】获取自动循环获取用户投稿视频信息失败

**Python 版本: 3.8.6

**模块版本:3.1.3

**运行环境:Linux/MacOS


在release3.1.3中,可以通过调用user.get_videos_g({uid})来获取用户的所有投稿视频信息,但在2022-09-21 18:00后,使用这个方法开始开始出现异常,以下是我在MacOS上执行失败的一段错误日志:

Traceback (most recent call last):
File "", line 1, in
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/bilibili_api/user.py", line 118, in get_videos_g
data = get_videos_raw(uid=uid, order=order, pn=page, verify=verify)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/bilibili_api/user.py", line 158, in get_videos_g
data = utils.get(url=api["url"], params=params, cookies=verify.get_cookies())
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/bilibili_api/utils.py", line 418, in get
resp = request("GET", url=url, params=params, cookies=cookies, headers=headers, data_type=date_type, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/bilibili_api/utils.py", line 394, in request
raise exceptions.BilibiliException(con["code"], msg)
bilibili_api.exceptions.BilibiliException: 错误代码:-401, 信息:非法访问

考虑到bilibili版本迭代速度过快,而release 3.1.3一直以来都能满足我们的服务需求,所以想请教下不切换版本的情况下是否还能获取到一个用户所发布的所有投稿信息

【建议】要不在原仓库给你引个流?

没想到还真有人接手做了,看了一圈貌似还可以。原仓库主要是我实在是没精力去维护了,要不在原仓库给你引个流?[狗头]

不介意的话也可以把原仓库转给你,我偶尔冒泡帮个忙。

【提问】如何才能增加观看直播时长

是这样的, 个人闲时会玩玩OW这个游戏,官方OWL联赛会根据观看时长赠送皮肤,个人又没有那么多时间挂时长,于是想写个脚本仍服务器上挂一下,无论怎样都不会增加时长,请问B站增加观看时长的api有了解吗,个人可以自行添加。
我翻了下B站直播相关的油猴脚本有调用heartbeat/webHeartBeat这个api的,我增加了一下发现没有什么用。

下面是主要逻辑

credential = Credential(sessdata, bili_jct, buvid3, dedeuserid)

room_id = xxxx
room = live.LiveRoom(room_id, credential)
sync(room.get_user_info_in_room())
room_info = sync(room.get_room_info())
print(f"进入{room_info['anchor_info']['base_info']['uname']}直播间, 标题【{room_info['room_info']['title']}】")
sync(room.get_room_play_info_v2(live_qn=live.ScreenResolution.FLUENCY))
danmaku = live.LiveDanmaku(room_id, False, credential)


@danmaku.on("ALL")
async def danmaku_all(event):
    pass
    # print(event)


def heartbeat():
    while True:
        sync(room.get_room_info())
        # 包装的 webHeartBeat 这个api
        print(sync(room.heartbeat()))
        time.sleep(60)


threading.Thread(target=heartbeat).start()
sync(danmaku.connect())

【提问】{这里填写标题}

Python 版本: 3.10

模块版本: 12.4.0

运行环境: Windows

下载视频示例报错 ”for chunk in resp.iter_bytes(1024):“
报错内容'ClientResponse' object has no attribute 'iter_bytes',看了最新的ClientResponse好像确实没有这个成员,应该是示例没更新,但是新版本应该怎样表示分块大小呢?

【漏洞】import错误和CLOSE_WAIT问题

Python 版本: 3.9 / NodeJS 版本:

模块版本: 11.5.1 (python/JS&TS)

运行环境: Debian 11 x86_64 Kernel: 5.10.0-14-amd64

模块路径: ./.local/lib/python3.9/site-packages

解释器(Python): python

报错信息:

Exception in thread Thread-9:
Traceback (most recent call last):
File "/home/appleUqaq/haku-qqbot/plugins/commands/bilibili.py", line 1, in <module>
    import bilibili_api
  File "/home/appleUqaq/.local/lib/python3.9/site-packages/bilibili_api/__init__.py", line 17, in <module>
    nest_asyncio.apply()
  File "/home/appleUqaq/.local/lib/python3.9/site-packages/nest_asyncio.py", line 16, in apply
    loop = loop or asyncio.get_event_loop()
  File "/home/appleUqaq/.local/lib/python3.9/site-packages/nest_asyncio.py", line 45, in _get_event_loop
    loop = events.get_event_loop_policy().get_event_loop()
  File "/usr/lib/python3.9/asyncio/events.py", line 642, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-9'.

报错代码:

import bilibili_api

还有一个问题,就是如果执行多次用 lsof | grep CLOSE_WAIT 查找则会出现CLOSE_WAIT,会导致 OSError: Too many open files ,因为不会异步,所以用的都是bilibili_api.sync()
image

【漏洞】python 3.9 api版本12.1.0 ,上传视频报错,一直显示分块上传失败

Python 版本:3.9
模块版本:bilibili-api-python 12.1.0
报错信息:
{'name': 'PRE_CHUNK', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x117db95b0>, 'offset': 0, 'chunk_number': 0, 'total_chunk_count': 1}}
{'name': 'CHUNK_FAILED', 'data': {'page': <bilibili_api.video_uploader.VideoUploaderPage object at 0x117db95b0>, 'offset': 0, 'chunk_number': 0, 'total_chunk_count': 1, 'info': '分块上传失败'}}

报错代码:

credential = video_uploader.Credential(sessdata=SESSDATA, bili_jct=BILI_JCT, buvid3=BUVID3)

# 具体请查阅相关文档
meta = {
       "copyright": 2,
       "source": v_url,
       "cover": v_cover,
       "desc": v_desc,
       "desc_format_id": 0,
       "dynamic": "自动化上传测试",
       "interactive": 0,
       "open_elec": 1,
       "no_reprint": 1,
       "subtitles": {
           "lan": "",
           "open": 1
       },
       "tag": ','.join(v_tag),
       "tid": 171,
       "title": v_title,
       "up_close_danmaku": False,
       "up_close_reply": False
    }
page = video_uploader.VideoUploaderPage(path=video_path, title=v_title, description=v_desc)
uploader = video_uploader.VideoUploader([page], meta, credential, v_cover)

在此处写正文

【提问】{代理端口}

Python 版本: 3.x

模块版本: x.x.x

运行环境: Windows / Linux


Traceback (most recent call last):
  File ".\bilisearch.py", line 175, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "D:\Program Files\anaconda3\envs\autopub\lib\asyncio\base_events.py", line 608, in run_until_complete
    return future.result()
  File ".\bilisearch.py", line 158, in main
    r = await misc.web_search_by_type(k,'video')
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\bilibili_api\misc.py", line 36, in web_search_by_type
    return await request('GET', url=api["url"], params=params)
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\bilibili_api\utils\network.py", line 111, in request
    async with session.request(**config) as resp:
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\client.py", line 1117, in __aenter__
    self._resp = await self._coro
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\client.py", line 520, in _request
    conn = await self._connector.connect(
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\connector.py", line 535, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\connector.py", line 890, in _create_connection
    _, proto = await self._create_proxy_connection(req, traces, timeout)
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\connector.py", line 1073, in _create_proxy_connection
    transport, proto = await self._create_direct_connection(
  File "D:\Program Files\anaconda3\envs\autopub\lib\site-packages\aiohttp\connector.py", line 1011, in _create_direct_connection
    raise ClientConnectorError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host {proxy}:80 ssl:default [getaddrinfo failed]
    proxypool='https://proxypool.scrape.center/random'

    proxy = requests.get(proxypool).text
    print(proxy,'========')
    settings.proxy = "http://{proxy}" # 里头填写你的代理地址
    r = await misc.web_search_by_type(k,'video')

提问:动态评论发不出去

Python 版本: 3.10

模块版本: x.x.x

运行环境: Windows / Linux / MacOS


资源类型改成VIDEO,oid改成某某av号是能成功的,但是评论动态不行。(oid填的是动态页的t.bilibili.com/和?spm_id_from...之间的一串数,字符串和int值都试过)

报错内容:
接口返回错误代码:-404,信息:啥都木有。
{'code': -404, 'message': '啥都木有', 'ttl': 1, 'data': None}

代码内容:
#coding=gbk
from bilibili_api import login, user, sync,comment
print("请登录:")
credential = login.login_with_qrcode()
try:
credential.raise_for_no_bili_jct() # 判断是否成功
credential.raise_for_no_sessdata() # 判断是否成功
except:
print("登陆失败。。。")
exit()
print("欢迎,", sync(user.get_self_info(credential))['name'], "!")

text=r"text"

async def main():
c = await comment.send_comment(text=text,oid='xxx' ,type_=comment.CommentResourceType.DYNAMIC,credential=credential)
print('success')
sync(main())

[BUG] 获取某些番剧时,KeyError: up_info

Python 版本: 3.10

**模块版本:latest

运行环境: Windows / Linux

模块路径: bilibili_api.bangumi

解释器(Python): pypi

from bilibili_api import bangumi
b = bangumi.Bangumi(media_id=1635, credential=credential)

KeyError: up_info

`获取专栏内容并转换为 Markdown` 存在BUG

Python 版本: 3.x
运行环境: Windows

from bilibili_api import article, sync

async def main():
    ar = article.Article(14693531)

    await ar.fetch_content()

    with open('article.md', 'w', encoding='utf8') as f:
        f.write(ar.markdown())

sync(main())

比如抓取14693531这篇文章,地址:https://www.bilibili.com/read/cv14693531/?from=readlist ,引用内容和引用间内容会丢失。
抓取其他文章时,出现引用内容后的一部分正文内容,也会被转为引用

【公告】bilibili_api PyInstaller 打包相关

bilibili_api 在 pyinstaller 打包的时候需要把许多的数据(如分区数据、API 数据)打进 exe 文件里面,目前 setup.py 已经添加了在 Pyinstaller 打包的时候自动把 bilibili_api 的相关文件打包进去的功能。

如果你在运行打包后的 exe 程序时出现:'NoneType' object is not subscriptable,则代表 bilibili_api 的数据没有打包进去。请按照如下步骤解决:

    1. 找到你的 python 模块目录(dist-packages 目录或 site-packages 目录)
    1. python 模块目录/PyInstaller/hooks 下新建文件 hook-bilibili_api.py
    1. hook-bilibili_api.py 文件中写入:
from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files("bilibili_api")

执行完以下步骤一般就能解决问题了。如果你的问题仍然没有解决,请发出你的 exe 文件的错误, PyInstaller 日志, 以便解决问题。

【提问】video_uploader超出当前可用分p视频数上限

Python 版本: 3.10.3

模块版本: 9.1.0

运行环境: Windows / Linux


使用VideoUploader传入了多个VideoUploaderPage对象时在提交视频时失败,提示超出当前可用分p视频数上限,请问分p这一块是有什么限制吗

pages = []
for filename in os.listdir(dirname):
    filepath = os.path.join(dirname, filename)
    page = video_uploader.VideoUploaderPage(filepath, meta['title'], meta['desc'])
    pages.append(page)
uploader = video_uploader.VideoUploader(pages=pages, meta=meta, credential=myCredential)
await uploader.start()

【提问】关注直播间提示/快速搜索功能

Python 版本: 3.10

模块版本: x.x.x (PYTHON/JS&TS)

运行环境: Windows /

输出
{'room_display_id': 21409991, 'room_real_id': 2199971, 'type': 'DANMU_MSG', 'data': {'cmd': 'DANMU_MSG', 'info': [[0, 1, 25, 16777215, 1659962555600, 124775867, 0, '178d1d3f', 0, 0, 0, '', 0, '{}', '{}', {'mode': 0, 'show_player_type': 0, 'extra': '{"send_from_me":false,"mode":0,"color":16777215,"dm_type":0,"font_size":25,"player_mode":1,"show_player_type":0,"content":"cddrjgtfj","user_hash":"395124031","emoticon_unique":"","bulge_display":0,"recommend_score":0,"main_state_dm_color":"","objective_state_dm_color":"","direction":0,"pk_direction":0,"quartet_direction":0,"anniversary_crowd":0,"yeah_space_type":"","yeah_space_url":"","jump_to_url":"","space_type":"","space_url":""}'}, {'activity_identity': '', 'activity_source': 0, 'not_show': 0}], 'cddrjgtfj', [291426330, '残存の影子', 0, 0, 0, 10000, 1, ''], [15, '旅行', '地球频道', 9196015, 12478086, '', 0, 12478086, 12478086, 12478086, 0, 1, 290515513], [10, 0, 9868950, '>50000', 1], ['', ''], 0, 0, None, {'ts': 1659962555, 'ct': 'CB0A8807'}, 0, 0, None, None, 0, 210]}}
但是我希望能输出
残存の影子说:cddrjgtfj

获取用户关注列表和粉丝列表的两个建议

感谢继续维护开发这个项目啊,好用,提个功能上的建议

  1. 另一个获取关注列表的接口
    接口参考 SocialSisterYi/bilibili-API-collect#521
    此接口的好处是可以获取到隐藏关注列表的用户的关注,不知道是否长期有效。
    可以考虑优先用原接口,如果检测到用户设置了隐藏,就根据get_followings的参数是否用第二个接口再次尝试。

  2. user模块get_followings和get_followers需要ps参数
    虽然只能获取到前5页,不过ps参数决定每页返回的用户数目,所以最多可以返回5*50=250个用户。
    不加ps参数的话,只能获取到100个。
    同时,get_all_followings里面也可以改一下

【提问】直播弹幕类接口可能有问题

Python 版本: 3.8

模块版本: 12.5.2

运行环境: Linux


今天在使用LiveDanmuku时突然发现卡在了获取真实房间号 stderr.log:
[2022-10-08 13:12:40,289][WARNING]创建主数据库容器成功
[2022-10-08 13:12:40,718][WARNING]创建缓存数据库容器成功
[2022-10-08 13:12:40,784][WARNING]获取用户-----------会话成功
[-----------][2022-10-08 13:12:40,790][INFO] 准备连接直播间 --------
[-----------][2022-10-08 13:12:40,791][DEBUG] 正在获取真实房间号

在怀疑是不是存在接口更新导致失效,还是说ip被墙这种,但是测试过的其他api一律有效,唯独卡死在这里的获取。

【需求】封装下载器

没用过ASync IO, 先放个需求在这。 等整明白了我看看能不能自己实现再PR过来

需求

  • 封装API成一个下载器, 提供类似DownloadUID DownloadTag 之类的接口函数和下载回调
  • 下载回调提供默认的aria2 RPC接口实现(aria2有Py封装)
  • 封装下载器成独立命令行工具, 工具读取JSON配置并尝试下载

【建议】贴个赞赏码出来

要做个项目 找到了MoyuScript/bilibili-api,看到已经不维护了 心里凉凉,又发现这个项目,希望能维护下去,贴个赞赏码出来表示下支持。

【提问】关于添加创作激励稿件收入接口

Python 版本: 3.9

模块版本: 12.1.0

运行环境: Windows


假设我想添加一个接口用于获取创作激励的稿件收入信息,我应当将其加入User类吗?还是应该将创作中心相关接口单独作为一个模块?

【建议】ResponseCodeException未能返回全部有效信息

在测试submit_subtitle这个函数时,网页会返回一些错误原因,但是ResponseCodeException并没有提取/返回所有有效信息,导致排查困难。
比如,经常收到报错:

接口返回错误代码:79014,信息:字幕超过限制。

但是网页返回的其实包含了其他有效信息:

{'code': 79014, 'message': '字幕超过限制', 'ttl': 1, 'data': [{'line': 580, 'error_msg': '字幕时间点超过视频时间长度'}]}

在代码中如果加上self.raw就可以返回全部信息。

class ResponseCodeException(ApiException):
"""
API 返回 code 错误。
"""
def __init__(self, code: int, msg: str, raw: dict = None):
"""
Args:
code (int): 错误代码。
msg (str): 错误信息。
raw (dict, optional): 原始响应数据. Defaults to None.
"""
super().__init__(msg)
self.msg = msg
self.code = code
self.raw = raw
def __str__(self):
return f"接口返回错误代码:{self.code},信息:{self.msg}。"

另外,关于字幕的操作,目前只有提交字幕这一个api,是否可以增加其他操作字幕的api,比如查看/退回/删除等
感谢!

【需求】添加检测 Cookies 是否有效功能

需求原因

b站 cookies 可能因超过时限、退出登录等原因失效,需要及时检测重新登陆。

实现方法

https://api.bilibili.com/x/web-interface/nav 发送 Get 请求,若 resp['code'] 值为 0 ,则登陆有效,反之失效。

【提问】有尝试过分析哪种调用可以保证每天自动登录(即获取1硬币)吗?

Python 版本: All

模块版本: All

运行环境: All


我此前长期使用的方式是携带着Cookies然后使用selenium打开主页维持一段时间(但是拒绝一切的图像文件啥的接受)。然后重保存整个Cookies的。因为懒所以一直没分析过具体会是api还是主页的请求本身是一个动态页面,导致在获取template的同时就更新该会话的登录状态,还是因为发送了某个心跳请求,或是登录接口本身做校验。
简而言之,我需要最小化自动登录(签到)的手续(对于Cookies的有效性校验我有方法,但是自动登录经过上次有出错的前提下我不保证一定成功,因此废弃该方案,但凡Cookies失效就拉Error,主动更新一遍Cookies)。

【需求】考虑 Bangumi 模块对部分特殊番剧的基本信息获取适配

Traceback (most recent call last):
.................
    ep = bangumi.Episode(675686)
  File "/home/xxx/miniconda3/envs/biliMonitor/lib/python3.8/site-packages/bilibili_api/bangumi.py", line 212, in __init__
    raise ApiException("未找到番剧信息")
bilibili_api.exceptions.ApiException.ApiException: 未找到番剧信息

问题描述

在对特殊类型,如ep675686进行

ep = bangumi.Episode(675686)
print(ep.get_aid())

会发生 404 错误

测试例

from bilibili_api import bangumi, sync
from bilibili_api.bangumi import Bangumi
async def main():
    ep = bangumi.Episode(675686)
    # 打印 bv 号674245
    print(ep.get_aid())
sync(main())

ep 对应页面不可访问,match取空

pattern = re.compile(r"window.__INITIAL_STATE__=(\{.*?\});")
match = re.search(pattern, content)

但是请观察以下 Api
原始Api
子Api

利用子 Api ,不可访问的 ep 剧集 所属番剧信息也是可以得到的,是否可以改善 Bangumi ?

【提问】直播间礼物统计方法

请问我想要输出"谢谢熱血赠送的2个辣条、1个PK票",该如何操作?
@room.on('COMBO_SEND')经常触发不动
@room.on('SEND_GIFT')不支持数量统计
`

from bilibili_api import live, sync
room = live.LiveDanmaku(2xxxx)
@room.on('SEND_GIFT')
async def on_gift1(event):
    礼物名=event['data']['data']['giftName']
    送礼人=event['data']['data']['uname']
    礼物数 = event['data']['data']['num']
    print(送礼人+礼物名+str(礼物数))
sync(room.connect())

`
具体要求:
1收到礼物后观察n秒,假如n秒内没有收到同一用户的礼物,就print()
2如果在观察的时候再次收到该用户礼物,则重置观察时间(再观察n秒),循环直到执行1
3不同用户的礼物互不干扰,每位用户的观察时间独立
4同一用户多个礼物可以合并一起输出
思考:
1while循环:浪费资源,堵住线程
2新建线程:目标3可能会有问题
3批量创建线程,一位用户一个线程去观察:不会......没找到代码实现方法
全局变量
主线程 子线程
发现礼物创建子线程----------------------------计时n秒
发现礼物,礼物数+x,重启子线程----------------计时n秒
发现礼物,礼物数+x,重启子线程----------------计时n秒
n秒了还没礼物----------------------------------print,结束子线程

【漏洞】{音频区文件获取报错}

Python 版本:3.10.6 / NodeJS 版本:16

模块版本: python(python/JS&TS)

运行环境: Linux

模块路径: `bilibili_api.audio, sync, get_session

解释器(Python): cpython

报错信息:

AttributeError: 'bytes' object has no attribute 'read'```

**报错代码:**

这里填写报错代码


---

chunk = await resp.content.read(1024)

【漏洞】登录接口可能存在新的问题

Python 版本: 3.8

模块版本: 12.5.0

运行环境: Linux

模块路径: bilibili_api.login

解释器(Python): cpython

报错代码:

def login_with_sms(phonenumber: PhoneNumber, code: str):
    """
    验证码登录

    Args:
        phonenumber(string): 手机号类
        code(string)       : 验证码

    Returns:
        Credential: 凭据类
    """
    global captcha_id
    sess = get_session()
    api = API["sms"]["login"]
    if captcha_id == None:
        raise LoginError("请申请或重新申请发送验证码")
    return_data = json.loads(
        sync(
            sess.request(
                "POST",
                url=api["url"],
                data={
                    "tel": phonenumber.number,
                    "cid": phonenumber.code,
                    "code": code,
                    "source": "main_web",
                    "captcha_key": captcha_id,
                    "keep": "true",
                },
            )
        ).text
    )
    if return_data["code"] == 0:
        captcha_id = None
        url = return_data["data"]["url"]
        cookies_list = url.split("?")[1].split("&")
        sessdata = ""
        bili_jct = ""
        dede = ""
        for cookie in cookies_list:
            if cookie[:8] == "SESSDATA":
                sessdata = cookie[9:]
            if cookie[:8] == "bili_jct":
                bili_jct = cookie[9:]
            if cookie[:11].upper() == "DEDEUSERID=":
                dede = cookie[11:]
        c = Credential(sessdata, bili_jct, dedeuserid=dede)
        return c
    else:
        raise LoginError(return_data["message"])

当触发安全机制时,其中return_data返回的是:

{'is_new': False, 'status': 5, 'message': '安全风险控制', 'url': '***', 'hint': '', 'in_reg_audit': 0, 'refresh_token': '', 'timestamp': 0}

即使return_data["code"] == 0
修复建议:
对return_data的status进行校验,以抛出异常。或者安全风险控制有进一步进行修正的登录过程。

【漏洞】导入了未依赖的包

Python 版本: 3.10.4

模块版本: 10.0.1

运行环境: Kubuntu 22.04 LTS

模块路径: bilibili_api.user

报错信息:

Traceback (most recent call last):
  File "<unrelated>.py", line 8, in <module>
    from bilibili_api.user import User, BangumiType
  File "<unrelated>/.venv/lib/python3.10/site-packages/bilibili_api/user.py", line 11, in <module>
    from pytest import param
ModuleNotFoundError: No module named 'pytest'

https://github.com/Nemo2011/bilibili_api/blob/9d02c3fa881ea307db99d25b2c7cfe989f063d95/bilibili_api/user.py#L11

requirements.txt 中没有依赖 pytest 但仍导入导致报错。(而且导入之后并未使用)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.