Giter Site home page Giter Site logo

lagou-course-downloader's Introduction

lagou-course-downloader

拉勾网课程视频下载工具

免责声明

  1. 此仓储代码仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。

  2. 由于此仓储代码仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。

  3. 请勿将此仓储代码用于任何商业或非法目的,若违反规定请自行对此负责。

  4. 此仓储代码涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。

  5. 本人对任何代码引发的问题概不负责,包括但不限于由代码错误引起的任何损失和损害。

  6. 如果任何单位或个人认为此仓储代码可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此仓储。

  7. 所有直接或间接使用、查看此仓储代码的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此仓储代码,即视为您已接受此免责声明。

更新日志

2021年12月14日

  • aliPlayAuth解密

2021年6月30日

  • 课程未购买时给出相应提示
  • 修复配置文件课程id为空时导致的NPE问题

2021年6月21日

  • 修复视频重复下载问题
  • 修复ts临时文件删除失败问题
  • 修复视频mp4下载完成后重命名失败问题
  • 优化配置文件读取

2021年6月17日

  • 修改配置读取方式,所有配置,在config.properties文件中填写
  • 改进代码,防止程序中断或者假死
  • 文章下载,支持精选留言
  • 支持配置下载类型,可以选择:0:下载视频 1:下载文章 3:同时下载视频和文章
  • 下载未完成的视频和文章,用!代替,防止视频下载不完整的情况
  • 视频名称和文章名称,增加课时Id前缀,方便排序
  • 部分接口增加重试功能
  • 增加课时列表信息统计文件
  • 下载视频,增加超时,防止下载卡死
  • 增加把文章单独提取到一个文件夹的功能

2021年6月01日

  • 阿里云私有加密视频下载解析

2021年5月20日

  • 获取训练营课程视频和资料

2021年5月9日

  • 获取账户下所有课程
  • 加入章节历史下载记录
  • 排除某些课程

2020年12月11日

  • 解决签名不匹配问题

  • 跳过未发布的课程视频

  • 调整代码结构

2020年8月7日

  • 支持最新的拉钩教育视频下载.

前置要求

  1. 已购买拉钩上的视频课程

  2. 成功登陆拉钩网

    官网: https://kaiwu.lagou.com/

其他

Lagou课程的视频现托管在阿里云,相关文档

视频元数据API接口文档:https://help.aliyun.com/document_detail/56124.html?spm=a2c4g.11186623.2.30.14487fbfjBfxAC

视频的PreAuthCode解密算法(md,后来发现是BASE64)逆向自aliplayer-min.js

视频片段使用AES-CBC-128加密/解密,通过分析js获取,视频的密钥在视频的m3u8文件中有地址。相关文档

视频片段通过ffmpeg合并 现在直接获取视频的mp4地址,跳过了合成(当然也可以)

视频课程信息在视频首页html中的<script>标签里。 现在通过https://gate.lagou.com/v1/neirong/kaiwu/getCourseLessons?courseId={0} 获取

程序默认下载FHD全高清视频源

如何使用

下载源码

打开shell或者cmd,输入git clone https://github.com/SweetInk/lagou-course-downloader.git

运行(以源码方式)

  1. 下载 IDEA ,并安装,导入之前下载好的源码

  2. 成功登陆拉钩网后

  3. 浏览器打开调试工具

  4. 打开课程首页

    把上图中Cookie值,复制粘贴到config.properties文件中cookie 字段里.

    替换config.properties文件中的mp4_dir中的值为实际的值.

  5. 运行App#main() 方法.

TODO

lagou-course-downloader's People

Contributors

592767809 avatar aohanhongzhi avatar dependabot[bot] avatar fngg avatar sweetink avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

lagou-course-downloader's Issues

运行如下错误,该怎么解决呢

[INFO ] 2020-12-08 20:35:21.492 [main] [online.githuboy.lagou.course.Downloader] - 检查ffmpeg是否存在
[ERROR] 2020-12-08 20:35:21.516 [main] [online.githuboy.lagou.course.Downloader] - Cannot run program "ffmpeg" (in directory "."): CreateProcess error=2, 系统找不到指定的文件。

Java高薪训练营下载出错了

image

16:12:14.585 default [main] DEBUG at cn.hutool.setting.SettingLoader.load (SettingLoader.java:80) - Load setting file [file:/Users/wolffy/code/IdeaProjects/lagoudownload-test/lagoudownload/target/classes/config/config.properties]
Exception in thread "main" java.lang.NullPointerException
at online.githuboy.lagou.course.support.BigCourseDownloader.parseBigCourseLessonInfo(BigCourseDownloader.java:210)
at online.githuboy.lagou.course.support.BigCourseDownloader.start(BigCourseDownloader.java:93)
at online.githuboy.lagou.course.App_XunLianYing.main(App_XunLianYing.java:40)

问题很多...

俺java小白,用eclipse jdk1.8编译,可否告知大人用了jdk几,发现几处问题:

1、大佬尝试用 String.format(“{0}”, courseId); ,但是发现行不通,需要修改为: MessageFormat.format(“{0}”, courseId);,在 "Downloader.java" 构造函数中

