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

论如何站着获取视频外挂字幕

[复制链接]
  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-5-20 14:35:51 | 显示全部楼层 | 阅读模式

    本帖最后由 脚本体验师001 于 2022-5-20 14:43 编辑

    网上获取字幕的网站数不胜数,质量参差不齐。这里不一一类举。
    可是可但是,能不能在油猴代码里直接获取,并直接使用?
    好吧好吧,取返回的HTML内容,然后正则截取,又什么new DOMParser(),又什么骚操作俺一个都不会。咋办呢?
    大家知道 http://sub.xmp.sandai.net:8000/subxl/{cid}.json 这个api吗?直接返回json格式的,迅雷看看的,不知道的可以百度,有了这个还要什么自行车!!!
    废话那么多干什么,直接上代码

    var xmpApi = function (cid, callback) {
                GM_xmlhttpRequest({
                    method: "get",
                    url: "http://sub.xmp.sandai.net:8000/subxl/" + cid + ".json",
                    headers: {
                        "Content-Type": "application/json;charset=utf-8"
                    },
                    onload: function (result) {
                        console.log("=== xmpApi response ===", result, cid);
                        callback && callback(result.response);
                    },
                    onerror: function (error) {
                        console.error("=== xmpApi ===", error, cid);
                        callback && callback("");
                    }
                });
            };

    看效果
    Y8KAYEPHCC7.png
    掰开给你看
    AKNP.png

    很简单是不是,只要一个cid参数。下面获取 cid

    var xmpHash = function (url, size, callback) {
                var bytesScopes = [];
                if (size < 0xf000) {
                    bytesScopes.push([ 0, "" ]);
                }
                else {
                    bytesScopes.push([ 0, 0x5000 - 1 ]);
                    bytesScopes.push([ parseInt(size / 3), parseInt(size / 3) + 0x5000 - 1 ]);
                    bytesScopes.push([ size - 0x5000, "" ]);
                }
                var hashList = [];
                var hasher = CryptoJS.algo.SHA1.create();
                hasher.reset();
                bytesScopes.forEach(function (scope, index) {
                    getRemoteFileRange(url, scope, function (result) {
                        if (result.status === 206) {
                            try {
                                var wordArray = CryptoJS.lib.WordArray.create(result.response);
                                if (++index == bytesScopes.length) {
                                    var filehash = hasher.finalize(wordArray);
                                    var cid = filehash.toString().toUpperCase();
                                    callback && callback(cid);
                                }
                                else {
                                    hasher.update(wordArray);
                                }
                            }
                            catch (error) {
                                console.error("=== shooterHash err ===", error, url, size);
                                callback && callback("");
                            }
                        }
                        else {
                            callback && callback("");
                        }
                    });
                });
            };
    
           var getRemoteFileRange = function (url, bytesScope, callback) {
                var bytes = function () {
                    if (Array.isArray(bytesScope)) {
                        if (Array.isArray(bytesScope[0])) {
                            return bytesScope.map(function (scope) {
                                return scope.join("-");
                            }).join(",");
                        }
                        else {
                            return bytesScope.join("-");
                        }
                    }
                    else if (typeof bytesScope == "string") {
                        return bytesScope;
                    }
                    else {
                        return "0-";
                    }
                }();
    
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        referer: location.protocol + "//" + location.host + "/",
                        range: "bytes=" + bytes
                    },
                    responseType: "arraybuffer",
                    onload: function(result) {
                        //console.log("=== getRemoteFileRange result ===", result);
                        callback && callback(result);
                    },
                    onerror: function (error) {
                        console.error("=== fileRange ===", error, url);
                        callback && callback("");
                    }
                });
            };

    备注说明:首先要 // @require https://cdn.staticfile.org/crypto-js/4.1.1/crypto-js.min.js 计算hash必备。
    参数中 url 指的是远程文件链接,可直接下载为原文件那种。
    参数中 size 指的是文件大小,bytes 为单位。如果不知道这个文件大小,可以这样取

            var getRemoteFileSize = function (url, callback) {
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        referer: location.protocol + "//" + location.host + "/",
                        range: "bytes=-1"
                    },
                    onload: function(result) {
                        var size = (/\d+-\d+\/(\d+)/.exec(result.responseHeaders) || [])[1];
                        console.log("size", size);
                        callback && callback(size);
                    },
                    onerror: function (error) {
                        console.error("getRemoteFileSize error", error, url);
                        callback && callback("");
                    }
                });
            };

    特别提醒:代码部分就是表示个意思,难免质量不佳。实测有时会返回空结果,实际使用要尝试多次获取。

    结语


    撒李恒道的花~

    什么什么?这一个还不够,我会告诉你射手网也可以这样玩吗? https://docs.google.com/document/d/1ufdzy6jbornkXxsD-OGl3kgWa4P9WO5NZb6_QYZiGI0/preview

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-5-20 15:36:12 | 显示全部楼层
    帮哥哥优化一下排版
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-5-20 17:51:37 | 显示全部楼层
    王一之 发表于 2022-5-20 15:36
    帮哥哥优化一下排版

    哎呀,这整整齐齐的多好,哥哥好好!
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

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

    积分
    6760

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

    发表于 2022-5-20 19:27:00 | 显示全部楼层
    你撒了我的花
    我要去抢谁的花了!
    呜呜呜
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情

    2023-12-8 22:55
  • 签到天数: 37 天

    [LV.5]常住居民I

    15

    主题

    144

    回帖

    154

    积分

    荣誉开发者

    积分
    154

    荣誉开发者油中2周年

    发表于 2022-5-20 23:15:18 | 显示全部楼层
         实用
    摸鱼中
    回复

    使用道具 举报

    发表回复

    本版积分规则

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