您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto login and auto refresh pages to find new available projects.
// ==UserScript== // @name dataannotation tasks notification // @namespace https://github.com/matthewwang16czap/TempermonkeyScripts // @version 0.2 // @description Auto login and auto refresh pages to find new available projects. // @author Shihanasaku // @license MIT // @match https://www.dataannotation.tech/* // @match https://app.dataannotation.tech/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_notification // ==/UserScript== (function() { 'use strict'; // help functions const login = (email, password) => { document.getElementById("user_email").value = email; document.getElementById("user_password").value = password; document.querySelector("input.btn").click(); }; const get_account = () => { let email = GM_getValue("email", ''); let password = GM_getValue("password", ''); return [email, password]; }; const set_account = (email, password) => { GM_setValue("email", email); GM_setValue("password", password); console.log(get_account()); }; const get_tasklogs = () => GM_getValue("tasklogs", []); const set_tasklogs = tasklogs => { GM_setValue("tasklogs", tasklogs); // console.log(get_tasklogs()); }; // menu let clear_storage = GM_registerMenuCommand("Clear storage", () => set_account('', '')); let goto_login = GM_registerMenuCommand("Login your account", () => { window.location.href = "https://app.dataannotation.tech/users/sign_in"; }); // if it is the login page if (window.location.href == "https://app.dataannotation.tech/users/sign_in") { // set default tasklogs set_tasklogs(['Onboarding Step 1 - Platform Basics', 'Onboarding Step 2 - Getting Paid!', 'Onboarding Step 3 - Practice Quiz!']); // if failed login, clear storage of current account if (document.querySelector(".alert") && !document.querySelector(".alert").innerText.includes('success')) { set_account('', ''); } // if has stored account let [email, password] = get_account(); if (email != '' && password != '') { login(email, password); } // if does not have stored account, wait for record user's account else { let form = document.querySelector("#new_user"); let new_div = document.createElement("div"); new_div.innerHTML = `</br><button style="color:red;">save my account for auto login</button>`; new_div.addEventListener("click", () => { set_account(document.getElementById("user_email").value, document.getElementById("user_password").value); alert("successfully save your account!"); }); form.parentNode.appendChild(new_div); } } // set up notifications if (window.location.href == "https://app.dataannotation.tech/workers/projects") { let tasks = document.getElementsByTagName("table")[1].childNodes[1].childNodes; let tasklogs = get_tasklogs(); let new_tasks_dict = Array.from(tasks).reduce((dict, task) => { if (!tasklogs.includes(task.childNodes[0].innerText)) { dict[task.childNodes[0].innerText] = task.childNodes[0].querySelector('a').href; } return dict; }, {}); let new_tasklogs = Array.from(tasks).map(task => task.childNodes[0].innerText); // update tasklogs set_tasklogs(new_tasklogs); // get notified if (Object.keys(new_tasks_dict).length != 0) { Object.keys(new_tasks_dict).forEach(taskname => { GM_notification({ text: taskname, title: "DataAnnotation", url: new_tasks_dict[taskname], onclick: (event) => { // The userscript is still running, so don't open example.com // event.preventDefault(); // Display an alert message instead // alert('I was clicked!') } }); }); } // set sleep time to refresh (10 mins) setTimeout(() => { location.reload(); }, 10*60*1000); } })();