经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
从【抓包分析】到【代码实战】,实现下载某破站视频(附源码)
来源:cnblogs  作者:失足成万古风流人物  时间:2023/10/23 9:57:20  对本文有异议

一、前言

前两天,我的邻居找到我,问我某破站的视频能否帮她下载成mp4格式?

网上应该有很多的下载工具,但是如果直接让她网上找,那么无法彰显我程序员大神的威武形象。因此我回复她,程序员大神是无敌的,只要在浏览器上能看到的东西,都能用程序拿到。只要在浏览器上用手能操作的东西,都能用程序操作。只要......

我发现我的邻居,已经悄然成为了我的产品经理,这些年着实给我提了不少产品思路哈哈哈。

二、需求分析

其实要做的功能,非常简单。从某破站上打开一个视频,从浏览器地址栏拿到这个视频的地址,然后粘贴到我开发的程序中,程序自动将相应的视频下载下来变成mp4格式。

干脆,我把程序放到我的云服务器上,这样不但邻居可以使用,世界各地的美女帅哥都能使用。如果用的人多了,我给他变成收费模式,下载一个视频收1分钱,一天如果有1万个人下载,不就能收100元吗?一个月30天,那就是3万,一年365天,那就是365*3万=1095万,艾玛这是要发大财呀。

你看,我不止是程序员大神,还是数学大神。其实数学十分简单,只不过剩下的九十分很难。

三、抓包分析

1、拿到视频文件真实地址

我们进入某破站,随便打开一个视频,咱们就用浏览器自带的网络监控工具抓包。

好家伙,这一大堆请求,一直在不停地刷,放个图大家感受一下:

不过凭借程序员大神多年的经验,直觉告诉我,咱们重点关注这俩请求:

看一下这俩请求的应答内容,这一看就是我们要的视频二进制内容嘛:

等等!1267024297-1-100024.m4s和1267024297-1-30232.m4s这些数字是从哪里来的呢?看起来像是视频的ID号之类的,但是浏览器链接栏中也没看到类似的号呢?

那接下来咱先看看第一个请求吧,看这里面能否找到啥蛛丝马迹。

这第一个请求就是我点击视频链接后发出的,这和浏览器地址栏的地址是一致的:

再看一下这个请求的应答是啥内容:

应答就是一段标准的html嘛。看看这里面有没有1267024297-1-100024.m4s和1267024297-1-30232.m4s相关的内容呢?搜一下,果然找到了:

看起来就是一段json,下面我把这段json贴出来,内容太多,我稍微删减了一些,只留下关键信息:

