• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python爬虫:爬取web网易云音乐——

武飞扬头像
date3_3_1kbaicai
帮助1

找到存储歌曲地址的url界面

首先我们要进入网易云的web页面在页面中我们随意选择一首歌曲,打开开发者工具查看响应的界面。

学新通

在这些页面中我们需要查找存储有音乐文件的url,这是我们可以打开全局搜索直接搜索与音频文件后缀相关的文件。(当然这这里可能会白忙活)

因为我们打开媒体文件,看见的后缀是.m4a,这也是类属于音频文件的一种只是划分的更细一点。(媒体文件一般包括音频和视频)

 学新通

 我们知道了返回的音频的格式,这时我们就知道我们需要找什么样的返回格式了,直接ctrl f搜索.m4a,我们可以看见这样一个界面

学新通

 如果想更直观的观看就点击预览:

学新通

 这时我们就知道在这个页面中返回了一些什么参数,code:200成功请求,歌曲的id号也可以说是歌曲的省份证,类型url地址,还有一些不知道干什么的参数,我们都可以通过键名猜测它是干嘛的,(如果还不放心也可以直接复制url地址打开看一看)

确定了返回的界面我们的第一步就已经完成了。

对比寻找我们需要的传递解密的参数

第二步我们就需要尝试多请求几首不同的歌曲发现里面有什么不同的参数。

可以看到post传递的参数有两个params和ensSeckey,哪里面的内容是什么呢,我们如何才能够传递像浏览器一样的参数,那是我们下一个需要解决的问题。

学新通

如果我们把自己想象为网页的负责人,一定不想让爬虫顺利的爬取我们网页的内容把,这时我们就会设置措施,这就是反爬,我们又想要数据这就是对抗。这里不得不提醒下爬虫需要注意的三个准则。

1.经常的看爬取网站的君子协议(Robots.txt协议,里面也可以看见网页允许什么样的请求头,那样我们的爬虫体验将是一种新待遇)

2.在不影响服务器端正常运行的前提下进行爬虫

3.不要使用爬虫进行不当得利,这样会违背不当竞争,如果东窗事发一告一个准。

说了这么多的题外话,就是希望我们在每一次爬虫时都要构造请求头,这里需要注意到是一个浏览器自带的代理地址,还有一个是cookie,cookie是一个有时效性的身份认证,里面有时也会带有必要的参数,需要我们去破解。

而在这里我们可以使用插件工具进行在线测试,在页面中我没有对请求头传入任何数据,值传递了post参数也能够完成请求,所以我们在这里可以不用构造请求头,但是作为一个有专业素养的爬虫高手,习惯的写上去了。

学新通

插件的名字叫Talend API Tester - Free Edition 

如有需要自行下载:密码:1kbc(需要解压点击crx文件压缩,edg开发者模式自行配置路径)

https://pan.百度.com/s/1uFadnzIq10WDbiYNRqpRrg?pwd=1kbc

到了这里我们我们知道只需要向网页传递post的数据返回值里面就会有音乐的源文件地址,第二步我们也完成了。

分析post表单数据

输出模块

我们如何知道这数据是怎么来的呢?

第一种关键字查找,我们可以使用CTRL shift f进行全局搜索params:和encSecKey:的一个

学新通

搜索直接带我们返回到了源代码的这儿,而且params:和encSecKey:还是成对出现的,只能说很大概率是这里,要确定就需要我们进一步的验证,这就是断点调试看见了返回页面需要经过这里。

学新通

这时我们就需要对这里的js代码进行分析了,可以看出有一个函数传入四个参数然后赋值于bVe7X,之后我们传递的参数带入到bVe7X,返回我们的post参数。这里我们就需要去研究这个window.asrsea函数的内部构造。

学新通

 点击跳转我们到了这样一个函数体中,我们把断点打在这里不断的调试,

学新通

 学新通

这里一共有五个函数,a函数是生成16给字符的随机字符串 ,b函数传入两个值进行加密模块,这里是AES对称加密,下面的偏移和模块CBC都是常见的加密方式。我们可以经过不断的尝试把这三个函数一python代码表示出来,我们知道在界面的post数据是如何输出的,接下来我们就需要知道我们需要输入什么数据了。

输入数据

 在不断的尝试中我知道了window.asrsea函数中传入的4个参数有三个是固定值,那还有一个是确定歌曲的唯一标识。

学新通

那还有一个是确定歌曲的唯一标识。

 学新通

 可以看出传递的参数可以设定歌曲的音质,ids号。。。

到这里我们的分析就结束了下一节是我的代码阶段,明天在续写。

第一次写python爬虫实战,写的坎坎坷坷的,有种心有余而力不足的感觉,见谅!!!

