此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/457260/1133329/PTC%20VieFaucet.js
您需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已经安装了用户样式管理器,让我安装!)
换行
// ==UserScript== // @name PTC VieFaucet // @namespace Multi WEB PTC With Manual Captcha // @version 2.0 // @description Multi WEB AutoRotasi // @author Saputra // @license MIT // @grant GM_xmlhttpRequest // ==/UserScript== ( function () { 'use strict' ; window . alert = function () {}; window . confirm = function () {}; //Do not execute if window is a pop up if ( window . name ){ return ; } var count = 0 ; var clicked = false ; //Enter your login and password below, if you like to Autologin. Be careful while providing passwords, //else you may get your accounts locked var websiteData = [ { url : "https://viefaucet.com/app/ptc" , login : "" , password : "" }, { url : "https://flickr.com" , login : "" , password : "" }, ]; var websiteMap = [{ website : [ "viefaucet.com" ], defaultButtonSelectors : [ ".el-card__body .el-button.el-button--primary.claim-button" ], allMessageSelectors : [ ".el-notification__group" , ".el-notification__content" ], messagesToCheckBeforeMovingToNextUrl : [ "You have claimed 21 tokens" , "You have claimed 50 tokens" , "You have claimed 91 tokens" , "You have claimed 20 tokens" , "Success" ], timeoutbeforeMovingToNextUrl : 47000 }, { website : [ "flickr.com" ], timeoutbeforeMovingToNextUrl : 1000 }, ]; //HtmlEvents dispatcher function triggerEvent ( el , type ) { try { var e = document . createEvent ( 'HTMLEvents' ); e . initEvent ( type , false , true ); el . dispatchEvent ( e ); } catch ( exception ){ console . log ( exception ); } } function toggleCaptcha ( selector , index ){ if ( document . querySelector ( selector )){ document . querySelector ( selector ). selectedIndex = index ; var targetNode = document . querySelector ( selector ); if ( targetNode ) { setTimeout ( function () { triggerEvent ( targetNode , 'change' ); }, 5000 ); } } } //Check if a string is present in Array String . prototype . includesOneOf = function ( arrayOfStrings ) { //If this is not an Array, compare it as a String if (! Array . isArray ( arrayOfStrings )) { return this . toLowerCase (). includes ( arrayOfStrings . toLowerCase ()); } for ( var i = 0 ; i < arrayOfStrings . length ; i ++) { if ( this . toLowerCase (). includes ( arrayOfStrings [ i ]. toLowerCase ())) { return true ; } } return false ; } var websiteDataValues = {}; //Get selector details from the websiteMap for ( let value of Object . values ( websiteMap )) { if ( window . location . href . includesOneOf ( value . website )) { websiteDataValues . inputTextSelector = value . inputTextSelector ; websiteDataValues . inputTextSelectorButton = value . inputTextSelectorButton ; websiteDataValues . defaultButtonSelectors = value . defaultButtonSelectors ; websiteDataValues . claimButtonSelector = value . claimButtonSelector ; websiteDataValues . captchaButtonSubmitSelector = value . captchaButtonSubmitSelector ; websiteDataValues . loginSelectors = value . loginSelectors ; websiteDataValues . loginCaptcha = value . loginCaptcha ; websiteDataValues . allMessageSelectors = value . allMessageSelectors ; websiteDataValues . messagesToCheckBeforeMovingToNextUrl = value . messagesToCheckBeforeMovingToNextUrl ; websiteDataValues . withdrawPageUrl = value . withdrawPageUrl ; websiteDataValues . withdrawEnabled = value . withdrawEnabled ; websiteDataValues . balanceSelector = value . balanceSelector ; websiteDataValues . withdrawMinAmount = value . withdrawMinAmount ; websiteDataValues . successMessageSelectors = value . successMessageSelectors ; websiteDataValues . toggleCaptchaSelector = value . toggleCaptchaSelector ; websiteDataValues . toggleCaptchaSelectorIndex = value . toggleCaptchaSelectorIndex ; websiteDataValues . additionalFunctions = value . additionalFunctions ; websiteDataValues . timeoutbeforeMovingToNextUrl = value . timeoutbeforeMovingToNextUrl ; break ; } } var login = "" ; var password = "" ; for ( let value of Object . values ( websiteData )) { count = count + 1 ; if ( value . url . includes ( window . location . hostname )) { websiteDataValues . url = value . url ; login = value . login ; password = value . password ; break ; } } //Get the next Url from the website data map async function getNextUrl () { //Go to the beginning if the end of the array is reached if ( count >= websiteData . length ) { websiteDataValues . nextUrl = websiteData [ 0 ]. url ; } else { websiteDataValues . nextUrl = websiteData [ count ]. url ; } //Use case for overrding next Url if ( websiteDataValues . overrideNextUrl ) { websiteDataValues . nextUrl = websiteDataValues . overrideNextUrl ; } //Ping Test to check if a website is up before proceeding to next url pingTest ( websiteDataValues . nextUrl ); } var isNextUrlReachable = false ; //Get the next Url from the website function pingTest ( websiteUrl ) { console . log ( websiteUrl ); GM_xmlhttpRequest ({ method : "GET" , url : websiteUrl , headers : { "Content-Type" : "application/x-www-form-urlencoded" }, timeout : 5000 , onload : function ( response ) { //Website is reachable isNextUrlReachable = true ; }, onerror : function ( e ) { count = count + 1 ; getNextUrl (); }, ontimeout : function () { count = count + 1 ; getNextUrl (); }, }); } async function delay ( ms ) { return new Promise ( resolve => setTimeout ( resolve , ms )) } var movingToNextUrl = false ; async function goToNextUrl () { if (! movingToNextUrl ) { movingToNextUrl = true ; getNextUrl (); while (! isNextUrlReachable ) { await delay ( 3000 ); } window . location . href = websiteDataValues . nextUrl ; } } //Default Setting: After 180 seconds go to next Url var delayBeforeMovingToNextUrl = 180000 ; if ( websiteDataValues . timeoutbeforeMovingToNextUrl ) { delayBeforeMovingToNextUrl = websiteDataValues . timeoutbeforeMovingToNextUrl ; } setTimeout ( function () { goToNextUrl (); }, delayBeforeMovingToNextUrl ); //Wait for 5 seconds if it's in dashboard, if ((! window . location . href . includes ( "coinpayu" )) && ( window . location . href . includes ( "dashboard" ) || window . location . href . includes ( "page/user-admin" ))) { setTimeout ( function () { if ( websiteDataValues . url ) { window . location . href = websiteDataValues . url ; } }, 5000 ); } //Returns true if message selectors are present function messageSelectorsPresent () { if ( websiteDataValues . allMessageSelectors ) { for ( var j = 0 ; j < websiteDataValues . allMessageSelectors . length ; j ++) { for ( var k = 0 ; k < document . querySelectorAll ( websiteDataValues . allMessageSelectors [ j ]). length ; k ++) { if ( document . querySelectorAll ( websiteDataValues . allMessageSelectors [ j ])[ k ] && ( document . querySelectorAll ( websiteDataValues . allMessageSelectors [ j ])[ k ]. innerText . includesOneOf ( websiteDataValues . messagesToCheckBeforeMovingToNextUrl ) || ( document . querySelectorAll ( websiteDataValues . allMessageSelectors [ j ])[ k ]. value && document . querySelectorAll ( websiteDataValues . allMessageSelectors [ j ])[ k ]. value . includesOneOf ( websiteDataValues . messagesToCheckBeforeMovingToNextUrl )))) { return true ; } } } } return false ; } function closeRepeatingAds () { //Check if previous Ad is Same as Current Ad and Skip the Ad if ( unsafeWindow . viewurl ) { if ( GM_getValue ( "adUrl" ) && GM_getValue ( "adUrl" ) == unsafeWindow . viewurl ) { //Skip the Ad document . querySelector ( ".card > a" ). click (); movingToNextUrl = true ; } else { GM_setValue ( "adUrl" , unsafeWindow . viewurl ); } } } function bithub () { //Block Pop Ups unsafeWindow . open = function (){}; if ( document . querySelector ( "body" ). innerText . includes ( "This ad does not exist or has expired" )){ window . location . href = "https://bithub.win/ptc/" ; } } function dogemate () { //Block Pop Ups unsafeWindow . open = function (){}; if ( document . querySelector ( "body" ). innerText . includes ( "This ad does not exist or has expired" )){ window . location . href = "https://dogemate.com/ptc/" ; } } function bits () { //Block Pop Ups unsafeWindow . open = function (){}; if ( document . querySelector ( "body" ). innerText . includes ( "This ad does not exist or has expired" )){ window . location . href = "https://bits.re/ptc/" ; } } function mad () { //Block Pop Ups unsafeWindow . open = function (){}; if ( document . querySelector ( "body" ). innerText . includes ( "This ad does not exist or has expired" )){ window . location . href = [ "https://coinpayz.xyz/ptc/" , "https://coinpot.in/ptc/" ]; } } var stopSolvingCaptcha = false ; function checkLoginSelectors () { if ( websiteDataValues . loginSelectors ) { //Check if all login selectors are present let count = 0 ; for ( let i = 0 ; i < websiteDataValues . loginSelectors . length ; i ++) { if ( document . querySelector ( websiteDataValues . loginSelectors [ i ])) { count ++; } } if ( count == websiteDataValues . loginSelectors . length ) { if ( login . length > 0 && password . length > 0 ) { //Input Login document . querySelector ( websiteDataValues . loginSelectors [ 0 ]). value = login ; //Input Password document . querySelector ( websiteDataValues . loginSelectors [ 1 ]). value = password ; } else { stopSolvingCaptcha = true ; } } else { stopSolvingCaptcha = true ; } } else { stopSolvingCaptcha = true ; } } setTimeout ( function () { checkLoginSelectors (); if ( websiteDataValues . additionalFunctions ) { websiteDataValues . additionalFunctions (); } //Look for all the default messages or errors before proceeding to next url //For other languages difference in the length of the strings can be compared or visibility of the style element if (! movingToNextUrl && messageSelectorsPresent ()) { goToNextUrl (); } //Check for all the default button selectors and click //This will only click the first selector found, so mention the selectors with parent element wherever required if (! movingToNextUrl && websiteDataValues . defaultButtonSelectors ){ for ( var i = 0 ; i < websiteDataValues . defaultButtonSelectors . length ; i ++){ if ( document . querySelector ( websiteDataValues . defaultButtonSelectors [ i ])){ triggerEvent ( document . querySelector ( websiteDataValues . defaultButtonSelectors [ i ]), 'mousedown' ); triggerEvent ( document . querySelector ( websiteDataValues . defaultButtonSelectors [ i ]), 'mouseup' ); document . querySelector ( websiteDataValues . defaultButtonSelectors [ i ]). click (); break ; } } } if (! movingToNextUrl && websiteDataValues . toggleCaptchaSelector && Number . isInteger ( websiteDataValues . toggleCaptchaSelectorIndex )){ toggleCaptcha ( websiteDataValues . toggleCaptchaSelector , websiteDataValues . toggleCaptchaSelectorIndex ); } //Input the address and click the login button if (! movingToNextUrl && document . querySelector ( websiteDataValues . inputTextSelector )) { document . querySelector ( websiteDataValues . inputTextSelector ). value = websiteDataValues . address ; setTimeout ( function () { if ( websiteDataValues . inputTextSelectorButton && document . querySelector ( websiteDataValues . inputTextSelectorButton )) { document . querySelector ( websiteDataValues . inputTextSelectorButton ). click (); } }, 5000 ); } //Click the form button after solving captcha //Works for both recaptcha and hcaptcha var clicked = false ; var captchaInterval = setInterval ( function () { if (! stopSolvingCaptcha || ! window . location . href . includes ( "login" )) { try { if (! clicked && unsafeWindow . grecaptcha && unsafeWindow . grecaptcha . getResponse (). length > 0 ) { for ( let i = 0 ; i < websiteDataValues . captchaButtonSubmitSelector . length ; i ++) { if ( document . querySelector ( websiteDataValues . captchaButtonSubmitSelector [ i ])) { document . querySelector ( websiteDataValues . captchaButtonSubmitSelector [ i ]). click (); } } clicked = true ; clearInterval ( captchaInterval ); setTimeout ( function () { if ( messageSelectorsPresent ()) { goToNextUrl (); } }, 5000 ); } } catch ( e ) { } for ( var hc = 0 ; hc < document . querySelectorAll ( "iframe" ). length ; hc ++) { if (! clicked && document . querySelectorAll ( "iframe" )[ hc ] && document . querySelectorAll ( "iframe" )[ hc ]. getAttribute ( "data-hcaptcha-response" ) && document . querySelectorAll ( "iframe" )[ hc ]. getAttribute ( "data-hcaptcha-response" ). length > 0 ) { for ( let i = 0 ; i < websiteDataValues . captchaButtonSubmitSelector . length ; i ++) { if ( document . querySelector ( websiteDataValues . captchaButtonSubmitSelector [ i ])) { document . querySelector ( websiteDataValues . captchaButtonSubmitSelector [ i ]). click (); } } clicked = true ; clearInterval ( captchaInterval ); setTimeout ( function () { if ( messageSelectorsPresent ()) { goToNextUrl (); } }, 5000 ); } } } }, 5000 ); }, 5000 ); window . onbeforeunload = function () { if ( unsafeWindow . myWindow ) { unsafeWindow . myWindow . close (); } if ( unsafeWindow . coinwin ) { var tmp = unsafeWindow . coinwin ; unsafeWindow . coinwin = {}; tmp . close (); } }; })();