查看代码
  1.  <script>
  2. window.__playinfo__ = {
  3. "code": 0,
  4. "message": "0",
  5. "ttl": 1,
  6. "data": {
  7. "from": "local",
  8. "result": "suee",
  9. "message": "",
  10. "quality": 64,
  11. "format": "flv720",
  12. "timelength": 312490,
  13. "accept_format": "hdflv2,flv,flv720,flv480,flv360",
  14. "accept_description": ["高清 1080P+", "高清 1080P", "高清 720P", "清晰 480P", "流畅 360P"],
  15. "accept_quality": [112, 80, 64, 32, 16],
  16. "video_codecid": 7,
  17. "seek_param": "start",
  18. "seek_type": "offset",
  19. "dash": {
  20. "duration": 313,
  21. "minBufferTime": 1.5,
  22. "min_buffer_time": 1.5,
  23. "video": [{
  24. "id": 80,
  25. "baseUrl": "https://xy182x117x194x4xy.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100113.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=107051&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=20f269&traceid=trDNtOvronEayd_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=b33a062d8cc1d08690ad8f7d727e5a1f",
  26. "base_url": "https://xy182x117x194x4xy.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100113.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=107051&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=20f269&traceid=trDNtOvronEayd_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=b33a062d8cc1d08690ad8f7d727e5a1f",
  27. "backupUrl": ["https://xy112x111x47x2xy.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=b33a062d8cc1d08690ad8f7d727e5a1f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=7b626b942dab4437433e276e1dfd6c63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=40000000"],
  28. "backup_url": ["https://xy112x111x47x2xy.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=b33a062d8cc1d08690ad8f7d727e5a1f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=7b626b942dab4437433e276e1dfd6c63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=40000000"],
  29. "bandwidth": 855502,
  30. "mimeType": "video/mp4",
  31. "mime_type": "video/mp4",
  32. "codecs": "hev1.1.6.L150.90",
  33. "width": 1920,
  34. "height": 1080,
  35. "frameRate": "23.810",
  36. "frame_rate": "23.810",
  37. "sar": "1:1",
  38. "startWithSap": 1,
  39. "start_with_sap": 1,
  40. "SegmentBase": {
  41. "Initialization": "0-1159",
  42. "indexRange": "1160-1935"
  43. },
  44. "segment_base": {
  45. "initialization": "0-1159",
  46. "index_range": "1160-1935"
  47. },
  48. "codecid": 12
  49. }, {
  50. "id": 80,
  51. "baseUrl": "https://xy49x71x163x109xy.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100050.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=279453&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=9e67ce&traceid=trFvCerZmkKQtz_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=3aac9a201552c1a8f1d4de37510b4a21",
  52. "base_url": "https://xy49x71x163x109xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100050.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=279453&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=9e67ce&traceid=trFvCerZmkKQtz_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=3aac9a201552c1a8f1d4de37510b4a21",
  53. "backupUrl": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100050.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3aac9a201552c1a8f1d4de37510b4a21&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=279453&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100050.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3dc776f9ddfeab28ff0105c7ec4875a4&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=279453&logo=40000000"],
  54. "backup_url": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100050.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3aac9a201552c1a8f1d4de37510b4a21&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=279453&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100050.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3dc776f9ddfeab28ff0105c7ec4875a4&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=279453&logo=40000000"],
  55. "bandwidth": 2233245,
  56. "mimeType": "video/mp4",
  57. "mime_type": "video/mp4",
  58. "codecs": "avc1.640032",
  59. "width": 1920,
  60. "height": 1080,
  61. "frameRate": "24.390",
  62. "frame_rate": "24.390",
  63. "sar": "1:1",
  64. "startWithSap": 1,
  65. "start_with_sap": 1,
  66. "SegmentBase": {
  67. "Initialization": "0-996",
  68. "indexRange": "997-1772"
  69. },
  70. "segment_base": {
  71. "initialization": "0-996",
  72. "index_range": "997-1772"
  73. },
  74. "codecid": 7
  75. }],
  76. "audio": [{
  77. "id": 30280,
  78. "baseUrl": "https://xy27x188x11x241xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-30280.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=14271&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=252dc5&traceid=trPZFhEozQrraC_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=ce4b9ea5064ef1e6074c45e253b02cbb",
  79. "base_url": "https://xy27x188x11x241xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-30280.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=14271&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=252dc5&traceid=trPZFhEozQrraC_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=ce4b9ea5064ef1e6074c45e253b02cbb",
  80. "backupUrl": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=ce4b9ea5064ef1e6074c45e253b02cbb&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=14271&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=16af80196302d63ec9b163a091cd175c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=14271&logo=40000000"],
  81. "backup_url": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=ce4b9ea5064ef1e6074c45e253b02cbb&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=14271&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=16af80196302d63ec9b163a091cd175c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=14271&logo=40000000"],
  82. "bandwidth": 114023,
  83. "mimeType": "audio/mp4",
  84. "mime_type": "audio/mp4",
  85. "codecs": "mp4a.40.2",
  86. "width": 0,
  87. "height": 0,
  88. "frameRate": "",
  89. "frame_rate": "",
  90. "sar": "",
  91. "startWithSap": 0,
  92. "start_with_sap": 0,
  93. "SegmentBase": {
  94. "Initialization": "0-933",
  95. "indexRange": "934-1721"
  96. },
  97. "segment_base": {
  98. "initialization": "0-933",
  99. "index_range": "934-1721"
  100. },
  101. "codecid": 0
  102. }, {
  103. "id": 30216,
  104. "baseUrl": "https://xy106x115x132x228xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-30216.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=4091&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=cda2a5&traceid=trpwNglAmwaBCr_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=0d2abfa51f30dcea5d37c226758fcd36",
  105. "base_url": "https://xy106x115x132x228xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-30216.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=4091&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=cda2a5&traceid=trpwNglAmwaBCr_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=0d2abfa51f30dcea5d37c226758fcd36",
  106. "backupUrl": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=0d2abfa51f30dcea5d37c226758fcd36&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=4091&logo=A0000400", "https://upos-sz-mirrorcoso1.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=coso1bv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3863d2a8bb127e48ab30bbc0147a2810&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=4091&logo=40000000"],
  107. "backup_url": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=0d2abfa51f30dcea5d37c226758fcd36&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=4091&logo=A0000400", "https://upos-sz-mirrorcoso1.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=coso1bv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=3863d2a8bb127e48ab30bbc0147a2810&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=4091&logo=40000000"],
  108. "bandwidth": 32682,
  109. "mimeType": "audio/mp4",
  110. "mime_type": "audio/mp4",
  111. "codecs": "mp4a.40.5",
  112. "width": 0,
  113. "height": 0,
  114. "frameRate": "",
  115. "frame_rate": "",
  116. "sar": "",
  117. "startWithSap": 0,
  118. "start_with_sap": 0,
  119. "SegmentBase": {
  120. "Initialization": "0-943",
  121. "indexRange": "944-1731"
  122. },
  123. "segment_base": {
  124. "initialization": "0-943",
  125. "index_range": "944-1731"
  126. },
  127. "codecid": 0
  128. }],
  129. "dolby": {
  130. "type": 0,
  131. "audio": null
  132. },
  133. "flac": null
  134. },
  135. "support_formats": [{
  136. "quality": 112,
  137. "format": "hdflv2",
  138. "new_description": "1080P 高码率",
  139. "display_desc": "1080P",
  140. "superscript": "高码率",
  141. "codecs": ["av01.0.08M.08.0.110.01.01.01.0", "avc1.640032", "hev1.1.6.L150.90"]
  142. }, {
  143. "quality": 80,
  144. "format": "flv",
  145. "new_description": "1080P 高清",
  146. "display_desc": "1080P",
  147. "superscript": "",
  148. "codecs": ["av01.0.08M.08.0.110.01.01.01.0", "avc1.640032", "hev1.1.6.L150.90"]
  149. }, {
  150. "quality": 64,
  151. "format": "flv720",
  152. "new_description": "720P 高清",
  153. "display_desc": "720P",
  154. "superscript": "",
  155. "codecs": ["av01.0.08M.08.0.110.01.01.01.0", "avc1.640028", "hev1.1.6.L120.90"]
  156. }, {
  157. "quality": 32,
  158. "format": "flv480",
  159. "new_description": "480P 清晰",
  160. "display_desc": "480P",
  161. "superscript": "",
  162. "codecs": ["av01.0.08M.08.0.110.01.01.01.0", "avc1.64001F", "hev1.1.6.L120.90"]
  163. }, {
  164. "quality": 16,
  165. "format": "flv360",
  166. "new_description": "360P 流畅",
  167. "display_desc": "360P",
  168. "superscript": "",
  169. "codecs": ["av01.0.08M.08.0.110.01.01.01.0", "avc1.64001E", "hev1.1.6.L120.90"]
  170. }],
  171. "high_format": null,
  172. "volume": {
  173. "measured_i": -18.5,
  174. "measured_lra": 8.9,
  175. "measured_tp": 1.2,
  176. "measured_threshold": -28.8,
  177. "target_offset": 0.4,
  178. "target_i": -14,
  179. "target_tp": -1
  180. },
  181. "last_play_time": 14000,
  182. "last_play_cid": 1267024297
  183. },
  184. "session": "5b95542e60887c5e597810671aa5001a"
  185. }
  186. </script>

