import re
import requests
from moviepy.editor import VideoFileClip, AudioFileClip
import os
print('欢迎使用这个程序,整个下载过程会创建一个主文件夹——b站, 里面有三个子文件夹,分别是:videos, audios, full,分别储存了纯视频,纯音频和完整视频。')
print('使用时请保证网络通畅并按指示操作,若运行过程中程序崩溃请重新运行')
# 创建文件夹
folders = [r'd://b站', r'd://b站/videos', r'd://b站/audios', r'd://b站/full']
for folder in folders:
try:
os.makedirs(folder, exist_ok=True)
except Exception as e:
print(f"创建文件夹 {folder} 时出错: {e}")
# 设置 cookies 和 headers
cookies = {
'buvid3': '191545EB-F165-63C6-31DD-4E19AB0C6E6043222infoc',
'b_nut': '1715784443',
'_uuid': '789165AA-BD31-91C5-85FC-812E8103E7D7846627infoc',
'enable_web_push': 'DISABLE',
'home_feed_column': '5',
'browser_resolution': '1536-791',
'buvid4': '536E98AC-7A05-3FF7-0E6F-02B90981AA9144819-024051514-wEm4aHvJu7Q%2FD4vfiutAXQ%3D%3D',
'CURRENT_FNVAL': '4048',
'rpdid': "|(J~|)RJRJ~J0J'u~ul~)RR~|",
'DedeUserID': '454569149',
'DedeUserID__ckMd5': '2b211b2849275e52',
'header_theme_version': 'CLOSE',
'SESSDATA': 'ae626e91%2C1732299406%2C6ad9f%2A51CjDXQy4suKJ2z-FYm_dhuDRjFykHfTScB5diTfCLK8FEJi_-W0sBKYJchwvlWMdMX10SVjFyYlZWUjJqeEhVTkdvVkNKa1UxQ0FDLXVUcDR5S3N1TVdNY204NEQ1b2NSXzEwRmJLc3p0T3R2TzMwVnpQWWFuejZKX2pUYzlKZy0wbnhuLTNzLVlRIIEC',
'bili_jct': '833db7865eb2dba49a7bf2ee50267657',
'bili_ticket': 'eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTcwMDY2MDksImlhdCI6MTcxNjc0NzM0OSwicGx0IjotMX0.em_D9uvPVPDjjRjsmPlO47w_fljiDgwpptUAfAEvscc',
'bili_ticket_expires': '1717006549',
'fingerprint': 'd745d914468882206ef1c2ecda369c8c',
'buvid_fp_plain': 'undefined',
'bp_t_offset_454569149': '935835578143866948',
'b_lsid': '8BE10FF8C_18FB9E44B14',
'buvid_fp': 'd745d914468882206ef1c2ecda369c8c',
'bmg_af_switch': '1',
'bmg_src_def_domain': 'i0.hdslb.com',
'is-2022-channel': '1',
'sid': 'nickbjf2',
}
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'priority': 'u=0, i',
'referer': 'https://www.bilibili.com/',
'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
}
params = {
'spm_id_from': '333.1007.tianma.1-2-2.click',
'vd_source': '1c1bd87c4da3354fc14f193d7119e8eb',
}
# 创建会话并设置 cookies 和 headers
session = requests.session()
session.cookies.update(cookies)
session.headers.update(headers)
session.params = params
# 获取视频和音频 URL
def get_urls(url):
try:
response = session.get(url)
except:
print('貌似网络有些问题,不过不要担心,我们再试一次')
get_urls(url)
else:
base_urls = re.findall(r'baseUrl":"(https?://[^\"]+)"', response.text)
video_url = base_urls[1]
audio_url = base_urls[-3]
return video_url, audio_url
# 下载视频和音频文件
def download(video_url, audio_url):
title = input('请输入你要保存的视频名:')
while True:
try:
video_res = session.get(video_url).content
except:
print('貌似网络有些问题,不过不要担心,我们再试一次')
else:
break
while True:
try:
audio_res = session.get(audio_url).content
except:
print('貌似网络有些问题,不过不要担心,我们再试一次')
else:
break
print('\n开始下载视频...')
with open(f'd://b站/videos/{title}.mp4', 'wb') as f:
f.write(video_res)
print('\n视频下载完成')
print('\n开始下载音频...')
with open(f'd://b站/audios/{title}.mp3', 'wb') as f:
f.write(audio_res)
print('\n音频下载完成')
return f'd://b站/videos/{title}.mp4', f'd://b站/audios/{title}.mp3', title
# 合并视频和音频文件
def combining(mp4_file, mp3_file, title):
output_file = f'd://b站/full/{title}.mp4'
video_clip = VideoFileClip(mp4_file)
audio_clip = AudioFileClip(mp3_file)
video_with_audio = video_clip.set_audio(audio_clip)
print('\n正在合并...')
video_with_audio.write_videofile(output_file, codec='libx264', audio_codec='aac')
print('合并完成')
# 主程序循环
i = True
while i:
while True:
try:
x = int(input('\n下载视频请按1, 退出请按2:'))
except ValueError:
print('请输入正确的数字')
else:
break
if x == 1:
url = input('\n输入你要下载的视频链接:')
video_url, audio_url = get_urls(url)
mp4_file, mp3_file, title = download(video_url, audio_url)
combining(mp4_file, mp3_file, title)
elif x == 2:
i = False
else:
print('\noops, 你好像输错了数字')