上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 李恒道 - 

【结束大吉】onlyfans的OB解密及DRM过校验思路(八)

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6763

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-7-1 11:09:52 | 显示全部楼层 | 阅读模式

    所以我们接下来只需要给cdmServer拓展一下设置证书,在node部分拿到证书就可以了
    剩下的不算很难了,我就只罗列一些关键的代码
    获取pssh,这里我偷懒排序取了个最小pssh

    function getPSSH(url, Cookie) {
      return new Promise(async (resolve, reject) => {
        try {
          const { data } = await axios.request({
            method: 'get',
            url: url,
            headers: {
              'Cookie': Cookie
            },
          })
          const reg = /<cenc\:pssh>(.*)<\/cenc\:pssh>/g
          const psshArray = sortArray([...data.matchAll(reg)].map(item => item[1]))[0]
          resolve(psshArray)
        } catch (error) {
          console.log(error)
          reject()
        }
    
      })
    }

    然后获取证书

                      const certificate = await new Promise((resolve) => {
                        axios.post(domain + cdmServer, buf, {
                          headers: cdmHeader,
                          responseType: "arraybuffer"
                        }).then((response) => {
                          resolve(response.data.toString('hex'))
                        }).catch((err) => {
                          console.log('err', err)
                        })
                      })

    在服务器端判断是否有证书,有的话就设置

        certificate= form.get("certificate")
        if not certificate is None:
             certificate=bytes.fromhex(certificate)
             cdmInstance.set_service_certificate(cdm_session_id,certificate)

    那么我们就可以拿到密钥了,先在js创建一个密钥数组

        const keyList = data.data.map((item) => item.key).map((key) => {
          return '-decryption_key ' + key
        })

    分别解密mp4和m4a

        const fileList = await downloadDRMViedeo(mpd, baseDir, mediaItem.id, Cookie)
        const mergeFile = []
        for (let index = 0; index < fileList.length; index++) {
          const filePath = fileList[index]
          await new Promise((resolve) => {
            ffmpeg().input(baseDir + '/' + filePath).inputOptions([
              ...keyList,
            ]).audioCodec('copy').videoCodec('copy').output(baseDir + '/drm_' + filePath).on("end", () => {
              mergeFile.push(baseDir + '/drm_' + filePath)
              resolve();
            }).run()
          })
        }

    然后将两个视频合并到一起就可以了

        await new Promise((resolve) => {
          ffmpeg().input(mergeFile[0]).input(mergeFile[1]).audioCodec('copy').videoCodec('copy').output(baseDir + '/decrypt_drm_' + mediaItem.id + '.mp4')
            .on('error', function (err) {
              console.log('An error occurred: ' + err.message);
            })
            .on('end', function () {
              resolve();
            })
            .run();
        })

    最后调用deleteVideoFiles分别删除残余文件

      await deleteVideoFiles(baseDir, mediaItem.id + '')
      await deleteVideoFiles(baseDir, 'drm_' + mediaItem.id)

    这里的删除是我组合的功能函数,也抄了网上的
    传入路径和文件前缀就可以自动删除

    function deleteFiles(files, callback) {
      if (files.length == 0) {
        callback()
      }
      var i = files.length;
      files.forEach(function (filepath) {
        fs.unlink(filepath, function (err) {
          i--;
          if (err) {
            callback(err);
            return;
          } else if (i <= 0) {
            callback(null);
          }
        });
      });
    }
    async function deleteVideoFiles(path, id) {
      return new Promise(async (resolve) => {
        const files = await getVideoFiles(path, id)
        deleteFiles(files, resolve)
      })
    }

    那么就实现了onlyfans的drm解密啦!
    因为没法贴图,所以这里贴个玩偶姐姐代替图吧
    图片.png
    完结撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    该用户从未签到

    0

    主题

    15

    回帖

    34

    积分

    助理工程师

    积分
    34

    新人报道油中3周年

    发表于 2024-7-2 15:28:58 | 显示全部楼层
    ggnbbbbbbbbbbbbbbbbbb
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表