//
// The script fill the captcha of recaptcha v2 demo.
//
// Note for users with firefox with the message "Firefox prevented this page from automatically reloading.":
// UNCHECK the option "warn me when pages try to redirect" in your browser
// You find the checkbox under Options > Advanced > General > Accessibility
//
// Please set your browser language to english! (EN)
//
// Loops
var max_loop = 1;
// Url
var myurl = "URL GOTO=https://www.google.com/recaptcha/api2/demo\n";
myurl += "";//extra lines
// Submit
mysubmit = "TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:NoFormName ATTR=*\n";
mysubmit += "";//extra lines
// Debug
var breakOnError = false;
var onBreakAlert = true;
var logFile = true;
var logFileName = 'iimLog.txt';
var max_loop_limit = 500;
//Main
var logFilePath = getiMacrosFolder('Logs')+'\\'+logFileName;
//Performance for recaptchav2
var start_frame_number = 0;
var max_frame_number = 40;
//JQuery
var url_jquery = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js";
// Step 1: Config for 9kw.eu for your apikey
var apikey = "";
//And priority (prio 1-20)
var prio = "1";
(function() {
\t // Syntaxcheck: API Key, prio
\t if(apikey.match(/^[a-zA-Z0-9]+$/) && apikey.length <= 50 && apikey.length >= 5){}else{alert_message("API Key \""+apikey+"\" is wrong.");return false;}
\t var d = parseFloat(prio); if(d >= 0 && d <= 20){}else{alert_message("Prio \""+prio+"\" is not in the set range.");return false;}
\t // only valid number
\t if (/[^\d]/.test(max_loop)) {
\t \t alert_message('Please enter a valid number for loop play');
\t \t return false;
\t }
\t
\t max_loop = parseInt(max_loop);
\t if(max_loop > max_loop_limit){
\t \t alert_message('Loop limit exceed (' + max_loop_limit + ') , edit the following variable to use your own limit.\n\nvar max_loop_limit = ' + max_loop_limit + ';');
\t \t return false;
\t } \t
\t
\t for(var loop = 1; loop <= max_loop; loop++){
\t \t var function_code = "";
\t \t function_code = recaptchav2();
\t \t if(function_code == false && breakOnError == true){
\t \t \t return false;
\t \t }
\t }
})();
//End
// functions
// recaptcha v2
function recaptchav2(){
\t //header
\t var imacros_header = "SET !EXTRACT_TEST_POPUP NO\n";
\t imacros_header += "SET !ERRORIGNORE NO\n";
\t imacros_header += "SET !TIMEOUT_PAGE 999\n";
\t imacros_header += "SET !TIMEOUT_STEP 999\n";
\t
\t var imacros_first = "CODE:"+imacros_header+"TAB CLOSEALLOTHERS\n";
\t imacros_first += "TAB T=1\n";
\t imacros_first += myurl;
\t iimPlay(imacros_first)
\t
\t // JQuery after url goto! (really important)
\t loadScriptFromURL(url_jquery);
\t $ = window.$,
\t JQuery = window.JQuery;
\t
\t // start execution
\t var start = new Date(), end; // for benchmarking
\t
\t // Step 2: Save the captcha picture to local disk
\t // initial click macro
\t
\t $('iframe[src*="anchor"]').contents().find('.recaptcha-checkbox-checkmark').click();
\t
\t //Wait a random number of seconds
\t wait(Math.floor(Math.random()*3 + 2));
\t var checkOK;
\t var more_correct_solutions;
\t var captchaid;
\t var numbers_rc2;
\t for(var i3=1;i3<=5;i3++){
\t \t captchaid = "";
\t \t // macro for checking captcha checkbox
\t \t if($('iframe').contents().find('html').find("#recaptcha-anchor").hasClass("recaptcha-checkbox-checked") == true){
\t \t \t end =+ new Date();
\t \t \t if(logFile){
\t \t \t \t log_message('Captcha is solved\n\rTime spent: '+Math.floor((end-start)/1000));
\t \t \t }
\t \t \t //break;
\t \t }else{
\t \t \t if(i3 > 1){
\t \t \t \t //more_correct_solutions = SearchOK("TAG POS=2 TYPE=DIV ATTR=TXT:Multiple<SP>correct<SP>solutions<SP>required<SP>-<SP>please*&&STYLE: CONTENT=EVENT:MOUSEOVER",0+other_frame_number);
\t \t \t \t if(more_correct_solutions < 1){
\t \t \t \t \t if($('iframe').contents().find('html').find("#recaptcha-anchor").hasClass("recaptcha-checkbox-checked") != true){
\t \t \t \t \t \t iimPlay(imacros_first)
\t \t \t \t \t \t wait(3)
\t \t \t \t \t \t $('iframe[src*="anchor"]').contents().find('.recaptcha-checkbox-checkmark').click();
\t \t \t \t \t \t loadScriptFromURL(url_jquery);
\t \t \t \t \t \t $ = window.$,
\t \t \t \t \t \t JQuery = window.JQuery;
\t \t \t \t \t }
\t \t \t \t }
\t \t \t }
\t \t \t numbers_rc2 = $('iframe').contents().find('html').find(".rc-image-tile-wrapper");
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t for(var i=0; i<numbers_rc2.length; i++){
\t \t \t \t \t var i_high = i + 1;
\t \t \t \t \t if(numbers_rc2.length > 10 && i < 9){
\t \t \t \t \t \t $('iframe').contents().find('html').find(".rc-image-tile-wrapper").eq(i).append("<span style='position: absolute;width: 18px;left: 0px;top: 0px;border: 1px red black;color:rgb(0, 0, 0);background: rgba(255, 255, 255, 0.9);font: bold 18px Helvetica, Sans-Serif;padding: 0px 0px 0px 6px;'>0"+i_high+"</span>");
\t \t \t \t \t }else{
\t \t \t \t \t \t $('iframe').contents().find('html').find(".rc-image-tile-wrapper").eq(i).append("<span style='position: absolute;width: 18px;left: 0px;top: 0px;border: 1px red black;color:rgb(0, 0, 0);background: rgba(255, 255, 255, 0.9);font: bold 18px Helvetica, Sans-Serif;padding: 0px 0px 0px 6px;'>"+i_high+"</span>");
\t \t \t \t \t }
\t \t \t \t }
\t \t \t \t var recaptcha_v2_error = false;
\t \t \t \t
\t \t \t \t var text_title;
\t \t \t \t $('iframe').contents().find('html').find(".rc-imageselect-desc-no-canonical").html($('iframe').contents().find('html').find(".rc-imageselect-desc-no-canonical").html()+"<br><span style='border: 1px red solid;color: rgba(255, 255, 255, 0.9);background: rgba(0, 0, 0, 0.8);font: bold 18px Helvetica, Sans-Serif;padding: 0px 0px 0px 8px;'>Type the image numbers <br> without spaces, e.g: 358 </span>");
\t \t \t \t $('iframe').contents().find('html').find(".rc-imageselect-desc").html($('iframe').contents().find('html').find(".rc-imageselect-desc").html()+"<br><span style='border: 1px red solid;color: rgba(255, 255, 255, 0.9);background: rgba(0, 0, 0, 0.8);font: bold 18px Helvetica, Sans-Serif;padding: 0px 0px 0px 8px;'>Type the image numbers <br> without spaces, e.g: 358 </span>");
\t \t \t }
\t \t \t var root = window.document.documentElement;
\t \t \t var canvas = window.document.createElementNS('http://www.w3.org/1999/xhtml', 'html:canvas');
\t \t \t var context = canvas.getContext('2d');
\t \t \t
\t \t \t var selection;
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t $('div:nth-of-type(2)').css({ transform: 'scale(.70)' }); \t \t \t
\t \t \t \t selection = {
\t \t \t \t \t top: $('div:nth-of-type(2)').offset().top,
\t \t \t \t \t left: $('div:nth-of-type(2)').offset().left,
\t \t \t \t \t width: $('div:nth-of-type(2)').width()*0.70,
\t \t \t \t \t height: (($('div:nth-of-type(2)').height() - $('iframe').contents().find('html').find(".rc-footer").height())*0.70),
\t \t \t \t };
\t \t \t }else{
\t \t \t \t selection = {
\t \t \t \t \t top: $('div:nth-of-type(2)').offset().top,
\t \t \t \t \t left: $('div:nth-of-type(2)').offset().left,
\t \t \t \t \t width: $('div:nth-of-type(2)').width(),
\t \t \t \t \t height: ($('div:nth-of-type(2)').height() - $('iframe').contents().find('html').find(".rc-footer").height()),
\t \t \t \t };
\t \t \t }
\t \t \t
\t \t \t canvas.height = selection.height;
\t \t \t canvas.width = selection.width;
\t \t \t
\t \t \t context.drawWindow(
\t \t \t \t window,
\t \t \t \t selection.left,
\t \t \t \t selection.top,
\t \t \t \t selection.width,
\t \t \t \t selection.height,
\t \t \t \t 'rgb(255, 255, 255)'
\t \t \t);
\t \t \t //Step 3: Open a new tab, and go to 9kw.eu, and submit the captcha picture
\t \t \t var imacros_main2 = "CODE:"+imacros_header;
\t \t \t imacros_main2 += "TAB OPEN\n";
\t \t \t imacros_main2 += "TAB T=2\n";
\t \t \t imacros_main2 += "URL GOTO=http://www.9kw.eu/grafik/form_base64.html\n";
\t \t \t //The apikey is used to identify each of our customers, which you can get from the our page. It is assigned to the CONTENT.
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:apikey CONTENT="+apikey+"\n";
\t \t \t //Priority in our system like min. 0 to max. 20 (cost +0-20)
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:prio CONTENT="+prio+"\n";
\t \t \t //Options for the form. See more under http://www.9kw.eu/grafik/form.html and http://www.9kw.eu/api.html
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/index.cgi ATTR=NAME:selfsolve CONTENT=NO\n";
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/index.cgi ATTR=NAME:confirm CONTENT=NO\n";
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/index.cgi ATTR=NAME:case-sensitive CONTENT=NO\n";
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/index.cgi ATTR=NAME:nomd5 CONTENT=YES\n";
\t \t \t //We need only numbers for this captcha
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/index.cgi ATTR=NAME:numeric CONTENT=YES\n";
\t \t \t }
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:source CONTENT=imacros\n";
\t \t \t // recaptcha v2 for non text captcha or recaptcha for text captcha
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:oldsource CONTENT=recaptchav2\n";
\t \t \t }else{
\t \t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:oldsource CONTENT=recaptcha\n";
\t \t \t }
\t \t \t //The path of the captcha picture saved is assigned to the CONTENT
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:file-upload-01 CONTENT="+canvas.toDataURL('image/png', '').split(',')[1]+"\n";
\t \t \t //Submit the formdata to 9kw.eu
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=TYPE:submit\n";
\t \t \t //Clean the !EXTRACT variable for the next task
\t \t \t imacros_main2 += "SET !EXTRACT NULL\n";
\t \t \t //Extract the characters that are recoginzed from the picture of captcha.
\t \t \t imacros_main2 += "TAG POS=1 TYPE=INPUT ATTR=NAME:result EXTRACT=TXT\n";
\t \t \t iimPlay(imacros_main2)
\t \t \t var answer = iimGetLastExtract();
\t \t \t //Step 4: Check the captcha answer (text or nothing like #EANF# = Extraction Anchor Not Found)
\t \t \t if(answer == "#EANF#" || answer == "ERROR NO USER"){
\t \t \t \t answer = "";
\t \t \t }
\t \t \t
\t \t \t //Extract the captchaid from your captcha submit
\t \t \t var imacros_main3 = "CODE:";
\t \t \t imacros_main3 += "SET !EXTRACT NULL\n";
\t \t \t imacros_main3 += "TAG POS=1 TYPE=INPUT ATTR=NAME:captchaid EXTRACT=TXT\n";
\t \t \t imacros_main3 += "SET captchaid {{!EXTRACT}}\n";
\t \t \t imacros_main3 += "TAB CLOSE\n";
\t \t \t iimPlay(imacros_main3)
\t \t \t captchaid = iimGetLastExtract();
\t \t \t
\t \t \t //Clean the !EXTRACT variable for the next task
\t \t \t var imacros_main4 = "SET !EXTRACT NULL\n";
\t \t \t iimPlay(imacros_main4)
\t \t \t
\t \t \t //Display extracted data (only for debug)
\t \t \t //iimDisplay("captchaid: "+captchaid+"\nanswer: "+answer)
\t \t \t
\t \t \t //Step 5: Fill the recognized characters to the verification box (Click the pictures 1..16)
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t $('div:nth-of-type(2)').css({ transform: 'scale(1.0)' });
\t \t \t \t
\t \t \t \t var myarray = answer.split('');
\t \t \t \t if(myarray.length < 2){
\t \t \t \t \t alert_message("No answer found. Check the history on 9kw.eu!");
\t \t \t \t \t if(breakOnError){
\t \t \t \t \t \t return false;
\t \t \t \t \t }else{
\t \t \t \t \t \t break;
\t \t \t \t \t }
\t \t \t \t }else{
\t \t \t \t \t for(var i = 0;i < myarray.length; i++){
\t \t \t \t \t \t if(myarray[i].match(/^[0-9]+$/)){
\t \t \t \t \t \t \t if(numbers_rc2.length > 10){
\t \t \t \t \t \t \t \t var two_values;
\t \t \t \t \t \t \t \t if(myarray[i+1].match(/^[0-9]+$/)){
\t \t \t \t \t \t \t \t \t two_values = myarray[i]+myarray[i+1];
\t \t \t \t \t \t \t \t }else{
\t \t \t \t \t \t \t \t \t two_values = myarray[i];
\t \t \t \t \t \t \t \t }
\t \t \t \t \t \t \t \t i += 1;
\t \t \t \t \t \t \t \t two_values = two_values.replace("0", "");
\t \t \t \t \t \t \t \t two_values = parseFloat(two_values) - 1;
\t \t \t \t \t \t \t \t if(two_values == ""){
\t \t \t \t \t \t \t \t \t two_values = 0;
\t \t \t \t \t \t \t \t }
\t \t \t \t \t \t \t \t $('iframe').contents().find('html').find(".rc-image-tile-wrapper").eq(two_values).click();
\t \t \t \t \t \t \t }else{
\t \t \t \t \t \t \t \t myarray[i] = parseFloat(myarray[i]) - 1;
\t \t \t \t \t \t \t \t if(myarray[i] == ""){
\t \t \t \t \t \t \t \t \t myarray[i] = 0;
\t \t \t \t \t \t \t \t }
\t \t \t \t \t \t \t \t $('iframe').contents().find('html').find(".rc-image-tile-wrapper").eq(myarray[i]).click();
\t \t \t \t \t \t \t }
\t \t \t \t \t \t }
\t \t \t \t \t }
\t \t \t \t }
\t \t \t }else{//text captcha
\t \t \t \t SearchFrame("TAG POS=1 TYPE=INPUT:TEXT ATTR=ID:default-response CONTENT="+answer,start_frame_number);
\t \t \t }
\t \t \t \t
\t \t \t //Click the Verify button
\t \t \t if(numbers_rc2.length > 1){
\t \t \t \t SearchFrame("EVENT TYPE=CLICK SELECTOR=\"HTML>BODY>DIV>DIV>DIV:nth-of-type(3)>DIV:nth-of-type(2)>DIV>DIV:nth-of-type(2)>DIV\" BUTTON=0",start_frame_number);
\t \t \t }else{
\t \t \t \t SearchFrame("TAG POS=1 TYPE=DIV ATTR=ID:recaptcha-verify-button",start_frame_number);
\t \t \t }
\t \t }
\t \t wait(1)
\t \t \t
\t \t // Submit
\t \t var solved_OK;
\t \t if($('iframe').contents().find('html').find("#recaptcha-anchor").hasClass("recaptcha-checkbox-checked") == true){
\t \t \t if($('iframe').contents().find('html').find("#recaptcha-anchor").hasClass("recaptcha-checkbox-checked") == true){
\t \t \t \t solved_OK = 1;
\t \t \t }
\t \t \t SearchFrame(mysubmit,start_frame_number);
\t \t \t loadScriptFromURL(url_jquery);
\t \t \t $ = window.$,
\t \t \t JQuery = window.JQuery;
\t \t }else{
\t \t \t solved_OK = 0;
\t \t \t if($('iframe').contents().find('html').find('.rc-imageselect-incorrect-response').css('display') == 'block'){
\t \t \t \t more_correct_solutions = 1;
\t \t \t }else{
\t \t \t \t more_correct_solutions = "";
\t \t \t }
\t \t }
\t \t \t
\t \t //Step 6: Check and send the captcha feedback back to the captcha service (OK:1, NotOK:2, EN: Right/False, DE: Richtig/Falsch)
\t \t var htmlcode = "";
\t \t if(captchaid.length > 0){
\t \t \t if($('iframe').contents().find('html').find("#recaptcha-anchor").hasClass("recaptcha-checkbox-checked") == true){
\t \t \t \t var imacros_main4b = "CODE:TAG POS=1 TYPE=DIV ATTR=CLASS:recaptcha-success EXTRACT=TXT\n";
\t \t \t \t iimPlay(imacros_main4b)
\t \t \t \t htmlcode = iimGetLastExtract();
\t \t \t }
\t \t }
\t \t \t \t \t \t
\t \t var feedback;
\t \t if(htmlcode.match(/Juhu/) || htmlcode.match(/Hooray/) || more_correct_solutions < 1 || solved_OK == 1){
\t \t \t feedback = 1;
\t \t }else{
\t \t \t feedback = 2;
\t \t }
\t \t \t
\t \t if(captchaid.length > 0){
\t \t \t var imacros_main5 = "CODE:TAB OPEN\n";
\t \t \t imacros_main5 += "TAB T=2\n";
\t \t \t imacros_main5 += "URL GOTO=http://www.9kw.eu/index.cgi?source=imacros&action=usercaptchacorrectback&apikey="+apikey+"&correct="+feedback+"&id="+captchaid+"\n";
\t \t \t imacros_main5 += "TAB CLOSE\n";
\t \t \t iimPlay(imacros_main5)
\t \t }
\t \t if(feedback == "1"){
\t \t \t break;
\t \t }
\t }
\t return;
}
// random between 1 and 9
function rand(){
\t return Math.floor(Math.random()*9) + 1;
}
// wait function like wait(2) for two seconds
function wait(waittime){
\t iimPlay("CODE: WAIT SECONDS="+waittime+"\n");
\t return;
}
// wait function like wait(2) for two seconds
function getextract(shortcode){
\t iimPlay("CODE: "+shortcode);
\t return iimGetLastExtract();
}
// date functione
function tempfile_date() {
\t now = new Date();
\t year = "" + now.getFullYear();
\t month = "" + (now.getMonth() + 1); if (month.length == 1) { month = "0" + month; }
\t day = "" + now.getDate(); if (day.length == 1) { day = "0" + day; }
\t hour = "" + now.getHours(); if (hour.length == 1) { hour = "0" + hour; }
\t minute = "" + now.getMinutes(); if (minute.length == 1) { minute = "0" + minute; }
\t second = "" + now.getSeconds(); if (second.length == 1) { second = "0" + second; }
\t return year + month + day + "_" + hour + minute + second;
}
// find frame with true or false as return
function SearchOK(checkcode,firstframenumber,lastframenumber){
\t var check = "CODE:";
\t check += "SET !ERRORIGNORE YES" + "\n";
\t check += "SET !TIMEOUT_STEP 0" + "\n";
\t check += "FRAME F={{i}}" + "\n";
\t check += "SET !ERRORIGNORE NO" + "\n";
\t \t \t
\t if (checkcode != ""){
\t \t check += checkcode + "\n";
\t }else{
\t \t return 0;
\t }
\t \t
\t if(/^\d+$/.test(firstframenumber)) {
\t \t frame = firstframenumber;
\t }else{
\t \t frame = 1;
\t }
\t
\t if(/^\d+$/.test(lastframenumber)) {
\t \t frame2 = lastframenumber;
\t }else{
\t \t frame2 = total_frame_number;
\t }
\t for(var i=frame;i<=frame2;i++){
\t \t iimSet("i",i)
\t \t if(iimPlay(check) == true){
\t \t \t return 1;
\t \t }
\t }
\t return 0;
}
// find frame with the framenumber as return
function SearchFrame(checkcode,firstframenumber){
\t var check = "CODE:";
\t check += "SET !ERRORIGNORE YES" + "\n";
\t check += "SET !TIMEOUT_STEP 0" + "\n";
\t check += "FRAME F={{i}}" + "\n";
\t check += "SET !ERRORIGNORE NO" + "\n";
\t \t \t
\t if (checkcode != ""){
\t \t check += checkcode + "\n";
\t }else{
\t \t return 0;
\t }
\t \t
\t if(/^\d+$/.test(firstframenumber)) {
\t \t frame = firstframenumber;
\t }else{
\t \t frame = 1;
\t }
\t for(var i=frame;i<=max_frame_number;i++){
\t \t iimSet("i",i)
\t \t //if the result of the macro is true save frame number and break
\t \t if(iimPlay(check) == true){
\t \t \t frame = i;
\t \t \t break;
\t \t }
\t }
\t //return frame number
\t return frame;
}
// Get the imacros folder
function getiMacrosFolder(folderName){
var pname;
switch (folderName){
case "Macros" :
pname = "defsavepath";
break;
case "DataSources" :
pname = "defdatapath";
break;
case "Downloads" :
pname = "defdownpath";
break;
case "Logs" :
pname = "deflogpath";
break;
default :
throw folderName + " is not a valid iMacros folder name";
break;
}
return imns.Pref.getFilePref(pname).path;
}
// Logfunction
function log_message(msg) {
\t var time = new Date().toString().replace(/\s+GMT.*/, '');
\t msg = time + ' - ' + msg + '\n';
\t var file_o = imns.FIO.openNode(logFilePath);
\t imns.FIO.appendTextFile(file_o, msg);
}
// Logfunction
function alert_message(msg){
\t if(logFile){
\t \t log_message(msg);
\t }
\t iimDisplay(msg);
\t if(onBreakAlert){
\t \t alert(msg);
\t }
}
// jquery
function loadScriptFromURL(url) {
\t var request = Components.classes['@mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Components.interfaces.nsIXMLHttpRequest),
\t async = false;
\t request.open('GET', url, async);
\t request.send();
\t if(request.status !== 200){
\t \t var message = 'an error occurred while loading script at url: ' + url + ', status: ' + request.status;
\t \t iimDisplay(message);
\t \t return false;
\t }
\t eval(request.response);
\t return true;
}
Я имею в виду, конечно, конечно, это возможно, но почему вы хотели бы сделать это в любом случае? –
Я могу сэкономить столько времени, когда он работает при создании ссылок bit.ly. Я нашел способ работать с iMacro, но цитата плохая 3 из ~ 80 работ (этот сервис captcha чрезвычайно сложный.). Я все еще оптимизирую его, тогда я выложу окончательный код здесь. –
Ох, я вижу сейчас. –