Greasy Fork

Greasy Fork is available in English.

妖火网增强插件

妖火网回复增强

当前为 2022-03-13 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         妖火网增强插件
// @namespace    https://yaohuo.me/
// @version      0.19
// @description  妖火网回复增强
// @author       外卖不用券(id:23825)
// @match        https://yaohuo.me/*
// @icon         https://yaohuo.me/css/favicon.ico
// @grant        unsafeWindow
// @license      MIT
// @2022/3/11    增加无跳转回复帖子
// @2022/3/11    去除jQuery,使用原生方式获取元素,支持非油猴手机浏览器
// @2022/3/12    回帖增加图床,自动插入图片UBB
// @2022/3/12    增加论坛表情包展开可视化选择
// @2022/3/12    增加文字颜色UBB快捷选择
// @2022/3/12    网址链接自动替换成UBB格式
// @2022/3/12    修复图片UBB与提取网址UBB冲突
// @2022/3/13    增加无感深入查看下一页回帖
// @2022/3/14    补全分号,修复alook安卓测试通过
// ==/UserScript==

console.log("妖火网分享你我!");
const FORE_COLORS = { '会员红': '#ff00c0', '妖火蓝': '#3d68a8', '论坛绿': '#21b273' };

// 表单对象序列化
function stringify(obj, sep, eq) {
    sep = sep || '&';
    eq = eq || '=';
    let str = "";
    for (var k in obj) {
        str += k + eq + unescape(obj[k]) + sep;
    }
    return str.slice(0, -1);
};

// POST表单封装
async function postData(url = '', data = {}) {
    const response = await fetch(url, {
        method: 'POST',
        mode: 'cors',
        cache: 'no-cache',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        redirect: 'follow',
        referrerPolicy: 'no-referrer',
        body: stringify(data)
    });
    return response; // parses JSON response into native JavaScript objects
}

// GET简单封装
async function getData(url = '') {
    const response = await fetch(url, {
        method: 'GET',
        mode: 'cors',
        cache: 'no-cache',
        redirect: 'follow',
        referrerPolicy: 'no-referrer',
    });
    return response.text(); // parses JSON response into native JavaScript objects
}

/*
 * 无跳转回帖
 */
let replyButton = document.getElementsByName("g")[0];
if (replyButton && replyButton.value == "快速回复") {
    replyButton.addEventListener('click', function (event) {
        event.preventDefault();
        var content = document.getElementsByName("content")[0].value;
        if (content.length) {
            // 匹配内容网址,替换为[url=https://xxx][/url]链接UBB
            const urlReg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
            const urlMatchResult = content.match(urlReg);
            if (urlMatchResult != null && !content.search('[img]')) { // TODO简单排除图片UBB内链接
                const urlString = urlMatchResult[0];
                content = content.replace(urlString, '[url]' + urlString + '[/url]');
            }
            // 添加[forecolor=#000000][/forecolor]文本颜色UBB
            let foreColor = document.getElementsByName("forecolor")[0];
            if (foreColor && foreColor.value != '文字颜色') {
                let chooseColor = FORE_COLORS[foreColor.value];
                content = '[forecolor=' + chooseColor + ']' + content + '[/forecolor]';
            }
            // 获取form表单参数
            var face = document.getElementsByName("face")[0].value;
            var sendmsg = document.getElementsByName("sendmsg")[0].value;
            var action = document.getElementsByName("action")[0].value;
            var id = document.getElementsByName("id")[0].value;
            var siteid = document.getElementsByName("siteid")[0].value;
            var lpage = document.getElementsByName("lpage")[0].value;
            var classid = document.getElementsByName("classid")[0].value;
            var sid = document.getElementsByName("sid")[0].value;
            var g = document.getElementsByName("g")[0].value;
            // console.log(face, sendmsg, content, action, id, siteid, lpage, classid, sid, g);
            // 发表回复
            postData('/bbs/book_re.aspx', {
                face: face,
                sendmsg: sendmsg,
                content: content,
                action: action,
                id: id,
                siteid: siteid,
                lpage: lpage,
                classid: classid,
                sid: sid,
                g: g
            }).then(data => {
                // console.log(data) // 回复成功!</b> 获得妖晶:30,获得经验:10<br/> 跳转中...
                location.reload(); // 直接刷新页面,没有优化处理
            }
            )
        }
    })
}

