做一个自动管理 b 站的程序,帮助我们快速批量创建收藏夹,收藏视频(懂得都懂)

项目 git 地址

文章目录

  • 一、自动登录 bilibili
  • 二、收藏夹管理
    • 2.1 创建新收藏夹
    • 2.2 获取收藏夹列表
    • 2.3 获取单个收藏夹信息
    • 2.4 修改收藏夹信息
    • 2.5 删除收藏夹
    • 2.6 修改收藏夹的顺序

一、自动登录 bilibili


首先需要获取到账号的 Cookie,目前还没有实现自动获取,暂时先使用了哔哩哔哩粉丝牌助手提供的 Cookie 获取工具。
获取到 Cookie 后,就可以对 session 进行配置

self.session = requests.session()
self.session.cookies['DedeUserID'] = # uid
self.session.cookies['DedeUserID__ckMd5'] = #
self.session.cookies['SESSDATA'] = #
self.session.cookies['bili_jct'] = #
self.session.cookies['LIVE_BUVID'] = #self.headers = {'origin': 'https://space.bilibili.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4501.0 Safari/537.36 Edg/91.0.866.0',
}

接下来测试一下能否成功登录,注意 CookieException 是我自定义的异常。

# url 是个人空间的收藏夹管理页面
url = 'https://space.bilibili.com/%s/favlist' % self.uid
homePage = self.session.get(url, headers=self.headers)
if (self.session.cookies['DedeUserID'] == '' or self.session.cookies['DedeUserID__ckMd5'] == ''):# 如果没有配置 Cookie 文件raise CookieException(0, 'Please configure the Cookie in the init method')
else:home_page = homePage.content.decode("utf-8")if ('个人空间_哔哩哔哩_Bilibili' not in home_page):# 没有成功 get 到页面,说明 Cookie 配置有问题raise CookieException(1, 'Invalid Cookie.')user_name = re.findall(r'<meta name="keywords" content="(.*),B站', home_page)[0]print('Valid Cookie, user name: %s' % user_name)

成功运行之后如下所示:

二、收藏夹管理


由于时间关系,我打算先完成对收藏夹的操作,之后再完善对收藏视频的操作

2.1 创建新收藏夹

创建收藏夹是所有操作中最基本的功能,实现了这个操作后,后面的操作大同小异。
通过抓包,可以发现创建收藏夹的 api 接口为 https://api.bilibili.com/x/v3/fav/folder/add,其数据为:

{"title": "folder title","intro": "folder introduction","privacy": 0, //0 为公开,1 为私密"cover": "cover image link","csrf": "70e8a10f9998293cdb639fa52bacf3ab", //固定值
}

只需要向接口 post 对应的数据,即可实现新建收藏夹。对于 post 返回的数据,有两个比较重要,分别是 code 错误代码和 message 错误信息。

check = self.session.post(url, headers=self.headers, data=data).json()
if check['code'] != 0: # code = 0 运行成功raise FavlistException(1, check['message'])
print('The folder has been created successfully.')

2.2 获取收藏夹列表

为了更方便的对收藏夹进行管理,我们需要一个方法来获取所有的收藏夹,并形成一个表。
同样通过抓包我们找到了它的 api https://api.bilibili.com/x/v3/fav/folder/created/list-all?up_mid=,等号后面接自己的 uid。
之后通过 get 可以获取一个 json 形式的数据,经过观察,可以找到所有收藏夹的信息。

check = self.session.get(url).json()
if check['code'] != 0:raise FavlistException(3, check['message'])
favList = check['data']['list']
return favList

顺便写一个方法来打印出所有的收藏夹

def printFavlist(self, favList):print("\tid\t\tfid\t\ttitle\t\tmedia_count")for k, i in enumerate(favList):print('%s\t%10s\t%8s\t%s\t%s' % (k, i['id'], i['fid'], i['title'], i['media_count']))

2.3 获取单个收藏夹信息

前面获取所有收藏夹信息的方法只能获得它们大概的信息,而接下来我们要获取某个收藏夹的详细信息。
它的 api 看起来略有不同,但是用法都一样 https://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&pn=1&ps=20&keyword=&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp 中间 %s 是收藏夹的 id

同样使用 get 方法获取数据,再从中挑选出有用的信息

