自动清理B站稍后再看列表
转载自己的知乎文章:https://zhuanlan.zhihu.com/p/30454297255
2025年11月23日
不知道有没有人和我一样,看B站喜欢把一大堆视频加入稍后再看,有些视频甚至看都不看就稍后再看了,导致稍后再看列表轻轻松松塞满。以前B站的稍后再看只能放一百个视频,两天就能塞满,现在扩容到一千个,依然用不了多久。
为了解决这个问题,自己用Python简单写了个脚本(好吧,是通义千问帮我写的),按照600个视频为限,如果超过就删除20个最早加入稍后再看的视频,然后再到Windows任务计划中设置定时执行。我自己设置了半个小时执行一次,再配合自己电脑一般一开就是一天,保证稍后再看列表一直可用。
当然,这里需要破除一个心魔,稍后再看里的视频删掉了可惜嘛?至少现在我觉得还好了。一方面600个视频的容量足够大,那些被清理掉的视频都是加入有段时间了,这么久没看,也没留下印象,就让它过去吧。另一方面,自己越来越把B站当成播客电台了,每次从稍后再看点开列表,有啥听啥,和听广播一样的感觉。
这里附上Python代码:
import http.client
import json
import urllib
from time import sleep
# 使用标准库获取稍后再看列表的方法
def get_toview_list(sessdata):
conn = http.client.HTTPSConnection("api.bilibili.com")
headers = {
'Cookie': f'SESSDATA={sessdata}',
}
conn.request("GET", "/x/v2/history/toview", headers=headers)
response = conn.getresponse()
if response.status == 200:
data = json.loads(response.read())
if data['code'] == 0:
return data['data']['list']
else:
print("Failed to fetch toview list:", data['message'])
return []
else:
print(f"Error fetching toview list: {response.status} {response.reason}")
return []
# 使用标准库从稍后再看中移除视频的方法
def remove_from_toview(aid, sessdata, csrf):
conn = http.client.HTTPSConnection("api.bilibili.com")
payload = urllib.parse.urlencode({
'aid': aid,
'csrf': csrf,
})
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': f'SESSDATA={sessdata}',
}
conn.request("POST", "/x/v2/history/toview/del", body=payload, headers=headers) # 注意这里使用POST方法
response = conn.getresponse()
result = json.loads(response.read())
if result['code'] == 0:
print(f"Successfully removed video with aid: {aid}")
else:
print(f"Failed to remove video with aid: {aid}, reason: {result['message']}")
MAX_Toview_Videos = 600
DELETE_CNT_EACH_TIME = 10
def manage_toview_videos(sessdata, csrf):
toview_list = get_toview_list(sessdata)
current_count = len(toview_list)
print(f"Current count of 'toview' videos: {current_count}")
if current_count > MAX_Toview_Videos:
videos_to_remove = current_count - MAX_Toview_Videos
videos_to_remove = min(videos_to_remove, DELETE_CNT_EACH_TIME)
print(f"Need to remove {videos_to_remove} videos.")
for i in range(videos_to_remove):
# 由于列表是从前往后排序的,所以我们倒序遍历以从最后开始移除
aid_to_remove = toview_list[-(i + 1)]['aid']
remove_from_toview(aid_to_remove, sessdata, csrf)
# 暂停1秒
sleep(1)
if __name__ == '__main__':
SESSDATA = "xxxxxxxxxxxxxxxxx" # 替换为您的SESSDATA
CSRF = "xxxxxxxxxxxx" # 替换为您的CSRF token,cookie中bili_jct的值。
manage_toview_videos(SESSDATA, CSRF)
代码中MAX_Toview_Videos表示自己设置的视频容量上限,超过的话每次执行会删除DELETE_CNT_EACH_TIME数量的视频,这两个值可以自己修改。
另外,代码中有两个值需要自己从网页浏览器的Cookies信息中复制出来,方法就是用一个已经登录B站的浏览器,打开开发者模式,在Cookies中查到SESSDATA和CSRF两个值(CSRF这个值应该查bili_jct,查CSRF可能查不到)。
然后在任意一个位置把上述代码保存到一个文件中,比如 autoremove_watchlater.py 。然后在Windows中设置任务计划程序,具体方法百度一下。注意设置“操作”的时候,“程序或脚本”填写自己安装的Python路径,填写pythonw.exe的路径,在执行的时候不会像python.exe一样弹出命令行窗口。“添加参数”部分填自己的代码文件路径。点击执行测试一下,会发现自己的稍后再看列表少了最早添加的视频,大功告成!
补充:现在把代码部署到个人家用服务器的Linux(openSUSE Leap 16)上了。可以用crontab或者systemd实现开机自动启动和定时执行,但是我选择直接代码里循环执行,中途睡眠一小时(sleep(3600*1)),自己开机启动,简单。
浙公网安备 33010602011771号