所以,我们第一步的思路就有了:请求视频地址,然后将应答中的这段json拿出来,再从json中将视频文件真实地址拿到。

2、下载视频文件

我们看上面的json,data.dash.video路径下面的值,就是我们要下载的视频的真实地址,但我们看到这是个Array,也就是说有多个视频地址,我们下载哪一个呢?我测试了一下,把所有视频都下载下来,视频内容都是一致的,只不过文件大小、视频长宽、码率之类的不同,我估计对应的是"高清 1080P+", "高清 1080P", "高清 720P", "清晰 480P", "流畅 360P"之类的。我们就简单处理吧,默认下载第一个视频就行了。

下面咱看看第一个视频的具体信息:

查看代码
  1.  {
  2. "id": 80,
  3. "baseUrl": "https://xy182x117x194x4xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100113.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=107051&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=20f269&traceid=trDNtOvronEayd_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=b33a062d8cc1d08690ad8f7d727e5a1f",
  4. "base_url": "https://xy182x117x194x4xy.mcdn.xxxxxxxxxx.cn:8082/v1/resource/1267024297-1-100113.m4s?agrr=0&build=0&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&bvc=vod&bw=107051&deadline=1695874583&e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D&f=u_0_0&gen=playurlv2&logo=A0000400&mcdnid=11000413&mid=1716139964&nbs=1&nettype=0&oi=3550958494&orderid=0%2C3&os=mcdn&platform=pc&sign=20f269&traceid=trDNtOvronEayd_0_e_N&uipk=5&uparams=e%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform&upsig=b33a062d8cc1d08690ad8f7d727e5a1f",
  5. "backupUrl": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=b33a062d8cc1d08690ad8f7d727e5a1f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=7b626b942dab4437433e276e1dfd6c63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=40000000"],
  6. "backup_url": ["https://xy112x111x47x2xy.mcdn.xxxxxxxxxx.cn:4483/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=mcdn&oi=3550958494&trid=00001a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=b33a062d8cc1d08690ad8f7d727e5a1f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&mcdnid=11000413&bvc=vod&nettype=0&orderid=0,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=A0000400", "https://upos-sz-mirrorali.xxxxxxxxxx.com/upgcxcode/07/13/1267024297/1267024297-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1695874583&gen=playurlv2&os=alibv&oi=3550958494&trid=1a6a4eb478e4473c92669eaa7931691bu&mid=1716139964&platform=pc&upsig=7b626b942dab4437433e276e1dfd6c63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&buvid=423719E5-C1F3-8E99-9949-C4F0FD92681D98687infoc&build=0&f=u_0_0&agrr=0&bw=107051&logo=40000000"],
  7. "bandwidth": 855502,
  8. "mimeType": "video/mp4",
  9. "mime_type": "video/mp4",
  10. "codecs": "hev1.1.6.L150.90",
  11. "width": 1920,
  12. "height": 1080,
  13. "frameRate": "23.810",
  14. "frame_rate": "23.810",
  15. "sar": "1:1",
  16. "startWithSap": 1,
  17. "start_with_sap": 1,
  18. "SegmentBase": {
  19. "Initialization": "0-1570",
  20. "indexRange": "1571-8935"
  21. },
  22. "segment_base": {
  23. "initialization": "0-1570",
  24. "index_range": "1571-8935"
  25. },
  26. "codecid": 12
  27. }