check = self.session.get(url, headers=self.headers).json()
# 我们要挑出的信息
keys = ['id', 'fid', 'title', 'cover', 'cnt_info', 'intro', 'media_count']
# 文件夹信息在 data 下的 info 中
check = check['data']['info']
info = {}
for i in keys:info[i] = check[i]
return info

在获取某个收藏夹之前,我们可以先判断一下该收藏夹存不存在

mediaList = self.getFavlist()
for i in mediaList:if i['id'] == mediaId:return
raise FavlistException(4, "Can not find the folder")

2.4 修改收藏夹信息

和新建收藏夹一样,先获取 api 和需要 post 的数据 https://api.bilibili.com/x/v3/fav/folder/edit

{"title": "lxymyxdd","intro": "this is a test message","privacy": 0,"cover": "","csrf": "70e8a10f9998293cdb639fa52bacf3ab", //固定值"media_id": 1607747941, //收藏夹 id
}

但值得注意的是,如果不想修改原先的数据,则对应的值应该填入原先的数据,而不是什么都不填,这就需要用到刚刚写好的获取收藏夹信息的方法了。

url = r'https://api.bilibili.com/x/v3/fav/folder/edit'
raw_data = self.getFolderInfo(mediaId)
data = {"privacy": 0,"csrf": "70e8a10f9998293cdb639fa52bacf3ab","media_id": mediaId,
}
data['title'] = raw_data['title'] if title == None else title
data['intro'] = raw_data['intro'] if intro == None else intro
data['cover'] = raw_data['cover'] if cover == None else cover
check = self.session.post(url, headers=self.headers, data=data).json()
if check['code'] != 0:raise FavlistException(6, check['message'])
print("The information has changed successfully.")

2.5 删除收藏夹

和创建收藏夹一样,没有需要特别说明的。直接贴出 api https://api.bilibili.com/x/v3/fav/folder/del

{"media_ids": ,//收藏夹 id"platform": "web", // 都是固定数据"jsonp": "jsonp","csrf": "70e8a10f9998293cdb639fa52bacf3ab",
}
 check = self.session.post(url, headers=self.headers, data=data).json()if check['code'] != 0:raise FavlistException(3, check['message'])print('The folder has been deleted successfully.')

2.6 修改收藏夹的顺序

在管理收藏页面,我们发现按住收藏夹右边部分并拖动可以更改它所在的位置,这一功能虽然用处不大,但是我也实现了一下。

依然是抓包获取 api 和数据 https://api.bilibili.com/x/v3/fav/folder/sort

{"sort": "156985141,1328013241,1194508841", //收藏夹 id"jsonp": "jsonp", //这些都是固定值"csrf": "70e8a10f9998293cdb639fa52bacf3ab",
}

观察一下我们可以发现,收藏夹的顺序就是 sort 下 id 的顺序,由此我们就可以写出该功能。其中 mediaId 为要移动的收藏夹的 id,index 是要移动到的位置。

favList = self.getFavlist()
idList = []
for k, i in enumerate(favList):idList.append(i['id'])
idList.remove(mediaId)
try:idList.insert(index, mediaId)
except IndexError as ie:idList.append(mediaId)print("Index out of range, it will be moved to the bottom of the list")idstr = ""
for i in idList:idstr += str(i) + ","
check = self.session.post(url, headers=self.headers, data=data).json()
if check['code'] != 0:raise FavlistException(7, check['message'])
print('The folder has been moved successfully.')

魔改一下这个方法就可以实现收藏夹按指定顺序排序,这里就不做拓展了。

目前仅开发了这几个功能,之后要去忙期末所以不一定有时间继续开发,等暑假吧。

