Greasy Fork

Greasy Fork is available in English.

海底掘金

这是一个针对 海底掘金活动 编写的油猴脚本,实现了用户信息的自动获取和掘进方式的高效的选择。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* 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 ==");
  };
})();