1. 为什么需要自动化清理B站评论与动态作为一个活跃的B站用户你可能已经积累了成百上千条历史评论和动态。手动删除这些内容不仅耗时耗力还容易遗漏。想象一下你要在手机或电脑上一条一条点击删除这个过程可能需要几个小时甚至几天时间。更糟糕的是B站并没有提供批量删除功能。即使你想清理的内容只有几十条手动操作也会让你抓狂。我曾经尝试手动删除200多条旧评论结果花了整整一个下午眼睛都快看花了。自动化清理的优势显而易见节省时间脚本可以在几分钟内完成可能需要数小时的手动工作避免遗漏确保所有目标内容都被清理干净可重复使用一次编写脚本可以多次运行精准控制可以根据特定条件筛选要删除的内容2. 手动删除的基础方法2.1 网页端手动删除在B站网页版上删除评论的基本步骤是进入我的页面找到动态或评论选项卡逐条定位到要删除的内容点击内容旁边的三个点选择删除选项这个方法最大的问题是效率极低。每删除一条内容页面都需要重新加载而且你无法批量选择多条内容同时删除。2.2 移动端手动删除手机APP上的操作流程类似打开B站APP进入个人中心找到动态或我的评论左滑单条内容点击删除按钮移动端的体验比网页版稍好但仍然无法批量操作。如果你有大量内容需要清理手指可能会抽筋。2.3 手动方法的局限性手动删除存在几个明显缺陷无法批量操作每次只能删除一条内容容易疲劳重复性操作容易导致注意力不集中没有筛选功能无法按时间、关键词等条件筛选要删除的内容容易误删疲劳时可能不小心删除不该删的内容3. 半自动化解决方案生成待删除列表3.1 使用Python收集评论链接这是一个折中的方案先用脚本收集所有要删除的评论链接然后手动访问这些链接进行删除。虽然仍需手动操作但至少不用一条条寻找要删除的内容了。import os import csv import re dir_path os.path.abspath(os.path.dirname(__file__)) delete_comment_url_list [] def input_mid(): while True: mid input(请输入你的账号ID) pattern re.compile(r\D) try: result pattern.search(mid).group() except AttributeError: break except: raise Exception(发生了未捕获的异常) if result: print(无效的账号ID请重新输入) return mid def get_dynamic_id(file_name): temp_str file_name.split(ID)[1] pattern re.compile(r\D{1}) result pattern.search(temp_str).group() dynamic_id temp_str.split(result,1)[0] return dynamic_id def get_url(mid): file_list os.listdir(dir_path) for file_name in file_list: file_path dir_path/file_name if (file_name[-3:] in [csv,CSV]) and (os.path.isfile(file_path)): with open(file_path,r,newline,encodingutf-8) as f: reader csv.DictReader(f) for row in reader: if row[mid] mid: dynamic_id get_dynamic_id(file_name) url https://t.bilibili.com/dynamic_id#replyrow[rpid] delete_comment_url_list.append(url) def save_data(): file_path dir_path/delete_bilibili_comment_url.txt with open(file_path,w,encodingutf-8) as f: f.write() with open(file_path,a,encodingutf-8) as f: for i in delete_comment_url_list: f.write(i\n) print(数据已保存到本地) if __name__ __main__: mid input_mid() get_url(mid) save_data()3.2 如何使用生成的链接列表运行上述脚本后会生成一个包含所有待删除评论链接的文本文件。你可以打开生成的txt文件逐个点击链接定位到对应评论手动点击删除按钮虽然仍需手动操作但至少不用费心寻找每条评论的位置了。这个方法适合评论数量不太多几十条的情况。3.3 半自动方案的优缺点优点比纯手动效率高不需要处理复杂的API认证风险较低可以逐条确认再删除缺点仍然需要大量手动操作对于大量评论几百条以上仍然不实用无法实现完全自动化4. 全自动化方案使用API批量删除4.1 获取必要的认证信息要实现全自动化删除我们需要以下几个关键信息Cookie用于维持登录状态在浏览器中打开B站并登录按F12打开开发者工具进入网络(Network)选项卡刷新页面找到任意请求复制请求头中的Cookie值CSRF Token用于防止跨站请求伪造通常可以在Cookie中找到名为bili_jct的值也可以在页面HTML中搜索csrf相关字段4.2 完整的自动化删除脚本import requests import os import re import csv import time url https://api.bilibili.com/x/v2/reply/del headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43, Referer: https://t.bilibili.com/, Cookie: 你的Cookie值 # 替换为你的实际Cookie } dir_path os.path.abspath(os.path.dirname(__file__)) error_info_list [] OK_info_list [] def input_mid(): while True: mid input(请输入你的账号ID) pattern re.compile(r\D) try: result pattern.search(mid).group() except AttributeError: break except: raise Exception(发生了未捕获的异常) if result: print(无效的账号ID请重新输入) return mid def get_dynamic_id_and_oid_and_type1(file_name): temp_list file_name.split(,) dynamic_id temp_list[0].split(ID)[1] oid temp_list[1].split(oid)[1] temp_str_for_type temp_list[2].split(type)[1] pattern re.compile(r\D{1}) result pattern.search(temp_str_for_type).group() type1 temp_str_for_type.split(result,1)[0] return dynamic_id, oid, type1 def get_rpid(file_path,mid): rpid_list [] with open(file_path,r,newline,encodingutf-8) as f: reader csv.DictReader(f) for row in reader: if row[mid] mid: rpid_list.append(row[rpid]) return rpid_list def save_error_log(): file_name 删除评论失败时错误日志.txt file_path dir_path/file_name with open(file_path,w,encodingutf-8) as f: f.write() with open(file_path,a,encodingutf-8) as f: for error_info_dict in error_info_list: t f删除B站动态ID{error_info_dict[dynamic_id]}中评论ID{error_info_dict[rpid]}时失败对应的oid是{error_info_dict[oid]}type是{error_info_dict[type1]}服务端返回的json数据是{error_info_dict[text]} f.write(t\n) print(错误日志已保存到本地) def save_OK_log(): file_name 删除评论成功时日志.txt file_path dir_path/file_name with open(file_path,w,encodingutf-8) as f: f.write() with open(file_path,a,encodingutf-8) as f: for OK_info_dict in OK_info_list: t f已删除B站动态ID{OK_info_dict[dynamic_id]}中评论ID{OK_info_dict[rpid]}服务端返回的json数据是{OK_info_dict[text]} f.write(t\n) print(成功日志已保存到本地) def delete_comment(file_name,file_path,mid): dynamic_id, oid, type1 get_dynamic_id_and_oid_and_type1(file_name) rpid_list get_rpid(file_path,mid) if len(rpid_list)0: for rpid in rpid_list: form_data { oid: oid, type: type1, jsonp: jsonp, rpid: rpid, csrf: 你的CSRF值 # 替换为你的实际CSRF值 } r requests.post(url,headersheaders,dataform_data) time.sleep(5) result r.json() global request_count request_count request_count1 code result[code] message result[message] ttl result[ttl] if not (code0 and message0 and ttl1): error_info_dict {} error_info_dict[dynamic_id] dynamic_id error_info_dict[oid] oid error_info_dict[type1] type1 error_info_dict[rpid] rpid error_info_dict[text] r.text error_info_list.append(error_info_dict) print(删除失败详情见本地错误日志文件) else: OK_info_dict {} OK_info_dict[dynamic_id] dynamic_id OK_info_dict[rpid] rpid OK_info_dict[text] r.text OK_info_list.append(OK_info_dict) if __name__ __main__: csv_file_count 0 request_count 0 mid input_mid() print(正在运行请耐心等待) file_list os.listdir(dir_path) for file_name in file_list: file_path dir_path/file_name if (file_name[-3:] in [csv,CSV]) and (os.path.isfile(file_path)): delete_comment(file_name,file_path,mid) csv_file_count csv_file_count1 print(f共有{csv_file_count}个csv文件其中{request_count}个含要删除的指定用户的评论) if request_count0: if len(OK_info_list)0: save_OK_log() if len(error_info_list)0: save_error_log() else: print(所有评论已删除)4.3 脚本使用说明将上述代码保存为Python文件如delete_bilibili_comments.py安装必要的依赖pip install requests替换脚本中的Cookie和CSRF值为你自己的准备包含评论数据的CSV文件可以从B站导出或通过爬虫获取运行脚本并按照提示输入你的B站账号ID4.4 自动化方案的注意事项频率控制脚本中设置了5秒的间隔避免请求过于频繁被B站限制错误处理脚本会记录成功和失败的删除操作方便后续检查数据备份建议在运行脚本前备份你的评论数据合法性仅用于删除自己的内容不要用于删除他人内容5. 进阶技巧与优化建议5.1 处理大量数据的优化如果需要删除的评论数量非常大上千条可以考虑以下优化多线程处理使用Python的threading模块并行发送删除请求分批次执行将任务分成多个小批次间隔执行错误重试机制对于失败的请求自动重试几次5.2 动态删除的特殊处理删除动态与删除评论的API略有不同。如果需要删除动态可以使用以下API端点https://api.bilibili.com/x/dynamic/feed/del需要的参数包括dynamic_id: 动态IDcsrf: CSRF令牌5.3 定期自动清理的实现你可以设置一个定时任务如Windows的任务计划或Linux的cron job定期运行清理脚本# Linux/macOS的cron示例每周日凌晨3点运行 0 3 * * 0 /usr/bin/python3 /path/to/your/script.py5.4 安全注意事项不要分享你的Cookie和CSRF令牌定期更新脚本以适应B站API的变化考虑使用环境变量存储敏感信息而不是直接写在脚本中如果不再需要脚本及时清除保存的认证信息6. 常见问题与解决方案6.1 获取Cookie失败怎么办如果无法获取正确的Cookie值可以尝试清除浏览器缓存后重新登录B站使用无痕/隐私模式浏览检查是否有浏览器插件干扰6.2 脚本返回403错误这通常意味着认证信息有问题或过期检查Cookie和CSRF值是否正确确认这些值是最新获取的B站会定期更新确保请求头中的User-Agent是有效的6.3 部分评论删除失败可能原因包括评论已被删除或不存在你没有删除该评论的权限B站服务器暂时不可用解决方案检查错误日志中的具体原因等待一段时间后重试对于顽固的失败项可以尝试手动删除6.4 如何确认评论已被删除脚本会生成成功日志记录所有已删除的评论。你也可以手动检查B站个人中心的评论列表使用B站搜索功能查找特定评论通过API查询评论状态7. 替代方案与工具推荐7.1 浏览器扩展工具有一些浏览器扩展可以提供批量删除功能如B站助手类扩展油猴脚本(Greasemonkey/Tampermonkey)这些工具通常提供图形界面比直接使用脚本更友好。7.2 第三方客户端某些第三方B站客户端可能提供批量管理功能但使用时需注意安全性确保客户端来源可靠兼容性可能与官方API不同步功能性可能不支持所有操作7.3 手机自动化工具对于移动端用户可以考虑Auto.js等Android自动化工具快捷指令(iOS)触控脚本工具这些工具可以模拟手动操作实现半自动化清理。8. 法律与道德考量在使用自动化工具时请务必注意仅用于管理自己的内容不要干扰他人遵守B站用户协议和相关法律法规不要过度请求避免对B站服务器造成负担尊重平台规则不要绕过合理的限制措施自动化工具是一把双刃剑合理使用可以提高效率滥用则可能导致账号受限或其他后果。建议在必要时才使用这些方法并保持适度原则。