b站视频下载

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, 你好像输错了数字')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值