/*
 * 图床传图
 */
let PIC_UPLOAD_API = "https://kf.dianping.com/api/file/burstUploadFile";
function uploadImage() {
    console.log("上传图片");
    let uploadimg = document.getElementsByName("upload-image")[0];
    // 构造表单
    const formData = new FormData();
    formData.append('files', uploadimg.files[0]);
    formData.append('fileName', uploadimg.files[0].name);
    formData.append('part', '0');
    formData.append('partSize', '1');
    formData.append('fileID', new Date().getTime());
    // console.log(uploadimg.files[0].name)
    // 请求头
    let headers = {
        // 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryquEEr8JAZtzApAYM',
        // 'Content-Length': uploadimg.files[0].size,
        'Host': 'kf.dianping.com',
        'CSC-VisitId': 'access-0ef0c9ff-03d9-42b9-952a-0a221e9c0e3a', // access-a55670d1-e246-423c-ac81-f20d4830ccdc
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    };
    postImage(PIC_UPLOAD_API, formData, headers)
        .then(data => {
            // console.log(data);
            if (data.code == 200) {
                let uploadPath = data.data.uploadPath;
                // 粘贴UBB代码到文本框
                let content = document.getElementsByName("content")[0];
                content.value += '\r\n[img]' + uploadPath + '[/img]';
            }
        })
        .catch(error => {
            console.log(error);
        })
}

// POST图片封装
async function postImage(url = '', data = {}, headers = {}) {
    const response = await fetch(url, {
        method: 'POST',
        headers: headers,
        body: data
    });
    return response.json();
}

// 创建上传文件按钮、自动上传
let replyForm = document.getElementsByName("f")[0];
if (replyForm) {
    let sendmsg = document.getElementsByName("sendmsg")[0];
    sendmsg.insertAdjacentHTML('afterend', '<input type="file" style="width: 40%" name="upload-image" accept="image/*" value="">');
    let uploadimg = document.getElementsByName("upload-image")[0];
    uploadimg.addEventListener('change', function () {
        uploadImage();
    })
}

/*
 * 表情展开
 */
let faceSelect = document.getElementsByName("face")[0];
if (faceSelect) {
    faceSelect.style.cssText = 'display: none;';// 隐藏表情下拉组件
    // 创建新的表情选框
    faceSelect.insertAdjacentHTML('afterend', '<input type="button" value="表情" name="new-face" style="padding: 0px 20px;margin-right: 3px;height: 19px;border-radius: 2px;border-color: rgb(133, 133, 133);">');
    let newface = document.getElementsByName("new-face")[0];
    newface.addEventListener('click', function () {
        // console.log('展开新表情');
        let newFaceBox = document.getElementsByName('new-face-box')[0];
        if (newFaceBox.style.display == "none") {
            newFaceBox.style.display = "block";
        } else newFaceBox.style.display = "none";
    });
    // 创建表情图标
    createNewFace();
}
function createNewFace() {
    let content = document.getElementsByName("content")[0];
    if (content) {
        let faceHtml = '<div style="display:none" name="new-face-box">';
        const faces = ["踩.gif", "狂踩.gif", "淡定.gif", "囧.gif", "不要.gif", "重拳出击.gif", "砳砳.gif", "滑稽砳砳.gif", "沙发.gif", "汗.gif", "亲亲.gif", "太开心.gif", "酷.gif", "思考.gif", "发呆.gif", "得瑟.gif", "哈哈.gif", "泪流满面.gif", "放电.gif", "困.gif", "超人.gif", "害羞.gif", "呃.gif", "哇哦.gif", "要死了.gif", "谢谢.gif", "抓狂.gif", "无奈.gif", "不好笑.gif", "呦呵.gif", "感动.gif", "喜欢.gif", "疑问.gif", "委屈.gif", "你不行.gif", "流口水.gif", "潜水.gif", "咒骂.gif", "耶耶.gif", "被揍.gif", "抱走.gif",];
        for (const face of faces) {
            faceHtml += '<img name="face-icon" alt="' + face + '" src="/face/' + face + '" style="width: 30px; height: 30px">';
        }
        faceHtml += '</div>';
        content.insertAdjacentHTML('beforebegin', faceHtml);
        // 注册点击事件
        let faceIcons = document.getElementsByName("face-icon");
        let newFaceBox = document.getElementsByName('new-face-box')[0];
        let newface = document.getElementsByName("new-face")[0];
        let face = document.getElementsByName("face")[0];
        for (const faceIcon of faceIcons) {
            faceIcon.addEventListener('click', function () {
                let faceName = faceIcon.alt;
                if (newFaceBox.style.display == "none") {
                    newFaceBox.style.display = "block";
                } else newFaceBox.style.display = "none";
                face.value = newface.value = faceName;
            })
        }
    };
}

