绕过 CoCo 作品分享的审核机制,让他人可以看到你分享的作品,请低调使用
目前為
// ==UserScript==
// @name CoCo 作品分享审核绕过
// @namespace https://slightning.rechen.xyz/
// @version 0.1.1
// @description 绕过 CoCo 作品分享的审核机制,让他人可以看到你分享的作品,请低调使用
// @author SLIGHTNING
// @match http://coco.codemao.cn/editor/*
// @match https://coco.codemao.cn/editor/*
// @icon https://coco.codemao.cn/favicon.ico
// @grant none
// @license GPL
// ==/UserScript==
(function() {
'use strict';
function modifyWork(work) {
var unsafeList = work.unsafeExtensionWidgetList,
safeList = work.extensionWidgetList
moveUnsafeToSafe(unsafeList, safeList)
work.globalWidgetIds = work.globalWidgetIds.map(removeUnsafe)
mapRemoveUnsafe(work.globalWidgets)
Object.values(work.screens).forEach(screen => {
screen.widgetIds = screen.widgetIds.map(removeUnsafe)
screen.invisibleWidgetIds = screen.invisibleWidgetIds.map(removeUnsafe)
mapRemoveUnsafe(screen.widgets)
})
blockRemoveUnsafe(work.blockly)
}
function moveUnsafeToSafe(unsafeList, safeList) {
var safeMap = {}
safeList.forEach(safe => {
safeMap[safe.type] = safe
})
var unsafe
while (unsafe = unsafeList.shift()) {
var sefe,
cdnUrl = `data:text/plain;charset=UTF-8,${encodeURIComponent(unsafe.code)}//`,
type = removeUnsafe(unsafe.type)
if (safe = safeMap[type]) {
safe.cdnUrl = cdnUrl
} else {
var safe = {
id: Math.floor(Math.random() * 10000) + 10000,
type: type,
cdnUrl: cdnUrl
}
safeList.push(safe)
}
}
}
function mapRemoveUnsafe(map) {
Object.keys(map).forEach(function(key) {
var widget = map[key]
delete map[key]
var id = removeUnsafe(key)
map[id] = widget
widget.id = id
widget.type = removeUnsafe(widget.type)
})
}
function blockRemoveUnsafe(screenBlock) {
Object.values(screenBlock).forEach(screen => {
Object.values(screen.workspaceJson.blocks).forEach(block => {
var {fields, shadows} = block
if (fields.WIDGET_ID) {
fields.WIDGET_ID = removeUnsafe(fields.WIDGET_ID)
}
block.mutation = block.mutation.replaceAll("widget_type=\"UNSAFE_", "widget_type=\"")
if (shadows.PARAM_text) {
shadows.PARAM_text = shadows.PARAM_text.replaceAll("widget_type=\"UNSAFE_", "widget_type=\"")
}
})
})
}
function removeUnsafe(id) {
if (id.startsWith("UNSAFE_")) {
return id.substring(7)
} else {
return id
}
}
var originalFetch = fetch
fetch = async function(input, init) {
var response = await originalFetch(input, init)
if (input.startsWith("https://creation.codemao.cn/716/appcraft/JSON") &&
response.ok) {
var responseToModify = response.clone()
var work = await responseToModify.json()
if (!work.blockCode) {
modifyWork(work)
}
var modifiedResponse = new Response(JSON.stringify(work), {
...response
})
return modifiedResponse
} else {
return response
}
}
async function modifyReleaseFile(file) {
file.extensionWidgetList.push({
id: 0,
type: "EXTENSION_SLIGHTNING_BYPASS_AUDIT",
cdnUrl:
"data:text/plain;charset=UTF-8," +
encodeURIComponent(`
new Function(\`(\${(async () => {
"use strict";
if (!window.SLIGHTNING_BYPASS_AUDIT_STOP) {
window.SLIGHTNING_BYPASS_AUDIT_STOP = true
var originalAlert = alert
alert = (message) => {
if (message == "作品审核中,请稍后再试") {
console.log.apply(this, arguments)
throw new Error("阻断新版 Player 检查自定义控件")
} else {
originalAlert.apply(this, arguments)
}
}
var res = [
"https://creation.codemao.cn/coconut/web/1.20.0/static/css/0.bdc7c4b0.chunk.css",
"https://creation.codemao.cn/coconut/web/1.20.0/static/css/index.fbac8067.69ec868f.chunk.css",
"https://creation.codemao.cn/coconut/web/1.20.0/static/js/0.778b65e8.chunk.js",
"https://creation.codemao.cn/coconut/web/1.20.0/static/js/2.6d64a925.chunk.js",
"https://creation.codemao.cn/coconut/web/1.20.0/static/js/index.fbac8067.866fb61f.chunk.js"
]
res = await Promise.all(res.map(async res => await (await fetch(res)).text()))
var {head, body} = document
var root = document.getElementById("root")
document.querySelectorAll("link[rel=\\"stylesheet\\"]").forEach(element => {
element.remove()
})
document.querySelectorAll("script")[1].remove()
document.querySelectorAll("script[src]").forEach(element => {
element.remove()
})
delete window.webpackJsonpappcraft
for (let i = 0; i < 2; i++) {
var element = document.createElement("style")
element.innerHTML = res.shift()
head.appendChild(element)
}
var element = document.createElement("script")
element.innerHTML = \`!function(e){function t(t){for(var n,o,u=t[0],i=t[1],f=t[2],l=0,d=[];l<u.length;l++)o=u[l],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(s&&s(t);d.length;)d.shift()();return c.push.apply(c,f||[]),r()}function r(){for(var e,t=0;t<c.length;t++){for(var r=c[t],n=!0,o=1;o<r.length;o++){var i=r[o];0!==a[i]&&(n=!1)}n&&(c.splice(t--,1),e=u(u.s=r[0]))}return e}var n={},o={8:0},a={8:0},c=[];function u(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,u),r.l=!0,r.exports}u.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{12:1}[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{1:"31d6cfe0",3:"31d6cfe0",10:"31d6cfe0",12:"0e6db29b",13:"31d6cfe0",14:"31d6cfe0",15:"31d6cfe0",16:"31d6cfe0",19:"31d6cfe0",20:"31d6cfe0"}[e]+".chunk.css",a=u.p+n,c=document.getElementsByTagName("link"),i=0;i<c.length;i++){var f=(s=c[i]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(f===n||f===a))return t()}var l=document.getElementsByTagName("style");for(i=0;i<l.length;i++){var s;if((f=(s=l[i]).getAttribute("data-href"))===n||f===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,c=new Error("Loading CSS chunk "+e+" failed.\\\\n("+n+")");c.code="CSS_CHUNK_LOAD_FAILED",c.request=n,delete o[e],d.parentNode.removeChild(d),r(c)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=n);var c,i=document.createElement("script");i.charset="utf-8",i.timeout=120,u.nc&&i.setAttribute("nonce",u.nc),i.src=function(e){return u.p+"static/js/"+({}[e]||e)+"."+{1:"80741801",3:"2b21973a",10:"7a731b8c",12:"a8d69b9c",13:"d8be0445",14:"db87458c",15:"6861f8d2",16:"1723ca48",19:"b2c08048",20:"d743e630"}[e]+".chunk.js"}(e);var f=new Error;c=function(t){i.onerror=i.onload=null,clearTimeout(l);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;f.message="Loading chunk "+e+" failed.\\\\n("+n+": "+o+")",f.name="ChunkLoadError",f.type=n,f.request=o,r[1](f)}a[e]=void 0}};var l=setTimeout((function(){c({type:"timeout",target:i})}),12e4);i.onerror=i.onload=c,document.head.appendChild(i)}return Promise.all(t)},u.m=e,u.c=n,u.d=function(e,t,r){u.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,t){if(1&t&&(e=u(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(u.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)u.d(r,n,function(t){return e[t]}.bind(null,n));return r},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,"a",t),t},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},u.p="https://creation.codemao.cn/coconut/web/1.20.0/",u.oe=function(e){throw console.error(e),e};var i=this.webpackJsonpappcraft=this.webpackJsonpappcraft||[],f=i.push.bind(i);i.push=t,i=i.slice();for(var l=0;l<i.length;l++)t(i[l]);var s=f;r()}([])\`
root.after(element)
for (let i = 0; i < 3; i++) {
var element = document.createElement("script")
element.innerHTML = res.shift()
body.appendChild(element)
}
}
}).toString()})()\`)()
const types = {
type: "SLIGHTNING_BYPASS_AUDIT",
title: "审核绕过",
icon: "",
isInvisibleWidget: true,
isGlobalWidget: true,
properties: [],
methods: [],
events: []
}
class Widget extends InvisibleWidget {
constructor(props) {
super(props)
}
}
exports.types = types
exports.widget = Widget
//`)
})
delete file.blockJsonMap
}
var originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data) {
if (data instanceof FormData) {
var fileName = data.get("fname"),
originalFile = data.get("file")
if (fileName == "test.json") {
var xhr = this,
xhrArguments = arguments
var reader = new FileReader()
reader.readAsText(originalFile)
reader.onload = async function() {
try {
var fileContent = JSON.parse(this.result)
await modifyReleaseFile(fileContent)
var blob = new Blob([JSON.stringify(fileContent)], { type: "text/plain" })
var file = new File([blob], originalFile.name, { type: originalFile.type })
data.set("file", file)
} catch (error) {
console.error(error)
alert(`绕过审核失败:${error.message}`)
}
originalSend.apply(xhr, xhrArguments)
}
} else {
originalSend.apply(this, arguments)
}
} else {
originalSend.apply(this, arguments)
}
}
})()