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

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

[复制链接]
  • TA的每日心情
    擦汗
    2022-6-12 21:47
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    11

    主题

    252

    帖子

    200

    积分

    高级工程师

    Rank: 6Rank: 6

    积分
    200

    中秋纪念章猫咪币纪念章活跃会员热心会员三好学生

    发表于 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

    Y8KAYEPHCT`87XX]_4J`BC7.png
  • TA的每日心情
    慵懒
    23 小时前
  • 签到天数: 67 天

    [LV.6]常住居民II

    150

    主题

    2001

    帖子

    2133

    积分

    管理员

    Rank: 10Rank: 10Rank: 10

    积分
    2133

    猫咪币纪念章热心会员活跃会员突出贡献三好学生中秋纪念章国庆纪念章管理员家财万贯

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

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-6-12 21:47
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    11

    主题

    252

    帖子

    200

    积分

    高级工程师

    Rank: 6Rank: 6

    积分
    200

    中秋纪念章猫咪币纪念章活跃会员热心会员三好学生

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

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

    使用道具 举报

  • TA的每日心情
    开心
    23 小时前
  • 签到天数: 53 天

    [LV.5]常住居民I

    352

    主题

    3091

    帖子

    3100

    积分

    管理员

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

    Rank: 10Rank: 10Rank: 10

    积分
    3100

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯管理员

    发表于 2022-5-20 19:27:00 | 显示全部楼层
    你撒了我的花
    我要去抢谁的花了!
    呜呜呜
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-29 15:12
  • 签到天数: 36 天

    [LV.5]常住居民I

    15

    主题

    159

    帖子

    151

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    151

    荣誉开发者国庆纪念章中秋纪念章

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

    使用道具 举报

    发表回复

    本版积分规则

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