/**
 * 字体颜色
 */
replyButton = document.getElementsByName("g")[0];
if (replyButton) {
    replyButton.insertAdjacentHTML('afterend', '<input type="button" value="文字颜色" name="forecolor">');
    let foreColor = document.getElementsByName("forecolor")[0];
    foreColor.addEventListener('click', function () {
        let forecolorBox = document.getElementsByName('forecolor-box')[0];
        if (forecolorBox.style.display == "none") {
            forecolorBox.style.display = "inline-block";
        } else forecolorBox.style.display = "none";
    });
    createForeColorBox();
}
function createForeColorBox() {
    let forecolor = document.getElementsByName("forecolor")[0];
    if (forecolor) {
        let forecolorBoxHtml = '<span style="display:none" name="forecolor-box">';
        const colors = FORE_COLORS;
        for (const color in colors) {
            forecolorBoxHtml += '&nbsp;<span name="forecolor-span" style="color:' + colors[color] + '">' + color + '</span>';
        }
        forecolorBoxHtml += '</span>';
        forecolor.insertAdjacentHTML('afterend', forecolorBoxHtml);
        // 注册颜色选择事件
        let forecolorSpans = document.getElementsByName("forecolor-span");
        let forecolorBox = document.getElementsByName('forecolor-box')[0];
        for (const forecolorSpan of forecolorSpans) {
            forecolorSpan.addEventListener('click', function () {
                let chooseColor = colors[forecolorSpan.innerHTML];
                if (forecolorBox.style.display == "inline-block") {
                    forecolorBox.style.display = "none";
                } else forecolorBox.style.display = "inline-block";
                forecolor.style.color = chooseColor;
                forecolor.value = forecolorSpan.innerHTML;
            })
        }
    }
}

/**
 * 加载下一页
 */
let moreBtn = document.getElementsByClassName('more')[0];
if (moreBtn) {
    moreBtn.addEventListener('click', asyncPage);
    function asyncPage(e) {
        e.preventDefault();
        const moreLink = moreBtn.firstChild.href;
        console.log(moreLink);
        getData(moreLink).then(html => {
            // 提取楼层回复
            const replyReg = /<div class="line.">(.*?)<\/div>/g;
            let nextReply = html.match(replyReg);
            for (const reply of nextReply) {
                moreBtn.insertAdjacentHTML('beforebegin', reply);
            }
            // 提取下一页页码
            const linkReg = /(?<=bt2"><a.href=").*(?=">下一页)/g;
            let nextLink = html.match(linkReg)[0].replaceAll('\&amp;', '&');
            console.log(nextLink);
            // 为新的下一页注册事件
            const moreNextBtn = document.getElementsByClassName('more')[0];
            moreNextBtn.firstChild.href = nextLink;
            moreNextBtn.addEventListener('click', asyncPage);
        })
    };
}