Skip to content
一个可以直接下载知乎视频的浏览器插件
Branch: master
Clone or download
shellvon fixed sina cors
新浪图片前几日新增了图片Referer检查,不允许跨域.
Latest commit c06206f Apr 29, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs fixed sina cors Apr 29, 2019
scripts first commit Aug 5, 2018
src
.babelrc
.eslintrc.js
.gitignore
.prettierrc
LICENSE Create LICENSE Sep 5, 2018
README.md update docs and released 1.0.9 Sep 13, 2018
package-lock.json update docs and released 1.0.9 Sep 13, 2018
package.json
webpack.config.js resolved #9 and update recommend loading spinner Aug 22, 2018

README.md

Zh-Downloader

这是Chrome插件(亦支持Firefox), 能进行知乎视频嗅探以及下载功能。支持下载为TS格式( MPEG2-TS 格式) 或者 MP4 格式。

Chrome Web Store

Firefox 用户请下载 1.0.9 版本以后的zip文件. See #12

更多介绍/下载信息请访问: http://zh-downloader.tw

使用说明

下载本代码之后执行 npm install && npm run build 之后在 chrome://extensions/ 中选择"加载已解压的扩展程序" 选择 dist 目录即可。

或者你可以选择已经打包好的CRX/ZIP格式插件(1.0.3开始不再提供CRX,参见 #6 ),可以前往这里下载:https://github.com/shellvon/zh-downloader/releases/

技术

本次计划使用 Vue,因此选择了 Kocal/vue-web-extension 模版

原理解释

本插件主要由 Popup Script 以及 Background Script 合作完成,参见:Understanding Google Chrome Extensions

大体步骤:

  • 使用 chrome.webRequest.onBeforeRequest 监听所有知乎发起的视频请求,根据简单抓包可以看到知乎当有视频的时候会向这个地址:https://v.vzuu.com/video/ZHIHU_VIDEO_ID 发起请求,其中ZHIHU_VIDEO_ID即为知乎视频ID. 之后利用知乎 API: https://lens.zhihu.com/api/videos/ZHIHU_VIDEO_ID 找到视频的 m3u8 地址。

  • 利用 M3U8-Parser 解析上述 API 返回的数据,并提交数据至 Popup 页面进行查看。

  • 提交数据利用了 Vue 的 Store 状态管理,由于 Popup 生命周期的原因,因此将 Store 也存入了 chrome.storage 进行持久化, 插件是 vuex-webextensions

  • Popup(前端)接受用户下载请求,利用 chrome.runtime.connect 连接 Port 与 Background.js (后端)进行双向通讯,通知其下载请求。

  • Background.js 遍历所有 TS 数据包并将起合并为一个 TS 包,如果发现下载的是 mp4 格式,则利用 mpegts_to_mp4 或则 mux.js 进行数据转化。

  • 利用 Port 实时通知 Popup 页的下载进度以及下载结果。

⚠️ 注意: MP4 尝试了mpegts_to_mp4, mux.js, videoconverter.js 效果均不是很理想。因此不建议下载MP4。

  1. mpegts_to_mp4: 读取 SPS 信息的时候宽度/高度信息错误 (调研发现是没有去掉 Emulation Prevention Bytes. 目前已经修复))
  2. mux.js 能正常读取宽/高,但是无法正常解析Duration(See videojs/mux.js#210),另一个有趣的问题是部分知乎用户的视频没有音频,因此不会触发 mux.js 的 data 事件(See videojs/mux.js#194),因此需要分开处理音频/视频。
  3. videoconverter.js Node 直接就爆内存错误

限制

  1. 下载过程中不能关闭 Popup 页,否则后端无法与之通信然后通知下载结果
  2. 不知道视频链接过期时间, 因此下载过程中会出现403,这时候可以点击ID进入知乎将自动刷新
  3. 转化的MP4格式宽高不正确,因此普通视频播放器可能难以播放, 请尝试用 mplayer 播放。 或者下载 TS 之后用 ffmpeg 或者 https://cloudconvert.com/ 在线转换

TODO:

  • 用户可自定义设置
  • 已下载视频增加打开功能
  • 自动删除采集超过一定时间的视频(时间/策略?)
  • 用户忽略某些条件的视频采集(如大小/清晰度/作者/视频名)? (似乎没什么用,此功能不打算实现)
  • 直接搜索知乎视频(不知道有API没有) 知乎推荐视频(无法搜索)
  • 修复导出 MP4 格式的问题,无论是 mux.js 还是 mpegts_to_mp4,任一即可
  • 发布至 Google Chrome 商店Install from Google Chrome Store

Change Logs

关于本项目的 Change Logs 您可以访问 http://zh-downloader.tw/#change-logs 查看详情 或者可以查看 docs/changelog.json 文件。

You can’t perform that action at this time.