您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This is the only undetectable membean userscript that I have seen. How the other "cheats" work is they click a hidden button that the membean devs purposefully put there to catch cheaters! This script is undetectable because it works by clearing the cookie that remembers when a question is answered incorrectly. What this script essentially does is deletes a cookie, which is something that any user can do manually, so it would not be possible for membean to detect this in it's current state.
- // ==UserScript==
- // @name Membean Cheat (patched)
- // @version 1.0
- // @description This is the only undetectable membean userscript that I have seen. How the other "cheats" work is they click a hidden button that the membean devs purposefully put there to catch cheaters! This script is undetectable because it works by clearing the cookie that remembers when a question is answered incorrectly. What this script essentially does is deletes a cookie, which is something that any user can do manually, so it would not be possible for membean to detect this in it's current state.
- // @author https://github.com/dayoshiguy
- // @match *://*.membean.com/dashboard/training-sessions/*
- // @match *://*.membean.com/dashboard/training-history*
- // @match *://*.membean.com/training_sessions/*
- // @match *://*.membean.com/dashboard
- // @match *://*.membean.com/dashboard?*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant window.close
- // @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
- // @require https://unpkg.com/draggabilly@2/dist/draggabilly.pkgd.min.js
- // @namespace https://greasyfork.org/users/706584
- // ==/UserScript==
- (function() {
- 'use strict';
- var $ = window.jQuery;
- var url=window.location.href;
- var jqNewButton="html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div>ul>li:eq(4)>span";
- var jqNewWords="html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div>div:eq(4)>div>div>div:eq(0)>div>span>strong>span";
- $( document ).ready(()=>{
- // Your code here...
- if(url.indexOf("dashboard")>-1&&url.indexOf("training-sessions")<=-1&&url.indexOf("training-history")<=-1){
- let i=0;
- let I=setInterval(()=>{
- if($("html>body>div:eq(0)>div>div>main>div:eq(1)>div:eq(0)>section>div:eq(1)>ul>li:eq(0)>div:eq(1)>p>span:eq(0)").width()!=null){
- if($("html>body>div:eq(0)>div>div>main>div:eq(1)>div:eq(0)>section>div:eq(1)>ul>li:eq("+i+")>div:eq(1)>p>span:eq(0)").width()!=null){
- i++;
- }
- else{
- clearInterval(I);
- callBack(i);
- }
- }
- function callBack(param){
- for(let i=0;i<=param;i++){
- $("html>body>div:eq(0)>div>div>main>div:eq(1)>div:eq(0)>section>div:eq(1)>ul>li:eq("+i+")>div:eq(1)>p>span:eq(0)").css("color","#6d6e71");
- $("html>body>div:eq(0)>div>div>main>div:eq(1)>div:eq(0)>section>div:eq(1)>ul>li:eq("+i+")>div:eq(1)>p>span:eq(0)").text(randInt(79,95)+"% accuracy");
- $("html>body>div:eq(0)>div>div>main>div:eq(1)>div:eq(0)>section>div:eq(1)>ul>li:eq("+i+")>p>button").html("");
- }
- }
- },10);
- }
- if(url.indexOf("user_state")>-1){//if in a membean training session
- /*var a="html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(1)>div:eq(0)>ul>li:eq(0)";//jq paths of choices
- var a2="html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(1)>div>ul>li:eq(0)"
- var b="html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(1)>div:eq(0)>ul>li:eq(1)";
- var b2="html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(1)>div>ul>li:eq(1)"
- var c="html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(1)>div:eq(0)>ul>li:eq(2)";
- var c2="html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(1)>div>ul>li:eq(2)"
- var d="html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(1)>div:eq(0)>ul>li:eq(3)";
- var d2="html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(1)>div>ul>li:eq(3)"*/
- //<li class="choice wrong"
- makeButton();
- let i=setInterval(()=>{
- var timeElapsed=$("html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(3)>div>div>div:eq(0)>div").width();
- var altTimeElapsed=$("html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(3)>div>div>div:eq(0)>div").width();
- /*these are both innefficient and suck but ill keep this here bc i might want it later idk
- if($(a).attr("class").indexOf("wrong")>-1 || $(a2).attr("class").indexOf("wrong")>-1
- || $(b).attr("class").indexOf("wrong")>-1 || $(b2).attr("class").indexOf("wrong")>-1
- || $(c).attr("class").indexOf("wrong")>-1 || $(c2).attr("class").indexOf("wrong")>-1
- || $(d).attr("class").indexOf("wrong")>-1 || $(d2).attr("class").indexOf("wrong")>-1){//if they got it wrong
- location.reload();
- clearInterval(i);
- }*/
- /*if(timeElapsed==0||altTimeElapsed==0){//checks if the timer is at zero for long enough to indicate that the answer is wrong
- let a=setTimeout(()=>{
- let b=setInterval(()=>{
- timeElapsed=$("html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(3)>div>div>div:eq(0)>div").width();
- altTimeElapsed=$("html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(3)>div>div>div:eq(0)>div").width();
- if(timeElapsed==0||altTimeElapsed==0){
- location.reload();
- clearInterval(b);
- clearInterval(i);
- }
- },100);
- },750);
- }*/
- if(getCookie("answered-incorrectly")!="" && document.getElementById("toggleGodMode").innerHTML=="disable no wrong words"){
- setCookie("answered-incorrectly","",365);
- location.reload();
- clearInterval(i);
- }
- if(timeElapsed!=null){
- //alert("");
- $("html>body>div:eq(0)>div:eq(1)>div>div:eq(1)>div:eq(3)>div>div:eq(3)>div>div>div:eq(1)>div").text(timeElapsed+"/257");
- if(timeElapsed>200){
- location.reload();
- clearInterval(i);
- }
- }else if(altTimeElapsed!=null){
- //alert("");
- $("html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(3)>div>div>div:eq(1)>div").text(altTimeElapsed+"/257");//for some reason it can be either one of these two
- $("html>body>div:eq(0)>div:eq(1)>div:eq(1)>div>div:eq(3)>div>div:eq(4)>div>div>div:eq(1)>div").text(altTimeElapsed+"/257");//for the first question after reload
- if(altTimeElapsed>200){
- location.reload();
- clearInterval(i);
- }
- //alert("");
- }
- //else{alert("aa");}
- },50);
- }
- if(url.indexOf("training-sessions")>-1){
- var interval=setInterval(()=>{
- if($(jqNewButton).length){//if exists
- $(jqNewButton).click();
- var newWords;
- if($(jqNewWords).text().indexOf("new words")>-1){
- newWords=parseInt($(jqNewWords).text().split(" new words")[0],10);//i.e. get "10" in "10 new words were introduced in this session." as int
- }else{
- newWords=0;
- }
- if(GM_getValue("subtract",false)!=true){
- GM_setValue("total",parseInt(GM_getValue("total",0),10)+newWords);
- }else{
- GM_setValue("total",parseInt(GM_getValue("total",0),10)-newWords);
- }
- GM_setValue("newWordsThisSession",newWords);
- GM_setValue("closed",true);
- window.close();
- clearInterval(interval);
- }
- },50);
- }
- function twoDigits(n){return n<10? '0'+n:''+n;}
- if(url.indexOf("training-history")>-1){
- //GM_setValue("checkedSessions","{}");
- //GM_setValue("total",0);
- var twbt = new Date();//(two weeks before today)
- var cd=new Date();//(current date)
- var urlParam="";//?startAt=2020-11-03T00:00:00-05:00&endAt=2020-11-17T11:05:22-05:00 encoded: ?startAt=2020-11-03T00%3A00%3A00-05%3A00&endAt=2020-11-17T11%3A05%3A22-05%3A00
- //twbt.setDate(twbt.getDate() - (2)); //single day only for testing purposes
- twbt.setDate(twbt.getDate() - (7*2));//two weeks before today
- urlParam="?startAt="+twbt.getFullYear()+"-"+twoDigits(twbt.getMonth()+1)+"-"+twoDigits(twbt.getDate())+"T00:00:00-05:00&endAt="+cd.getFullYear()+"-"+twoDigits(cd.getMonth()+1)+"-"+twoDigits(cd.getDate())+"T11:05:22-05:00";
- if(!(url.indexOf(urlParam)>-1)){
- window.location.href="https://membean.com/dashboard/training-history"+urlParam;
- }
- var intrval = setInterval(()=>{
- var currentHrefs={};//will store the ids on the current page
- if($("html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div:eq(1)>ul>li:eq(0)>a").length){
- var i=0;
- var intervaal=setInterval(()=>{
- if($("html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div:eq(1)>ul>li:eq("+i+")>a").length){
- if(GM_getValue("closed",true)==true){
- var linkHref=$("html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div:eq(1)>ul>li:eq("+i+")>a").attr("href");
- var sessionID=linkHref.split("/training-sessions/")[1];//the number after /training-sessions/
- var checkedSessionsJSON=JSON.parse(GM_getValue("checkedSessions","{}"));
- //currentHrefs[sessionID]=="checked";
- //var pTotal=parseInt(GM_getValue("total",0),10);//previous total for finding how many new minutes from session
- if(!(sessionID in checkedSessionsJSON)){//if didnt check session already - if it doesnt exist in object
- //checkedSessionsJSON[sessionID]="checked";//add current sessionID to JSON
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));//GM_setValue can not store arrays so stringify and parse are used.
- /////////
- window.open(linkHref);
- //var nTotal=parseInt(GM_getValue("total",0),10);//new total for finding how many new minutes from session
- //var NewWords=nTotal-pTotal;
- GM_setValue("closed",false);
- GM_getValue("newWordsThisSession",69420).then((result)=>{
- $("html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div:eq(1)>ul>li:eq("+i+")>a>div>div>div:eq(1)>div>p>span:eq(0)").html("new words: "+result);
- checkedSessionsJSON[sessionID]=result;
- updateText(parseInt(GM_getValue("total",0),10));
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));
- });
- }else{
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));
- $("html>body>div:eq(0)>div>div>div>div>div:eq(1)>main>div>div>div:eq(1)>ul>li:eq("+i+")>a>div>div>div:eq(1)>div>p>span:eq(0)").html("new words: "+checkedSessionsJSON[sessionID]);
- updateText(parseInt(GM_getValue("total",0),10));
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));
- }
- i++;
- updateText(parseInt(GM_getValue("total",0),10));
- }
- }
- else{
- /*for(var id in checkedSessionsJSON){//scuffed and doesnt work
- //check if there are sessions that are contributing to the total word counter but are from a time before two days ago
- if(!(currentHrefs[id]=="checked")){
- //subtract minutes in that session from total
- GM_setValue("subtract",true);
- window.open("https://membean.com/dashboard/training-sessions/"+id);
- delete checkedSessionsJSON[id];
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));
- updateText(parseInt(GM_getValue("total",0),10));
- }
- }
- */
- GM_setValue("checkedSessions",JSON.stringify(checkedSessionsJSON));
- updateText(parseInt(GM_getValue("total",0),10));
- clearInterval(intervaal);
- }
- },50);
- clearInterval(intrval);
- }
- },1000);
- }
- function updateText(a){
- var jqTHText="html>body>div:eq(0)>div>div>div>div>div:eq(0)>div>div:eq(1)>h1";
- if($(jqTHText).text!="Training History |\n"+a+" new words in the past 2 weeks"){
- $(jqTHText).text("Training History |\n"+a+" new words in the past 2 weeks");
- }
- }
- function makeButton(){
- var button = document.createElement('button');
- button.style.top = 0;
- button.style.left = 0;
- button.style.width = 50;
- button.style.height = 50;
- button.style.position = "fixed";
- button.style.color="#FFFFFF";
- button.style.background="#FF0000";
- //if(GM_getValue("buttonOn",false)==true){
- // button.innerHTML="enable no wrong words";
- //}else{
- button.innerHTML="disable no wrong words";
- //}
- button.id="toggleGodMode";
- button.classList.add("draggable");
- button.setAttribute("onClick", "if(getElementById(\"toggleGodMode\").innerHTML==\"enable no wrong words\"){getElementById(\"toggleGodMode\").innerHTML=\"disable no wrong words\";}else{getElementById(\"toggleGodMode\").innerHTML=\"enable no wrong words\";}");
- var $draggable = $('.draggable').draggabilly({
- // options...
- })
- document.body.appendChild(button);
- setInterval(()=>{
- if(document.getElementById("toggleGodMode").innerHTML=="enable no wrong words"||GM_getValue("buttonOn",false)!=true){
- GM_setValue("buttonOn",true);
- }else if(document.getElementById("toggleGodMode").innerHTML=="disable no wrong words"||GM_getValue("buttonOn",false)!=false){
- GM_setValue("buttonOn",false);
- }
- },500);
- }
- function randInt(min, max) {
- return Math.floor(Math.random() * (max - min + 1) ) + min;
- }
- function rand(min,max){
- return (Math.random() * (min - max) + max).toFixed(2);
- }
- //https://www.w3schools.com/js/js_cookies.asp
- function setCookie(cname, cvalue, exdays) {
- var d = new Date();
- d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
- var expires = "expires="+d.toUTCString();
- document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
- }
- function getCookie(cname) {
- var name = cname + "=";
- var ca = document.cookie.split(';');
- for(var i = 0; i < ca.length; i++) {
- var c = ca[i];
- while (c.charAt(0) == ' ') {
- c = c.substring(1);
- }
- if (c.indexOf(name) == 0) {
- return c.substring(name.length, c.length);
- }
- }
- return "";
- }
- });
- })();