· 4 years ago · Jun 10, 2021, 01:36 AM
1// ==UserScript==
2// @name Hcaptcha Solver (Automatically solves Hcaptcha in browser)
3// @namespace Hcaptcha Solver
4// @version 2.0
5// @description Hcaptcha Solver in Browser | Automatically solves Hcaptcha in browser
6// @author Md ubeadulla
7// @match *://*.hcaptcha.com/*
8// @grant GM_xmlhttpRequest
9// @connect www.imageidentify.com
10
11/*
12██╗░░██╗░█████╗░░█████╗░██████╗░████████╗░█████╗░██╗░░██╗░█████╗░ ░██████╗░█████╗░██╗░░░░░██╗░░░██╗███████╗██████╗░
13██║░░██║██╔══██╗██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██║░░██║██╔══██╗ ██╔════╝██╔══██╗██║░░░░░██║░░░██║██╔════╝██╔══██╗
14███████║██║░░╚═╝███████║██████╔╝░░░██║░░░██║░░╚═╝███████║███████║ ╚█████╗░██║░░██║██║░░░░░╚██╗░██╔╝█████╗░░██████╔╝
15██╔══██║██║░░██╗██╔══██║██╔═══╝░░░░██║░░░██║░░██╗██╔══██║██╔══██║ ░╚═══██╗██║░░██║██║░░░░░░╚████╔╝░██╔══╝░░██╔══██╗
16██║░░██║╚█████╔╝██║░░██║██║░░░░░░░░██║░░░╚█████╔╝██║░░██║██║░░██║ ██████╔╝╚█████╔╝███████╗░░╚██╔╝░░███████╗██║░░██║
17╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝╚═╝░░░░░░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝╚═╝░░╚═╝ ╚═════╝░░╚════╝░╚══════╝░░░╚═╝░░░╚══════╝╚═╝░░╚═╝
18*/
19/** Note: This script is solely intended for the use of educational purposes only and not to abuse any website.
20*
21* Sign Up using the referral links or consider a donation to the following addresses:
22***************************************************************************************************
23* Faucets: *
24* Sign up using the referral link and solve captchas to earn crypto (Do not abuse the websites) *
25* 1.) https://get-bitcoin.net/?ref=9230 *
26* 2.) https://getdoge.io/?ref=34017 *
27* 3.) https://actumcrypto.org/faucet/?r=DPtBQG9GNTYHUFkjB2zYWYah4nCCogVAt9 *
28* 4.) https://cryptowin.io/ref/ubeadulla *
29* 5.) https://winalittle.fun/referral/02c7061877cec89e81a306303d36b77c *
30* 6.) https://faucetofbob.xyz/?ref=2121 *
31* 7.) https://free-litecoin.com/login?referer=1035367 *
32* 8.) https://free-ethereum.io/?referer=742436 *
33* 9.) https://litking.biz/signup?r=125431 *
34* 10.) https://bitking.biz/signup?r=75339 *
35***************************************************************************************************
36* MicroWallets: *
37* 1.) FaucetPay: BTC: 1HeD2a11n8d9zBTaznNWfVxtw1dKuW2vT5 *
38* LTC: MHpCuD3zAFEkeuhbgLbuZKcfdqMFkaLSem *
39* BCH: bitcoincash:qp7ywra8h7lwatcuc7u65lv8x6rv5kn4sutrsnzrpx *
40* TRX: TLs3iQfXJs1rmUuG6pkLkUwcu32mFUwzgu *
41* Doge: DPtBQG9GNTYHUFkjB2zYWYah4nCCogVAt9 *
42* 2.) ExpressCrypto: *
43* BTC Wallet: 3DftzBztFkDVP3rSSzD9YJ9FKieGfbAotw *
44* Doge Wallet: D78xByqXqW6vCt8btam5T83Ejkw8MBs7nB *
45* LTC Wallet: MNw2cMXHxPfWzeodngfxWjurwqjKvVECfS *
46* 3.) Direct BTC: 35HbfGfvbdctzY6tT4jcHXRx4zonBTnDuC *
47***************************************************************************************************
48* Cloud Mining Websites Just SignUp and earn passive income * *
49* 1.) https://tronrex.online/r/86733 *
50* 2.) https://tronhub.club/r/63438 *
51***************************************************************************************************
52*/
53
54// TODO: Refractor Code and arrange the functions in order
55
56
57// ==/UserScript==
58
59(function() {
60
61 'use strict';
62
63 var selectedImageCount =0;
64
65 //Node Selectors
66 const CHECK_BOX = "#checkbox";
67 const SUBMIT_BUTTON = ".button-submit";
68 const TASK_IMAGE_BORDER = ".task-image .border";
69 const IMAGE = ".task-image .image";
70 const TASK_IMAGE = ".task-image";
71 const PROMPT_TEXT = ".prompt-text";
72 const ARIA_CHECKED = "aria-checked";
73
74 String.prototype.includesOneOf = function(arrayOfStrings) {
75
76 //If this is not an Array, compare it as a String
77 if(!Array.isArray(arrayOfStrings)) {
78 return this.includes(arrayOfStrings.toLowerCase());
79 }
80
81 for(var i = 0; i < arrayOfStrings.length; i++) {
82 if(arrayOfStrings[i].substr(0,1) == "=" && this == arrayOfStrings[i].substr(1)) {
83 return true;
84 }else if(this.includes(arrayOfStrings[i].toLowerCase())){
85 return true;
86 }else{
87
88 }
89 }
90 return false;
91 }
92
93
94 // This script uses imageidentify API (wolfram) . You may also use TensorFlow.js, Yolo latest version to recognize common objects.(When the cloud service is available for yolo, we can switch the API endpoint). Accuracy varies between Wolfram, Tensorflow and Yolo.
95 // Use this as a reference to solve recaptcha/other captchas using scripts in browser. This is intended for learning purposes.
96
97 function matchImages(imageUrl,word,i) {
98
99 GM_xmlhttpRequest ( {
100 method: "POST",
101 //method: "GET"
102 url: "https://www.imageidentify.com/objects/user-26a7681f-4b48-4f71-8f9f-93030898d70d/prd/urlapi/",
103 //url: "https://vision.imadelhanafi.com/predict/v1?model=yolo",
104 headers: {
105 "Content-Type": "application/x-www-form-urlencoded"
106 },
107 data: "image=" + encodeURIComponent(imageUrl),
108 onload: function(response){clickImages(response,imageUrl,word,i)},
109 onerror: function(e){
110 console.log(e);
111 },
112 } );
113
114 }
115
116 function clickImages(response,imageUrl,word,i){
117
118 word = getSynonyms(word);
119
120 if(response && response.responseText){
121 var responseJson = JSON.parse(response.responseText);
122 if(responseJson.identify && responseJson.identify.title && responseJson.identify.title.toLowerCase().includesOneOf(word) && qSelectorAll(TASK_IMAGE_BORDER)[i].style.opacity==0){
123 qSelectorAll(TASK_IMAGE)[i].click();
124 }else if(responseJson.identify && responseJson.identify.alternatives){
125 var alternatives = JSON.stringify(responseJson.identify.alternatives);
126 var alternativesJson = JSON.parse(alternatives);
127
128 for (var key in alternativesJson) {
129 if (alternativesJson.hasOwnProperty(key)) {
130 if(key.toLowerCase().includesOneOf(word) && qSelectorAll(TASK_IMAGE_BORDER)[i].style.opacity==0){
131 qSelectorAll(TASK_IMAGE)[i].click();
132 break;
133 }
134 if(alternativesJson[key].toLowerCase().includesOneOf(word) && qSelectorAll(TASK_IMAGE_BORDER)[i].style.opacity==0){
135 qSelectorAll(TASK_IMAGE)[i].click();
136 break;
137 }
138 }
139 }
140 }else{
141 //No Match found
142 }
143 selectedImageCount = selectedImageCount +1;
144 }
145 }
146
147 function qSelectorAll(selector){
148 return document.querySelectorAll(selector);
149 }
150
151 function qSelector(selector){
152 return document.querySelector(selector);
153 }
154
155
156 function getSynonyms(word){
157
158 //TODO: Format this to JSON string
159 if(word=="motorbus"){
160 word = ['bus','motorbus'];
161 }
162
163 if(word=="car"){
164 word = ['car','coupe','limo'];
165 }
166
167 if(word=="airplane"){
168 word = ['airplane','plane','aircraft','aeroplane']
169 }
170
171 if(word =="train"){
172 word = ['train','rail','cable car']
173 }
174
175 if(word == "boat"){
176 word = ['boat','ship','cruise','watercraft','vessel','ark','row','yacht','barge','sailboat','sail boat','motorboat','motor boat','canoe','katamaran','kayak','ferry','sail boat','sail','water']
177 }
178
179 if(word == "bike"){
180 word = ['bike','bicycle','motorbike','cycle','scooter','motor bike','pushbike','two-wheeler','pedal cycle','motorcycle','wheel']
181 }
182
183 return word
184
185 }
186
187 var checkboxInterval = setInterval(function(){
188 if(!qSelector(CHECK_BOX)){
189 clearInterval(checkboxInterval);
190 }
191
192 if(qSelector(CHECK_BOX) && qSelector(CHECK_BOX).getAttribute(ARIA_CHECKED) == "true"){
193 clearInterval(checkboxInterval);
194 }
195
196 if(qSelector(CHECK_BOX) && qSelector(CHECK_BOX).getAttribute(ARIA_CHECKED) == "false"){
197 qSelector(CHECK_BOX).click();
198 }
199
200 },5000);
201
202 function selectImagesAfterDelay(delay){
203 setTimeout(function(){
204 selectImages();
205 },delay*1000);
206 }
207
208
209 function triggerEvent(el, type){
210 var e = document.createEvent('HTMLEvents');
211 e.initEvent(type, false, true);
212 el.dispatchEvent(e);
213 }
214
215
216 // Small hack to select the nodes
217 function unsure(targetNodeText){
218 var waitForUnsureInterval = setInterval(function(){
219 var targetNode = Array.from(qSelectorAll('div'))
220 .find(el => el.textContent === targetNodeText);
221 //Works for now
222 //TODO: Select clothing
223 //TODO: Draw boxes around images
224 if(targetNode){
225 triggerEvent(targetNode, 'mousedown');
226 triggerEvent(targetNode, 'mouseup');
227 if(qSelector(SUBMIT_BUTTON)){
228 qSelector(SUBMIT_BUTTON).click();
229 }
230 }
231 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
232 clearInterval(waitForUnsureInterval);
233 return selectImages();
234 }
235
236 },3000);
237 }
238
239
240 function getImageList(){
241 var imageList = [];
242 for(var i=0;i<9;i++){
243 var urlString =qSelectorAll(IMAGE)[i].style.background;
244 var urlMatch = urlString.match(/(?<=\(\").+?(?=\"\))/g);
245 var imageUrl = urlMatch[0];
246 imageList[i] = imageUrl;
247 }
248 return imageList;
249
250 }
251
252 function waitUntilImageSelection(){
253 var imageIntervalCount = 0;
254 var imageInterval = setInterval(function(){
255 imageIntervalCount = imageIntervalCount + 1;
256 if(selectedImageCount == 9){
257 clearInterval(imageInterval);
258 if(qSelector(SUBMIT_BUTTON)){
259 qSelector(SUBMIT_BUTTON).click();
260 }
261 return selectImagesAfterDelay(5);
262 } else if( imageIntervalCount > 8){
263 clearInterval(imageInterval);
264 return selectImages();
265
266 }else{
267
268 }
269 },3000);
270 }
271
272 function waitForImagesToAppear(){
273 var checkImagesSelectedCount = 0;
274 var waitForImagesInterval = setInterval(function(){
275 checkImagesSelectedCount = checkImagesSelectedCount + 1;
276
277 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
278 clearInterval(waitForImagesInterval);
279 return selectImages();
280 }else if(checkImagesSelectedCount > 20 ){
281 clearInterval(waitForImagesInterval);
282 }else {
283 var targetNodeList = ["Photo is clean, no watermarks, logos or text overlays","An interior photo of room","Unsure","Photo is sharp"];
284 for(var j = 0; j < targetNodeList.length; j++) {
285 var targetNode = Array.from(qSelectorAll('div'))
286 .find(el => el.textContent === targetNodeList[j]);
287 if(targetNode){
288 //console.log("Target Node Found");
289 clearInterval(waitForImagesInterval);
290 return unsure(targetNodeList[j]);
291 }
292 }
293
294 }
295
296 },3000);
297
298 }
299
300 function selectImages(){
301 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
302 selectedImageCount =0;
303 try {
304 var word = qSelector(PROMPT_TEXT).innerText;
305 if(word && word.includes("Please click each image")) {
306 word = word.replace('Please click each image containing a ','');
307 word = word.replace('Please click each image containing an ','');
308 } else{
309 //TODO: Select images from example and identify the word for other languages
310
311 }
312 }catch(err) {
313 console.log(err.message);
314 return selectImagesAfterDelay(5);
315 }
316
317 var imageList =[];
318
319 try {
320 imageList = getImageList();
321 }catch(err) {
322 console.log(err.message);
323 return selectImagesAfterDelay(5);
324 }
325
326 for(var i=0;i<9;i++){
327 matchImages(imageList[i],word,i);
328 }
329 waitUntilImageSelection();
330
331 }else{
332 waitForImagesToAppear();
333 }
334 }
335
336 selectImages();
337
338})();