Greasy Fork is available in English.

仓库用度盘投稿助手

简易功能增强, 方便仓库投稿用

< Commentaires sur 仓库用度盘投稿助手

Question / commentaire

mr
§
Posté le: 04/04/2019

如果是为了提取文件,可以试试这个

这是我根据原作者的代码提取出来的脚本,只实现肚娘提取码的功能

代码不依赖百度的库,所以只要API不变理论上不受更新影响。

浏览器登录百度云盘后,F12控制台[Console]粘贴代码,回车。

依次粘贴提取码和输入存放路径后等待运行即可,进度会显示在控制台里。

//提取码    
  var code = prompt("请输入提取码[游侠肚娘]");
  //保存目录(保存在网盘的目录 例:/test123/)
      var dir = prompt("请输入存放目录[格式示例:/GTA5/](杠开头杠结尾)");


 /**
       * 一个简单的类似于 NodeJS Buffer 的实现.
       * 用于解析游侠度娘提取码。
       * @param {SimpleBuffer}
       */
      function SimpleBuffer(str) {
        this.fromString(str);
      }

      SimpleBuffer.toStdHex = function toStdHex(n) {
        return ('0' + n.toString(16)).slice(-2);
      };

      SimpleBuffer.prototype.fromString = function fromString(str) {
        var len = str.length;

        this.buf = new Uint8Array(len);
        for (var i = 0; i < len; i++) {
          this.buf[i] = str.charCodeAt(i);
        }
      };

      SimpleBuffer.prototype.readUnicode = function readUnicode(index, size) {
        if (size & 1)
          size++;

        var bufText = Array.prototype.slice.call(this.buf, index, index + size).map(SimpleBuffer.toStdHex);

        var buf = [''];
        for (var i = 0; i < size; i += 2)
          buf.push(bufText[i + 1] + bufText[i]);

        return JSON.parse('"' + buf.join('\\u') + '"');
      };

      SimpleBuffer.prototype.readNumber = function readNumber(index, size) {
        var ret = 0;

        for (var i = index + size; i > index;)
          ret = this.buf[--i] + (ret * 256);

        return ret;
      };

      SimpleBuffer.prototype.readUInt = function readUInt(index) {
        return this.readNumber(index, 4);
      };

      SimpleBuffer.prototype.readULong = function readULong(index) {
        return this.readNumber(index, 8);
      };

      SimpleBuffer.prototype.readHex = function readHex(index, size) {
        return Array.prototype.slice.call(this.buf, index, index + size).map(SimpleBuffer.toStdHex).join('');
      };

      function DuParser() {}
      DuParser.parse = function generalDuCodeParse(szUrl) {
        var r;
        if (szUrl.indexOf('BDLINK') === 0) {
          r = DuParser.parseDu_v1(szUrl);
          r.ver = '游侠 v1';
        } else {
          r = DuParser.parseDu_v2(szUrl);
          r.ver = '梦姬标准';
        }
        return r;
      };

      DuParser.parseDu_v1 = function parseDu_v1(szUrl) {
        var raw = atob(szUrl.slice(6).replace(/\s/g, ''));
        if (raw.slice(0, 5) !== 'BDFS\x00')
          return null;

        var buf = new SimpleBuffer(raw);

        var ptr = 9;
        var arrFiles = [];
        var fileInfo, nameSize;
        var total = buf.readUInt(5);

        for (i = 0; i < total; i++) {
          // 大小 (8 bytes)
          // MD5 + MD5S (0x20)
          // nameSize (4 bytes)
          // Name (unicode)
          fileInfo = {};
          fileInfo.size = buf.readULong(ptr + 0);
          fileInfo.md5 = buf.readHex(ptr + 8, 0x10);
          fileInfo.md5s = buf.readHex(ptr + 0x18, 0x10);
          nameSize = buf.readUInt(ptr + 0x28) << 1;
          fileInfo.nameSize = nameSize;
          ptr += 0x2C;

          fileInfo.name = buf.readUnicode(ptr, nameSize);
          arrFiles.push(fileInfo);
          ptr += nameSize;
        }

        return arrFiles;
      };

      DuParser.parseDu_v2 = function parseDu_v2(szUrl) {
        return szUrl.split('\n').map(function(z) {
          // unsigned long long: 0~18446744073709551615
          return z.trim().match(/([\dA-F]{32})#([\dA-F]{32})#([\d]{1,20})#([\s\S]+)/);
        }).filter(function(z) {
          return z;
        }).map(function(info) {
          return {
            md5: info[1],
            md5s: info[2],
            size: info[3],
            name: info[4]
          };
        });
      };





  var codeInfo = DuParser.parse(code);
  var failed = 0;
  saveFile(0);

function saveFile(i) {
    if (i >= codeInfo.length) {
      console.log(`转存完毕 (失败 ${failed} 个)!`);
      return;
    }

    console.log(`正在转存文件 (${ i + 1 }/${ codeInfo.length }), 请稍后 ..`);

    var file = codeInfo[i];

    $.ajax({
      url: '/api/rapidupload',
      type: 'POST',
      data: {
        path: dir + file.name,
        'content-md5': file.md5,
        'slice-md5': file.md5s,
        'content-length': file.size
      }
    }).success(function(r) {
      if (r.errno) failed++;
    }).fail(function(r) {
      failed++;
    }).always(function() {
      saveFile(i + 1);
    });
  }

Poster une réponse

Connectez-vous pour poster une réponse.