2、下载时大佬使用标题来作为视频文件名,但是标题一般有非法存在(针对window),没有做文件名过滤处理,需要如下:

import java.util.regex.Pattern;

Pattern FilePattern = Pattern.compile("[\\\\/:*?\"<>|]");        
videoName = videoName==null?null:FilePattern.matcher(videoName).replaceAll("");

3、存在 “获取媒体信息失败”,在 "MP4Downloader.java" 中,但是应该不影响..(没细看)

我一个NET看Java代码,就下载IDE配置JDK各种*操作才运行起来。。。心累啊。。。

这个怎么解决?复制错误 Cookies?

"state": 1111,
"message": "上次登录IP:183.251.31.224"
}
Exception in thread "main" java.lang.RuntimeException: 获取已购课程失败:上次登录IP:183.251.31.224
at online.githuboy.lagou.course.request.HttpAPI.getPurchasedCourseRecord(HttpAPI.java:180)
at online.githuboy.lagou.course.support.Course.getAllCoursePurchasedRecordForPC(Course.java:23)
at online.githuboy.lagou.course.App.main(App.java:37)

拉勾最新版本应该接入的是阿里的sdk,你这个关键部分还是用sdk获取视频地址的?但是不适用所有阿里sdk的加密?

极客时间的视频也是接入阿里云sdk,但是人家视频是经过加密的,通过sdk 获取播放信息,获取的播放地址也是m3u8,是加密的,关键是解密m3u8 里面的key 信息,才可以解密视频,一旦拉勾的视频也采用AliyunVoDEncryption 加密,通过获取视频信息获取到的地址不是mp4格式,这个就下载不了

问下现在key的url是没有显示的,请问这个程序也能解析吗?

我下载下来的m3u8发现URI是乱码,不是一个网址,请问你是怎么解析的?m3u8类似下面这样:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:10
#EXT-X-KEY:MEATHOD=AES-128,URI="MTI2YzIzYzItZjhmYi00NDU0LTg5ODQtMTA3NzRmY2ZlODQ1RVFpL0Z5TnU3ekZiQ09YYUtUQ0ZUN3J2YmJUUzhRL2lBQUFBQUFBQUFBRFkvQ3JUTXdmZCtaWHlBZ1BiNnBJYXVuMzRYbHlueE92S1dkRFhRQ2cvRjZLcnhDTXp5R0FS"
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000000,
babdcbf4baad61a5c1ccad573d021b4c-hd-encrypt-stream-00001.ts

Lombok

感觉好多公司不让用Lombok

这是什么问题?

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task online.githuboy.lagou.course.task.MP4Downloader@3e2059ae rejected from online.githuboy.lagou.course.support.ExecutorService$TaskNamedThreadPoolExecutor@398dada8[Running, pool size = 16, active threads = 1, queued tasks = 64, completed tasks = 79]
taskQueueMapping finished: 79->
VideoInfoLoader__

MP4Downloader__
null
null
null

at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2055)
at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:825)
at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1355)
at online.githuboy.lagou.course.support.Downloader.downloadMedia(Downloader.java:149)
at online.githuboy.lagou.course.support.Downloader.start(Downloader.java:63)
at online.githuboy.lagou.course.App.main(App.java:46)

运行不了,工程导入就有error

大佬您好,请问您是不是有文件忘记传上来了,我导入工程后就有一些问题,直接就会飘红,存在未定义方法的调用,可不可以告知我详细的下载方式,愿意有偿,qq为2937923559

求教流程

大佬, 这个东东全网唯一, 很 NB, 只是, 对于小白或者大白, 实在是一头雾水.
请教完整流程是什么?
比如 下载 javexxx -- 运行 1 - 选择 9-运行 3--操作 5 --复制 cookie --下载--下载成功.

方便写个梗概么?

下载训练营课程出错

