Greasy Fork is available in English.
这是一个针对 海底掘金活动 编写的油猴脚本,实现了用户信息的自动获取和掘进方式的高效的选择。
/* eslint-disable */ // ==UserScript== // @name 海底掘金 // @namespace https://github.com/palmcivet/juejin-miming // @version 0.0.4 // @license MIT // @description 这是一个针对 海底掘金活动 编写的油猴脚本,实现了用户信息的自动获取和掘进方式的高效的选择。 // @author Palm Civet // @match https://juejin.cn/game/haidijuejin/* // @require https://unpkg.com/[email protected]/dist/cdn.min.js // @grant none // ==/UserScript== var __defProp = Object.defineProperty; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; (function() { const CLASS_NAME = "juejin-miming"; const API_USER = "https://api.juejin.cn/user_api/v1/user/get"; const API_GAME_BASE = "https://juejin-game.bytedance.com/game/sea-gold"; const API_GAME_COMMAND = `${API_GAME_BASE}/game/command`; async function getUserInfo() { try { const result = await fetch(API_USER, { credentials: "include" }); const data = await result.json(); return data.data; } catch (error) { throw error; } } async function gameCommand({ uid = "", authorization = "", gameId = "", commandStep = 0 }) { const commandArr = [ [{ times: 2, command: ["2", "L", "D", "L", "4", "D", "6", "R", "D", "R"] }], [{ times: 2, command: ["2", "R", "D", "R", "6", "D", "4", "L", "D", "L"] }], [ { times: 10, command: [ { times: 2, command: ["D", "2", "L", "D", "L", "4", "D", "6", "U", "L", "D", "R"] }, "L", "D" ] }, { times: 2, command: ["U", "U", "8", "R"] }, { times: 10, command: [ { times: 2, command: ["D", "2", "R", "D", "R", "6", "D", "4", "U", "R", "D", "L"] }, "R", "D" ] }, { times: 2, command: ["U", "U", "8", "L"] } ], [ { times: 10, command: [ { times: 2, command: ["D", "2", "L", "D", "L", "4", "D", "6", "U", "L", "D", "R"] }, "L", "D" ] }, { times: 2, command: ["U", "U", "8", "R"] }, { times: 10, command: [ { times: 2, command: ["D", "2", "R", "D", "R", "6", "D", "4", "U", "R", "D", "L"] }, "R", "D" ] }, { times: 2, command: ["U", "U", "8", "L"] } ], [ { times: 10, command: [ "L", "L", "L", "4", "L", "L", "L", "4", "D", "R", "R", "R", "6", "R", "R", "R", "6" ] }, { times: 3, command: ["U", "U", "L", "L", "8", "4"] }, { times: 6, command: ["D", "2", "L", "D", "L", "4", "D", "6", "U", "L", "D", "R"] }, "L", "D", { times: 10, command: [ "R", "R", "R", "6", "R", "R", "R", "6", "D", "L", "L", "L", "4", "L", "L", "L", "4" ] }, { times: 3, command: ["U", "U", "R", "R", "8", "6"] }, { times: 6, command: ["D", "2", "R", "D", "R", "6", "D", "4", "U", "R", "D", "L"] }, "R", "D" ] ]; const coreCode = commandArr[commandStep]; const loop = commandStep <= 1 ? 2 : 4; const params = { command: [] }; let _params = params; for (let i = 0; i < loop; i++) { _params["command"].push({ times: 10, command: [] }); _params = _params.command[0]; if (i >= loop - 1) { _params.command.push(...coreCode); } } _params = null; const datarus = await fetch(`${API_GAME_COMMAND}?uid=${uid}&time=${Date.parse(new Date().toString())}`, { method: "POST", credentials: "include", headers: { "Content-type": "application/json; charset=UTF-8", "authorization": authorization, "accept": "application/json, text/plain, */*", "content-length": JSON.stringify(params).length.toString(), "x-tt-gameid": gameId }, body: JSON.stringify(params) }); return datarus.json(); } function injectStyle() { const styleDOM = document.createElement("style"); styleDOM.id = `${CLASS_NAME}-style`; styleDOM.innerHTML = `:root { --radius: 6px; --padding: 10px; --primary-color: #3c7eff; } .juejin-miming-controls { background-color: #3c7eff; border: 2px solid #bedaff; border-radius: var(--radius); position: absolute; right: 10px; top: 10px; width: 200px; padding: var(--padding); display: flex; flex-direction: column; align-items: center; color: white; } .juejin-miming-controls h2 { margin: var(--padding) 0; } .juejin-miming-controls a { color: white; } .juejin-miming-info input[type="text"] { font-family: monospace, "Courier New", Courier; width: 100%; font-size: 15px; height: 28px; border: 0; outline: 0; overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; box-sizing: border-box; border-radius: calc(var(--radius) / 2); margin: 2px 0; padding: 0 4px; } .juejin-miming-cmd { margin: var(--padding) 0; display: flex; flex-direction: column; width: 100%; } .juejin-miming-cmd label { list-style: none; width: 100%; text-align: left; cursor: pointer; display: inline-flex; align-items: center; font-family: monospace, "Courier New", Courier; } .juejin-miming-cmd input[type="radio"] { cursor: pointer; padding: 0; width: 17px; height: 17px; margin: 0 5px 0 5px; } .juejin-miming-btn { color: #1d4dd2; background-color: white; border: 2px solid #1d4dd2; width: 70px; height: 30px; cursor: pointer; border-radius: calc(var(--radius) / 2); } .juejin-miming-btn:hover { color: white; background-color: #1d4dd2; border: 2px solid white; } .juejin-miming-msg { margin-top: var(--padding); height: 24px; } `; document.head.append(styleDOM); } function injectControls() { const root = document.querySelector("#Cocos2dGameContainer"); const container = document.createElement("div"); container.className = `${CLASS_NAME}-script`; container.innerHTML = `<div class="juejin-miming-controls" x-data> <div class="juejin-miming-project"> <h2> <a href="//github.com/palmcivet/juejin-miming" target="_blank" title="GitHub">\u6398\u91D1\u6316\u77FF</a> </h2> </div> <div class="juejin-miming-info"> <input type="text" x-model="$store.controls.form.uid" placeholder="uid" /> <input type="text" x-model="$store.controls.form.authorization" placeholder="authorization" /> <input type="text" x-model="$store.controls.form.gameId" placeholder="x-tt-gameid" /> </div> <div class="juejin-miming-cmd"> <label> <input type="radio" value="0" name="commandStep" @change="$store.controls.onChange(0)" /> 0\uFF1A\u5F00\u5C40\u5F80\u5DE6 </label> <label> <input type="radio" value="1" name="commandStep" @change="$store.controls.onChange(1)" /> 1\uFF1A\u5F00\u5C40\u5F80\u53F3 </label> <label> <input type="radio" value="2" name="commandStep" @change="$store.controls.onChange(2)" /> 2\uFF1A\u4E2D\u671F </label> <label> <input type="radio" value="3" name="commandStep" @change="$store.controls.onChange(3)" /> 3\uFF1A\u540E\u671F\u98DE\u7FD4 </label> <label> <input type="radio" value="4" name="commandStep" @change="$store.controls.onChange(4)" /> 4\uFF1A\u540E\u671F\u626B\u8361 </label> </div> <button class="juejin-miming-btn" @click="$store.controls.onSubmit()">\u6267\u884C</button> <div class="juejin-miming-msg" x-text="$store.controls.message"></div> </div> `; root.appendChild(container); } (function(context) { context.rewriteXHR = { cachedProto: function() { this._originXhr = context.XMLHttpRequest.prototype; this._originOpen = this._originXhr.open; this._originSend = this._originXhr.send; this._originSetRequestHeader = this._originXhr.setRequestHeader; }, overWrite: function() { const _this = this; this._originXhr.open = function() { this.open_args = [...arguments]; return _this._originOpen.apply(this, arguments); }; this._originXhr.send = function() { return _this._originSend.apply(this, arguments); }; this._originXhr.setRequestHeader = function() { const url = this.open_args && this.open_args[1]; if (url.startsWith(API_GAME_BASE)) { const headerKey = arguments[0]; if (/^x-tt-gameid$/.test(headerKey)) { localStorage.setItem(`${CLASS_NAME}-gameid`, arguments[1]); Alpine.store("controls").form.gameId = localStorage.getItem(`${CLASS_NAME}-gameid`); } if (/^Authorization$/.test(headerKey)) { localStorage.setItem(`${CLASS_NAME}-authid`, arguments[1]); Alpine.store("controls").form.authorization = localStorage.getItem(`${CLASS_NAME}-authid`); } } return _this._originSetRequestHeader.apply(this, arguments); }; }, init: function() { this.cachedProto(); this.overWrite(); } }; context.rewriteXHR.init(); })(window); document.addEventListener("alpine:init", () => { Alpine.store("controls", { form: { uid: "", gameId: "", authorization: "", commandStep: "0" }, message: "", onChange(value) { Alpine.store("controls").form.commandStep = value; }, async onSubmit() { Alpine.store("controls").message = ""; const result = await gameCommand(__spreadValues({}, Alpine.store("controls").form)); const { message } = result; Alpine.store("controls").message = message; } }); console.info("== Juejin miming: inject =="); }); const _onload = window.onload || function() { }; window.onload = async (event) => { _onload(event); setTimeout(injectStyle); setTimeout(injectControls, 8e3); const { user_id } = await getUserInfo(); Alpine.store("controls").form.uid = user_id; Alpine.store("controls").form.gameId = localStorage.getItem(`${CLASS_NAME}-gameid`); Alpine.store("controls").form.authorization = localStorage.getItem(`${CLASS_NAME}-authid`); console.log("== Juejin miming: enjoy =="); }; })();