先把代码发出来js代码

  1.  
    let window = {};
  2.  
    var CryptoJS = CryptoJS || function(u, p) {
  3.  
    var d = {}
  4.  
    , l = d.lib = {}
  5.  
    , s = function() {}
  6.  
    , t = l.Base = {
  7.  
    extend: function(a) {
  8.  
    s.prototype = this;
  9.  
    var c = new s;
  10.  
    a && c.mixIn(a);
  11.  
    c.hasOwnProperty("init") || (c.init = function() {
  12.  
    c.$super.init.apply(this, arguments)
  13.  
    }
  14.  
    );
  15.  
    c.init.prototype = c;
  16.  
    c.$super = this;
  17.  
    return c
  18.  
    },
  19.  
    create: function() {
  20.  
    var a = this.extend();
  21.  
    a.init.apply(a, arguments);
  22.  
    return a
  23.  
    },
  24.  
    init: function() {},
  25.  
    mixIn: function(a) {
  26.  
    for (var c in a)
  27.  
    a.hasOwnProperty(c) && (this[c] = a[c]);
  28.  
    a.hasOwnProperty("toString") && (this.toString = a.toString)
  29.  
    },
  30.  
    clone: function() {
  31.  
    return this.init.prototype.extend(this)
  32.  
    }
  33.  
    }
  34.  
    , r = l.WordArray = t.extend({
  35.  
    init: function(a, c) {
  36.  
    a = this.words = a || [];
  37.  
    this.sigBytes = c != p ? c : 4 * a.length
  38.  
    },
  39.  
    toString: function(a) {
  40.  
    return (a || v).stringify(this)
  41.  
    },
  42.  
    concat: function(a) {
  43.  
    var c = this.words
  44.  
    , e = a.words
  45.  
    , j = this.sigBytes;
  46.  
    a = a.sigBytes;
  47.  
    this.clamp();
  48.  
    if (j % 4)
  49.  
    for (var k = 0; k < a; k )
  50.  
    c[j k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j k) % 4);
  51.  
    else if (65535 < e.length)
  52.  
    for (k = 0; k < a; k = 4)
  53.  
    c[j k >>> 2] = e[k >>> 2];
  54.  
    else
  55.  
    c.push.apply(c, e);
  56.  
    this.sigBytes = a;
  57.  
    return this
  58.  
    },
  59.  
    clamp: function() {
  60.  
    var a = this.words
  61.  
    , c = this.sigBytes;
  62.  
    a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);
  63.  
    a.length = u.ceil(c / 4)
  64.  
    },
  65.  
    clone: function() {
  66.  
    var a = t.clone.call(this);
  67.  
    a.words = this.words.slice(0);
  68.  
    return a
  69.  
    },
  70.  
    random: function(a) {
  71.  
    for (var c = [], e = 0; e < a; e = 4)
  72.  
    c.push(4294967296 * u.random() | 0);
  73.  
    return new r.init(c,a)
  74.  
    }
  75.  
    })
  76.  
    , w = d.enc = {}
  77.  
    , v = w.Hex = {
  78.  
    stringify: function(a) {
  79.  
    var c = a.words;
  80.  
    a = a.sigBytes;
  81.  
    for (var e = [], j = 0; j < a; j ) {
  82.  
    var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255;
  83.  
    e.push((k >>> 4).toString(16));
  84.  
    e.push((k & 15).toString(16))
  85.  
    }
  86.  
    return e.join("")
  87.  
    },
  88.  
    parse: function(a) {
  89.  
    for (var c = a.length, e = [], j = 0; j < c; j = 2)
  90.  
    e[j >>> 3] |= parseInt(a.substr(j, 2), 16) << 24 - 4 * (j % 8);
  91.  
    return new r.init(e,c / 2)
  92.  
    }
  93.  
    }
  94.  
    , b = w.Latin1 = {
  95.  
    stringify: function(a) {
  96.  
    var c = a.words;
  97.  
    a = a.sigBytes;
  98.  
    for (var e = [], j = 0; j < a; j )
  99.  
    e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255));
  100.  
    return e.join("")
  101.  
    },
  102.  
    parse: function(a) {
  103.  
    for (var c = a.length, e = [], j = 0; j < c; j )
  104.  
    e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4);
  105.  
    return new r.init(e,c)
  106.  
    }
  107.  
    }
  108.  
    , x = w.Utf8 = {
  109.  
    stringify: function(a) {
  110.  
    try {
  111.  
    return decodeURIComponent(escape(b.stringify(a)))
  112.  
    } catch (c) {
  113.  
    throw Error("Malformed UTF-8 data")
  114.  
    }
  115.  
    },
  116.  
    parse: function(a) {
  117.  
    return b.parse(unescape(encodeURIComponent(a)))
  118.  
    }
  119.  
    }
  120.  
    , q = l.BufferedBlockAlgorithm = t.extend({
  121.  
    reset: function() {
  122.  
    this.i4m = new r.init;
  123.  
    this.yL2x = 0
  124.  
    },
  125.  
    AE9v: function(a) {
  126.  
    "string" == typeof a && (a = x.parse(a));
  127.  
    this.i4m.concat(a);
  128.  
    this.yL2x = a.sigBytes
  129.  
    },
  130.  
    mD8v: function(a) {
  131.  
    var c = this.i4m
  132.  
    , e = c.words
  133.  
    , j = c.sigBytes
  134.  
    , k = this.blockSize
  135.  
    , b = j / (4 * k)
  136.  
    , b = a ? u.ceil(b) : u.max((b | 0) - this.Vr8j, 0);
  137.  
    a = b * k;
  138.  
    j = u.min(4 * a, j);
  139.  
    if (a) {
  140.  
    for (var q = 0; q < a; q = k)
  141.  
    this.tt1x(e, q);
  142.  
    q = e.splice(0, a);
  143.  
    c.sigBytes -= j
  144.  
    }
  145.  
    return new r.init(q,j)
  146.  
    },
  147.  
    clone: function() {
  148.  
    var a = t.clone.call(this);
  149.  
    a.i4m = this.i4m.clone();
  150.  
    return a
  151.  
    },
  152.  
    Vr8j: 0
  153.  
    });
  154.  
    l.Hasher = q.extend({
  155.  
    cfg: t.extend(),
  156.  
    init: function(a) {
  157.  
    this.cfg = this.cfg.extend(a);
  158.  
    this.reset()
  159.  
    },
  160.  
    reset: function() {
  161.  
    q.reset.call(this);
  162.  
    this.mj8b()
  163.  
    },
  164.  
    update: function(a) {
  165.  
    this.AE9v(a);
  166.  
    this.mD8v();
  167.  
    return this
  168.  
    },
  169.  
    finalize: function(a) {
  170.  
    a && this.AE9v(a);
  171.  
    return this.nZ9Q()
  172.  
    },
  173.  
    blockSize: 16,
  174.  
    mE8w: function(a) {
  175.  
    return function(b, e) {
  176.  
    return (new a.init(e)).finalize(b)
  177.  
    }
  178.  
    },
  179.  
    yK2x: function(a) {
  180.  
    return function(b, e) {
  181.  
    return (new n.HMAC.init(a,e)).finalize(b)
  182.  
    }
  183.  
    }
  184.  
    });
  185.  
    var n = d.algo = {};
  186.  
    return d
  187.  
    }(Math);
  188.  
    (function() {
  189.  
    var u = CryptoJS
  190.  
    , p = u.lib.WordArray;
  191.  
    u.enc.Base64 = {
  192.  
    stringify: function(d) {
  193.  
    var l = d.words
  194.  
    , p = d.sigBytes
  195.  
    , t = this.bD5I;
  196.  
    d.clamp();
  197.  
    d = [];
  198.  
    for (var r = 0; r < p; r = 3)
  199.  
    for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r 1 >>> 2] >>> 24 - 8 * ((r 1) % 4) & 255) << 8 | l[r 2 >>> 2] >>> 24 - 8 * ((r 2) % 4) & 255, v = 0; 4 > v && r .75 * v < p; v )
  200.  
    d.push(t.charAt(w >>> 6 * (3 - v) & 63));
  201.  
    if (l = t.charAt(64))
  202.  
    for (; d.length % 4; )
  203.  
    d.push(l);
  204.  
    return d.join("")
  205.  
    },
  206.  
    parse: function(d) {
  207.  
    var l = d.length
  208.  
    , s = this.bD5I
  209.  
    , t = s.charAt(64);
  210.  
    t && (t = d.indexOf(t),
  211.  
    -1 != t && (l = t));
  212.  
    for (var t = [], r = 0, w = 0; w < l; w )
  213.  
    if (w % 4) {
  214.  
    var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4)
  215.  
    , b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4);
  216.  
    t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4);
  217.  
    r
  218.  
    }
  219.  
    return p.create(t, r)
  220.  
    },
  221.  
    bD5I: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /="
  222.  
    }
  223.  
    }
  224.  
    )();
  225.  
    (function(u) {
  226.  
    function p(b, n, a, c, e, j, k) {
  227.  
    b = b (n & a | ~n & c) e k;
  228.  
    return (b << j | b >>> 32 - j) n
  229.  
    }
  230.  
    function d(b, n, a, c, e, j, k) {
  231.  
    b = b (n & c | a & ~c) e k;
  232.  
    return (b << j | b >>> 32 - j) n
  233.  
    }
  234.  
    function l(b, n, a, c, e, j, k) {
  235.  
    b = b (n ^ a ^ c) e k;
  236.  
    return (b << j | b >>> 32 - j) n
  237.  
    }
  238.  
    function s(b, n, a, c, e, j, k) {
  239.  
    b = b (a ^ (n | ~c)) e k;
  240.  
    return (b << j | b >>> 32 - j) n
  241.  
    }
  242.  
    for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x )
  243.  
    b[x] = 4294967296 * u.abs(u.sin(x 1)) | 0;
  244.  
    r = r.MD5 = v.extend({
  245.  
    mj8b: function() {
  246.  
    this.cU5Z = new w.init([1732584193, 4023233417, 2562383102, 271733878])
  247.  
    },
  248.  
    tt1x: function(q, n) {
  249.  
    for (var a = 0; 16 > a; a ) {
  250.  
    var c = n a
  251.  
    , e = q[c];
  252.  
    q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360
  253.  
    }
  254.  
    var a = this.cU5Z.words
  255.  
    , c = q[n 0]
  256.  
    , e = q[n 1]
  257.  
    , j = q[n 2]
  258.  
    , k = q[n 3]
  259.  
    , z = q[n 4]
  260.  
    , r = q[n 5]
  261.  
    , t = q[n 6]
  262.  
    , w = q[n 7]
  263.  
    , v = q[n 8]
  264.  
    , A = q[n 9]
  265.  
    , B = q[n 10]
  266.  
    , C = q[n 11]
  267.  
    , u = q[n 12]
  268.  
    , D = q[n 13]
  269.  
    , E = q[n 14]
  270.  
    , x = q[n 15]
  271.  
    , f = a[0]
  272.  
    , m = a[1]
  273.  
    , g = a[2]
  274.  
    , h = a[3]
  275.  
    , f = p(f, m, g, h, c, 7, b[0])
  276.  
    , h = p(h, f, m, g, e, 12, b[1])
  277.  
    , g = p(g, h, f, m, j, 17, b[2])
  278.  
    , m = p(m, g, h, f, k, 22, b[3])
  279.  
    , f = p(f, m, g, h, z, 7, b[4])
  280.  
    , h = p(h, f, m, g, r, 12, b[5])
  281.  
    , g = p(g, h, f, m, t, 17, b[6])
  282.  
    , m = p(m, g, h, f, w, 22, b[7])
  283.  
    , f = p(f, m, g, h, v, 7, b[8])
  284.  
    , h = p(h, f, m, g, A, 12, b[9])
  285.  
    , g = p(g, h, f, m, B, 17, b[10])
  286.  
    , m = p(m, g, h, f, C, 22, b[11])
  287.  
    , f = p(f, m, g, h, u, 7, b[12])
  288.  
    , h = p(h, f, m, g, D, 12, b[13])
  289.  
    , g = p(g, h, f, m, E, 17, b[14])
  290.  
    , m = p(m, g, h, f, x, 22, b[15])
  291.  
    , f = d(f, m, g, h, e, 5, b[16])
  292.  
    , h = d(h, f, m, g, t, 9, b[17])
  293.  
    , g = d(g, h, f, m, C, 14, b[18])
  294.  
    , m = d(m, g, h, f, c, 20, b[19])
  295.  
    , f = d(f, m, g, h, r, 5, b[20])
  296.  
    , h = d(h, f, m, g, B, 9, b[21])
  297.  
    , g = d(g, h, f, m, x, 14, b[22])
  298.  
    , m = d(m, g, h, f, z, 20, b[23])
  299.  
    , f = d(f, m, g, h, A, 5, b[24])
  300.  
    , h = d(h, f, m, g, E, 9, b[25])
  301.  
    , g = d(g, h, f, m, k, 14, b[26])
  302.  
    , m = d(m, g, h, f, v, 20, b[27])
  303.  
    , f = d(f, m, g, h, D, 5, b[28])
  304.  
    , h = d(h, f, m, g, j, 9, b[29])
  305.  
    , g = d(g, h, f, m, w, 14, b[30])
  306.  
    , m = d(m, g, h, f, u, 20, b[31])
  307.  
    , f = l(f, m, g, h, r, 4, b[32])
  308.  
    , h = l(h, f, m, g, v, 11, b[33])
  309.  
    , g = l(g, h, f, m, C, 16, b[34])
  310.  
    , m = l(m, g, h, f, E, 23, b[35])
  311.  
    , f = l(f, m, g, h, e, 4, b[36])
  312.  
    , h = l(h, f, m, g, z, 11, b[37])
  313.  
    , g = l(g, h, f, m, w, 16, b[38])
  314.  
    , m = l(m, g, h, f, B, 23, b[39])
  315.  
    , f = l(f, m, g, h, D, 4, b[40])
  316.  
    , h = l(h, f, m, g, c, 11, b[41])
  317.  
    , g = l(g, h, f, m, k, 16, b[42])
  318.  
    , m = l(m, g, h, f, t, 23, b[43])
  319.  
    , f = l(f, m, g, h, A, 4, b[44])
  320.  
    , h = l(h, f, m, g, u, 11, b[45])
  321.  
    , g = l(g, h, f, m, x, 16, b[46])
  322.  
    , m = l(m, g, h, f, j, 23, b[47])
  323.  
    , f = s(f, m, g, h, c, 6, b[48])
  324.  
    , h = s(h, f, m, g, w, 10, b[49])
  325.  
    , g = s(g, h, f, m, E, 15, b[50])
  326.  
    , m = s(m, g, h, f, r, 21, b[51])
  327.  
    , f = s(f, m, g, h, u, 6, b[52])
  328.  
    , h = s(h, f, m, g, k, 10, b[53])
  329.  
    , g = s(g, h, f, m, B, 15, b[54])
  330.  
    , m = s(m, g, h, f, e, 21, b[55])
  331.  
    , f = s(f, m, g, h, v, 6, b[56])
  332.  
    , h = s(h, f, m, g, x, 10, b[57])
  333.  
    , g = s(g, h, f, m, t, 15, b[58])
  334.  
    , m = s(m, g, h, f, D, 21, b[59])
  335.  
    , f = s(f, m, g, h, z, 6, b[60])
  336.  
    , h = s(h, f, m, g, C, 10, b[61])
  337.  
    , g = s(g, h, f, m, j, 15, b[62])
  338.  
    , m = s(m, g, h, f, A, 21, b[63]);
  339.  
    a[0] = a[0] f | 0;
  340.  
    a[1] = a[1] m | 0;
  341.  
    a[2] = a[2] g | 0;
  342.  
    a[3] = a[3] h | 0
  343.  
    },
  344.  
    nZ9Q: function() {
  345.  
    var b = this.i4m
  346.  
    , n = b.words
  347.  
    , a = 8 * this.yL2x
  348.  
    , c = 8 * b.sigBytes;
  349.  
    n[c >>> 5] |= 128 << 24 - c % 32;
  350.  
    var e = u.floor(a / 4294967296);
  351.  
    n[(c 64 >>> 9 << 4) 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360;
  352.  
    n[(c 64 >>> 9 << 4) 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360;
  353.  
    b.sigBytes = 4 * (n.length 1);
  354.  
    this.mD8v();
  355.  
    b = this.cU5Z;
  356.  
    n = b.words;
  357.  
    for (a = 0; 4 > a; a )
  358.  
    c = n[a],
  359.  
    n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
  360.  
    return b
  361.  
    },
  362.  
    clone: function() {
  363.  
    var b = v.clone.call(this);
  364.  
    b.cU5Z = this.cU5Z.clone();
  365.  
    return b
  366.  
    }
  367.  
    });
  368.  
    t.MD5 = v.mE8w(r);
  369.  
    t.HmacMD5 = v.yK2x(r)
  370.  
    }
  371.  
    )(Math);
  372.  
    (function() {
  373.  
    var u = CryptoJS
  374.  
    , p = u.lib
  375.  
    , d = p.Base
  376.  
    , l = p.WordArray
  377.  
    , p = u.algo
  378.  
    , s = p.EvpKDF = d.extend({
  379.  
    cfg: d.extend({
  380.  
    keySize: 4,
  381.  
    hasher: p.MD5,
  382.  
    iterations: 1
  383.  
    }),
  384.  
    init: function(d) {
  385.  
    this.cfg = this.cfg.extend(d)
  386.  
    },
  387.  
    compute: function(d, r) {
  388.  
    for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q; ) {
  389.  
    n && s.update(n);
  390.  
    var n = s.update(d).finalize(r);
  391.  
    s.reset();
  392.  
    for (var a = 1; a < p; a )
  393.  
    n = s.finalize(n),
  394.  
    s.reset();
  395.  
    b.concat(n)
  396.  
    }
  397.  
    b.sigBytes = 4 * q;
  398.  
    return b
  399.  
    }
  400.  
    });
  401.  
    u.EvpKDF = function(d, l, p) {
  402.  
    return s.create(p).compute(d, l)
  403.  
    }
  404.  
    }
  405.  
    )();
  406.  
    CryptoJS.lib.Cipher || function(u) {
  407.  
    var p = CryptoJS
  408.  
    , d = p.lib
  409.  
    , l = d.Base
  410.  
    , s = d.WordArray
  411.  
    , t = d.BufferedBlockAlgorithm
  412.  
    , r = p.enc.Base64
  413.  
    , w = p.algo.EvpKDF
  414.  
    , v = d.Cipher = t.extend({
  415.  
    cfg: l.extend(),
  416.  
    createEncryptor: function(e, a) {
  417.  
    return this.create(this.IX5c, e, a)
  418.  
    },
  419.  
    createDecryptor: function(e, a) {
  420.  
    return this.create(this.brC8u, e, a)
  421.  
    },
  422.  
    init: function(e, a, b) {
  423.  
    this.cfg = this.cfg.extend(b);
  424.  
    this.Vv8n = e;
  425.  
    this.J5O = a;
  426.  
    this.reset()
  427.  
    },
  428.  
    reset: function() {
  429.  
    t.reset.call(this);
  430.  
    this.mj8b()
  431.  
    },
  432.  
    process: function(e) {
  433.  
    this.AE9v(e);
  434.  
    return this.mD8v()
  435.  
    },
  436.  
    finalize: function(e) {
  437.  
    e && this.AE9v(e);
  438.  
    return this.nZ9Q()
  439.  
    },
  440.  
    keySize: 4,
  441.  
    ivSize: 4,
  442.  
    IX5c: 1,
  443.  
    brC8u: 2,
  444.  
    mE8w: function(e) {
  445.  
    return {
  446.  
    encrypt: function(b, k, d) {
  447.  
    return ("string" == typeof k ? c : a).encrypt(e, b, k, d)
  448.  
    },
  449.  
    decrypt: function(b, k, d) {
  450.  
    return ("string" == typeof k ? c : a).decrypt(e, b, k, d)
  451.  
    }
  452.  
    }
  453.  
    }
  454.  
    });
  455.  
    d.StreamCipher = v.extend({
  456.  
    nZ9Q: function() {
  457.  
    return this.mD8v(!0)
  458.  
    },
  459.  
    blockSize: 1
  460.  
    });
  461.  
    var b = p.mode = {}
  462.  
    , x = function(e, a, b) {
  463.  
    var c = this.tB1x;
  464.  
    c ? this.tB1x = u : c = this.DB0x;
  465.  
    for (var d = 0; d < b; d )
  466.  
    e[a d] ^= c[d]
  467.  
    }
  468.  
    , q = (d.BlockCipherMode = l.extend({
  469.  
    createEncryptor: function(e, a) {
  470.  
    return this.Encryptor.create(e, a)
  471.  
    },
  472.  
    createDecryptor: function(e, a) {
  473.  
    return this.Decryptor.create(e, a)
  474.  
    },
  475.  
    init: function(e, a) {
  476.  
    this.ud1x = e;
  477.  
    this.tB1x = a
  478.  
    }
  479.  
    })).extend();
  480.  
    q.Encryptor = q.extend({
  481.  
    processBlock: function(e, a) {
  482.  
    var b = this.ud1x
  483.  
    , c = b.blockSize;
  484.  
    x.call(this, e, a, c);
  485.  
    b.encryptBlock(e, a);
  486.  
    this.DB0x = e.slice(a, a c)
  487.  
    }
  488.  
    });
  489.  
    q.Decryptor = q.extend({
  490.  
    processBlock: function(e, a) {
  491.  
    var b = this.ud1x
  492.  
    , c = b.blockSize
  493.  
    , d = e.slice(a, a c);
  494.  
    b.decryptBlock(e, a);
  495.  
    x.call(this, e, a, c);
  496.  
    this.DB0x = d
  497.  
    }
  498.  
    });
  499.  
    b = b.CBC = q;
  500.  
    q = (p.pad = {}).Pkcs7 = {
  501.  
    pad: function(a, b) {
  502.  
    for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n = 4)
  503.  
    l.push(d);
  504.  
    c = s.create(l, c);
  505.  
    a.concat(c)
  506.  
    },
  507.  
    unpad: function(a) {
  508.  
    a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
  509.  
    }
  510.  
    };
  511.  
    d.BlockCipher = v.extend({
  512.  
    cfg: v.cfg.extend({
  513.  
    mode: b,
  514.  
    padding: q
  515.  
    }),
  516.  
    reset: function() {
  517.  
    v.reset.call(this);
  518.  
    var a = this.cfg
  519.  
    , b = a.iv
  520.  
    , a = a.mode;
  521.  
    if (this.Vv8n == this.IX5c)
  522.  
    var c = a.createEncryptor;
  523.  
    else
  524.  
    c = a.createDecryptor,
  525.  
    this.Vr8j = 1;
  526.  
    this.eU6O = c.call(a, this, b && b.words)
  527.  
    },
  528.  
    tt1x: function(a, b) {
  529.  
    this.eU6O.processBlock(a, b)
  530.  
    },
  531.  
    nZ9Q: function() {
  532.  
    var a = this.cfg.padding;
  533.  
    if (this.Vv8n == this.IX5c) {
  534.  
    a.pad(this.i4m, this.blockSize);
  535.  
    var b = this.mD8v(!0)
  536.  
    } else
  537.  
    b = this.mD8v(!0),
  538.  
    a.unpad(b);
  539.  
    return b
  540.  
    },
  541.  
    blockSize: 4
  542.  
    });
  543.  
    var n = d.CipherParams = l.extend({
  544.  
    init: function(a) {
  545.  
    this.mixIn(a)
  546.  
    },
  547.  
    toString: function(a) {
  548.  
    return (a || this.formatter).stringify(this)
  549.  
    }
  550.  
    })
  551.  
    , b = (p.format = {}).OpenSSL = {
  552.  
    stringify: function(a) {
  553.  
    var b = a.ciphertext;
  554.  
    a = a.salt;
  555.  
    return (a ? s.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r)
  556.  
    },
  557.  
    parse: function(a) {
  558.  
    a = r.parse(a);
  559.  
    var b = a.words;
  560.  
    if (1398893684 == b[0] && 1701076831 == b[1]) {
  561.  
    var c = s.create(b.slice(2, 4));
  562.  
    b.splice(0, 4);
  563.  
    a.sigBytes -= 16
  564.  
    }
  565.  
    return n.create({
  566.  
    ciphertext: a,
  567.  
    salt: c
  568.  
    })
  569.  
    }
  570.  
    }
  571.  
    , a = d.SerializableCipher = l.extend({
  572.  
    cfg: l.extend({
  573.  
    format: b
  574.  
    }),
  575.  
    encrypt: function(a, b, c, d) {
  576.  
    d = this.cfg.extend(d);
  577.  
    var l = a.createEncryptor(c, d);
  578.  
    b = l.finalize(b);
  579.  
    l = l.cfg;
  580.  
    return n.create({
  581.  
    ciphertext: b,
  582.  
    key: c,
  583.  
    iv: l.iv,
  584.  
    algorithm: a,
  585.  
    mode: l.mode,
  586.  
    padding: l.padding,
  587.  
    blockSize: a.blockSize,
  588.  
    formatter: d.format
  589.  
    })
  590.  
    },
  591.  
    decrypt: function(a, b, c, d) {
  592.  
    d = this.cfg.extend(d);
  593.  
    b = this.Hf1x(b, d.format);
  594.  
    return a.createDecryptor(c, d).finalize(b.ciphertext)
  595.  
    },
  596.  
    Hf1x: function(a, b) {
  597.  
    return "string" == typeof a ? b.parse(a, this) : a
  598.  
    }
  599.  
    })
  600.  
    , p = (p.kdf = {}).OpenSSL = {
  601.  
    execute: function(a, b, c, d) {
  602.  
    d || (d = s.random(8));
  603.  
    a = w.create({
  604.  
    keySize: b c
  605.  
    }).compute(a, d);
  606.  
    c = s.create(a.words.slice(b), 4 * c);
  607.  
    a.sigBytes = 4 * b;
  608.  
    return n.create({
  609.  
    key: a,
  610.  
    iv: c,
  611.  
    salt: d
  612.  
    })
  613.  
    }
  614.  
    }
  615.  
    , c = d.PasswordBasedCipher = a.extend({
  616.  
    cfg: a.cfg.extend({
  617.  
    kdf: p
  618.  
    }),
  619.  
    encrypt: function(b, c, d, l) {
  620.  
    l = this.cfg.extend(l);
  621.  
    d = l.kdf.execute(d, b.keySize, b.ivSize);
  622.  
    l.iv = d.iv;
  623.  
    b = a.encrypt.call(this, b, c, d.key, l);
  624.  
    b.mixIn(d);
  625.  
    return b
  626.  
    },
  627.  
    decrypt: function(b, c, d, l) {
  628.  
    l = this.cfg.extend(l);
  629.  
    c = this.Hf1x(c, l.format);
  630.  
    d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt);
  631.  
    l.iv = d.iv;
  632.  
    return a.decrypt.call(this, b, c, d.key, l)
  633.  
    }
  634.  
    })
  635.  
    }();
  636.  
    (function() {
  637.  
    for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c )
  638.  
    a[c] = 128 > c ? c << 1 : c << 1 ^ 283;
  639.  
    for (var e = 0, j = 0, c = 0; 256 > c; c ) {
  640.  
    var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4
  641.  
    , k = k >>> 8 ^ k & 255 ^ 99;
  642.  
    l[e] = k;
  643.  
    s[k] = e;
  644.  
    var z = a[e]
  645.  
    , F = a[z]
  646.  
    , G = a[F]
  647.  
    , y = 257 * a[k] ^ 16843008 * k;
  648.  
    t[e] = y << 24 | y >>> 8;
  649.  
    r[e] = y << 16 | y >>> 16;
  650.  
    w[e] = y << 8 | y >>> 24;
  651.  
    v[e] = y;
  652.  
    y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e;
  653.  
    b[k] = y << 24 | y >>> 8;
  654.  
    x[k] = y << 16 | y >>> 16;
  655.  
    q[k] = y << 8 | y >>> 24;
  656.  
    n[k] = y;
  657.  
    e ? (e = z ^ a[a[a[G ^ z]]],
  658.  
    j ^= a[a[j]]) : e = j = 1
  659.  
    }
  660.  
    var H = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]
  661.  
    , d = d.AES = p.extend({
  662.  
    mj8b: function() {
  663.  
    for (var a = this.J5O, c = a.words, d = a.sigBytes / 4, a = 4 * ((this.bbn9e = d 6) 1), e = this.bsg8Y = [], j = 0; j < a; j )
  664.  
    if (j < d)
  665.  
    e[j] = c[j];
  666.  
    else {
  667.  
    var k = e[j - 1];
  668.  
    j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24,
  669.  
    k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255],
  670.  
    k ^= H[j / d | 0] << 24);
  671.  
    e[j] = e[j - d] ^ k
  672.  
    }
  673.  
    c = this.bsh8Z = [];
  674.  
    for (d = 0; d < a; d )
  675.  
    j = a - d,
  676.  
    k = d % 4 ? e[j] : e[j - 4],
  677.  
    c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>> 8 & 255]] ^ n[l[k & 255]]
  678.  
    },
  679.  
    encryptBlock: function(a, b) {
  680.  
    this.DE0x(a, b, this.bsg8Y, t, r, w, v, l)
  681.  
    },
  682.  
    decryptBlock: function(a, c) {
  683.  
    var d = a[c 1];
  684.  
    a[c 1] = a[c 3];
  685.  
    a[c 3] = d;
  686.  
    this.DE0x(a, c, this.bsh8Z, b, x, q, n, s);
  687.  
    d = a[c 1];
  688.  
    a[c 1] = a[c 3];
  689.  
    a[c 3] = d
  690.  
    },
  691.  
    DE0x: function(a, b, c, d, e, j, l, f) {
  692.  
    for (var m = this.bbn9e, g = a[b] ^ c[0], h = a[b 1] ^ c[1], k = a[b 2] ^ c[2], n = a[b 3] ^ c[3], p = 4, r = 1; r < m; r )
  693.  
    var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p ]
  694.  
    , s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p ]
  695.  
    , t = d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p ]
  696.  
    , n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p ]
  697.  
    , g = q
  698.  
    , h = s
  699.  
    , k = t;
  700.  
    q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p ];
  701.  
    s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p ];
  702.  
    t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p ];
  703.  
    n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p ];
  704.  
    a[b] = q;
  705.  
    a[b 1] = s;
  706.  
    a[b 2] = t;
  707.  
    a[b 3] = n
  708.  
    },
  709.  
    keySize: 8
  710.  
    });
  711.  
    u.AES = p.mE8w(d)
  712.  
    }
  713.  
    )();
  714.  
    function RSAKeyPair(a, b, c) {
  715.  
    this.e = biFromHex(a),
  716.  
    this.d = biFromHex(b),
  717.  
    this.m = biFromHex(c),
  718.  
    this.chunkSize = 2 * biHighIndex(this.m),
  719.  
    this.radix = 16,
  720.  
    this.barrett = new BarrettMu(this.m)
  721.  
    }
  722.  
    function twoDigit(a) {
  723.  
    return (10 > a ? "0" : "") String(a)
  724.  
    }
  725.  
    function encryptedString(a, b) {
  726.  
    for (var f, g, h, i, j, k, l, c = new Array, d = b.length, e = 0; d > e; )
  727.  
    c[e] = b.charCodeAt(e),
  728.  
    e ;
  729.  
    for (; 0 != c.length % a.chunkSize; )
  730.  
    c[e ] = 0;
  731.  
    for (f = c.length,
  732.  
    g = "",
  733.  
    e = 0; f > e; e = a.chunkSize) {
  734.  
    for (j = new BigInt,
  735.  
    h = 0,
  736.  
    i = e; i < e a.chunkSize; h)
  737.  
    j.digits[h] = c[i ],
  738.  
    j.digits[h] = c[i ] << 8;
  739.  
    k = a.barrett.powMod(j, a.e),
  740.  
    l = 16 == a.radix ? biToHex(k) : biToString(k, a.radix),
  741.  
    g = l " "
  742.  
    }
  743.  
    return g.substring(0, g.length - 1)
  744.  
    }
  745.  
    function decryptedString(a, b) {
  746.  
    var e, f, g, h, c = b.split(" "), d = "";
  747.  
    for (e = 0; e < c.length; e)
  748.  
    for (h = 16 == a.radix ? biFromHex(c[e]) : biFromString(c[e], a.radix),
  749.  
    g = a.barrett.powMod(h, a.d),
  750.  
    f = 0; f <= biHighIndex(g); f)
  751.  
    d = String.fromCharCode(255 & g.digits[f], g.digits[f] >> 8);
  752.  
    return 0 == d.charCodeAt(d.length - 1) && (d = d.substring(0, d.length - 1)),
  753.  
    d
  754.  
    }
  755.  
    function setMaxDigits(a) {
  756.  
    maxDigits = a,
  757.  
    ZERO_ARRAY = new Array(maxDigits);
  758.  
    for (var b = 0; b < ZERO_ARRAY.length; b )
  759.  
    ZERO_ARRAY[b] = 0;
  760.  
    bigZero = new BigInt,
  761.  
    bigOne = new BigInt,
  762.  
    bigOne.digits[0] = 1
  763.  
    }
  764.  
    function BigInt(a) {
  765.  
    this.digits = "boolean" == typeof a && 1 == a ? null : ZERO_ARRAY.slice(0),
  766.  
    this.isNeg = !1
  767.  
    }
  768.  
    function biFromDecimal(a) {
  769.  
    for (var d, e, f, b = "-" == a.charAt(0), c = b ? 1 : 0; c < a.length && "0" == a.charAt(c); )
  770.  
    c;
  771.  
    if (c == a.length)
  772.  
    d = new BigInt;
  773.  
    else {
  774.  
    for (e = a.length - c,
  775.  
    f = e % dpl10,
  776.  
    0 == f && (f = dpl10),
  777.  
    d = biFromNumber(Number(a.substr(c, f))),
  778.  
    c = f; c < a.length; )
  779.  
    d = biAdd(biMultiply(d, lr10), biFromNumber(Number(a.substr(c, dpl10)))),
  780.  
    c = dpl10;
  781.  
    d.isNeg = b
  782.  
    }
  783.  
    return d
  784.  
    }
  785.  
    function biCopy(a) {
  786.  
    var b = new BigInt(!0);
  787.  
    return b.digits = a.digits.slice(0),
  788.  
    b.isNeg = a.isNeg,
  789.  
    b
  790.  
    }
  791.  
    function biFromNumber(a) {
  792.  
    var c, b = new BigInt;
  793.  
    for (b.isNeg = 0 > a,
  794.  
    a = Math.abs(a),
  795.  
    c = 0; a > 0; )
  796.  
    b.digits[c ] = a & maxDigitVal,
  797.  
    a >>= biRadixBits;
  798.  
    return b
  799.  
    }
  800.  
    function reverseStr(a) {
  801.  
    var c, b = "";
  802.  
    for (c = a.length - 1; c > -1; --c)
  803.  
    b = a.charAt(c);
  804.  
    return b
  805.  
    }
  806.  
    function biToString(a, b) {
  807.  
    var d, e, c = new BigInt;
  808.  
    for (c.digits[0] = b,
  809.  
    d = biDivideModulo(a, c),
  810.  
    e = hexatrigesimalToChar[d[1].digits[0]]; 1 == biCompare(d[0], bigZero); )
  811.  
    d = biDivideModulo(d[0], c),
  812.  
    digit = d[1].digits[0],
  813.  
    e = hexatrigesimalToChar[d[1].digits[0]];
  814.  
    return (a.isNeg ? "-" : "") reverseStr(e)
  815.  
    }
  816.  
    function biToDecimal(a) {
  817.  
    var c, d, b = new BigInt;
  818.  
    for (b.digits[0] = 10,
  819.  
    c = biDivideModulo(a, b),
  820.  
    d = String(c[1].digits[0]); 1 == biCompare(c[0], bigZero); )
  821.  
    c = biDivideModulo(c[0], b),
  822.  
    d = String(c[1].digits[0]);
  823.  
    return (a.isNeg ? "-" : "") reverseStr(d)
  824.  
    }
  825.  
    function digitToHex(a) {
  826.  
    var b = 15
  827.  
    , c = "";
  828.  
    for (i = 0; 4 > i; i)
  829.  
    c = hexToChar[a & b],
  830.  
    a >>>= 4;
  831.  
    return reverseStr(c)
  832.  
    }
  833.  
    function biToHex(a) {
  834.  
    var d, b = "";
  835.  
    for (biHighIndex(a),
  836.  
    d = biHighIndex(a); d > -1; --d)
  837.  
    b = digitToHex(a.digits[d]);
  838.  
    return b
  839.  
    }
  840.  
    function charToHex(a) {
  841.  
    var h, b = 48, c = b 9, d = 97, e = d 25, f = 65, g = 90;
  842.  
    return h = a >= b && c >= a ? a - b : a >= f && g >= a ? 10 a - f : a >= d && e >= a ? 10 a - d : 0
  843.  
    }
  844.  
    function hexToDigit(a) {
  845.  
    var d, b = 0, c = Math.min(a.length, 4);
  846.  
    for (d = 0; c > d; d)
  847.  
    b <<= 4,
  848.  
    b |= charToHex(a.charCodeAt(d));
  849.  
    return b
  850.  
    }
  851.  
    function biFromHex(a) {
  852.  
    var d, e, b = new BigInt, c = a.length;
  853.  
    for (d = c,
  854.  
    e = 0; d > 0; d -= 4,
  855.  
    e)
  856.  
    b.digits[e] = hexToDigit(a.substr(Math.max(d - 4, 0), Math.min(d, 4)));
  857.  
    return b
  858.  
    }
  859.  
    function biFromString(a, b) {
  860.  
    var g, h, i, j, c = "-" == a.charAt(0), d = c ? 1 : 0, e = new BigInt, f = new BigInt;
  861.  
    for (f.digits[0] = 1,
  862.  
    g = a.length - 1; g >= d; g--)
  863.  
    h = a.charCodeAt(g),
  864.  
    i = charToHex(h),
  865.  
    j = biMultiplyDigit(f, i),
  866.  
    e = biAdd(e, j),
  867.  
    f = biMultiplyDigit(f, b);
  868.  
    return e.isNeg = c,
  869.  
    e
  870.  
    }
  871.  
    function biDump(a) {
  872.  
    return (a.isNeg ? "-" : "") a.digits.join(" ")
  873.  
    }
  874.  
    function biAdd(a, b) {
  875.  
    var c, d, e, f;
  876.  
    if (a.isNeg != b.isNeg)
  877.  
    b.isNeg = !b.isNeg,
  878.  
    c = biSubtract(a, b),
  879.  
    b.isNeg = !b.isNeg;
  880.  
    else {
  881.  
    for (c = new BigInt,
  882.  
    d = 0,
  883.  
    f = 0; f < a.digits.length; f)
  884.  
    e = a.digits[f] b.digits[f] d,
  885.  
    c.digits[f] = 65535 & e,
  886.  
    d = Number(e >= biRadix);
  887.  
    c.isNeg = a.isNeg
  888.  
    }
  889.  
    return c
  890.  
    }
  891.  
    function biSubtract(a, b) {
  892.  
    var c, d, e, f;
  893.  
    if (a.isNeg != b.isNeg)
  894.  
    b.isNeg = !b.isNeg,
  895.  
    c = biAdd(a, b),
  896.  
    b.isNeg = !b.isNeg;
  897.  
    else {
  898.  
    for (c = new BigInt,
  899.  
    e = 0,
  900.  
    f = 0; f < a.digits.length; f)
  901.  
    d = a.digits[f] - b.digits[f] e,
  902.  
    c.digits[f] = 65535 & d,
  903.  
    c.digits[f] < 0 && (c.digits[f] = biRadix),
  904.  
    e = 0 - Number(0 > d);
  905.  
    if (-1 == e) {
  906.  
    for (e = 0,
  907.  
    f = 0; f < a.digits.length; f)
  908.  
    d = 0 - c.digits[f] e,
  909.  
    c.digits[f] = 65535 & d,
  910.  
    c.digits[f] < 0 && (c.digits[f] = biRadix),
  911.  
    e = 0 - Number(0 > d);
  912.  
    c.isNeg = !a.isNeg
  913.  
    } else
  914.  
    c.isNeg = a.isNeg
  915.  
    }
  916.  
    return c
  917.  
    }
  918.  
    function biHighIndex(a) {
  919.  
    for (var b = a.digits.length - 1; b > 0 && 0 == a.digits[b]; )
  920.  
    --b;
  921.  
    return b
  922.  
    }
  923.  
    function biNumBits(a) {
  924.  
    var e, b = biHighIndex(a), c = a.digits[b], d = (b 1) * bitsPerDigit;
  925.  
    for (e = d; e > d - bitsPerDigit && 0 == (32768 & c); --e)
  926.  
    c <<= 1;
  927.  
    return e
  928.  
    }
  929.  
    function biMultiply(a, b) {
  930.  
    var d, h, i, k, c = new BigInt, e = biHighIndex(a), f = biHighIndex(b);
  931.  
    for (k = 0; f >= k; k) {
  932.  
    for (d = 0,
  933.  
    i = k,
  934.  
    j = 0; e >= j; j,
  935.  
    i)
  936.  
    h = c.digits[i] a.digits[j] * b.digits[k] d,
  937.  
    c.digits[i] = h & maxDigitVal,
  938.  
    d = h >>> biRadixBits;
  939.  
    c.digits[k e 1] = d
  940.  
    }
  941.  
    return c.isNeg = a.isNeg != b.isNeg,
  942.  
    c
  943.  
    }
  944.  
    function biMultiplyDigit(a, b) {
  945.  
    var c, d, e, f;
  946.  
    for (result = new BigInt,
  947.  
    c = biHighIndex(a),
  948.  
    d = 0,
  949.  
    f = 0; c >= f; f)
  950.  
    e = result.digits[f] a.digits[f] * b d,
  951.  
    result.digits[f] = e & maxDigitVal,
  952.  
    d = e >>> biRadixBits;
  953.  
    return result.digits[1 c] = d,
  954.  
    result
  955.  
    }
  956.  
    function arrayCopy(a, b, c, d, e) {
  957.  
    var g, h, f = Math.min(b e, a.length);
  958.  
    for (g = b,
  959.  
    h = d; f > g; g,
  960.  
    h)
  961.  
    c[h] = a[g]
  962.  
    }
  963.  
    function biShiftLeft(a, b) {
  964.  
    var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt;
  965.  
    for (arrayCopy(a.digits, 0, d.digits, c, d.digits.length - c),
  966.  
    e = b % bitsPerDigit,
  967.  
    f = bitsPerDigit - e,
  968.  
    g = d.digits.length - 1,
  969.  
    h = g - 1; g > 0; --g,
  970.  
    --h)
  971.  
    d.digits[g] = d.digits[g] << e & maxDigitVal | (d.digits[h] & highBitMasks[e]) >>> f;
  972.  
    return d.digits[0] = d.digits[g] << e & maxDigitVal,
  973.  
    d.isNeg = a.isNeg,
  974.  
    d
  975.  
    }
  976.  
    function biShiftRight(a, b) {
  977.  
    var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt;
  978.  
    for (arrayCopy(a.digits, c, d.digits, 0, a.digits.length - c),
  979.  
    e = b % bitsPerDigit,
  980.  
    f = bitsPerDigit - e,
  981.  
    g = 0,
  982.  
    h = g 1; g < d.digits.length - 1; g,
  983.  
    h)
  984.  
    d.digits[g] = d.digits[g] >>> e | (d.digits[h] & lowBitMasks[e]) << f;
  985.  
    return d.digits[d.digits.length - 1] >>>= e,
  986.  
    d.isNeg = a.isNeg,
  987.  
    d
  988.  
    }
  989.  
    function biMultiplyByRadixPower(a, b) {
  990.  
    var c = new BigInt;
  991.  
    return arrayCopy(a.digits, 0, c.digits, b, c.digits.length - b),
  992.  
    c
  993.  
    }
  994.  
    function biDivideByRadixPower(a, b) {
  995.  
    var c = new BigInt;
  996.  
    return arrayCopy(a.digits, b, c.digits, 0, c.digits.length - b),
  997.  
    c
  998.  
    }
  999.  
    function biModuloByRadixPower(a, b) {
  1000.  
    var c = new BigInt;
  1001.  
    return arrayCopy(a.digits, 0, c.digits, 0, b),
  1002.  
    c
  1003.  
    }
  1004.  
    function biCompare(a, b) {
  1005.  
    if (a.isNeg != b.isNeg)
  1006.  
    return 1 - 2 * Number(a.isNeg);
  1007.  
    for (var c = a.digits.length - 1; c >= 0; --c)
  1008.  
    if (a.digits[c] != b.digits[c])
  1009.  
    return a.isNeg ? 1 - 2 * Number(a.digits[c] > b.digits[c]) : 1 - 2 * Number(a.digits[c] < b.digits[c]);
  1010.  
    return 0
  1011.  
    }
  1012.  
    function biDivideModulo(a, b) {
  1013.  
    var f, g, h, i, j, k, l, m, n, o, p, q, r, s, c = biNumBits(a), d = biNumBits(b), e = b.isNeg;
  1014.  
    if (d > c)
  1015.  
    return a.isNeg ? (f = biCopy(bigOne),
  1016.  
    f.isNeg = !b.isNeg,
  1017.  
    a.isNeg = !1,
  1018.  
    b.isNeg = !1,
  1019.  
    g = biSubtract(b, a),
  1020.  
    a.isNeg = !0,
  1021.  
    b.isNeg = e) : (f = new BigInt,
  1022.  
    g = biCopy(a)),
  1023.  
    new Array(f,g);
  1024.  
    for (f = new BigInt,
  1025.  
    g = a,
  1026.  
    h = Math.ceil(d / bitsPerDigit) - 1,
  1027.  
    i = 0; b.digits[h] < biHalfRadix; )
  1028.  
    b = biShiftLeft(b, 1),
  1029.  
    i,
  1030.  
    d,
  1031.  
    h = Math.ceil(d / bitsPerDigit) - 1;
  1032.  
    for (g = biShiftLeft(g, i),
  1033.  
    c = i,
  1034.  
    j = Math.ceil(c / bitsPerDigit) - 1,
  1035.  
    k = biMultiplyByRadixPower(b, j - h); -1 != biCompare(g, k); )
  1036.  
    f.digits[j - h],
  1037.  
    g = biSubtract(g, k);
  1038.  
    for (l = j; l > h; --l) {
  1039.  
    for (m = l >= g.digits.length ? 0 : g.digits[l],
  1040.  
    n = l - 1 >= g.digits.length ? 0 : g.digits[l - 1],
  1041.  
    o = l - 2 >= g.digits.length ? 0 : g.digits[l - 2],
  1042.  
    p = h >= b.digits.length ? 0 : b.digits[h],
  1043.  
    q = h - 1 >= b.digits.length ? 0 : b.digits[h - 1],
  1044.  
    f.digits[l - h - 1] = m == p ? maxDigitVal : Math.floor((m * biRadix n) / p),
  1045.  
    r = f.digits[l - h - 1] * (p * biRadix q),
  1046.  
    s = m * biRadixSquared (n * biRadix o); r > s; )
  1047.  
    --f.digits[l - h - 1],
  1048.  
    r = f.digits[l - h - 1] * (p * biRadix | q),
  1049.  
    s = m * biRadix * biRadix (n * biRadix o);
  1050.  
    k = biMultiplyByRadixPower(b, l - h - 1),
  1051.  
    g = biSubtract(g, biMultiplyDigit(k, f.digits[l - h - 1])),
  1052.  
    g.isNeg && (g = biAdd(g, k),
  1053.  
    --f.digits[l - h - 1])
  1054.  
    }
  1055.  
    return g = biShiftRight(g, i),
  1056.  
    f.isNeg = a.isNeg != e,
  1057.  
    a.isNeg && (f = e ? biAdd(f, bigOne) : biSubtract(f, bigOne),
  1058.  
    b = biShiftRight(b, i),
  1059.  
    g = biSubtract(b, g)),
  1060.  
    0 == g.digits[0] && 0 == biHighIndex(g) && (g.isNeg = !1),
  1061.  
    new Array(f,g)
  1062.  
    }
  1063.  
    function biDivide(a, b) {
  1064.  
    return biDivideModulo(a, b)[0]
  1065.  
    }
  1066.  
    function biModulo(a, b) {
  1067.  
    return biDivideModulo(a, b)[1]
  1068.  
    }
  1069.  
    function biMultiplyMod(a, b, c) {
  1070.  
    return biModulo(biMultiply(a, b), c)
  1071.  
    }
  1072.  
    function biPow(a, b) {
  1073.  
    for (var c = bigOne, d = a; ; ) {
  1074.  
    if (0 != (1 & b) && (c = biMultiply(c, d)),
  1075.  
    b >>= 1,
  1076.  
    0 == b)
  1077.  
    break;
  1078.  
    d = biMultiply(d, d)
  1079.  
    }
  1080.  
    return c
  1081.  
    }
  1082.  
    function biPowMod(a, b, c) {
  1083.  
    for (var d = bigOne, e = a, f = b; ; ) {
  1084.  
    if (0 != (1 & f.digits[0]) && (d = biMultiplyMod(d, e, c)),
  1085.  
    f = biShiftRight(f, 1),
  1086.  
    0 == f.digits[0] && 0 == biHighIndex(f))
  1087.  
    break;
  1088.  
    e = biMultiplyMod(e, e, c)
  1089.  
    }
  1090.  
    return d
  1091.  
    }
  1092.  
    function BarrettMu(a) {
  1093.  
    this.modulus = biCopy(a),
  1094.  
    this.k = biHighIndex(this.modulus) 1;
  1095.  
    var b = new BigInt;
  1096.  
    b.digits[2 * this.k] = 1,
  1097.  
    this.mu = biDivide(b, this.modulus),
  1098.  
    this.bkplus1 = new BigInt,
  1099.  
    this.bkplus1.digits[this.k 1] = 1,
  1100.  
    this.modulo = BarrettMu_modulo,
  1101.  
    this.multiplyMod = BarrettMu_multiplyMod,
  1102.  
    this.powMod = BarrettMu_powMod
  1103.  
    }
  1104.  
    function BarrettMu_modulo(a) {
  1105.  
    var i, b = biDivideByRadixPower(a, this.k - 1), c = biMultiply(b, this.mu), d = biDivideByRadixPower(c, this.k 1), e = biModuloByRadixPower(a, this.k 1), f = biMultiply(d, this.modulus), g = biModuloByRadixPower(f, this.k 1), h = biSubtract(e, g);
  1106.  
    for (h.isNeg && (h = biAdd(h, this.bkplus1)),
  1107.  
    i = biCompare(h, this.modulus) >= 0; i; )
  1108.  
    h = biSubtract(h, this.modulus),
  1109.  
    i = biCompare(h, this.modulus) >= 0;
  1110.  
    return h
  1111.  
    }
  1112.  
    function BarrettMu_multiplyMod(a, b) {
  1113.  
    var c = biMultiply(a, b);
  1114.  
    return this.modulo(c)
  1115.  
    }
  1116.  
    function BarrettMu_powMod(a, b) {
  1117.  
    var d, e, c = new BigInt;
  1118.  
    for (c.digits[0] = 1,
  1119.  
    d = a,
  1120.  
    e = b; ; ) {
  1121.  
    if (0 != (1 & e.digits[0]) && (c = this.multiplyMod(c, d)),
  1122.  
    e = biShiftRight(e, 1),
  1123.  
    0 == e.digits[0] && 0 == biHighIndex(e))
  1124.  
    break;
  1125.  
    d = this.multiplyMod(d, d)
  1126.  
    }
  1127.  
    return c
  1128.  
    }
  1129.  
    var maxDigits, ZERO_ARRAY, bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks, biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998;
  1130.  
    setMaxDigits(20),
  1131.  
    dpl10 = 15,
  1132.  
    lr10 = biFromNumber(1e15),
  1133.  
    hexatrigesimalToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),
  1134.  
    hexToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"),
  1135.  
    highBitMasks = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535),
  1136.  
    lowBitMasks = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535);
  1137.  
    !function() {
  1138.  
    function a(a) {
  1139.  
    var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
  1140.  
    for (d = 0; a > d; d = 1)
  1141.  
    e = Math.random() * b.length,
  1142.  
    e = Math.floor(e),
  1143.  
    c = b.charAt(e);
  1144.  
    return c
  1145.  
    }
  1146.  
    function b(a, b) {
  1147.  
    var c = CryptoJS.enc.Utf8.parse(b)
  1148.  
    , d = CryptoJS.enc.Utf8.parse("0102030405060708")
  1149.  
    , e = CryptoJS.enc.Utf8.parse(a)
  1150.  
    , f = CryptoJS.AES.encrypt(e, c, {
  1151.  
    iv: d,
  1152.  
    mode: CryptoJS.mode.CBC
  1153.  
    });
  1154.  
    return f.toString()
  1155.  
    }
  1156.  
    function c(a, b, c) {
  1157.  
    var d, e;
  1158.  
    return setMaxDigits(131),
  1159.  
    d = new RSAKeyPair(b,"",c),
  1160.  
    e = encryptedString(d, a)
  1161.  
    }
  1162.  
    function d(d, e, f, g) {
  1163.  
    var h = {}
  1164.  
    , i = a(16);
  1165.  
    return h.encText = b(d, g),
  1166.  
    h.encText = b(h.encText, i),
  1167.  
    h.encSecKey = c(i, e, f),
  1168.  
    h
  1169.  
    }
  1170.  
    function e(a, b, d, e) {
  1171.  
    var f = {};
  1172.  
    return f.encText = c(a e, b, d),
  1173.  
    f
  1174.  
    }
  1175.  
    window.asrsea = d,
  1176.  
    window.ecnonasr = e
  1177.  
    }();
  1178.  
     
  1179.  
    function encryptoMusicData(id) {
  1180.  
    let requestBody = `{"ids": "[${id}]", "level": "standard", "encodeType": "aac", "csrf_token": ""}`;
  1181.  
    let result = window.asrsea(
  1182.  
    requestBody,
  1183.  
    '010001',
  1184.  
    '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7',
  1185.  
    '0CoJUm6Qyw8W8jud'
  1186.  
    );
  1187.  
    return {
  1188.  
    params: result.encText,
  1189.  
    encSecKey: result.encSecKey
  1190.  
    }
  1191.  
    }
  1192.  
     
  1193.  
    function Music_playlist_comment(rid) {
  1194.  
    let requestBody1 = `{"rid":"A_PL_0_${rid}","threadId":"A_PL_0_${rid}","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}`;
  1195.  
    let result = window.asrsea(
  1196.  
    requestBody1,
  1197.  
    '010001',
  1198.  
    '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7',
  1199.  
    '0CoJUm6Qyw8W8jud'
  1200.  
    );
  1201.  
    return {
  1202.  
    params: result.encText,
  1203.  
    encSecKey: result.encSecKey
  1204.  
    }
  1205.  
    }
  1206.  
     
  1207.  
    function Music_single_comment(rid) {
  1208.  
    let requestBody1 = `{"rid":"R_SO_4_${rid}","threadId":"R_SO_4_${rid}","pageNo":"1","pageSize":"1000","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}`;
  1209.  
    let result = window.asrsea(
  1210.  
    requestBody1,
  1211.  
    '010001',
  1212.  
    '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7',
  1213.  
    '0CoJUm6Qyw8W8jud'
  1214.  
    );
  1215.  
    return {
  1216.  
    params: result.encText,
  1217.  
    encSecKey: result.encSecKey
  1218.  
    }
  1219.  
    }
