基于规则引擎与LLM的B站关注列表智能分类实践
1. 项目概述:一个更聪明的B站关注管理方案
如果你在B站关注了成百上千位UP主,每次想找特定内容都得在关注列表里大海捞针,或者B站自带的那个手动分组功能让你感到效率低下,那么这个项目可能就是为你准备的。我最近在打理自己的B站账号时,发现关注列表已经臃肿不堪,游戏、科技、生活、知识区的内容全都混在一起。B站提供的分组功能基本等于手动贴标签,对于几百个关注来说,工作量巨大且分类标准难以统一。于是,我找到了一个名为sunrisever/bilibili-follow的开源工具,它提供了一套本地化、可规则定制、并能借助外部大语言模型(LLM)辅助决策的关注列表管理流水线。简单说,它能把你的关注列表“倒出来”,用你设定的规则自动分好类,再把分类结果同步回B站的分组里。
这个项目的核心价值在于,它没有试图重新发明轮子去内置一个可能效果一般的AI模型,而是巧妙地结合了本地规则引擎和外部强大模型的审查能力。你完全掌控分类规则,对于模糊不清的“边缘案例”,则可以请ChatGPT、Claude这类模型帮你参谋。最终,一个清晰、可维护的关注分组体系就自动在B站后台建立起来了。接下来,我会详细拆解整个流程,从环境准备、数据抓取、规则编写,到与AI协作以及最终同步,分享我实际操作中的每一步细节和踩过的坑。
2. 核心工作流与设计思路拆解
2.1 为什么不用B站自带分组?
B站的分组功能本质上是一个手动标签系统。你需要点击每个UP主,然后从下拉菜单中为其分配一个分组。对于几十个关注尚可忍受,但一旦数量上百,这就变成了一项繁琐且容易出错的体力活。更关键的是,它缺乏智能性:你无法基于UP主的投稿内容、签名、标签等公开信息进行批量、自动化的分类。这个项目正是为了解决这两个痛点:自动化和智能化。
2.2 项目核心四步走
整个工具的设计遵循一个清晰的管道(Pipeline)模式,我将其理解为四个核心阶段:
- 数据导出(Fetch):工具通过B站API,使用你的登录凭证(Cookies),将你关注的所有UP主的公开数据抓取到本地。这些数据包括UID、昵称、签名、认证信息、标签、粉丝数等,存储为结构化的JSON文件。
- 本地分类(Classify):这是核心环节。你需要预先在
classify_rules.json文件中定义好你的分类体系(例如“科技数码”、“游戏解说”、“生活Vlog”、“知识科普”)以及对应的匹配规则。规则通常基于关键词(在签名、标签中匹配)或UP主属性(如认证类型)。工具会读取这些规则,对导出的UP主数据进行遍历和匹配,生成初步的分类结果。 - AI辅助审查(Review):上一步的纯规则匹配必然会产生误判或难以判定的“边缘案例”。项目建议将分类结果输出为一份人类可读的Markdown摘要文件。你可以将这份文件直接丢给ChatGPT、Claude等模型的网页版或应用,让它帮你审查哪些分类可能不合理,哪些规则需要优化。这一步是“智能化”的关键,利用了外部模型强大的自然语言理解和推理能力。
- 同步回写(Sync):在确认分类结果无误后,工具会调用B站API,在你的账号下创建对应的分组(如果不存在),并将UP主移入相应的分组中。为了安全起见,务必先使用
--dry-run参数进行“干跑”,预览将要执行的操作,确认无误后再执行真正的同步。
这个设计的精妙之处在于责任分离:繁重的、可规则化的批量操作由本地脚本完成;而需要人类判断力或高级认知能力的模糊决策,则外包给更专业的AI模型。你作为用户,是整个过程的总指挥和最终决策者。
2.3 技术栈与依赖解析
项目使用Python编写,依赖相对轻量。核心依赖库通常是requests用于网络请求,json用于数据处理。它本质上是一个与B站Web端API交互的脚本集合。这意味着你不需要复杂的编程环境,只需要一个能运行Python 3.6+ 的环境即可。
注意:项目明确说明,默认工作流不需要任何付费API密钥。与AI的交互是通过你手动复制粘贴Markdown内容到ChatGPT等工具的Web界面完成的。这极大地降低了使用门槛和成本。只有当你希望实现“全自动流水线”(即脚本自动调用OpenAI API等)时,才需要配置API密钥,但这属于高级用法。
3. 从零开始的详细实操指南
3.1 环境准备与项目初始化
首先,你需要将项目代码克隆到本地。假设你已安装Git和Python。
# 克隆项目 git clone https://github.com/sunrisever/bilibili-follow.git cd bilibili-follow # 安装依赖 pip install -r requirements.txt安装完成后,检查requirements.txt内容,通常核心就是requests。如果安装缓慢,可以考虑使用国内镜像源,例如pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。
接下来是准备数据目录。项目提供了一个示例配置文件夹。
# 复制示例数据目录 cp -r data_example data现在,你的工作目录下会有一个data文件夹,里面包含config.json和classify_rules.json等关键文件的模板。
3.2 获取并配置B站Cookies(关键步骤)
这是整个流程中唯一稍显复杂但至关重要的一步。工具需要你的B站登录状态来访问API。这些信息以Cookies的形式存在。
登录B站:用浏览器打开
www.bilibili.com并登录你的账号。打开开发者工具:按
F12或右键“检查”,打开开发者工具。找到Cookies:切换到
Network(网络)标签页。刷新页面,在请求列表中找到任意一个www.bilibili.com的请求(通常是第一个document类型)。点击该请求,在右侧Headers(标头)选项卡中,向下找到Request Headers(请求标头)部分的cookie:字段。提取关键字段:在长长的cookie字符串中,你需要找到以下几个关键字段的值:
SESSDATAbili_jct(有时也叫csrf)buvid3DedeUserID它们的格式类似SESSDATA=abcdefg%2C1234567890; bili_jct=abc123def456; ...。
填写配置文件:用文本编辑器打开
data/config.json文件。你会看到如下结构:{ "cookies": { "sessdata": "", "bili_jct": "", "buvid3": "", "dedeuserid": "" }, "http_proxy": "", "https_proxy": "" }将上一步提取到的值(不包括键和等号)分别填入对应的空字符串中。例如,如果
SESSDATA=abcde12345,那么就在"sessdata": "abcde12345"。http_proxy和https_proxy如果你在国内直连B站,通常留空即可。
实操心得:
- 安全警告:Cookies等同于你的登录凭证,切勿泄露给他人。
config.json文件应妥善保管,最好加入.gitignore避免误提交。- 有效期:
SESSDATA等Cookie有过期时间(通常几个月)。如果后续脚本报错提示“未登录”或“权限错误”,第一件事就是检查并重新获取、更新Cookies。- 精确复制:复制值时注意不要带入多余的空格或引号。一个验证方法是,填好后可以尝试用
python -c "import json; print(json.load(open('data/config.json'))['cookies']['sessdata'][:10])"快速打印前几个字符,确认读取无误。
3.3 设计你的分类规则体系
在运行脚本前,需要规划好你想怎么分。打开data/classify_rules.json,其结构决定了分类逻辑。
一个典型的规则文件如下所示:
{ "categories": { "科技数码": { "keywords": ["科技", "数码", "手机", "电脑", "硬件", "软件", "评测", "开箱", "Apple", "小米"], "must_have_tags": [], "exclude_keywords": ["美食"], "official_verify": -1 }, "游戏区": { "keywords": ["游戏", "攻略", "实况", "电竞", "Steam", "单机", "手游", "原神", "LOL"], "must_have_tags": [], "exclude_keywords": ["音乐"], "official_verify": -1 }, "生活娱乐": { "keywords": ["生活", "Vlog", "日常", "美食", "旅行", "搞笑", "音乐", "舞蹈", "时尚"], "must_have_tags": [], "exclude_keywords": ["编程"], "official_verify": -1 }, "知识学习": { "keywords": ["知识", "科普", "学习", "教程", "历史", "财经", "编程", "Python", "英语", "考研"], "must_have_tags": [], "exclude_keywords": ["鬼畜"], "official_verify": -1 }, "未分类": { "keywords": [], "must_have_tags": [], "exclude_keywords": [], "official_verify": -1 } }, "priority": ["科技数码", "游戏区", "生活娱乐", "知识学习", "未分类"], "default_category": "未分类" }字段解析与配置技巧:
categories: 定义每个分类及其匹配规则。keywords:核心字段。列表中的关键词会在UP主的**签名(sign)和标签(tags)**中进行搜索匹配。匹配逻辑通常是“或”(OR),即命中任一关键词即视为匹配。关键词设置需要一定的技巧性,既要覆盖全面,又要避免误伤。must_have_tags: 留空即可,或用于更严格的匹配(要求UP主标签必须包含列表中的所有项)。exclude_keywords: 排除关键词。如果一个UP主虽然命中了本类的keywords,但其信息中也包含排除词,则不会被分入此类。用于处理歧义,例如“美食”UP主可能也有“生活”标签,但你不希望“科技”类关键词误匹配到“美食”。official_verify: UP主认证类型。-1表示不限制。0为个人,1为机构。你可以利用此字段,例如将“新闻”类只分给认证机构。
priority:匹配优先级列表。这是关键!分类引擎会按照这个列表的顺序,对每个UP主依次尝试匹配。一旦某个分类的规则匹配成功,就会将该UP主归入此类,并停止后续规则的尝试。因此,你需要把规则最具体、最明确的类别放在前面,把范围较广的类别放在后面。例如,“编程教学”应该放在“知识学习”前面,否则所有编程UP主都会被“知识学习”的宽泛关键词先捕获。default_category: 所有规则都无法匹配的UP主,最终归宿。
注意事项:
- 规则冲突:由于优先级机制,规则设计不当会导致分类错误。务必仔细规划
priority顺序。- 关键词选择:初期建议关键词宽泛一些,先跑一遍看看结果。可以从UP主的签名、标签中提取高频词。避免使用过于常见的字眼,如“的”、“了”。
- “未分类”兜底:一定要设置一个“未分类”类别,用于收纳所有无法自动归类的UP主,这些将是后续AI审查的重点对象。
3.4 执行数据抓取与本地分类
配置好Cookies和规则后,就可以开始运行了。
第一步:抓取关注列表数据
python fetch.py all这个命令会开始从B站API拉取你所有关注UP主的详细信息。根据关注数量多少,可能需要几十秒到几分钟。完成后,在data目录下会生成一个up主详细数据.json文件。你可以打开它粗略查看,里面包含了每个UP主的丰富信息,是后续分类的基础。
第二步:执行本地规则分类
python classify.py脚本会读取up主详细数据.json和你的classify_rules.json,开始进行分类。运行结束后,会生成两个重要文件:
data/分类结果.json: 机器可读的最终分类映射,格式如{"UP主UID": "分类名称", ...}。data/分类结果.md:人类/AI可读的详细摘要。这个文件是下一步的核心。
打开分类结果.md,你会看到类似这样的内容:
# 分类结果摘要 ## 科技数码 (15人) - **老师好我叫何同学** (UID: 163637592) - 签名:... 标签:数码、科技、摄影... - **影视飓风** (UID: 168598) - 签名:... 标签:影视、器材、评测... ... ## 游戏区 (32人) ... ## 未分类 (8人) - **张三的日常** (UID: 123456) - 签名:一个快乐的沙雕 标签:生活、搞笑 - **李四讲历史** (UID: 234567) - 签名:读史明智 标签:历史、读书 ...这份文件清晰地列出了每个分类下有哪些UP主,以及他们的关键信息。未分类列表就是你接下来需要处理的“疑难杂症”。
3.5 引入AI进行辅助审查与优化
这是体现项目“智能”的一环。你不需要在代码里集成任何API,只需手动操作。
- 打开AI工具:访问ChatGPT、Claude、文心一言、通义千问等任意你常用的大语言模型Web界面或应用。
- 提交内容:将
data/分类结果.md文件的内容全部复制粘贴到AI的对话框中。 - 提出审查请求:向AI发出明确的指令。例如:
“以下是我根据关键词规则对B站关注UP主进行的自动分类结果。请帮我审查:
- 明显的错误分类:有没有哪个UP主被分到了明显不合适的类别里?请指出并说明理由。
- 规则优化建议:针对‘未分类’列表中的UP主,根据他们的签名和标签,你认为他们应该属于哪个现有类别?或者需要新增什么类别?
- 关键词建议:为了更准确地进行自动分类,你认为我应该在各类别的关键词列表中增加或删除哪些词语?”
- 分析AI反馈:AI会基于其强大的语义理解能力,给出分析。它可能会指出:“‘张三的日常’虽然标签有‘生活’,但其内容多为搞笑段子,建议放入‘生活娱乐’而非‘未分类’。”或者“‘李四讲历史’明显属于‘知识学习’,你的‘知识学习’类别关键词中应加入‘历史’。”
- 迭代优化规则:根据AI的建议,回头修改
data/classify_rules.json。- 调整
keywords列表。 - 调整
priority顺序。 - 甚至新增或删除类别。
- 调整
- 重新分类验证:修改规则后,再次运行
python classify.py,生成新的分类结果.md。可以再次请AI审查,直到你对自动分类的准确率满意为止。通常经过2-3轮迭代,准确率会达到一个很高的水平。
实操心得:
- 提问技巧:给AI的指令越具体,得到的反馈越有价值。直接问“哪里不对”可能得到泛泛之谈,而指定审查“未分类”列表和“错误分类”,则能获得针对性建议。
- 成本与效率:使用Web版模型通常是免费的(有次数限制),完全足够个人使用。这比调用API更经济,且交互性更强,你可以连续追问。
- 最终决策权在你:AI只是参谋。它可能因为不了解某个小众领域UP主而给出错误建议。你需要结合自己的知识做最终判断。例如,AI可能不知道“老番茄”是游戏区UP主,因为他的签名里没有“游戏”二字。
3.6 安全同步与分组回写
在确认分类结果令人满意后,就可以准备同步到B站了。安全第一,务必先干跑!
第一步:干跑预览
python sync_groups.py --dry-run这个命令会模拟整个同步过程:检查你的B站账号现有分组,对比本地分类结果,计算出需要创建哪些新分组、将哪些UP主移动到哪个分组。它不会执行任何实际的写操作,只会将计划要执行的操作打印到终端。
仔细阅读干跑输出,确认:
- 将要创建的分组名称是否正确(注意:B站分组名不能包含
/等特殊字符)。 - 每个UP主的移动操作是否符合你的预期。
- 是否有任何警告或错误信息(如Cookie失效、API限制等)。
第二步:执行同步
如果干跑结果一切正常,就可以执行真正的同步了。
python sync_groups.py脚本会开始调用B站API,执行分组创建和UP主移动操作。根据UP主数量,这个过程可能需要一段时间。同步完成后,你可以立即刷新B站网页版或App的“关注”页面,在分组筛选栏里,应该就能看到新建的、并且已经填充好UP主的分组了。
重要警告:
- 网络与权限:同步过程依赖于网络和有效的Cookies。如果中途失败,可以重新运行
sync_groups.py,脚本通常设计为幂等的(重复执行效果相同)。- 分组数量限制:B站对单个用户的分组数量可能有上限(通常是几十个),请勿创建过多分组。
- 操作不可逆:虽然你可以手动在B站界面再改回来,但批量移动仍是一个严肃操作。确保
分类结果.json是你最终想要的状态。
4. 长期维护与进阶技巧
4.1 日常维护流程
首次全量分类同步后,你后续新关注UP主,不需要再从头跑一遍全流程。项目提供了增量更新的思路。
- 获取新关注UP主的UID:当你新关注一个UP主时,记下他的UID(在UP主主页网址中
/space.bilibili.com/后面的数字)。 - 增量添加与分类:运行项目可能提供的增量脚本(如示例中的
python add_new.py <mid>,需确认项目实际支持),或手动将该UID添加到某个数据文件中,然后重新运行classify.py。更简单的方法是,定期(如每月)重新运行一次python fetch.py all抓取最新全量数据,再分类、审查、同步。由于脚本的同步操作是增量的,只会更新有变化的部分,因此不会造成重复劳动。
4.2 规则文件的高级玩法
- 基于粉丝数的分类:你可以修改分类脚本,在规则中增加对
fans(粉丝数)字段的判断。例如,创建一个“潜力新人”类别,规则为fans < 10000。 - 多重条件组合:虽然默认规则文件可能只支持关键词和认证,但你可以修改
classify.py的逻辑,实现更复杂的规则,例如(keywords匹配) AND (粉丝数 > X) AND (认证类型 = 个人)。 - 外部数据源:理论上,你可以结合其他数据源(如UP主的近期视频标题、简介)来丰富分类依据,但这需要更复杂的爬虫和文本分析。
4.3 故障排查与常见问题
Q1: 运行fetch.py时报错,提示“登录失败”或“Cookie无效”。A1:这是最常见的问题。99%的原因是Cookies过期或填写错误。请重新按照3.2节的步骤获取最新的Cookies并更新config.json。确保没有多余的空格,值填写正确。
Q2:classify.py运行后,未分类里人数非常多。A2:这说明你的分类规则keywords覆盖度不够。打开未分类的UP主列表,观察他们的签名和标签,提取高频词,补充到相应类别的keywords中。利用AI分析未分类列表是最高效的方法。
Q3: 某个UP主被分错了类别。A3:有两种解决方法: 1.优化规则:检查该UP主被误分到的类别,在其exclude_keywords中添加能唯一标识该UP主但不应属于该类别的词。同时,检查该UP主正确类别的keywords,确保包含了能匹配到他的词。调整priority顺序也可能解决。 2.手动覆盖:更直接的方法是,在分类结果.json文件中,手动找到该UP主的UID行,将其对应的分类名称改为正确的。然后直接运行sync_groups.py同步即可。这相当于一次手动修正。
Q4: 执行sync_groups.py时速度很慢或部分失败。A4:B站API可能有频率限制。脚本中应该已经加入了适当的延时(如time.sleep)。如果遇到429(请求过多)错误,需要增加请求间隔。检查脚本中关于延时的配置项。对于大批量UP主,同步过程本身就需要较长时间,请耐心等待。
Q5: 分组名含有非法字符导致同步失败。A5:B站分组名不允许包含/、\、?等字符。请确保classify_rules.json中定义的分类名称是纯文本,不含特殊符号。
4.4 项目文件职责梳理
为了更清晰地管理,这里再次总结核心文件的作用:
| 文件路径 | 核心作用 | 是否需频繁修改 |
|---|---|---|
data/config.json | 存储B站登录Cookies和网络代理配置。 | 仅在Cookie过期时修改。 |
data/classify_rules.json | 核心,定义你的分类体系、匹配规则和优先级。 | 在优化分类效果时需要反复修改。 |
data/up主详细数据.json | 由fetch.py生成,存储所有关注UP主的原始数据。 | 自动生成,无需手动修改。 |
data/分类结果.json | 由classify.py生成,存储UID到分类名的最终映射。 | 自动生成,可作为手动修正的入口。 |
data/分类结果.md | 由classify.py生成,用于人工和AI审查的友好报告。 | 自动生成,是AI交互的桥梁。 |
fetch.py | 抓取数据的脚本。 | 直接运行。 |
classify.py | 执行分类的脚本。 | 直接运行,其逻辑由规则文件控制。 |
sync_groups.py | 执行同步的脚本。 | 直接运行,务必先--dry-run。 |
整个流程走下来,你会发现这个项目提供了一个极其灵活和强大的框架。它将繁琐的批量操作自动化,将困难的判断问题外包给顶尖的AI,而你将精力集中在最高效的环节——定义规则和做最终决策。经过这样一番打理,你的B站关注列表将从一团乱麻变得井井有条,无论是想找特定内容还是回顾订阅,效率都会大大提升。这不仅仅是整理了一个列表,更是为你自己的信息输入源做了一次高质量的“数据治理”。
