Greasy Fork

Greasy Fork is available in English.

我就是要跳轉(B站番劇投稿頁跳轉去番劇頁)

解決有時打開B站番劇投稿頁不會跳轉去番劇頁的問題

当前为 2018-04-02 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         我就是要跳轉(B站番劇投稿頁跳轉去番劇頁)
// @version      0.3.1
// @description  解決有時打開B站番劇投稿頁不會跳轉去番劇頁的問題
// @author       i9602097
// @include      *://www.bilibili.com/video/av*
// @run-at       document-start
// @grant      GM_registerMenuCommand
// @grant      GM_listValues
// @grant      GM_getValue
// @grant      GM_setValue
// @grant      GM_deleteValue
// @grant      unsafeWindow
// @namespace http://tampermonkey.net/
// ==/UserScript==
// 
function getJSON(url) {
    var request = new XMLHttpRequest();
    request.open("GET", url, false);
    // request.setRequestHeader("If-Modified-Since","0");
    try {
        request.send();
    } catch (e) {
        console.log(e);
        console.log("跨域失敗");
    }
    // console.log(request.readyState);
    // console.log(request.responseText);
    console.log(request.getAllResponseHeaders());
    if (request.readyState == 4 && request.responseText) {
        try {
            return JSON.parse(request.responseText);
        } catch (e) {
            console.log("JSON file error:" + url);
            return {
                "code": -2
            };
        }
    } else {
        console.log("Get JSON error:" + url);
        return {
            "code": -1
        };
    }
}

function getDataWithZone(text, zone) {
    return new Date(Date.parse(text) - (3600000 * zone) - (new Date().getTimezoneOffset() * 60000));
}

