לכל מאן דבעי
מצ"ב הקוד לפענוח הקפצ'ה
להכניס ב tampermonkey
ולהכניס בפנים מפתח API מגוגל סטודיו
עובד מעולה
בהצלחה
// ==UserScript==
// @name Telerik Solver with Gemini Flash
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Solve RadCaptcha using Google Gemini Flash Multimodal API
// @author You
// @match *://*/*
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(function() {
'use strict';
// ==========================================
// הגדרות משתמש
// ==========================================
const GOOGLE_API_KEY = "YOUR_GEMINI_API_KEY_HERE"; // הדבק כאן את המפתח מגוגל
const MODEL_NAME = "gemini-2.5-flash"; //
// ==========================================
function addSolverUI() {
const captchaContainer = document.querySelector('.tkCaptcha_bluediv') || document.querySelector('.RadCaptcha');
if (!captchaContainer || document.getElementById('gemini-solve-btn')) return;
const btn = document.createElement('button');
btn.id = 'gemini-solve-btn';
btn.innerText = '⚡ פתור עם Gemini';
btn.style = 'background: #4285F4; color: white; border: none; padding: 5px 10px; margin: 5px; cursor: pointer; font-weight: bold; border-radius: 4px;';
btn.onclick = async (e) => {
e.preventDefault();
btn.innerText = '⏳ מעבד...';
btn.disabled = true;
await processCaptcha(btn);
};
// הוספת הכפתור ליד שדה הטקסט או בראש הדיב
const targetLocation = document.getElementById('ContentUsersPage_rc1_SpamProtectorPanel') || captchaContainer;
targetLocation.prepend(btn);
}
async function processCaptcha(btn) {
try {
// 1. איתור כתובת האודיו
const audioUrl = await getAudioSource();
if (!audioUrl) {
alert('לא נמצא מקור שמע. נסה לרענן את הקפצ\'ה.');
resetBtn(btn);
return;
}
console.log("Audio URL found:", audioUrl);
// 2. הורדת האודיו (ArrayBuffer)
const audioBase64 = await fetchAudioAsBase64(audioUrl);
// 3. שליחה ל-Gemini
const code = await sendToGemini(audioBase64);
if (code) {
fillInput(code);
btn.innerText = '✅ פוצח: ' + code;
} else {
btn.innerText = '❌ נכשל';
setTimeout(() => resetBtn(btn), 3000);
}
} catch (error) {
console.error("Critical Error:", error);
alert('שגיאה בתהליך: ' + error.message);
resetBtn(btn);
}
}
function resetBtn(btn) {
btn.disabled = false;
btn.innerText = '⚡ פתור עם Gemini';
}
// פונקציה למציאת ה-URL של האודיו מתוך ה-HTML של Telerik
async function getAudioSource() {
// ניסיון 1: תגית Audio קיימת
let audioEl = document.querySelector('div.RadCaptcha audio');
if (audioEl && audioEl.src && audioEl.src.length > 10) {
return audioEl.src;
}
// ניסיון 2: לינק להשמעה (נפוץ ב-Telerik)
const linkObj = document.getElementById('ContentUsersPage_rc1_CaptchaAudioCodeUP');
if (linkObj) {
// לפעמים ה-SRC נוצר רק אחרי לחיצה?
// במקרה של Telerik, ה-href של הלינק הוא לעיתים קרובות javascript:void(0)
// אבל ה-HTML ששלחת מראה שיש תגית audio מוכנה.
// אם היא ריקה, ננסה לדמות לחיצה ולחכות שניה
/*
linkObj.click();
await new Promise(r => setTimeout(r, 1000));
audioEl = document.querySelector('div.RadCaptcha audio');
if (audioEl && audioEl.src) return audioEl.src;
*/
}
// לפי ה-HTML ששלחת, ה-src נמצא בתוך ה-audio ישירות
// אבל הנתיב הוא יחסי (/Emosek/...), לכן צריך להצמיד לדומיין
if (audioEl && audioEl.getAttribute('src')) {
return audioEl.src; // הדפדפן כבר משלים לדומיין מלא בדרך כלל
}
return null;
}
// שימוש ב-GM_xmlhttpRequest לעקיפת CORS והמרה ל-Base64
function fetchAudioAsBase64(url) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "arraybuffer",
onload: function(response) {
if (response.status === 200) {
const base64 = arrayBufferToBase64(response.response);
resolve(base64);
} else {
reject(new Error("Failed to download audio. Status: " + response.status));
}
},
onerror: function(err) {
reject(err);
}
});
});
}
// המרת באפר למחרוזת Base64 נקייה
function arrayBufferToBase64(buffer) {
let binary = '';
const bytes = new Uint8Array(buffer);
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
// התקשורת מול Gemini API
function sendToGemini(base64Audio) {
return new Promise((resolve, reject) => {
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL_NAME}:generateContent?key=${GOOGLE_API_KEY}`;
// הפרומפט - החלק הכי חשוב
// Telerik מקריא אותיות ומספרים. הפרומפט מכוון את המודל לפורמט הזה.
const promptText = `
You are a CAPTCHA solving expert.
Listen to the audio file. It contains a sequence of letters and numbers spoken clearly (sometimes phonetically like "A as in Alpha").
Extract ONLY the characters of the code.
Ignore background noise.
Do not write explanation. Output strictly the alphanumeric code (e.g., "AB3D5").
`;
const payload = {
"contents": [{
"parts": [
{ "text": promptText },
{
"inline_data": {
"mime_type": "audio/wav", // Telerik בד"כ שולח WAV
"data": base64Audio
}
}
]
}]
};
GM_xmlhttpRequest({
method: "POST",
url: apiUrl,
headers: { "Content-Type": "application/json" },
data: JSON.stringify(payload),
onload: function(response) {
if (response.status === 200) {
try {
const data = JSON.parse(response.responseText);
const text = data.candidates[0].content.parts[0].text;
// ניקוי רווחים, ירידות שורה וסימנים מיותרים
const cleanCode = text.trim().replace(/\s/g, '').replace(/\./g, '');
resolve(cleanCode);
} catch (e) {
reject(new Error("Failed to parse Gemini response"));
}
} else {
console.error("Gemini API Error:", response.responseText);
reject(new Error("Gemini API returned error " + response.status));
}
}
});
});
}
function fillInput(code) {
const input = document.getElementById('ContentUsersPage_rc1_CaptchaTextBox');
if (input) {
input.value = code;
// טריגר לאירועים כדי שהאתר יקלוט שהוזן טקסט
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
input.dispatchEvent(new Event('blur', { bubbles: true }));
}
}
// הפעלה ראשונית
setTimeout(addSolverUI, 1500);
})();```