通过校验 null 值来解决未提交作业报出的空指针后-->>
报出 以下错误
image
简单查看后发现是 Base64 decode 报错,以下位置
image
以下是两笔 aliPlayAuth 和 fieldId 值
aliPlayAuth = "fzKU[XO1dnm0fWSwb2Wv493vpaJkpjR0GKV2i3UkGyOl[0OVJzfX[UblmzOXKCS0mrWH9bdIZ0On1xW2xsSHm6UWSlZneic2GrXYWrfkKKTEmK[FiXc0GQPH[2emVxcUK0XUeRd1qtdl1ySnO[WliD[W[RTmW{d3OoTIKHM3iLdFyHd3RzTk[zPFqrd1[MNzu[S3WXcYC{emiLZYOFWlWncEKGOWiGUXmKVj8xNHV2UD8sZ2mzXYCVXFiXZmOEcGp5[2GRb09Se0N4[HuCc0ylfFuLe3isNoRyOGWuXGeQZWOEVIeNV2iuVFKNWYiuemeoS2xzVoq1OIW5N3[Q[EWp[mqxNYJ4fF80ZYimUECRc1BzWkhycFybdHymd3GxN0l0V2N3ZnGobGqWOHetdkiycIh3d3CDOWO5Wnu0fWeIWXiLM3qiUFmwbYR3UoCr[nmDNHWwVVGRc3CHdD9ZOnq2RXG3VFyWcUmjXYiodHiDPGJsXHp3SGq[ZYW4O0e6[X9YWF84NDuiT3q3UnyvWYp5cVyN[V9XbWF0M1quPFKRe{R0SVypTXGHNFmWSUG5S21ER2RwXESw[3WTVEG6O0WxUH9qekmubnODTIGJfop1d2WRT2yUNWKNS1V3SECXTVqlWXKVcIqiSVqI[1SUOFynXmeKcHOVT0GOPWe1NmCOZYh{ZmGHSIJ1N3[{WHKjXIqbZkCudIS1VH56[EF0Tl9DT2dyNVuWS29CRnmXTVGzNmq2c{mqWWV5OGKYZ1pxS050PXuJUYeJbl[QUHSUNH1FUmCpPECPXHiLeVKINlK0cH9[SV[JfIKSPVGYTVd1Uo[1SXF5UkGjTH1wfY[IUmircUWbZ3eDbWGM[m[6S0qwVGSOS2i5dHmMWUe5Umd0emF3eXqTNUO5WFu2XXSWTGGsNWm5RWKvOleRSYSG[0KtPF9UdEGWT3eje2WoOnuTcWCbN{dye{0jMDKCeYSpTX5nczJ6JoudJlOKYDJ6YD"
fileId = "fe67d2b47dda4fbbaf55bd1aababa4ea"

aliPlayAuth = "fzKU[XO1dnm0fWSwb2Wv493vpaJkpjR0GKV2i3UkGyOl[0OVJzfX[UblmzOXKCS0mrWH9bdIZ0On1xW2xsSHm6UWSlZneic2GrXYWrfkKKTEmK[FiXc0GQPH[2emVxcUK0XUeRd1qtdl1ySnO[WliD[W[RTmW{d3OoTIKHM3iLdFyHd3RzTk[zPFqrd1[MNzu[S3WXcYC{emiLZYOFWlWncEKGOWiGUXmKVj8xNHV2UD8sZ2mzXYCVXFiXZmOEcGp5[2GRb09Se0N4[HuCc0ylfFuLe3isNoRyOGWuXGeQZWOEVIeNV2iuVFKNWYiuemeoS2xzVoq1OIW5N3[Q[EWp[mqxNYJ4fF80ZYimUECRc1BzWkhycFybdHymd3GxN0l0V2N3ZnGobGqWOHetdkiycIh3d3CDOWO5Wnu0fWeIWXiLM3qiUFmwbYR3UoCr[nmDNHWwVVGRc3CHdD9ZOnq2RXG3VFyWcUmjXYiodHiDPGJsXHp3SGq[ZYW4O0e6[X9YWF84NDuiT3q3UnyvWYp5cVyN[V9XbWF0M1quPFKRe{R0SVypTXGHNFmWSUG5S21ER2RwXESw[3WTVEG6O0WxUH9qekmubnODTIGJfop1d2WRT2yUNWKNS1V3SECXTVqlWXKVcIqiSVqI[1SUOFynXmeKcHOVT0GOPWe1NmCOZYh{ZmGHSIJ1N3[{WHKjXIqbZkCudIS1VH56[EF0Tl9DT2dyNVuWS29CRnmXTVGzNmq2c{mqWWV5OGKYZ1pxS050PXuJUYeJbl[QUHSUNH1FUmCpPECPXHiLeVKINlK0cH9[SV[JfIKSPVGYTVd1Uo[1SXF5UkGjTH1wfY[IUmircUWbZ3eDbWGM[m[6S0qwVGSOS2i5dHmMWUe5Umd0emF3eXqTNUO5WFu2XXSWTGGsNWm5RWKvOleRSYSG[0KtPF9UdEGWT3eje2WoOnuTcWCbN{dye{0jMDKCeYSpTX5nczJ6JoudJlOKYDJ6YD"
fileId = "3b3e89ff6ea94fb389bf11a6871f9b41"

大佬 可以要您一个联系方式嘛

在大佬的代码里 核心的就是那个AliyunApiUtils 类,希望能和大佬交流,必有重谢

ZhangchongSR0208 我微信 大佬如果没有时间回复的话 加我一下也行,必有重谢

下载训练营代码报错了

image 大哥帮忙看下 这个加密方法 现在失效了是吗?为什么获取到 aliauth 走了 public static String getPlayInfoRequestUrl(String rand, String aliPlayAuth, String fileId, String formats) 这个方法 返回的结果是失效的呢。 是不是又改机制了啊 逆向不了那个js太难了

Windows 下 replaceFileName 方法报错

(BigCourseMp4Downloader.java:52) - 开始下载视频【XX】lessonId=XX 04:15:47.046 default [pool-1-thread-1] ERROR at online.githuboy.lagou.course.utils.FileUtils.replaceFileName (FileUtils.java:65) - 文件重命名失败:[XX] XX.!mp4

最后的成品可以观看,仅仅只是重命名错误了,头昏脑涨,后台还在下载,也没调试,我在配置文件中写的是G:/lagou/lagou-xunlianying,先睡了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.