Sleazy Fork is available in English.

海角天涯-解锁海角社区资源

无限制解锁收费资源,包括钻石贴、金币贴,下载视频,复制视频链接,自动展开帖子

// ==UserScript==
// @name         海角天涯-解锁海角社区资源
// @namespace    tianya365.top
// @homepage     https://vip.tianya365.top
// @version      1.0.0
// @description  无限制解锁收费资源,包括钻石贴、金币贴,下载视频,复制视频链接,自动展开帖子
// @icon         data:image/vnd.microsoft.icon;base64,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
// @author       tianya365.top
// @exclude      https://*.tianya365.top/*
// @exclude      https://*hjedd.top/*
// @exclude      https://hj*.icu/*
// @include      https://hj*.*/*
// @include      https://*.hj*.*/*
// @include      https://hai*.top/*
// @match        https://haijiao.com/*
// @match        https://www.haijiao.com/*
// @match        *://*/post/details*
// @connect      *
// @run-at       document-end
// @grant        none
// @antifeature  payment
// @charset		 UTF-8
// ==/UserScript==

(function () {
    'use strict';

    let version = '1.0.0';
    let newVersion = '';
    let m3u8_url = '';
    let play_url = '';
    let hasPic = false;
    let video = null;
    let server = window.localStorage.getItem('hjty_server');

    if (server == null) {
        server = 'https://vip.tianya365.top';
        window.localStorage.setItem('hjty_server', 'https://vip.tianya365.top');
    }

    function importJs(src, onload) {
        let script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.src = src;
        script.onload = onload;
        document.getElementsByTagName('head')[0].appendChild(script);
    }

    function loadStyle(content) {
        let domStyle = document.createElement('style');
        let domHead = document.getElementsByTagName('head')[0];
        domStyle.appendChild(document.createTextNode(content));
        domHead.appendChild(domStyle);
    }

    function importCss(href) {
        let link = document.createElement("link");
        link.setAttribute("rel", "stylesheet");
        link.href = href;
        document.getElementsByTagName('head')[0].appendChild(link);
    }

    importCss(server + '/static/libs/vant/lib/index.css');
    importJs(server + '/static/libs/axios/axios.min.js');
    importJs(server + '/js/base64.min.js');
    importJs(server + '/static/libs/vue/vue.global.prod.js', function () {
        importJs(server + '/static/libs/vant/lib/vant.js', function () {
            init()
        });
    });

    loadStyle(`
#play-box {height: 100%;display: flex;align-items: center;background-color: #000;}
.play-box {width: 100%;height: 100%;max-width: 100%;}
#bbs_float_menu{z-index:1!important;}
#body.el-popup-parent--hidden{overflow: auto;}
.van-list .van-list__loading,
.sell-btn:before,
.el-message-box,
.v-modal,
.containeradvertising,
.ishide,
.el-message-box__wrapper,
#tidio-chat{display: none !important;}
`);

    function init() {
        document.body.innerHTML += `
<div id="hjty-app">
    <van-dialog v-model:show="dialogLogin" 
        :before-close="userLogin" 
        title="登录海角天涯" 
        confirm-button-text="登录" 
        show-cancel-button="true"
        cancel-button-text="注册"
        theme="round-button">
        <van-form style="padding: 10px 15px">
            <van-field
              v-model="username"
              name="账号"
              label="账号"
              placeholder="请输入账号"
              :rules="[{ required: true, message: '请填写账号' }]"
            ></van-field>
            <van-field
              v-model="password"
              type="password"
              name="密码"
              label="密码"
              placeholder="请输入密码"
              :rules="[{ required: true, message: '请填写密码' }]"
            ></van-field>
        </van-form>
    </van-dialog>
    <div style="touch-action: none">
        <van-floating-bubble
          axis="xy"
          :icon="icon"
          magnetic="x"
          @click="unlock"
          v-model:offset="offset"
        ></van-floating-bubble>
    </div>
    <div>
        <van-action-sheet
          v-model:show="actionShow"
          :actions="actions"
          @select="onSelect"
          cancel-text="关闭"
          description="帖子解锁成功,下滑查看更多操作"
        ></van-action-sheet>
    </div>
    <div>
        <van-popup v-model:show="showPlayer" :closeable="true" class="play-box" @click-close-icon="onPlayerClose">
            <div id="play-box">
               <iframe :src="play_url" style="display:block;border:0;width: 100%;height: 500px" allow="autoplay; encrypted-media" allowfullscreen></iframe>
            </div>
        </van-popup>
    </div>
</div>`;
        axios.defaults.timeout = 10000;
        Vue.createApp({
            data() {
                return {
                    showPlayer: false,
                    dialogLogin: false,
                    dialogResult: false,
                    actionShow: false,
                    icon: 'lock',
                    play_url: '',
                    username: '',
                    password: '',
                    offset: {},
                    actions: []
                };
            },
            mounted() {
                if (!getUserToken()) {
                    this.dialogLogin = true;
                } else {
                    this.checkUpdate();
                }
                this.offset = {x: window.innerWidth - 72, y: window.innerHeight / 2};
            },
            methods: {
                unlock() {
                    if (newVersion !== '') {
                        this.showUpdate();
                        return;
                    }

                    deleteCookie('NOTLOGIN');
                    const pid = this.getPid();
                    if (!pid) {
                        vant.showToast('请在帖子详情页使用');
                        return;
                    }
                    if (m3u8_url !== '') {
                        this.actionShow = true;
                        return;
                    }
                    vant.showLoadingToast({
                        message: '解锁中...',
                        forbidClick: true,
                        duration: 0,
                    });
                    this.getTopic(pid).then((data) => {
                        this.showTopic(data, pid);
                    }).catch((err) => {
                        vant.closeToast();
                        vant.showFailToast(err);
                    });
                },
                showActions() {
                    this.actions = [
                        {
                            name: '播放视频(站内)',
                            key: 'play',
                            subname: '如无法在线播放,可尝试其他在线播放器,或下载后再观看'
                        },
                        {
                            name: '复制视频地址',
                            key: 'copy',
                            subname: '可复制视频地址到其他地方播放或下载'
                        },
                        {
                            name: '在线播放器1',
                            subname: '手机端可能无法播放',
                            key: 'open',
                            url: 'https://www.hlsplayer.net/embed?type=m3u8&src=' + encodeURIComponent(m3u8_url)
                        },
                        {
                            name: '在线播放器2',
                            key: 'open',
                            subname: '无法播放免费视频,手机端可能无法播放',
                            url: 'https://m3u8player.org/'
                        },
                        {
                            name: '视频下载通道1',
                            key: 'open',
                            subname: '【推荐】支持自动下载和在线播放',
                            url: 'https://getm3u8.com/?source=' + m3u8_url
                        },
                        {
                            name: '视频下载通道2',
                            key: 'open',
                            subname: '免费视频可能无法下载,推荐在电脑端操作',
                            url: 'https://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html?source=' + m3u8_url
                        },
                        {
                            name: '视频下载通道3',
                            key: 'open',
                            subname: '需要手动点击下载,推荐在电脑端操作',
                            url: 'https://tools.thatwind.com/tool/m3u8downloader#m3u8=' + encodeURIComponent(m3u8_url)
                        },
                        {
                            name: '海角天涯官网',
                            key: 'open',
                            subname: '点击访问',
                            url: server + '/'
                        },
                        {
                            name: '切换节点',
                            key: 'switch',
                            subname: '点击切换其他服务器节点'
                        },
                        {
                            name: '退出登录',
                            subname: '当前账号:'+ window.localStorage.getItem('hjty_user_name'),
                            key: 'logout',
                        },
                    ];
                    this.actionShow = true;
                },
                onSelect(item) {
                    switch (item.key) {
                        case 'play':
                            this.play_url = play_url;
                            this.showPlayer = true;
                            vant.showToast('视频加载中,请稍等...');
                            break;
                        case 'open':
                            window.open(item.url);
                            break;
                        case 'switch':
                            this.switchServer();
                            break;
                        case 'logout':
                            window.localStorage.setItem('hjty_user_token', '');
                            window.localStorage.setItem('hjty_user_name', '');
                            vant.showSuccessToast('退出成功');
                            location.reload();
                            break;
                        case 'copy':
                            copyText(m3u8_url).then(() => {
                                vant.showSuccessToast('复制成功');
                            }).catch(() => {
                                vant.showFailToast('复制失败');
                            });
                    }
                },
                getAttachments(data, pid) {
                    return new Promise((resolve, reject) => {
                        let html = '';
                        data['attachments'].forEach(item => {
                            switch (item.category) {
                                case 'video':
                                    video = item;
                                    break;
                                case 'audio':
                                    html += '<p style="text-align: center"><audio src="' + item['remoteUrl'] + '" controls="true" id="showaudio"></audio></p>'
                                    break;
                                case 'images':
                                    hasPic = true;
                                    if (!data['content'].includes(item['remoteUrl'])) {
                                        html += '<p><img data-url="'+item['remoteUrl']+'" src="/images/common/project/loading.gif" alt="" data-id="' + item.id + '" lazy="loaded"></p>'
                                    }
                                    break;
                            }
                        });
                        resolve(html);
                    });
                },
                showTopic(data, pid) {
                    if (data['attachments']) {
                        this.getAttachments(data, pid).then(html => {
                            if (html) {
                                if ($('.sell-btn').length) {
                                    $('.sell-btn').replaceWith('<div id="hjsell-container" class="hjsell-container"><div class="hssell-content">' + html + '</div></div>');
                                } else {
                                    $('#hjsell-container .hssell-content').html(html);
                                }
                                if (!document.getElementById('hjsell-container')) {
                                    vant.showFailToast('请等待页面加载完成!');
                                    return;
                                }
                                window.scrollTo({
                                    top: document.getElementById('hjsell-container').getBoundingClientRect().top + window.scrollY - 100,
                                    behavior: 'smooth'
                                });
                                if (hasPic) {
                                    this.showImages();
                                }
                            }
                            if (video !== null) {
                                if (!data['sale'] || data['sale']['money_type'] === 0 || data['sale']['is_buy']) {
                                    this.getVideo(video, pid);
                                } else {
                                    this.queryTopic(pid);
                                }
                            } else {
                                vant.closeToast();
                                vant.showSuccessToast('解锁成功');
                            }
                        });
                    } else {
                        vant.showFailToast('没有可解锁的内容');
                    }
                },
                queryTopic(pid) {
                    axios.get(server + '/api/topic/' + pid + '?v=' + version, {
                        headers: {
                            'token': getUserToken()
                        }
                    }).then(res => {
                        vant.closeToast();
                        if (res.data.code) {
                            if (res.data.msg === '有新版本') {
                                newVersion = res.data.data;
                                this.showUpdate();
                                return ;
                            }

                            if (res.data.data['m3u8_url'] !== '') {
                                m3u8_url = res.data.data['m3u8_url'];
                                play_url = res.data.data['play_url'];
                                setTimeout(() => {this.icon = 'bars';}, 1000);
                                this.showActions();
                            } else {
                                vant.showFailToast('没有可解锁的内容');
                            }
                        } else {
                            vant.showDialog({
                                title: '解锁失败',
                                message: res.data.msg,
                                theme: 'round-button',
                                confirmButtonText: res.data.data['confirmButtonText'],
                                cancelButtonText: res.data.data['cancelButtonText'],
                                showCancelButton: !!res.data.data['cancelButtonText'],
                            }).then(action => {
                                if (action === 'confirm') {
                                    if (res.data.data['confirmButtonText'] === '重新登录') {
                                        window.localStorage.setItem('hjty_user_token', '');
                                        this.dialogLogin = true;
                                    } else if (res.data.data['confirmButtonText'] === '打开官网') {
                                        window.open(server + '/');
                                    }
                                }
                            });
                            return false;
                        }
                    }).catch(() => {
                        vant.closeToast();
                        vant.showConfirmDialog({
                            title: '解锁失败',
                            message: '服务器连接出错,是否切换到其他节点?',
                            theme: 'round-button',
                            beforeClose: (action) => {
                                if (action === 'confirm') {
                                    this.switchServer();
                                }
                                return true;
                            }
                        });
                    });
                },
                showImages() {
                    document.querySelectorAll('#hjsell-container img').forEach(img => {
                        axios.get(img.dataset.url).then(res => {
                            img.src = imageDecode(res.data);
                        });
                    });
                },
                getVideo(item, pid) {
                    const uid = /uid=([^;]+)/.exec(document.cookie);
                    const token = /token=([^;]+)/.exec(document.cookie);
                    axios.post('/api/attachment', JSON.stringify({
                        id: item.id,
                        resource_id: pid,
                        resource_type: 'topic',
                        line: ''
                    }), {
                        headers: {
                            'X-User-Id': uid && token ? uid[1] : '172561377002',
                            'X-User-Token': uid && token ? token[1] : '364327dff561472e94e8ffd9042d97f5'
                        }
                    }).then(res => {
                        vant.closeToast();
                        let data = {};
                        if (res.data.isEncrypted) {
                            data = JSON.parse(window.Base64.decode(window.Base64.decode(window.Base64.decode(res.data.data))));
                        } else {
                            data = res.data.data;
                        }

                        if (!data['remoteUrl'].startsWith('http')) {
                            m3u8_url = play_url = window.location.origin + data.remoteUrl;
                        } else {
                            m3u8_url = play_url = data.remoteUrl;
                        }
                        play_url = server + '/play?url=' + window.Base64.encode(play_url);

                        setTimeout(() => {this.icon = 'bars';}, 1000);
                        this.showActions();
                    }).catch(() => {
                        vant.showFailToast('网络错误: 2')
                    });
                },
                getTopic(pid) {
                    return new Promise((resolve, reject) => {
                        axios.get('/api/topic/' + pid).then(res => {
                            let data = {};
                            if (res.data.isEncrypted) {
                                data = JSON.parse(window.Base64.decode(window.Base64.decode(window.Base64.decode(res.data.data))));
                            } else {
                                data = res.data.data;
                            }
                            resolve(data);
                        }).catch(() => {
                            reject('网络错误: 3')
                        });
                    })
                },
                onPlayerClose() {
                    this.play_url = '';
                },
                switchServer() {
                    if (server === 'https://vip.tianya365.top') {
                        window.localStorage.setItem('hjty_server', 'https://haijiao.tianya365.top');
                    } else {
                        window.localStorage.setItem('hjty_server', 'https://vip.tianya365.top');
                    }
                    vant.showSuccessToast('切换成功');
                    setTimeout(() => {
                        window.location.reload();
                    }, 1000);
                },
                userLogin(action) {
                    if (action === 'confirm') {
                        if (!this.username || !this.password) {
                            vant.showFailToast('请填写账号和密码');
                            return false;
                        }
                        return new Promise((resolve) => {
                            axios.post(server + '/api/login', {
                                username: this.username,
                                password: this.password
                            }).then(res => {
                                if (res.data.code) {
                                    vant.showFailToast(res.data.msg);
                                    resolve(false);
                                } else {
                                    window.localStorage.setItem('hjty_user_token', res.data.token);
                                    window.localStorage.setItem('hjty_user_name', this.username);
                                    this.dialogLogin = false;
                                    vant.showSuccessToast(res.data.msg);
                                    resolve(true);
                                }
                            });
                        });
                    } else {
                        window.open(server + '/reg');
                    }
                },
                getPid() {
                    if (/\/post\/details.*pid=\d+/.test(location.href)) {
                        let match = location.href.match(/\/post\/details.*pid=(\d+)/i);
                        return parseInt(match[1]);
                    }
                    return false;
                },
                showUpdate() {
                    vant.showDialog({
                        title: '新版本(' + newVersion + ')',
                        message: '检测到新版本,请更新后再使用!',
                        theme: 'round-button',
                        confirmButtonText: '立即更新',
                    }).then(() => {
                        location.href = server + '/js/script.user.js?v=' + Math.random();
                    });
                },
                checkUpdate() {
                    axios.get(server + '/api/update?v=' + version, {
                        headers: {
                            'token': getUserToken()
                        }
                    }).then(res => {
                        if (res.data.msg === '有新版本') {
                            newVersion = res.data.data;
                            this.showUpdate();
                        }
                    }).catch(() => {
                        vant.closeToast();
                        vant.showConfirmDialog({
                            title: '版本检查失败',
                            message: '服务器连接出错,是否切换到其他节点?',
                            theme: 'round-button',
                            beforeClose: (action) => {
                                if (action === 'confirm') {
                                    this.switchServer();
                                }
                                return true;
                            }
                        });
                    });
                }
            },
        }).use(vant).mount('#hjty-app');
    }

    function getUserToken() {
        return window.localStorage.getItem('hjty_user_token');
    }

    function deleteCookie(name) {
        // 设置 cookie 过期时间为过去的时间
        document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';
    }

    function imageDecode(t) {
        const e = "ABCD*EFGHIJKLMNOPQRSTUVWX#YZabcdefghijklmnopqrstuvwxyz1234567890";
        let o, i, a, r, s, c, u, l = "", d = 0;

        function n(e) {
            let t, n = "", o = 0, i = 0, a = 0;
            while (o < e.length)
                i = e.charCodeAt(o),
                    i < 128 ? (n += String.fromCharCode(i),
                        o++) : i > 191 && i < 224 ? (a = e.charCodeAt(o + 1),
                        n += String.fromCharCode((31 & i) << 6 | 63 & a),
                        o += 2) : (a = e.charCodeAt(o + 1),
                        t = e.charCodeAt(o + 2),
                        n += String.fromCharCode((15 & i) << 12 | (63 & a) << 6 | 63 & t),
                        o += 3);
            return n
        }

        t = t.replace(/[^A-Za-z0-9*#]/g, "");
        while (d < t.length)
            r = e.indexOf(t.charAt(d++)),
                s = e.indexOf(t.charAt(d++)),
                c = e.indexOf(t.charAt(d++)),
                u = e.indexOf(t.charAt(d++)),
                o = r << 2 | s >> 4,
                i = (15 & s) << 4 | c >> 2,
                a = (3 & c) << 6 | u,
                l += String.fromCharCode(o),
            64 !== c && (l += String.fromCharCode(i)),
            64 !== u && (l += String.fromCharCode(a));

        let reg = new RegExp('', "g");
        l = l.replace(reg, '');
        return l = n(l),
            l
    }

    function copyText(text) {
        return new Promise((resolve, reject) => {
            if (navigator.clipboard && window.isSecureContext) {
                navigator.clipboard.writeText(text)
                    .then(() => {
                        resolve();
                    })
                    .catch(err => {
                        reject(err);
                    });
            } else {
                const textarea = document.createElement('textarea');
                textarea.value = text;
                textarea.style.position = 'fixed';
                document.body.appendChild(textarea);
                textarea.focus();
                textarea.select();

                try {
                    const success = document.execCommand('copy');
                    if (success) {
                        resolve();
                    } else {
                        reject();
                    }
                } catch (err) {
                    reject(err);
                }

                document.body.removeChild(textarea);
            }
        });
    }
})();