我们看到有好几个url,实际上用第一个baseUrl即可。

现在我们拿到了视频真实地址,接下来该下载视频了,现在我们需要再回头分析视频下载请求。

先看请求头:

我们构造请求的时候可以把上面这些头都设置上,但是经过我的验证,实际上我们只需要设置下面这几个头即可:

Origin:就设置破站的域名即可

Referer:设置这个视频在浏览器地址栏中的地址即可

User-Agent:设置这个固定值即可

Range:上面截图设置的是bytes=0-1570,这个是咋回事?

观察一下上面的json,看到了吧,就设置为这个值就可以了。

是不是万事大吉了呢?根据以上思路,我构造了个请求试了下,果然还有问题,为啥?显然是Range:bytes=0-1570的问题。

不过,在这个请求的应答头里面,可以找到答案:

很显然,这个值就是视频的完整大小,所以,咱们设置为Range:bytes=0-3098152果然,下载下来了完整视频。

所以,我们的逻辑应该是,先设置Range:bytes=0-1570,请求一次,从这次请求的应答头中找到Content-Range,拿到视频的总大小3098152。再请求一次,设置Range:bytes=0-3098152,这次的应答,便是完整的视频文件了。

现在总该万事大吉了吧?打开视频检验一下。还是有点不对劲,只有人像,没有声音。

3、下载声音文件

再回看前面的完整json,视频文件信息是从data.dash.video路径下面找到的,我们看到还有一个data.dash.audio路径,显然,这是声音文件。

