您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
摸鱼派聊天室,防撤回、抢红包、自动清屏、一言、机器人聊天、自动+1、弹框查看图片
当前为
// ==UserScript== // @name 摸鱼派聊天室 // @namespace https://lemon-cxh.github.io/ // @version 1.1 // @description 摸鱼派聊天室,防撤回、抢红包、自动清屏、一言、机器人聊天、自动+1、弹框查看图片 // @author Lemon // @match https://pwl.icu/cr // @icon https://www.google.com/s2/favicons?domain=pwl.icu // @connect https://v1.hitokoto.cn // @connect http://api.qingyunke.com // @run-at document-start // @grant unsafeWindow // @grant GM_xmlhttpRequest // @license MIT // ==/UserScript== (function() { 'use strict'; const OPEN_PACKET_URL = 'https://pwl.icu/chat-room/red-packet/open'; const HISTORY_MESSAGE_URL = 'https://pwl.icu/chat-room/more'; const HITOKOTO_URL = 'https://v1.hitokoto.cn/?c=e&c=f&c=j'; const AI_ELEMENT_ID = 'aiCheckbox'; var aiEnable = false; const PLUS_ONE_ID = 'pulsOne'; var plusOneEnable = true; var previousMessage = ''; var previousPlusOneMessage = ''; var clearChatRoomElement; const MESSAGE_MAX = 30; var messageCount = 0; unsafeWindow.redPacketMap = new Map(); function webSocketHook() { unsafeWindow.WebSocket = new Proxy(unsafeWindow.WebSocket, { construct(target, args) { let obj = new target(...args); return new Proxy(obj, proxyHandler); } }) }; function requestSend() { XMLHttpRequest.prototype.mySend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function(data) { this.addEventListener('load', function() { if (this.responseURL === OPEN_PACKET_URL) { showMoney(this.response); unsafeWindow.Util.closeAlert(); return; } if (-1 !== this.responseURL.indexOf(HISTORY_MESSAGE_URL)) { queryRedPacketOnHistory(this.response); return; } }, false); this.mySend.apply(this, arguments); } } function addMenu() { document.onreadystatechange = function(){ if(document.readyState == 'complete'){ let e = document.getElementById('redPacketBtn').parentNode.children[3]; clearChatRoomElement = e.children[0]; // AI聊天机器人 let ai = document.createElement("button"); ai.setAttribute('style', 'margin-right: 6px'); ai.innerHTML = '<input id="' + AI_ELEMENT_ID + '" type="checkbox"/><span>机器人</span>'; e.insertBefore(ai, e.firstChild); document.getElementById(AI_ELEMENT_ID).addEventListener( 'change', function() { aiEnable = this.checked; }); // 自动加一 let plusOne = document.createElement("button"); plusOne.setAttribute('style', 'margin-right: 6px'); plusOne.innerHTML = '<input id="' + PLUS_ONE_ID + '" type="checkbox"/><span>+1</span>'; e.insertBefore(plusOne, e.firstChild); plusOne = document.getElementById(PLUS_ONE_ID); plusOne.checked = true; plusOne.addEventListener( 'change', function() { plusOneEnable = this.checked; }); // 一言 e = document.getElementById('breezemoonInput').parentNode; let hitokoto = document.createElement("button"); hitokoto.innerHTML = '一言'; hitokoto.setAttribute('class', 'green'); e.insertBefore(hitokoto, e.lastChild.nextSibling); hitokoto.onclick = () => sendHitokoto(); unsafeWindow.ChatRoom.showImg = id => { alert('<div class="user-card" style="margin: 0 auto">' + document.getElementById(id).outerHTML + '</div>') } } } } let proxyHandler = { get(target, property) { let value = target[property] if ((typeof value) === 'function') { value = value.bind(target) } return value }, set(target, property, value) { if (property === 'onmessage') { let realOnMessage = value; value = function(event) { analyzeMessage(event, realOnMessage); } } target[property] = value return value } }; // 解析消息 function analyzeMessage(event, realOnMessage) { var o = JSON.parse(event.data); switch (o.type) { case 'redPacketStatus': delayOpenRedPacket(o); realOnMessage(event); break; case 'revoke': preventRevoke(o.oId); return; case 'msg': messageCount++; if (isRedPacketMessage(o.content)) { delayOpenRedPacket(o); } else { chat(o); } realOnMessage(event); if (hasImg(o)) { addImgClick(o.oId) } clearChatRoom(); break; } }; // 查询历史记录是否有红包 function queryRedPacketOnHistory(data) { console.log('查询历史记录中是否有未领取红包'); let o = JSON.parse(data); if (!o.data) { return; } o.data.forEach(e => { if (isRedPacketMessage(e.content) && notOpenRedPacket(e.content)) { openRedPacket(e.oId); console.log('历史消息中有未领取红包'); } }) } // 是否是红包信息 function isRedPacketMessage(s) { return -1 !== s.indexOf('"msgType":"redPacket"'); } // 是否还有未打开的红包 function notOpenRedPacket(content) { let o = JSON.parse(content); return o.got < o.count && o.who.every(e => unsafeWindow.Label.currentUserName != e.userName); } function delayOpenRedPacket(oId) { if (unsafeWindow.ChatRoom) { setTimeout(() => { openRedPacket(oId); }, 3000 + Math.round(Math.random() * 100)); } } // 弹窗提示抢红包信息 function showMoney(data) { let o = JSON.parse(data); let usesrMoney = -1; o.who.forEach(e => { console.log(e.userName + ' 抢到了:' + e.userMoney + '积分'); if (e.userName === unsafeWindow.Label.currentUserName) { usesrMoney = e.userMoney; } }); console.log('____________________') usesrMoney > -1 ? notice('抢到了:' + usesrMoney + '积分') : notice('很遗憾没有抢到红包'); } // 清屏 function clearChatRoom() { if (messageCount > MESSAGE_MAX) { clearChatRoomElement.click(); messageCount = 0; } } // 防撤回 function preventRevoke(oId) { let source = document.getElementById('chatroom' + oId); if (!source) { return; } let href = source.firstElementChild.getAttribute('href'); let child = document.createElement("div"); child.setAttribute('style', 'color: rgb(50 50 50);margin-bottom: 10px;text-align: center;'); child.innerHTML = '<span><a href="' + href + '" target="_blank">' + href.substring(8) + '</a>想要撤回消息</span>'; source.parentNode.insertBefore(child, source); messageCount -= 20; } function addImgClick(oId) { let imgs = document.getElementById('chatroom' + oId).querySelector('.vditor-reset').querySelectorAll('img'); imgs.forEach((e, index) => { e.setAttribute('onclick', 'ChatRoom.showImg("img' + oId + index + '")'); e.setAttribute('id', 'img' + oId + index); }) } function hasImg(o) { return -1 !== o.content.indexOf('<img') } // 判断消息内容 function chat(o) { if (plusOneEnable) { if (previousMessage === o.md && previousMessage !== previousPlusOneMessage) { sendMessage(o.md); previousPlusOneMessage = o.md; } previousMessage = o.md; return; } if (!aiEnable || o.userName === unsafeWindow.Label.currentUserName || -1 === o.md.indexOf('@' + unsafeWindow.Label.currentUserName)) { return; } let msg = o.md.replace('@' + unsafeWindow.Label.currentUserName); aiApi(o.userName, msg); } // 机器人回复 function aiApi(userName, msg) { GM_xmlhttpRequest({ method: "GET", url: 'http://api.qingyunke.com/api.php?key=free&appid=0&msg=' + encodeURI(msg), onload: function(response){ let o = JSON.parse(response.response); sendMessage('@' + userName + ' ' + o.content); }, onerror: function(response){ console.log("请求失败"); } }); } // 发送一言 function sendHitokoto() { GM_xmlhttpRequest({ method: "GET", url: HITOKOTO_URL, onload: function(response){ let o = JSON.parse(response.response); document.getElementById('breezemoonInput').value = o.hitokoto; document.getElementById('breezemoonPostBtn').click(); }, onerror: function(response){ console.log("请求失败"); } }); } function sendMessage(s) { unsafeWindow.ChatRoom.editor.setValue(s); unsafeWindow.ChatRoom.send(); } function alert(s) { unsafeWindow.Util.alert(s) } function notice(message) { unsafeWindow.Util.notice("success", 1500, message); } function openRedPacket(oId) { unsafeWindow.ChatRoom.unpackRedPacket(oId); } webSocketHook(); requestSend(); addMenu(); })();