1. 项目概述与核心价值作为一个长期混迹于B站的内容创作者和重度用户我经常需要追踪一批UP主的更新动态。无论是为了学习同行的视频制作技巧还是为了及时获取行业资讯手动一个个去B站主页刷新效率实在太低。市面上虽然有一些聚合工具但要么功能臃肿要么需要复杂的配置要么就是隐私安全让人不放心。于是我决定自己动手用Python写一个轻量、高效、完全掌控在自己手里的B站UP主更新查看器也就是这个Jianguo99/bilibili-update-viewer项目。这个工具的核心目标非常明确让你能通过命令行快速、精准地查看任意B站UP主的最新视频和动态并且支持按用户名搜索和缓存功能避免重复查询。它本质上是一个命令行工具通过调用B站的官方API当然需要你提供自己的登录凭证将UP主的更新信息结构化地呈现在你的终端里。对于像我这样习惯在终端里工作或者希望将UP主更新监控集成到自动化脚本中的开发者来说它非常趁手。它的核心功能围绕三个关键词展开搜索、查看、缓存。你可以直接输入你熟悉的UP主昵称如“影视飓风”来搜索并获取其唯一IDmid你可以指定这个ID来拉取他/她最新发布的视频列表或图文动态你还可以检查他/她今天是否更新了视频。所有查询过的UP主信息都会被自动缓存到本地下次再查时工具会优先从缓存读取速度飞快也避免了给B站服务器带来不必要的请求压力。2. 核心设计与实现思路拆解2.1 为什么选择命令行工具而非图形界面在项目启动前我首先思考了形态问题。图形界面GUI固然直观但开发成本高且不利于自动化集成和远程服务器使用。命令行工具CLI的优势在于轻量与高效无需启动浏览器或桌面应用一个命令就能获取结果非常适合快速查询。易于脚本化与自动化可以轻松地将查询命令写入Shell脚本、Python脚本或者结合Cron定时任务实现定时检查UP主更新并发送通知如邮件、Telegram消息。跨平台与低资源占用只要系统有Python环境就能运行对服务器极其友好。开发与维护简单核心逻辑聚焦于数据处理和API调用无需处理复杂的UI交互和渲染。因此采用命令行交互模式是这个工具能保持简洁和强大扩展性的基石。2.2 技术栈选型Python Requests选择Python作为开发语言几乎是顺理成章的。Python拥有极其丰富的网络请求库如requests和数据处理库如json其简洁的语法能让我们快速实现业务逻辑。requests库相比Python内置的urllibAPI更加人性化处理Cookie、Header、代理等都非常方便是进行Web API调用的不二之选。项目依赖非常简单主要就是requests库。这确保了工具的核心依赖极小安装部署几乎没有障碍。2.3 核心数据流与缓存设计工具的工作流程可以概括为“查询 - 处理 - 展示 - 缓存”。查询用户通过命令行参数指定要查询的UP主通过--search用户名或--mid用户ID和要查看的内容类型视频、动态。处理工具根据参数构造对应的B站API请求。这里有一个关键点B站的大部分API接口都需要用户登录后的Cookie信息才能正常访问尤其是获取动态列表。因此我们需要用户预先配置好自己的B站Cookie。展示工具解析API返回的JSON数据提取出视频标题、链接、发布时间、播放量或动态内容、发布时间等信息并以清晰易读的格式打印到终端。缓存当通过用户名搜索UP主时工具会将“用户名 - mid”的映射关系保存到本地的user_cache.json文件中。下次再搜索同一用户名时直接读取缓存无需再次请求网络极大提升了响应速度并减少了网络请求。这个缓存机制是本工具的一个亮点。它解决了两个痛点一是B站搜索API可能有频率限制频繁搜索同一用户效率低下二是UP主的mid是固定不变的缓存一次即可永久使用除非用户名变更。独立的get_mid.py脚本就是为了快速利用这个缓存而设计的。3. 环境准备与详细配置指南3.1 Python环境搭建工具要求Python 3.9及以上版本。我推荐使用pyenv或conda来管理Python版本这样可以避免污染系统环境。对于新手可以直接从 Python官网 下载安装包。安装后在终端验证版本python3 --version # 或 python --version确保输出为Python 3.9.x或更高。3.2 获取项目代码与安装依赖首先你需要将项目代码克隆到本地。如果你有Git可以直接运行git clone https://github.com/Jianguo99/bilibili-update-viewer.git cd bilibili-update-viewer如果不用Git也可以直接在GitHub项目页面下载ZIP包并解压。进入项目目录后安装所需的Python库。项目依赖列在requirements.txt文件中通常只有requests。pip install -r requirements.txt如果你遇到权限问题可以尝试使用pip3或者加上--user参数安装到用户目录pip3 install --user -r requirements.txt。注意在国内网络环境下使用pip安装可能会很慢或失败。建议配置清华大学的PyPI镜像源。可以临时使用pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple或者永久配置镜像源。3.3 核心配置获取并设置B站Cookie这是整个工具配置中最关键、也最容易出错的一步。因为B站的视频列表、动态等API需要鉴权我们必须提供已登录用户的Cookie。详细获取步骤打开Chrome、Edge或Firefox浏览器访问 bilibili.com 并确保你已经登录了你的B站账号。按键盘上的F12键打开“开发者工具”。点击顶部标签栏的“Network”网络选项卡。在开发者工具打开的状态下刷新一下B站首页按F5或点击刷新按钮。此时“Network”面板会列出很多请求。找到其中任意一个请求通常是第一个www.bilibili.com的文档请求或者任何一个api.bilibili.com的请求点击它。在右侧展开的详情面板中找到“Request Headers”请求头部分。在其中找到Cookie:这一行。后面跟着的一长串字符就是你需要复制的Cookie值。它看起来像这样SESSDATAabcdefg123456; bili_jctxyz789; DedeUserID1234567; ...完整地复制这一长串字符从SESSDATA开始到最后一个分号结束。设置环境变量获取到Cookie后不能直接写在代码里为了安全我们使用环境变量来传递。在Linux/macOS的终端中export BILIBILI_COOKIES你刚刚复制的整段Cookie字符串注意等号两边不能有空格并且Cookie字符串要用单引号或双引号包裹起来因为其中包含特殊字符。在Windows的命令提示符CMD中set BILIBILI_COOKIES你刚刚复制的整段Cookie字符串Windows CMD中如果Cookie字符串含有特殊字符可能也需要引号但通常直接设置也可以在Windows PowerShell中$env:BILIBILI_COOKIES你刚刚复制的整段Cookie字符串重要提示这种方式设置的环境变量只在当前终端会话中有效。关闭终端后下次再打开就需要重新设置。为了方便你可以将export BILIBILI_COOKIES...这行命令添加到你的Shell配置文件如~/.bashrc,~/.zshrc中但请注意这会将你的Cookie明文保存在电脑上存在一定的安全风险。更安全的方式是使用.env文件配合python-dotenv库来管理但原项目为了极简没有采用。你可以根据自身安全需求权衡。4. 工具使用详解与实战案例4.1 主脚本update_viewer.py全参数解析update_viewer.py是整个工具的核心。它提供了灵活的参数组合让你能精确获取想要的信息。基础查询模式你必须提供一种方式来指定要查询的UP主即--mid(用户ID) 和--search(用户名搜索) 二选一。通过用户名搜索UP主并查看信息最常用python3 update_viewer.py --search 影视飓风 --videos --dynamics --count 5--search 影视飓风搜索昵称包含“影视飓风”的UP主。工具会调用B站搜索API返回第一个最匹配的结果并自动将其mid和昵称缓存到user_cache.json。--videos同时请求该UP主的最新视频列表。--dynamics同时请求该UP主的最新动态包括图文、转发等。--count 5指定获取视频和动态的数量各取最新的5条。默认是3条。执行后终端会先显示搜索到的UP主信息UID、昵称然后分别列出最新的视频和动态每条信息包含标题/内容、发布时间、链接BV号或动态ID等。通过已知mid直接查询如果你已经知道UP主的mid例如“影视飓风”的mid是946974可以直接使用这样会跳过搜索步骤更快。python3 update_viewer.py --mid 946974 --videos这条命令只查看该UP主的最新视频。参数组合与简化参数支持简写-s对应--search-v对应--videos-d对应--dynamics-n对应--count。可以不指定内容类型。如果只给了--search或--mid而不加-v或-d工具默认什么也不显示但搜索操作仍会执行并缓存结果。这常用于初次搜索并缓存UP主信息。python3 update_viewer.py -s 老师好我叫何同学 # 仅搜索并缓存不输出视频/动态4.2 缓存工具get_mid.py的妙用当你运行过几次搜索后本地就会生成一个user_cache.json文件。get_mid.py脚本专门用于快速从这个缓存文件中查找UP主的mid。python3 get_mid.py 影视飓风如果缓存中存在“影视飓风”脚本会直接输出其mid例如946974。如果不存在则输出NOT_FOUND。这个脚本在自动化场景中非常有用。例如你可以写一个Shell脚本先调用get_mid.py获取mid如果没找到再调用update_viewer.py --search这样可以最大限度地利用缓存避免不必要的网络搜索。4.3 实战案例监控多个UP主今日是否更新假设我想每天早上一开机就检查我关注的几个科技区UP主比如“影视飓风”、“老师好我叫何同学”、“极客湾”昨天有没有发新视频。我可以编写一个简单的Shell脚本check_update.sh#!/bin/bash # 设置Cookie环境变量如果已在配置文件中设置可省略 export BILIBILI_COOKIES你的Cookie # 定义要检查的UP主列表 up_list(影视飓风 老师好我叫何同学 极客湾Geekerwan) echo B站UP主昨日更新检查 $(date %Y-%m-%d) for up_name in ${up_list[]}; do echo -n 检查 $up_name ... # 首先尝试从缓存获取mid mid$(python3 get_mid.py $up_name) # 如果缓存没有则搜索并获取这里简化处理实际可先搜索一次 if [ $mid NOT_FOUND ]; then # 搜索并缓存这里我们只为了获取mid不输出内容 result$(python3 update_viewer.py --search $up_name 21 | grep -o mid: [0-9]*) mid$(echo $result | cut -d -f2) # 如果还是没获取到跳过 if [ -z $mid ]; then echo 搜索失败跳过 continue fi fi # 获取该UP主最新的一条视频 video_info$(python3 update_viewer.py --mid $mid --videos --count 1 2/dev/null | grep -A1 最新视频 | tail -n1) if [ -n $video_info ]; then # 从输出中提取发布时间假设输出格式包含日期 # 这里需要根据工具的实际输出格式进行解析以下为示例 pub_date$(echo $video_info | grep -o [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}) today$(date %Y-%m-%d) yesterday$(date -d -1 day %Y-%m-%d) if [ $pub_date $today ] || [ $pub_date $yesterday ]; then echo 【有更新】发布时间: $pub_date # 你可以在这里添加更多动作比如用系统通知、发邮件等 else echo 暂无新视频最新: $pub_date fi else echo 获取视频信息失败 fi done这个脚本展示了如何将几个工具组合起来实现一个简单的自动化监控流程。你可以用系统的定时任务如Linux的cron或Windows的任务计划程序来每天定时运行它。5. 核心代码模块解析与自定义扩展5.1 API封装层bilibili_api.py这个文件是工具与B站服务器通信的核心。它封装了网络请求、签名计算WBI签名和具体的API调用。关键函数解析get_wbi_sign(params: dict)B站的部分API如搜索使用了名为“WBI”的签名算法来防止恶意请求。这个函数的作用就是根据B站当前的密钥对请求参数进行签名生成一个w_rid字段。算法大致是对参数按字典序排序后与密钥拼接并进行MD5哈希。这部分代码通常不需要修改除非B站更改了签名算法。search_user(keyword: str)根据关键词搜索用户。它构造搜索URL添加必要的参数和WBI签名发送GET请求并解析返回的JSON数据提取第一个也是最相关的用户的mid和name。get_user_videos(mid: int, pn1, ps3)获取指定UP主的视频列表。参数mid是用户IDpn是页码ps是每页数量。它调用space.bilibili.com/ajax/member/getSubmitVideos这个接口。返回的数据结构包含了视频列表每个视频对象有aid旧版AV号、bvid新版BV号、title、created发布时间戳等字段。get_user_dynamics(mid: int, offset0, need_topFalse)获取指定UP主的动态。这是工具里比较“脆弱”的部分因为B站动态的API接口相对不那么稳定且需要有效的Cookie。它尝试模拟Web端的请求获取动态流。返回的数据是嵌套的JSON需要仔细解析出动态类型视频、图文、转发、内容、发布时间等。如果你想扩展功能比如获取UP主的粉丝数、点赞数或者获取视频的详细统计数据弹幕数、收藏数就需要研究B站的其他API接口并在这个文件中添加对应的函数。查看浏览器开发者工具中“Network”选项卡的XHR请求是寻找API端口的有效方法。5.2 主逻辑层update_viewer.py这个文件处理命令行参数协调各个API函数并控制输出格式。逻辑流程参数解析使用Python内置的argparse库定义和解析命令行参数。环境检查检查BILIBILI_COOKIES环境变量是否已设置如果没有则报错退出。用户识别如果提供了--mid直接使用。如果提供了--search则调用search_user函数。查询前会先检查本地user_cache.json缓存命中则直接使用缓存的mid未命中则请求网络并将结果写入缓存。数据获取与展示如果指定了--videos调用get_user_videos循环打印视频信息。如果指定了--dynamics调用get_user_dynamics解析并打印动态信息。结果输出使用print函数将信息格式化输出到控制台。这里可以自定义输出格式比如使用tabulate库生成更漂亮的表格。缓存机制实现缓存文件user_cache.json是一个简单的JSON字典结构为{用户名1: mid1, 用户名2: mid2, ...}。在search_user函数中请求网络前会先加载这个文件查找获取到新的映射后会更新字典并写回文件。get_mid.py脚本就是直接读取这个文件进行查找。5.3 如何自定义输出格式或添加新功能假设你觉得默认的文字输出不够直观想将结果输出为Markdown表格或者直接生成一个HTML报告。修改输出格式你可以在update_viewer.py中找到打印视频和动态信息的部分通常是循环打印print(...)的地方。将这些print语句替换为构建数据结构如列表的列表的代码然后使用tabulate库进行格式化。首先安装tabulatepip install tabulate然后修改代码from tabulate import tabulate # 假设 video_items 是一个字典列表每个字典包含 title, bvid, pub_date table_data [] for v in video_items: table_data.append([v[title], v[bvid], v[pub_date]]) headers [标题, BV号, 发布时间] print(tabulate(table_data, headersheaders, tablefmtgrid))添加新功能获取UP主基本信息如果你想在查询时顺便显示UP主的粉丝数、签名等信息可以在bilibili_api.py中添加一个新函数get_user_info(mid)调用B站的空间信息接口如https://api.bilibili.com/x/space/acc/info?mid{mid}。在update_viewer.py的参数解析部分添加一个新的选项例如--info。在主逻辑中如果用户指定了--info就调用get_user_info函数并打印结果。6. 常见问题、故障排查与优化建议在实际使用和开发过程中你肯定会遇到一些问题。下面是我踩过的一些坑和解决方案。6.1 Cookie失效或权限不足问题现象运行工具时报错KeyError: data或返回的数据为空或直接返回未登录的错误信息。原因分析这是最常见的问题。B站的Cookie是有有效期的通常一段时间不登录会失效或者你复制的Cookie不完整、格式错误。解决方案重新获取Cookie严格按照第3.3节的步骤重新登录B站并复制全新的Cookie字符串。确保复制的是整个Cookie:头部的值不要遗漏。检查环境变量确保环境变量设置正确。在终端中执行echo $BILIBILI_COOKIESLinux/macOS或echo %BILIBILI_COOKIES%Windows CMD查看输出是否是你复制的长字符串。检查特殊字符Cookie字符串中可能包含、等特殊字符。在设置环境变量时确保使用了引号单引号或双引号将其包裹起来。6.2 搜索不到用户或结果不准问题现象使用--search参数时返回的UP主不是你想要的那个或者返回未找到用户。原因分析B站搜索API返回的是相关性排序的结果第一个不一定精确匹配。UP主可能更改了昵称。搜索关键词不够精确。解决方案使用精确匹配尝试使用UP主昵称的全称或者其昵称中独一无二的部分。手动获取mid直接去B站该UP主的主页URL中通常包含其mid。例如“https://space.bilibili.com/946974”中的946974就是mid。拿到mid后直接使用--mid参数一劳永逸。检查缓存user_cache.json缓存的是最后一次搜索该关键词时匹配到的用户。如果之前匹配错了可以手动编辑这个JSON文件删除错误的条目或者直接清空文件让工具重新搜索。6.3 动态获取失败或数据不全问题现象使用--dynamics参数时没有输出或者输出的动态数量少于预期。原因分析B站动态的API接口比较复杂且可能经常变动。原项目中的get_user_dynamics函数可能只处理了部分类型的动态如视频、图文对于转发、直播等动态可能解析不全或跳过。此外该接口可能有更严格的频率限制或鉴权要求。解决方案更新API逻辑关注B站Web端的变化通过开发者工具抓取新的动态接口请求模仿其参数和头信息更新bilibili_api.py中的get_user_dynamics函数。这是最根本但也最需要动手能力的办法。使用备用方案如果只是关心UP主发布的视频那么--videos参数通常更稳定可靠。动态功能可以作为补充。增加请求间隔在代码中特别是在循环请求动态如果需要翻页时使用time.sleep(1)或更长的间隔避免触发B站的反爬机制。6.4 网络请求超时或频率限制问题现象工具运行缓慢或偶尔出现requests.exceptions.Timeout或ConnectionError。原因分析网络不稳定或者短时间内发送了太多请求被B站服务器暂时限制。解决方案添加重试机制可以使用requests库的适配器或者tenacity库为网络请求添加自动重试逻辑。增加延迟在连续调用多个API例如批量检查多个UP主时在每次请求之间主动添加延迟例如time.sleep(1.5)。使用代理如果你的网络环境访问B站不稳定可以考虑在requests.get()或requests.post()调用中设置proxies参数。6.5 安全与隐私提醒Cookie是最高权限凭证你复制的Cookie代表了你的B站登录态。切勿泄露你的BILIBILI_COOKIES环境变量值或包含它的脚本。任何人拿到这个Cookie都可以在Web端以你的身份进行操作。本地缓存安全user_cache.json文件仅存储用户名和mid的映射不包含敏感信息相对安全。项目代码审计由于工具需要你的Cookie建议你花点时间简单阅读一下bilibili_api.py和update_viewer.py的代码确认它只是向api.bilibili.com等B站官方域名发送请求而没有将你的数据发送到第三方服务器。这是使用任何需要凭证的开源工具的好习惯。7. 进阶玩法与项目扩展思路这个基础工具就像一颗种子你可以根据自己的需求让它生长成不同的形态。1. 打造图形化界面GUI如果你觉得命令行不够友好可以使用tkinter、PyQt或DearPyGui等库为它包裹一个简单的图形界面。界面可以包含一个输入框用来输入UP主名字几个复选框来选择查看视频还是动态一个按钮执行查询一个文本框或表格来展示结果。这可以让工具被更多非技术背景的朋友使用。2. 实现定时监控与通知这是自动化核心场景。结合系统的定时任务如cron和通知工具邮件通知使用Python的smtplib库在发现关注的UP主更新时将视频标题和链接发送到你的邮箱。系统通知在桌面环境下可以使用plyer库触发系统的原生通知。即时通讯推送通过调用Server酱、PushPlus、Telegram Bot等服务的API将更新信息推送到手机。 你可以将第4.3节的Shell脚本改写成更健壮的Python脚本集成这些通知功能。3. 构建Web服务或机器人Web服务使用Flask或FastAPI框架将工具的核心功能封装成HTTP API。这样你就可以通过浏览器访问或者从其他程序远程调用。聊天机器人将工具集成到QQ机器人如go-cqhttp、Discord Bot或Telegram Bot中。在群里发送“查一下影视飓风更新”机器人自动回复最新视频信息。4. 数据持久化与分析修改工具让它将每次查询到的视频更新记录标题、BV号、发布时间、播放量存储到数据库如SQLite或CSV文件中。长期积累后你可以分析UP主的更新频率、视频播放量趋势等这对手帐创作者或市场分析会很有价值。5. 支持多平台监控扩展思路工具的架构是通用的。你可以抽象出一个“平台抽象层”然后为YouTube、抖音等平台实现类似的search_user、get_user_videos函数。这样你就拥有了一个统一的多平台UP主更新监控中心。这个项目的魅力在于它足够简单核心逻辑清晰因此有着极高的可塑性和扩展性。它不仅仅是一个工具更是一个学习网络请求、API调用、数据解析和自动化脚本编写的优秀范例。希望你在使用和改造它的过程中也能享受到动手创造的乐趣。