优酷m3u8动态地址破解

2017-01-16  本文已影响0人  9701a3f6343b

废话不多说直接上代码

(function(){
  window.BuildVideoInfo = {
    encodeid:"XMTY3NjA4MTAzNg==",
    _type:"m3u8",
    _url:"http://play.youku.com/play/get.json?vid=419020259&ct=12&callback=BuildVideoInfo.response",
    _vid:"419020259",
  };
  // encodeid:"XMTU4MzI3Mzc1Ng==",
  // _type:"m3u8",
  // _url:"http://play.youku.com/play/get.json?vid=395818439&ct=12&callback=BuildVideoInfo.response",
  // _vid:"395818439",
  BuildVideoInfo.response = function(a) {
      this.init(a);
      //var b = a.data, c = b.stream;
      //this.playlistError || (this.playlistOK=!0, this.reportPlayListUep(), YK.v = a, a && b && (!c || "default" === c[0].drm_type && "http" === c[0].transfer_mode) ? this.init(a) : this.error(1, a, b, c))
  };
  BuildVideoInfo.m3u8src = function(a) {
      return YK.password = this._password, YK.m3u8src_v2(this.encodeid, a)
  };
  BuildVideoInfo.init = function(a) {
        console.log(a);
        this._v = a;
        var b = a.data, c = b.stream;
        if (this.encodeid = b.video.encodeid, !b.security ||!b.security.encrypt_string ||!b.security.ip)
            return YKP.sendErrorReport(2004), void YKP.showError(null, "数据解析错误");
        if (!c&&!b.error)
            return void YKP.showError(null, "该视频暂不能播放");
        var d = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26], e = rc4(translate(YK.mk.a3 + "o0b" + YKP.userCache.a1, d).toString(), decode64(b.security.encrypt_string)), f = e.split("_");
        YKP.userCache.sid = e.split("_")[0];
        YKP.userCache.token = e.split("_")[1];
        YK.v = a;
        var url = YK.m3u8src_v2(BuildVideoInfo.encodeid,"mp4");
        $("#media").attr("src",url)
        // var string = '<video id="media" src="'+url+'" width="0px" height="0px" preload controls ></video>';
        // $(".page-content").append(string);
        console.log(url);
        //$("#media").attr("src",url);
    };
  var YK = {}, YKU = {}, YKP = {
          playerType: "",
          userCache: {
              a1: "4",
              a2: "1"
          },
          playerState: {
              PLAYER_STATE_INIT: "PLAYER_STATE_INIT",
              PLAYER_STATE_READY: "PLAYER_STATE_READY",
              PLAYER_STATE_AD: "PLAYER_STATE_AD",
              PLAYER_STATE_PLAYING: "PLAYER_STATE_PLAYING",
              PLAYER_STATE_END: "PLAYER_STATE_END",
              PLAYER_STATE_ERROR: "PLAYER_STATE_ERROR"
          },
          playerCurrentState: "PLAYER_STATE_INIT"
      };
  YK.m3u8src = function(a, b) {
        var c = "http://v.youku.com/player/getM3U8/vid/" + a + "/type/" + b + "/ts/" + parseInt((new Date).getTime() / 1e3);
        return  (c += "/useKeyFrame/0"), c += "/v.m3u8"
    };
  YK.m3u8src_v2 = function(a, b) {
      var c = {
          vid: a,
          type: b,
          ts: parseInt((new Date).getTime() / 1e3),
          keyframe: YKP.isIPHONE ? 0: 1
      };
      YK.password && (c.password = YK.password), YK.password && YK.initConfig.client_id && YK.config.partner_config && 1 == YK.config.partner_config.status && 1 == YK.config.partner_config.passless && (c.client_id = YK.initConfig.client_id);
      var d = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26], e = encodeURIComponent(encode64(rc4(translate(YK.mk.a4 + "poz" + YKP.userCache.a2, d).toString(), YKP.userCache.sid + "_" + a + "_" + YKP.userCache.token)));
      c.ep = e, c.sid = YKP.userCache.sid, c.token = YKP.userCache.token, c.ctype = "12", c.ev = "1", c.oip = YK.v.data.security.ip;
      var f = "http://pl.youku.com/playlist/m3u8?" + urlParameter(c);
      return f;
  };
  YK.mk = {}, YK.mk.a3 = "b4et", void(YK.mk.a4 = "boa4")
  function decode64(a) {
      if (!a)
          return "";
      a = a.toString();
      var b, c, d, e, f, g, h, i = new Array( - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, 62, - 1, - 1, - 1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 1, - 1, - 1, - 1, - 1, - 1, - 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 1, - 1, - 1, - 1, - 1, - 1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 1, - 1, - 1, - 1, - 1);
      for (g = a.length, f = 0, h = ""; g > f;) {
          do
              b = i[255 & a.charCodeAt(f++)];
          while (g > f&&-1 == b);
          if ( - 1 == b)
              break;
          do
              c = i[255 & a.charCodeAt(f++)];
          while (g > f&&-1 == c);
          if ( - 1 == c)
              break;
          h += String.fromCharCode(b<<2 | (48 & c)>>4);
          do {
              if (d = 255 & a.charCodeAt(f++), 61 == d)
                  return h;
              d = i[d]
          }
          while (g > f&&-1 == d);
          if ( - 1 == d)
              break;
          h += String.fromCharCode((15 & c)<<4 | (60 & d)>>2);
          do {
              if (e = 255 & a.charCodeAt(f++), 61 == e)
                  return h;
              e = i[e]
          }
          while (g > f&&-1 == e);
          if ( - 1 == e)
              break;
          h += String.fromCharCode((3 & d)<<6 | e)
      }
      return h
  }
  function rc4(a, b) {
          for (var c, d = [], e = 0, f = "", g = 0; 256 > g; g++)
              d[g] = g;
          for (g = 0; 256 > g; g++)
              e = (e + d[g] + a.charCodeAt(g%a.length))%256, c = d[g], d[g] = d[e], d[e] = c;
          g = 0, e = 0;
          for (var h = 0; h < b.length; h++)
              g = (g + 1)%256, e = (e + d[g])%256, c = d[g], d[g] = d[e], d[e] = c, f += String.fromCharCode(b.charCodeAt(h)^d[(d[g] + d[e])%256]);
          return f
      }
  function translate(a, b) {
      for (var c = [], d = 0; d < a.length; d++) {
          var e = 0;
          e = a[d] >= "a" && a[d] <= "z" ? a[d].charCodeAt(0) - "a".charCodeAt(0) : a[d] - "0" + 26;
          for (var f = 0; 36 > f; f++)
              if (b[f] == e) {
                  e = f;
                  break
              }
          e > 25 ? c[d] = e - 26 : c[d] = String.fromCharCode(e + 97)
      }
      return c.join("")
  }
  // var d = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26], e = rc4(translate(YK.mk.a3 + "o0b" + YKP.userCache.a1, d).toString(), decode64(b.security.encrypt_string)), f = e.split("_");
  // YKP.userCache.sid = e.split("_")[0];
  // YKP.userCache.token = e.split("_")[1];
  $.ajax(
    {
        type:'get',
        url : BuildVideoInfo._url,
        dataType : 'jsonp',
        jsonp:"jsoncallback",
        success  : function(data) {
            alert(data);
        },
        error : function(e) {
            //alert("fail");
        }
    }
  );

  var encode64 = function(a) {
        if (!a)
            return "";
        a = a.toString();
        var b, c, d, e, f, g, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        for (d = a.length, c = 0, b = ""; d > c;) {
            if (e = 255 & a.charCodeAt(c++), c == d) {
                b += h.charAt(e>>2), b += h.charAt((3 & e)<<4), b += "==";
                break
            }
            if (f = a.charCodeAt(c++), c == d) {
                b += h.charAt(e>>2), b += h.charAt((3 & e)<<4 | (240 & f)>>4), b += h.charAt((15 & f)<<2), b += "=";
                break
            }
            g = a.charCodeAt(c++), b += h.charAt(e>>2), b += h.charAt((3 & e)<<4 | (240 & f)>>4), b += h.charAt((15 & f)<<2 | (192 & g)>>6), b += h.charAt(63 & g)
        }
        return b
    }
    var urlParameter = function(a) {
        var b = [];
        for (var c in a)
            b.push(c + "=" + a[c]);
        return b.join("&")
    }
})(window)

只要配置好前面的encodeid、_url以及_vid就能正确输出优酷m3u8正确的原始地址

上一篇下一篇

猜你喜欢

热点阅读