所以说破站是视频、音频分离的。

接下来我们还要把音频文件下载下来,下载过程跟上面视频文件是一致的,这里不再啰嗦了。

四、程序实现

代码基于SpringBoot,开发一个Web程序,部署到云服务器,供用户下载视频。

1、拿到完整json

根据前面的分析,我们首先请求视频在浏览器地址栏中的地址,拿到html。然后从html中拿到json,最后从json中拿到视频信息和音频信息,代码如下:

  1. logger.info("开始解析视频地址:{}",url);
  2. String html = restTemplate.getForObject(url,String.class);
  3. String regex = "(?<=<script>window.__playinfo__=).*?(?=</script>)";
  4. Pattern pattern = Pattern.compile(regex);
  5. Matcher matcher = pattern.matcher(html);
  6. if (matcher.find()) {
  7. String jsonStr = matcher.group();
  8. JSON json = JSONUtil.parse(jsonStr);
  9. JSONArray videoList = (JSONArray)json.getByPath("data.dash.video");
  10. JSONArray audioList = (JSONArray)json.getByPath("data.dash.audio");
  11. }

2、下载视频文件

  1. for (Object video:videoList){
  2. JSONObject map = (JSONObject)video;
  3. String videoUrl = map.get("baseUrl").toString();
  4. String segmentInit = map.getByPath("SegmentBase.Initialization").toString();
  5. RequestCallback requestCallback = new RequestCallback() {
  6. @Override
  7. public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException {
  8. clientHttpRequest.getHeaders().add("Referer",url);
  9. clientHttpRequest.getHeaders().add("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36");
  10. clientHttpRequest.getHeaders().add("Range","bytes="+segmentInit);
  11. }
  12. };
  13. ResponseExtractor responseExtractor = new ResponseExtractor<String>() {
  14. @Override
  15. public String extractData(ClientHttpResponse clientHttpResponse) throws IOException {
  16. return clientHttpResponse.getHeaders().get("Content-Range").get(0).split("/")[1];
  17. }
  18. };
  19. Object videoSize = restTemplate.execute(videoUrl, HttpMethod.GET,requestCallback,responseExtractor);
  20. logger.info("视频地址:{}",videoUrl);
  21. logger.info("视频大小:{}",videoSize);
  22. RequestCallback videoRequestCallback = new RequestCallback() {
  23. @Override
  24. public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException {
  25. clientHttpRequest.getHeaders().add("Referer",url);
  26. clientHttpRequest.getHeaders().add("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36");
  27. clientHttpRequest.getHeaders().add("Range","bytes=0-"+videoSize);
  28. }
  29. };
  30. String fileName = StringUtils.substringBefore(videoUrl,".m4s");
  31. fileName = StringUtils.substringAfterLast(fileName,"/");
  32. final String finalFileName = fileName +".mp4";
  33. ResponseExtractor videoResponseExtractor = new ResponseExtractor<Boolean>() {
  34. @Override
  35. public Boolean extractData(ClientHttpResponse clientHttpResponse) throws IOException {
  36. OutputStream output = null;
  37. try {
  38. output = new FileOutputStream(dir+ finalFileName);
  39. logger.info("开始下载视频文件:{}",finalFileName);
  40. IOUtils.copy(clientHttpResponse.getBody(),output);
  41. logger.info("视频文件下载完成:{}",finalFileName);
  42. return Boolean.TRUE;
  43. }catch (Exception e){
  44. e.printStackTrace();
  45. return Boolean.FALSE;
  46. }finally {
  47. if (output != null){
  48. output.close();
  49. }
  50. }
  51. }
  52. };
  53. Object result = restTemplate.execute(videoUrl, HttpMethod.GET,videoRequestCallback,videoResponseExtractor);
  54. if ((Boolean)result){
  55. videoFile = finalFileName;
  56. break;
  57. }
  58. }

3、下载音频文件

与下载视频文件逻辑一致,不再贴出。

4、视频音频合并

上面的步骤把视频和音频文件都下载下来了,我们需要将这俩合并成一个文件。

百度搜索一个叫ffmpeg的东西,这是个武功高强的音视频处理工具,具体有多高强呢,我估计有三四层楼那么高。

