前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫还能这么玩-防采集?MSUP阿里加密视频沦陷!

爬虫还能这么玩-防采集?MSUP阿里加密视频沦陷!

作者头像
一个程序猿的异常
发布2023-07-24 18:13:26
2240
发布2023-07-24 18:13:26
举报
文章被收录于专栏:一个程序猿的异常

AnyProxy,springboot,ffmpeg强强联合,下载msup大会阿里加密视频,学习大牛打怪招式。

执行流程图

MSUP 是做什么的?

麦思博(msup)有限公司是一家面向软件研发团队的培训咨询机构,专注于软件研发中心的快速成长,服务于软件开发团队的技能提升、软件工程的实际应用和软件品质的创新与超越。强调人员、技术、流程和管理的有机结合,注重个体的技能提升与职业发展,研发团队的管理与协作。分享世界级软件研发团队最佳管理实践,这正是msup的精髓所在!

AnyProxy 简介

AnyProxy是一个开放式的HTTP代理服务器。

Github主页:https://github.com/alibaba/anyproxy

主要特性包括:

  • 基于Node.js,开放二次开发能力,允许自定义请求处理逻辑
  • 支持Https的解析
  • 提供GUI界面,用以观察请求

作为全局模块

这里以Windows为例

代码语言:javascript
复制
npm install -g anyproxy

启动

  • 命令行启动AnyProxy,默认端口号8001
代码语言:javascript
复制
anyproxy
  • 启动后将终端http代理服务器配置为127.0.0.1:8001即可
  • 访问http://127.0.0.1:8002 ,web界面上能看到所有的请求信息

代理HTTPS

  • AnyProxy默认不对https请求做处理,如需看到明文信息,需要配置CA证书

解析https请求的原理是中间人攻击(man-in-the-middle),用户必须信任AnyProxy生成的CA证书,才能进行后续流程

  • 生成证书并解析所有https请求
代码语言:javascript
复制
anyproxy-ca #生成rootCA证书,生成后需要手动信任
anyproxy --intercept #启动AnyProxy,并解析所有https请求
  • 证书生成后会自动打开生成证书的目录,默认位置:{userhome}\.anyproxy\certificates,双击打开证书,根据提示安装。

rule模块简介

AnyProxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。

规则模块的能力范围包括:

  • 拦截并修改正在发送的请求
    • 可修改内容包括请求头(request header),请求体(request body),甚至是请求的目标地址等
  • 拦截并修改服务端响应
    • 可修改的内容包括http状态码(status code)、响应头(response header)、响应内容等
  • 拦截https请求,对内容做修改
    • 本质是中间人攻击(man-in-the-middle attack),需要客户端提前信任AnyProxy生成的CA
代码语言:javascript
复制
anyproxy --rule ./rule.js

我们使用到的脚本示例

代码语言:javascript
复制
module.exports = {
    * beforeSendResponse(requestDetail, responseDetail) {
        // 这里可能需要根据自己所在地区切换下URL,看下请求替换就可以了
        if (requestDetail.url.indexOf('vod.cn-shanghai.aliyuncs.com') > -1) {
            const newResponse = responseDetail.response;
            const body = newResponse.body;
            let result = JSON.parse(body.toString());
            let res = result.PlayInfoList.PlayInfo;
            let hdInfo;
            for (var i = 0; i < res.length; i++) {
                var r = res[i];
                if (r.Definition == 'HD') {
                    hdInfo = r;
                    break;
                }
            }
            if (!hdInfo) {
                hdInfo = res[res.length - 1];
            }
            let url = hdInfo.PlayURL;
            let vid = result.VideoBase.VideoId;
            console.log(url);
            console.log(vid);

            return {
                response: newResponse
            };
        }
    },
};
启动脚本

这里不在赘述如何获取全部视频和如何获取视频播放地址,有心的人自然知道怎么处理

代码语言:javascript
复制
anyproxy --intercept --rule rule.js  

打开浏览器输入地址 chrome://settings/ 展开 高级选项 - 打开您计算机的代理设置 配置代理地址和端口为 127.0.0.1 8001 点击保存即可

浏览器输入视频地址 https://case.msup.com.cn/play?id=165&videoId=0 观察控制台,发现可以打印出我们需要的视频地址信息

拷贝地址使用 ffplay 播放确认是否可用

代码语言:javascript
复制
ffplay url

控制台有日志输出,并且开始播放,binggo~,地址对了,接下来就是如何保存视频。

ffmpeg 简介

  • Windows 下载地址 https://ffmpeg.zeranoe.com/builds/
  • 下载完成以后解压,把解压目录添加到 环境变量 下,方便使用
  • m3u8 视频保存MP4
代码语言:javascript
复制
ffmpeg -i  [url] [test.mp4]  

springboot

使用springboot的目的是把整个流程脚本化执行批量下载,关于所有视频信息的获取,有兴趣的自行研究吧,这里只介绍如何根据得到的视频信息自动下载。

我们需要借助 anyproxyrule 脚本的能力 拦截 response 把视频地址发送到我们的程序,然后自动下载。接口请求使用 axios 库。

发送视频信息到服务端

代码语言:javascript
复制
// 我是个java程序猿,不要吐槽我的前端代码!
if (vid && url) {
    axios.get('http://127.0.0.1:8081/msup/item/vid?vid=' + vid + '&url=' + url).then(function (response) {
        const data = response.data;
        if (data.id) {
            axios.get('http://127.0.0.1:8081/msup/down?id=' + data.id + '&url=' + data.url);
        } else {
            console.log('>>>>>>>>>>>>>>>>>>>>')
        }
    });
}

服务端根据视频信息进行下载

代码语言:javascript
复制
public static String ffmpeg(String id, String url) {
  return execute("sh", "-c", "cd /root/msup/ && nohup ffmpeg -i " + url + " " + id + ".mp4  > " + id + ".log 2>&1 &");
}

private static String execute(String... args) {

  LOGGER.info("exec : " + Arrays.toString(args));

  StringBuilder sb = new StringBuilder();

  try {
    ProcessBuilder pb = new ProcessBuilder(args);

    pb.redirectErrorStream(true);

    Process proc = pb.start();
    LOGGER.info("Process started !");

    String line;
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(), "gbk"));
    while ((line = in.readLine()) != null) {
      sb.append(line).append(System.getProperty("line.separator"));
      LOGGER.info(line);
    }

    proc.destroy();
    LOGGER.info("Process ended !");
  } catch (Exception e) {
  }

  return sb.toString();
}

展示下成果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个程序猿的异常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 执行流程图
  • MSUP 是做什么的?
  • AnyProxy 简介
    • 作为全局模块
      • 启动
        • 代理HTTPS
          • rule模块简介
            • 我们使用到的脚本示例
              • 启动脚本
          • ffmpeg 简介
          • springboot
            • 发送视频信息到服务端
              • 服务端根据视频信息进行下载
              • 展示下成果
              相关产品与服务
              云服务器
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档