Bilibili.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import json
  2. import requests
  3. import re
  4. from moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip
  5. url = 'https://www.bilibili.com/video/BV1Ce4y1z72V/?spm_id_from=333.999.0.0'
  6. def GetResponse(url):
  7. headers = {
  8. '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',
  9. 'accept - encoding': 'gzip, deflate',
  10. 'accept - language': 'zh - CN, zh;q = 0.9, en;q = 0.8, en - GB;q = 0.7, en - US;q = 0.6',
  11. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
  12. 'Referer':'https://search.bilibili.com/all?vt=44591831&keyword=%E8%B0%81%E7%94%B5%E5%90%89%E4%BB%96%E8%B0%B1&from_source=webtop_search&spm_id_from=333.1007&search_source=2'
  13. }
  14. response = requests.get(url = url,headers = headers)
  15. return response
  16. def GetVideoInfo() -> str:
  17. response = GetResponse(url = url)
  18. html = response.text
  19. info = re.findall('<script>window.__playinfo__=(.*?)</script>', html)[0]
  20. json_data = json.loads(info)
  21. audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
  22. video_url = json_data['data']['dash']['video'][0]['baseUrl']
  23. title = re.findall('<title data-vue-meta="true">(.*?)</title>', html)
  24. print(title)
  25. if title:
  26. title = title[0]
  27. illegal_chars = fr'<>:"/\\|?*'
  28. def remove_illegal_chars(s):
  29. for char in illegal_chars:
  30. s = s.replace(char, "")
  31. return s
  32. title = remove_illegal_chars(title)
  33. else:
  34. return None
  35. print(title)
  36. return (title, audio_url, video_url)
  37. def Save(title,audio_url,video_url):
  38. audio_content = GetResponse(url = audio_url).content
  39. video_content = GetResponse(url = video_url).content
  40. with open('D:/pyp/bilibili_pachong/bilibili_files/AAC/' + title + '.aac', mode='wb') as audio:
  41. audio.write(audio_content)
  42. with open('D:/pyp/bilibili_pachong/bilibili_files/MP4/' + title + '.mp4', mode='wb') as video:
  43. video.write(video_content)
  44. if __name__ == '__main__':
  45. title,audio_url,video_url = GetVideoInfo()
  46. Save(title, audio_url, video_url)
  47. # 加载视频和音频文件
  48. audio_path = fr"D:\pyp\bilibili_pachong\bilibili_files\AAC\{title}.aac"
  49. audio_clip = AudioFileClip(audio_path)
  50. video_path = fr"D:\pyp\bilibili_pachong\bilibili_files\MP4\{title}.mp4"
  51. video_clip = VideoFileClip(video_path)
  52. # print(audio_clip,video_clip)
  53. # 确保音频和视频长度相同
  54. audio_clip = audio_clip.set_duration(video_clip.duration)
  55. # 将音频设置到视频上
  56. video_clip_with_audio = video_clip.set_audio(audio_clip)
  57. # 输出合并后的文件
  58. video_clip_with_audio.write_videofile(fr"D:\pyp\bilibili_pachong\bilibili_files\Files\{title}synth.mp4", codec="libx264", audio_codec="aac")