本版
查看: 8124|回复: 6

python实现B站收藏夹同步

[复制链接]

Honor Moderator

楼主(1#)
发表于 2020-2-1 11:06:46 | 只看该作者 |只看大图 |倒序浏览 |阅读模式
本帖最后由 这个显卡不太冷 于 2020-2-1 11:18 编辑

[md]# 为了防止B站收藏的内容被吞,做了个这个同步工具


## 食用方法

* 要求至少python3.7的环境, Windows
* 基于you-get,需要安装最新的you-get,可以直接`pip install you-get`
* 在`video_list`处填入收藏夹ID。具体来说,在web端打开B站收藏夹例 [https://space.bilibili.com/2170464/favlist?fid=61630664&ftype=create](https://space.bilibili.com/2170464/favlist?fid=61630664&ftype=create) 其中fid=xxx即收藏夹ID。
* 若收藏夹ID是私有收藏夹,需要登录B站后复制一下cookie中的SESSDATA字段,填入第39行,有效期一个月
* dashflv的高帧率视频需要完整cookies,在脚本目录下建立cookies.txt将B站cookies以Netscape cookies的格式粘贴
* 目录下的db.ini是日志。code=0表示同步成功。否则未成功,原因可能是因为视频已经失效,或者在特殊页面,如拜年祭专有页面。

![image.png](data/attachment/forum/202002/01/110220ktw9htbe7h9g9toa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600 "image.png")

## 效果

![image.png](data/attachment/forum/202002/01/110502alyjeoysdds1l7xj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600 "image.png")

![image.png](data/attachment/forum/202002/01/111846phic19c11n851xnh.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600 "image.png")

## 代码

```python

# coding=utf-8
import subprocess
import sys, os
import requests, time, urllib.request, re
import configparser

def RunShellWithReturnCode(command,print_output=True,universal_newlines=True):
video_title = ""
os.environ["COMSPEC"] = 'powershell'
p = subprocess.Popen(command, stdout=subprocess.PIPE, encoding='utf-8', stderr=subprocess.PIPE, shell=True, universal_newlines=universal_newlines)
if print_output:
print(command)
output_array = []
while True:
line = p.stdout.readline()
if not line:
break
print(line.strip("/n"))
titlepos = line.find("title:")
if titlepos != -1 :
video_title = line[titlepos + 7:].strip()
output_array.append(line)
output ="".join(output_array)
else:
output = p.stdout.read()
p.wait()
errout = p.stderr.read()
if print_output and errout:
print(sys.stderr, errout)
p.stdout.close()
p.stderr.close()
return output, p.returncode, video_title


def get_play_list(media_id, pn):
url_api = 'https://api.bilibili.com/medialist/gateway/base/spaceDetail?media_id={}&pn={}&ps=20'.format(media_id, pn)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Cookie': 'SESSDATA=598c42e6%2C1582286719%2C48857111', # 登录B站后复制一下cookie中的SESSDATA字段,有效期1个月
'Host': 'api.bilibili.com'
}
html = requests.get(url_api, headers=headers).json()
video_list = []
try:
for i in html['data']['medias']:
video_list.append(i['short_link'])
print(video_list)
except KeyError as identifier:
print(identifier)
return video_list


def check_code(video_url, conf):
if(conf.has_section(video_url)):
if(conf.get(video_url, 'code') == '1'):
return False
return True
else :
conf.add_section(video_url)
return False


if __name__ == "__main__":
# RunShellWithReturnCode("you-get -i \"https://www.bilibili.com/video/av85365197\" ")
cfg = "db.ini"
conf = configparser.ConfigParser()
conf.read(cfg, encoding='utf-8')

udebug = 0

for i in range(1, 51):
video_list = get_play_list(135779664, i)
if len(video_list):
for video_url in video_list:
if(check_code(video_url, conf) == False):
r_out, r_code, video_title = RunShellWithReturnCode("you-get -c cookies.txt --format=dash-flv '{}' ".format(video_url))
if(r_code == 1):
r_out, r_code, video_title = RunShellWithReturnCode("you-get -c cookies.txt '{}' ".format(video_url))
conf.set(video_url, 'code', str(r_code))
conf.set(video_url, 'title', video_title)
conf.write(open("db.ini", "w", encoding='utf-8'))
# r_code = 0 : yes
# r_code = 1 : no
else :
print("sync complate")
break


```
[/md]


有人找乐子,有人照镜子
回复

支持 | 反对  0 支持 / 0 反对 评分 举报

[Lv.8]超级萝卜

矛盾综合体(喜欢折腾又懒得折腾)

沙发(2#)
发表于 2020-2-3 23:41:02 | 只看该作者
这个冬天不太冷

感谢分享~!

[Lv.6]大萝卜

板凳(3#)
发表于 2020-3-5 18:30:47 | 只看该作者
好像不错,虽然没有这个习惯。

[Lv.5]胡萝卜

地板(4#)
发表于 2020-3-12 08:29:43 | 只看该作者
感谢大佬!!!!!!!!!很有用!!!

[Lv.8]超级萝卜

5#
发表于 2020-3-23 15:48:03 | 只看该作者
膜拜,这个太神奇了,太方便了。

Honor Moderator

6#
 楼主| 发表于 2020-3-23 18:36:06 | 只看该作者
拂晓 发表于 2020-3-23 15:48
膜拜,这个太神奇了,太方便了。

失效,今天b站改了接口,暂时爬不到了
有人找乐子,有人照镜子

Super Moderator

Developer

7#
发表于 2020-3-24 18:52:46 | 只看该作者
这个显卡不太冷 发表于 2020-3-23 18:36
失效,今天b站改了接口,暂时爬不到了

AV改成BV了,稿件标识也从纯数字改成了数字和大小写字母组成的字符串。

联系我们(Contact)|手机版|萝卜头IT论坛 ( 苏ICP备15050961号-1 )

GMT+8, 2026-10-19 22:25 , Processed in 0.07 second(s), 20 queries , Gzip On.

快速回复 返回顶部 返回列表