很多人觉得编程很难,觉得那是程序员的专属技能。2026年了,AI编程工具已经非常成熟,普通人用AI辅助编程,完全可以独立开发出实用的小工具。
今天分享一个真实案例:我是怎么做B站视频批量下载工具的。整个开发过程,从需求分析到代码实现,全都是用Cursor AI编程助手完成的。
一、需求分析:明确要做什么
我需要批量下载B站上某个UP主的所有视频,用于离线观看和学习。之前试过一些现成工具,但要么有水印,要么下载速度慢,要么需要付费。
核心需求:
- 支持输入B站UP主主页URL,自动获取所有视频列表
- 支持选择下载质量(高清/1080P/720P)
- 支持断点续传,避免网络中断后重新下载
- 支持多线程并发下载,提高效率
二、用Cursor开始开发
1. 创建项目结构
打开Cursor,新建Python项目。先让AI帮我设计项目结构:
bilibili_downloader/├── main.py # 主入口├── config.py # 配置文件├── video_fetcher.py # 视频列表获取├── downloader.py # 下载器核心└── requirements.txt # 依赖库2. 获取视频列表
让Cursor帮我写获取B站UP主视频列表的代码:
import requestsimport jsonfrom typing import List, Dictclass BilibiliFetcher: def __init__(self): self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } def get_upvideos(self, uid: str, cookie: str = None) -> List[Dict]: """获取UP主的所有视频""" url = f"https://api.bilibili.com/x/space/wbi/arc/search" params = { 'mid': uid, 'pn': 1, 'ps': 30, 'order': 'pubdate' } response = requests.get(url, params=params, headers=self.headers) data = response.json() videos = [] if data['code'] == 0: for item in data['data']['list']['vlist']: videos.append({ 'bvid': item['bvid'], 'title': item['title'], 'aid': item['aid'], 'duration': item['length'], 'pubdate': item['pubdate'] }) return videos3. 开发下载器
下载器是核心部分,需要处理视频解析、并发下载、进度显示等功能:
import asyncioimport aiohttpfrom pathlib import Pathimport jsonclass VideoDownloader: def __init__(self, max_concurrent: int = 3): self.max_concurrent = max_concurrent self.semaphore = asyncio.Semaphore(max_concurrent) async def download_single(self, session, bvid, save_path): """下载单个视频""" async with self.semaphore: # 获取视频下载链接 url = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&qn=80" async with session.get(url) as resp: data = await resp.json() if data['code'] != 0: print(f"获取 {bvid} 下载链接失败") return False video_url = data['data']['durl'][0]['url'] # 下载视频 async with session.get(video_url) as video_resp: content = await video_resp.read() with open(save_path, 'wb') as f: f.write(content) return True async def batch_download(self, videos: List[Dict], save_dir: str): """批量下载""" Path(save_dir).mkdir(parents=True, exist_ok=True) async with aiohttp.ClientSession() as session: tasks = [] for video in videos: safe_title = self.sanitize_filename(video['title']) save_path = f"{save_dir}/{safe_title}.mp4" tasks.append(self.download_single(session, video['bvid'], save_path)) await asyncio.gather(*tasks)4. 添加进度显示
让工具更专业一点,加上进度显示和统计功能:
from tqdm import tqdmclass ProgressDownloader(VideoDownloader): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) async def batch_download(self, videos, save_dir): Path(save_dir).mkdir(parents=True, exist_ok=True) async with aiohttp.ClientSession() as session: with tqdm(total=len(videos), desc="下载进度") as pbar: for video in videos: safe_title = self.sanitize_filename(video['title']) save_path = f"{save_dir}/{safe_title}.mp4" success = await self.download_single( session, video['bvid'], save_path ) pbar.update(1) pbar.set_postfix({ '当前': video['title'][:20], '状态': '✓' if success else '✗' })三、遇到的问题和解决
问题1:B站API需要登录
B站某些高清视频需要登录才能下载。解决方案:让用户粘贴自己的Cookie,工具自动解析并使用。
问题2:网络中断导致下载失败
加了断点续传功能,保存下载进度到JSON文件,下次启动自动跳过已完成的视频。
问题3:文件名包含特殊字符
Windows系统文件名不能包含特殊字符,添加了文件名清理函数:
import redef sanitize_filename(self, filename: str) -> str: """清理文件名,移除非法字符""" filename = re.sub(r'[<>:"/\|?*]', '', filename) filename = filename[:200] # 限制长度 return filename四、使用效果
用这个工具,下载一个UP主的100个视频:
- 之前用现成工具:需要2小时,有水印
- 现在用自己开发的工具:30分钟完成,无水印,支持断点续传
最重要的是,这个工具可以根据自己的需求随时修改和扩展。
五、总结
用AI编程开发工具的流程:
- 明确需求,拆解功能模块
- 让AI写基础代码框架
- 逐个模块调试,遇到问题让AI修复
- 组合测试,优化性能和体验
整个开发过程不需要我懂太多编程知识,只需要:
- 知道这个工具要做什么
- 能描述清楚遇到的问题
- 会复制粘贴和运行测试
AI编程让普通人也能开发实用工具。如果你也有重复性工作想自动化,不妨试试用AI帮你开发一个小工具。
作者:汝连杰
平台:抖创汇AI编程版块
|