马儿慢些走

人生惶惶,悲喜一场。

自动清理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)),自己开机启动,简单。

posted on 2025-11-23 10:25  马儿慢些走  阅读(0)  评论(0)    收藏  举报

导航