您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Waits for manual account selection, then automatically clicks the 'Continue/Allow' button on the Google OAuth permission screen.
// ==UserScript== // @name Google OAuth Continue Clicker (No Account Select) // @namespace ekstra26 // @version 3.2 // @description Waits for manual account selection, then automatically clicks the 'Continue/Allow' button on the Google OAuth permission screen. // @match https://accounts.google.com/* // @run-at document-end // @license MIT // @grant none // ==/UserScript== (function () { 'use strict'; // Sadece OAuth izin ekranını hedefleyen URL deseni const OAUTH_URL_REGEX = /^https:\/\/accounts\.google\.com\/o\/oauth2\//i; // Tekrarlayan tıklamaları önlemek için durum bayrağı let clickAttemptedOnPermissionScreen = false; // Detaylı loglama için yardımcı fonksiyon function log(message, ...args) { const timestamp = new Date().toLocaleTimeString(); console.log(`[OAuth Script ${timestamp}] ${message}`, ...args); } // Güvenilir tıklama fonksiyonu function robustClick(element) { if (!element) { log("Hata: Tıklanacak bir element bulunamadı."); return; } log("ROBUST CLICK denemesi başlatıldı:", element); element.scrollIntoView({ behavior: 'smooth', block: 'center' }); const clickSequence = [ () => { log("Adım 1: focus"); if (typeof element.focus === 'function') element.focus(); }, () => { log("Adım 2: mousedown"); element.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, buttons: 1 })); }, () => { log("Adım 3: mouseup"); element.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, buttons: 1 })); }, () => { log("Adım 4: click (MouseEvent)"); element.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, buttons: 1 })); }, () => { log("Adım 5: .click() metodu"); if (typeof element.click === 'function') element.click(); }, () => { log("Tıklama sekansı tamamlandı."); } ]; let delay = 200; // Başlangıç gecikmesi for (const action of clickSequence) { setTimeout(action, delay); delay += 150; // Her adım arası gecikme } } // Devam Et / İzin Ver butonunu bulup tıklayan fonksiyon function findAndClickContinueButton() { if (clickAttemptedOnPermissionScreen) { // Bu ekranda zaten tıklama denendi, tekrar deneme. return; } const targetTexts = ['continue', 'allow', 'ok', 'tamam', 'devam et', 'izin ver', 'onayla', 'ileri']; const targetButtonClass = 'VfPpkd-RLmnJb'; // Google'ın standart buton class'ı log(`"${targetButtonClass}" class'ına sahip butonlar aranıyor...`); const candidateButtons = Array.from(document.querySelectorAll(`button.${targetButtonClass}`)); if (candidateButtons.length === 0) { log("Potansiyel buton bulunamadı."); return; } let buttonToClick = null; for (const button of candidateButtons) { const textContent = (button.textContent || "").trim().toLowerCase(); if (targetTexts.some(target => textContent.includes(target))) { const style = getComputedStyle(button); if (!button.disabled && style.visibility !== 'hidden' && style.display !== 'none') { log(`Uygun buton bulundu: "${textContent}"`); buttonToClick = button; break; } } } if (buttonToClick) { log("Tıklanacak final buton seçildi. Tıklama işlemi başlatılıyor."); clickAttemptedOnPermissionScreen = true; // Tekrar denenmesini engelle robustClick(buttonToClick); // Tıklama yapıldığı için gözlemciyi durdurabiliriz. if (pageObserver) { setTimeout(() => { log("İşlem tamamlandı, gözlemci durduruluyor."); pageObserver.disconnect(); }, 2000); // Tıklamanın etkisini göstermesi için 2 sn bekle } } else { log("Hedef metinleri içeren, tıklanabilir bir buton bulunamadı."); } } // Ek: <span jsname="V67aGc" class="VfPpkd-vQzf8d">Continue</span> butonunu da tıklayan fonksiyon function findAndClickSpanContinueButton() { if (clickAttemptedOnPermissionScreen) { return; } // Sadece ilgili span'ı seç const spanBtn = document.querySelector('span[jsname="V67aGc"].VfPpkd-vQzf8d'); if (spanBtn) { log("Span Continue butonu bulundu, tıklanıyor..."); clickAttemptedOnPermissionScreen = true; robustClick(spanBtn); if (pageObserver) { setTimeout(() => { log("Span buton için işlem tamamlandı, gözlemci durduruluyor."); pageObserver.disconnect(); }, 2000); } } else { log("Span Continue butonu bulunamadı."); } } // Ana mantık: URL'yi kontrol et ve doğru eylemi yap function mainLogic() { const currentUrl = window.location.href; if (OAUTH_URL_REGEX.test(currentUrl)) { // 2. AŞAMA: İzin/Onay Ekranındayız log("OAuth izin ekranı tespit edildi. Buton aranacak."); findAndClickContinueButton(); findAndClickSpanContinueButton(); // <span> Continue butonunu da dene } else { // 1. AŞAMA: Hesap Seçim Ekranı veya başka bir sayfa log("Hesap seçim ekranı veya alakasız bir sayfa. Bekleniyor."); // Bir sonraki olası OAuth ekranı için durumu sıfırla clickAttemptedOnPermissionScreen = false; } } // DOM değişikliklerini izle (örn: kullanıcı hesap seçtiğinde sayfa içeriği değişir) const pageObserver = new MutationObserver((mutations, observer) => { log("DOM değişikliği tespit edildi, durum yeniden kontrol ediliyor..."); mainLogic(); }); // Ana script başlangıcı function start() { log("Script başlatıldı. İlk kontrol yapılıyor."); mainLogic(); // İlk yükleme anında kontrol // Gözlemciyi başlat pageObserver.observe(document.body, { childList: true, subtree: true }); // Gözlemcinin kaçırma ihtimaline karşı zamanlayıcılar setTimeout(mainLogic, 2000); setTimeout(mainLogic, 4000); } // Sayfa tamamen yüklendiğinde veya interaktif olduğunda başla if (document.readyState === 'complete' || document.readyState === 'interactive') { start(); } else { document.addEventListener('DOMContentLoaded', start); } })();