// ==UserScript==
// @name 妖火网增强插件
// @namespace https://yaohuo.me/
// @version 0.16.1
// @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冲突
// @downloadURL none
// ==/UserScript==
console.log("妖火网分享你我!");
const FORE_COLORS = { '会员红': '#ff00c0', '妖火蓝': '#3d68a8', '首页绿': '#378d8d' };
// 表单对象序列化
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
}
/*
* 无跳转回帖
*/
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) // 回复成功! 获得妖晶:30,获得经验:10
跳转中...
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', '');
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', '');
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 = '