使用这个工具合并音频视频,正常是在命令行中这么用:

  1. ffmpeg -i 视频文件名.mp4 -i 音频文件名.mp3 -c:v copy -c:a copy 输出文件名.mp4

集成到java代码中,其实就是执行上面的命令即可:

  1. List<String> commands = new ArrayList<>();
  2. commands.add(ffmpegPath);
  3. commands.add("-i");
  4. commands.add(dir+videoFile);
  5. commands.add("-i");
  6. commands.add(dir+audioFile);
  7. commands.add("-c:v");
  8. commands.add("copy");
  9. commands.add("-c:a");
  10. commands.add("copy");
  11. commands.add(dir+"final-file.mp4");
  12. logger.info("开始合成视频音频");
  13. ProcessBuilder builder = new ProcessBuilder();
  14. builder.command(commands);
  15. try {
  16. builder.inheritIO().start().waitFor();
  17. logger.info("视频合成完成");
  18. } catch (InterruptedException | IOException e) {
  19. logger.info("视频合成失败:{}", ExceptionUtils.getStackTrace(e));
  20. }

5、文件下载

从用户使用的角度来看,整个流程是这样:

1)输入视频地址

2)后台将对应的视频音频下载并合并成最终mp4文件,保存在磁盘

3)返回保存在磁盘上的mp4文件名,并提示用户是否要下载该视频

4)用户确定后,将3中返回的文件名回传给后台,后台找到文件磁盘保存地址,并下载

下面是下载的相应代码:

  1. logger.info("下载视频文件:{}",file);
  2. if (StringUtils.isEmpty(file)){
  3. return;
  4. }
  5. String[] arr = file.split("_");
  6. if (arr.length != 2){
  7. return;
  8. }
  9. String filePath = baseDir+File.separator+arr[0]+File.separator+arr[1];
  10. if (!FileUtil.exist(filePath)){
  11. return;
  12. }
  13. HttpFile.downloadFile(arr[1],filePath,response);
  14. FileUtil.del(baseDir+File.separator+arr[0]);

五、部署到云服务器

我手上本来就有一台腾讯云服务器,直接拿来用即可。作为一个程序员,云服务器现在应该是标配了,学生可以用来学习,菜鸟可以用来练手,老鸟玩点有趣的东西偶尔赚点小钱。你如果想买一台云服务器来玩儿,下面是直达腾讯云优惠专区的链接:

https://cloud.tencent.com/act/cps/redirect?redirect=5186&cps_key=814b8b5d55ef58acc94a1b6bf43d5a2b&from=console

1、打包

maven命令随便打个包吧:mvn clean package,或者在你的IDE上双击一下某个按钮。

2、上传

连上你的服务器,把jar包扔上去。这里推荐一个工具:FinalShell,集shell和ftp于一体,非常方便。

3、启动

端口默认配置的30016,可以根据需要进行修改。通过以下命令就可以愉快的启动服务了:

  1. nohup java -jar xxxxxxxx.jar >/dev/null 2>&1 &

4、安装ffmpeg

上面提到,破站是视频、音频分离的,所以程序中需要调用ffmpeg这个工具将视频和音频文件进行合并。ffmpeg工具的安装方法可自行搜索,这不是本文重点。

5、验证一下

目前,可以通过http://服务器公网ip:30016 的方式在全世界每个角落进行访问了。当然,你也可以申请一个域名。

我把这个程序部署到了腾讯云上,试试效果:http://106.53.17.139:30016/

?

源码请猛点(0积分):https://download.csdn.net/download/u012071890/88403445

或者到这里获取:https://github.com/shenmejianghu/bili-downloader

编译完jar包赶紧扔你的服务器上,开启你的“装13”加“年入千万”之旅吧。

注:本代码基于破站鬼畜视频模块抓包分析,不一定适用于所有模块,可自行分析扩展代码,原理相通。

?

六、总结

整个开发过程结束了,这其中最重要的环节是抓包分析的过程,如果这个过程搞定了,剩下的编码工作量其实很小。

最后,恳请大家不要乱来,千万别给我上Jmeter,如果给我干崩了,我可拿你没办法。学习交流使用,真的不要乱来哦。

原文链接:https://www.cnblogs.com/blogtimes/p/17777546.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号