构建 bilibili 的自动化管理相关推荐

  1. 我们是如何使用 PingCode Flow 实现研发自动化管理的?

    作者: 徐子岩 Shaun Xu 研发自动化产品PingCode Flow已经上线将近半年的时间.在这期间,我们很高兴的看到越来越多的研发团队试用.接受并喜欢上这款产品.从目前的后台监控数据看,我们的 ...

  2. Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

    前言 这次主要分享通过Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警方案.通过执行耗时,定位哪些接口拖累了服务的性能:通过请求频次,设置适当的限流 ...

  3. 从0到1构建支撑企业自动化运维体系

    关注我们获得更多内容 精彩预告:第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市朝阳区东三环中路61号富力万丽酒店盛大开启.本次大会邀请互联网领先企业的数据库专家,国产数据库的领军人 ...

  4. 以数字孪生为基础,构建机房智慧化管理新环境

    目前,信息技术和互联网技术快速发展,各行各业都搭上数字时代的科技快车,运用智慧化管理手段赋能行业转型新发展.其中,数据中心机房作为企业信息化建设的重要基础设施,随着数据中心的复杂性和安全性的不断提升, ...

  5. 如何以物联网+硬件+物联卡方式构建新型智慧医疗管理体系?

    医疗事业的建设关系着我国人民的身体健康和生命安全,医疗体制改革一直以来都是国家战略布局的重点,医疗改革的本质就是改善医疗服务,提升病患就医体验,今天中创物联网将探讨如何通过物联网技术实现医疗改革和物联 ...

  6. 人事管理 | HR“入转调离”如何自动化管理?

    春招马上开始了,大规模的招聘使得人事管理变得越来越复杂.在我加入的一些HR交流社群中,大家普遍最头疼的问题就是: 招聘过程缺乏规范管理,候选人状态信息跟进不及时. 员工的"入转调离" ...

  7. Ansible批量自动化管理工具(二)

    Ansible批量自动化管理工具(二) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打开百度网盘手机App,操 ...

  8. 自动化管理工具Rundeck

    扫码关注公众号,每天推送不同的技术文章,公众号私聊获取学习资料,期待你我之间一起进步! 1.Rundeck介绍 Rundeck(http://rundeck.org)是开源软件,可以帮助你自动化管理日 ...

  9. 常用的自动化管理软件及Ansible安装

    常用的自动化管理软件及Ansible安装 文章目录 常用的自动化管理软件及Ansible安装 1. Puppet 2. CHEF 3. CFEngine 4. Foreman 5. Katello 6 ...

最新文章

  1. python之函数三装饰器
  2. 算法:删除链表中重复的元素||
  3. vivo android8公测,vivo 开启安卓P公测不限人数!这四款机型用户别错过了
  4. 习题:统计字符串中的单词个数
  5. os.environ详解
  6. hadoop的HA高可用配置(没有搞完)
  7. (王道408考研数据结构)第八章排序-第二节:直接插入排序和希尔排序
  8. ASSERT报错:error C2664: “AfxAssertFailedLine”: 不能将参数 1 从“TCHAR []”转换为“LPCSTR”...
  9. 业务逻辑?到底是什么
  10. 台式计算机诞生,生物电脑 ①1946年,世界上第一台计算机诞生,这个庞然大物开创了一个电脑时代。从那时候起,人们不断革新、创造,把庞然大物的体积一减再减,现在我们所见的台式电脑、掌上电脑...
  11. java编程思想.pdf,阿里开发手册.pdf,MySQL是怎样运行的_掘金小册_.pdf
  12. android的大转盘抽奖完美实现
  13. 计算机网络4小时速成:应用层,cs模型,p2p模型,DNS域名系统,文件传输协议FTP,电子邮件SMTP,万维网HTTP,动态主机配置协议DHCP
  14. 深度学习论文-DAnetExFuseDFN
  15. 怎么把几个pdf合并成一个文件?这个pdf合并的方法不容错过
  16. html css超链接字体颜色,HTML-CSS设置超链接颜色字体
  17. 4步教你学会使用matlab模糊控制工具箱
  18. 据说看懂这些故事的人 最后都成了亿万富翁
  19. 重复性工作再也不用做啦?机器人自动化迎难而上
  20. LaTeX中使用bicaption、tabula包绘制三线表

热门文章

  1. 磁盘修复fsck命令详解
  2. 三国杀ol服务器维修中,三国杀OL登录不了
  3. 炫酷的vue登陆界面2.0
  4. android Service的stopself方法
  5. 实验:MBR扇区故障
  6. 【Flutter】动画学习(二) Animation
  7. Cf 362div2 C [map暴力,思维能力]
  8. 天池:铝型材表面瑕疵识别比赛第10名 算法分享github链接
  9. js 将二维对象数组转换成树状结构数据
  10. [附源码]计算机毕业设计Python+uniapp基于MVVM在线电影购票APP05s75(程序+源码+LW+远程部署)