function getEpisodeID(aid, pid) {
    var avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
    console.log("avjson.code:" + avjson.code);
    if (!avjson.code) {
        var updateDate = new Date();
        updateDate.setDate(updateDate.getDate() - 1);
        console.log("緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString() + ",如果比" + updateDate.toString() + "早則會更新緩存並重新加載");
        if (getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8) < updateDate) {
            console.log("緩存過早,更新緩存並重新加載");
            getJSON("https://www.biliplus.com/api/view?id=" + aid + "&update=true");
            avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
            console.log("avjson.code:" + avjson.code);
            if (!avjson.code) {
                console.log("新的緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString());
            }
        }
    } else {
        console.log("緩存錯誤,更新緩存並重新加載");
        getJSON("https://www.biliplus.com/api/view?id=" + aid + "&update=true");
        avjson = getJSON("https://www.biliplus.com/api/view?id=" + aid);
        console.log("avjson.code:" + avjson.code);
        if (!avjson.code) {
            console.log("新的緩存時間是" + getDataWithZone(avjson.lastupdate.replace(/-/g, "/"), 8).toString());
        }
    }
    if (!avjson.code) {
        console.log("標題:" + avjson.title);
        if (avjson.bangumi) {
            console.log("投稿API番劇標題:" + avjson.bangumi.title);
            var cid;
            for (var i = 0; i < avjson.list.length; i++) {
                if (avjson.list[i].page == pid) {
                    cid = avjson.list[i].cid;
                }
            }
            console.log("cid:" + cid);
            var bangumijson = getJSON("https://www.biliplus.com/api/bangumi?season=" + avjson.bangumi.season_id);
            console.log("bangumijson.code:" + bangumijson.code);
            if (!bangumijson.code) {
                console.log("番劇API番劇標題:" + bangumijson.result.bangumi_title);
                var episode_id;
                if (cid) {
                    for (var i = 0; i < bangumijson.result.episodes.length; i++) {
                        if (bangumijson.result.episodes[i].danmaku == cid) {
                            episode_id = bangumijson.result.episodes[i].episode_id;
                        }
                    }
                }
                if (!episode_id) {
                    console.log("cid反查失敗,使用AV號和分P反查");
                    for (var i = 0; i < bangumijson.result.episodes.length; i++) {
                        if (bangumijson.result.episodes[i].av_id == aid && bangumijson.result.episodes[i].page == pid) {
                            episode_id = bangumijson.result.episodes[i].episode_id;
                        }
                    }
                }
                if (!episode_id) {
                    console.log("分P反查失敗,只用AV號反查,結果可能有出入");
                    for (var i = 0; i < bangumijson.result.episodes.length; i++) {
                        if (bangumijson.result.episodes[i].av_id == aid) {
                            episode_id = bangumijson.result.episodes[i].episode_id;
                        }
                    }
                }
                if (episode_id) {
                    console.log("episode_id:" + episode_id);
                    return episode_id;
                } else {
                    console.log("episode_id查詢失敗");
                }
            } else {
                console.log("bangumi json error");
            }
        } else {
            console.log("no bangumi");
        }
    } else {
        console.log("av json error");
    }
}

function redirectURL() {
    console.log("call redirectURL");
    if (!episode_id) {
        episode_id = getEpisodeID(aid, pid);
    }
    if (episode_id) {
        location.replace("//bangumi.bilibili.com/anime/v/" + episode_id);
    }
}

function changePopup() {
    if (GM_getValue('enablePopup') === false) {
        if (confirm("沒有打開彈窗提示\n是否打開彈窗提示")) {
            GM_setValue('enablePopup', true);
            console.log("enablePopup:" + GM_getValue('enablePopup'));
            if ((GM_getValue('enablePopup') !== false)) {
                alert("操作成功\n彈窗提示已打開\n將重新加載頁面");
                unsafeWindow.location.reload(true);
            } else {
                alert("操作失敗\n將重新加載頁面");
                unsafeWindow.location.reload(true);
            }
        } else {
            alert("已取消操作");
        }
    } else {
        if (confirm("已打開彈窗提示\n是否關閉彈窗提示")) {
            GM_setValue('enablePopup', false);
            console.log("enablePopup:" + GM_getValue('enablePopup'));
            if ((GM_getValue('enablePopup') === false)) {
                alert("操作成功\n彈窗提示已關閉\n將重新加載頁面");
                unsafeWindow.location.reload(true);
            } else {
                alert("操作失敗\n將重新加載頁面");
                unsafeWindow.location.reload(true);
            }
        } else {
            alert("已取消操作");
        }
    }
}
// console.log(GM_listValues());
// GM_deleteValue('enablePopup');
if (GM_getValue('enablePopup') === undefined)
    GM_setValue('enablePopup', true);
console.log("enablePopup:" + GM_getValue('enablePopup'));
GM_registerMenuCommand('開關彈窗提示', changePopup);
document.addEventListener('DOMContentLoaded', function() {
    console.log("網址:" + location.href);
    console.log("window.aid:" + unsafeWindow.aid);
    var aid = unsafeWindow.aid;
    if (!aid) aid = location.href.match(/\/video\/av(\d+)\//)[1];
    aid = Number(aid);
    console.log("aid:" + aid);
    console.log("window.pageno:" + unsafeWindow.pageno);
    var pid = unsafeWindow.pageno;
    if (!pid) {
        if (location.href.match(/\/index_(\d+).html/)) {
            pid = location.href.match(/\/index_(\d+).html/)[1];
        } else if (location.href.match(/\/\?p\=(\d+)/)) {
            pid = location.href.match(/\/\?p\=(\d+)/)[1];
        } else {
            pid = "1";
        }
    }
    pid = Number(pid);
    console.log("pid:" + pid);
    episode_id = getEpisodeID(aid, pid);
    if (episode_id) {
        GM_registerMenuCommand('跳轉到http://bangumi.bilibili.com/anime/v/' + episode_id, redirectURL);
        let msg = document.querySelector('.b-page-body > .error-container > .error-panel');
        if (msg && GM_getValue('enablePopup') === false || confirm("是否跳轉到http://bangumi.bilibili.com/anime/v/" + episode_id + "\n注意:可在腳本命令中關閉這彈窗自動跳轉")) {
            location.replace("//bangumi.bilibili.com/anime/v/" + episode_id);
        }
    }
}, false);