学新通

python代码

  1.  
    import sys
  2.  
    import execjs
  3.  
    import requests
  4.  
    import json
  5.  
    import csv
  6.  
    from snownlp import SnowNLP
  7.  
     
  8.  
    def get_music():
  9.  
    code=""
  10.  
    with open("encrypet.js", "r",encoding='utf-8') as f:
  11.  
    code = f.read()
  12.  
    run =execjs.compile(code)
  13.  
    ID = input("输入歌曲的id:")
  14.  
    result = run.call(
  15.  
    "encryptoMusicData",
  16.  
    ID
  17.  
    )
  18.  
    url = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
  19.  
    header = {
  20.  
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
  21.  
    }
  22.  
    post_data = {
  23.  
    'params': result.get('params'),
  24.  
    'encSecKey': result.get('encSecKey')
  25.  
    }
  26.  
    res = requests.post(url=url, headers=header, data=post_data)
  27.  
    rulest = res.json()
  28.  
    print(rulest['data'][0]['url'])
  29.  
    print("是否要下载音乐到本地。如果下载请输入y,不下载输入其它字符")
  30.  
    word = input('输入字符')
  31.  
    if word == 'y' or word == 'Y' :
  32.  
    response = requests.get(url=rulest['data'][0]['url'])
  33.  
    name = input("输入音频姓名")
  34.  
    with open(f'./{name}.mp3', 'wb') as f:
  35.  
    f.write(response.content)
  36.  
    else:
  37.  
    print('欢迎使用')
  38.  
     
  39.  
    # print(res.text)
  40.  
     
  41.  
    def get_playlist_commt():#歌单评论
  42.  
    code = ""
  43.  
    with open("encrypet.js", "r", encoding='utf-8') as f:
  44.  
    code = f.read()
  45.  
    run = execjs.compile(code)
  46.  
    ID = input("输入歌单的id:")
  47.  
    result = run.call(
  48.  
    "Music_comment",
  49.  
    ID
  50.  
    )
  51.  
    # print(result)
  52.  
    url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
  53.  
    header = {
  54.  
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
  55.  
    }
  56.  
    post_data = {
  57.  
    'params': result.get('params'),
  58.  
    'encSecKey': result.get('encSecKey')
  59.  
    }
  60.  
    res = requests.post(url=url, headers=header, data=post_data)
  61.  
    rulest = res.json()
  62.  
    # print(rulest['data']['comments'][0]['content'])
  63.  
    for i in rulest['data']['comments']:
  64.  
    print(i['content'])
  65.  
    # print(res.text)
  66.  
    return 0
  67.  
     
  68.  
    def get_singal_commt():#歌单评论
  69.  
    code = ""
  70.  
    with open("encrypet.js", "r", encoding='utf-8') as f:
  71.  
    code = f.read()
  72.  
    run = execjs.compile(code)
  73.  
    ID = input("输入歌曲的id:")
  74.  
    result = run.call(
  75.  
    "Music_single_comment",
  76.  
    ID
  77.  
    )
  78.  
    # print(result)
  79.  
    url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
  80.  
    header = {
  81.  
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
  82.  
    }
  83.  
    post_data = {
  84.  
    'params': result.get('params'),
  85.  
    'encSecKey': result.get('encSecKey')
  86.  
    }
  87.  
    res = requests.post(url=url, headers=header, data=post_data)
  88.  
    rulest = res.json()
  89.  
    # print(rulest['data']['comments'][0]['content'])
  90.  
    index = 0
  91.  
    for i in rulest['data']['comments']:
  92.  
    index = 1
  93.  
    print(index,i['content'])
  94.  
    # print(res.text)
  95.  
    return 0
  96.  
     
  97.  
    def write_csv():
  98.  
    code = ""
  99.  
    with open("encrypet.js", "r", encoding='utf-8') as f:
  100.  
    code = f.read()
  101.  
    run = execjs.compile(code)
  102.  
    ID = input("输入歌曲的id:")
  103.  
    result = run.call(
  104.  
    "Music_single_comment",
  105.  
    ID
  106.  
    )
  107.  
    # print(result)
  108.  
    url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
  109.  
    header = {
  110.  
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
  111.  
    }
  112.  
    post_data = {
  113.  
    'params': result.get('params'),
  114.  
    'encSecKey': result.get('encSecKey')
  115.  
    }
  116.  
    res = requests.post(url=url, headers=header, data=post_data)
  117.  
    rulest = res.json()
  118.  
    with open('single_comment.csv', 'w', encoding='utf-8', newline='') as w:
  119.  
    csv_writer = csv.writer(w)
  120.  
    for i in rulest['data']['comments']:
  121.  
    index = 1
  122.  
    content = i['content'].replace('\n', '').strip()
  123.  
    sen = SnowNLP(i['content'])
  124.  
    data = [str(index), content, sen.sentiments] # 将元组改为列表
  125.  
    csv_writer.writerow(data)
  126.  
    print('完成')
  127.  
    return 0
  128.  
     
  129.  
    def main():
  130.  
    write_csv()
  131.  
    return
  132.  
     
  133.  
    if __name__ == '__main__':
  134.  
    sys.exit(main())
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgffebg
系列文章
更多 icon
同类精品
更多 icon
继续加载