· 4 years ago · Jun 19, 2021, 01:22 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 =="truck"){
176 word = ['pickup','trailer','pickup truck']
177 }
178
179 if(word == "boat"){
180 word = ['boat','ship','cruise','watercraft','vessel','ark','row','yacht','barge','sailboat','sail boat','motorboat','motor boat','canoe','katamaran','kayak','ferry','sail boat','sail','water']
181 }
182
183 if(word == "bike"){
184 word = ['bike','bicycle','motorbike','cycle','scooter','motor bike','pushbike','two-wheeler','pedal cycle','motorcycle','wheel']
185 }
186
187 return word
188
189 }
190
191 var checkboxInterval = setInterval(function(){
192 if(!qSelector(CHECK_BOX)){
193 clearInterval(checkboxInterval);
194 }
195
196 if(qSelector(CHECK_BOX) && qSelector(CHECK_BOX).getAttribute(ARIA_CHECKED) == "true"){
197 clearInterval(checkboxInterval);
198 }
199
200 if(qSelector(CHECK_BOX) && qSelector(CHECK_BOX).getAttribute(ARIA_CHECKED) == "false"){
201 qSelector(CHECK_BOX).click();
202 }
203
204 },5000);
205
206 function selectImagesAfterDelay(delay){
207 setTimeout(function(){
208 selectImages();
209 },delay*1000);
210 }
211
212
213 function triggerEvent(el, type){
214 var e = document.createEvent('HTMLEvents');
215 e.initEvent(type, false, true);
216 el.dispatchEvent(e);
217 }
218
219
220 // Small hack to select the nodes
221 function unsure(targetNodeText){
222 var waitForUnsureInterval = setInterval(function(){
223 var targetNode = Array.from(qSelectorAll('div'))
224 .find(el => el.textContent === targetNodeText);
225 //Works for now
226 //TODO: Select clothing
227 //TODO: Draw boxes around images
228 if(targetNode){
229 triggerEvent(targetNode, 'mousedown');
230 triggerEvent(targetNode, 'mouseup');
231 if(qSelector(SUBMIT_BUTTON)){
232 qSelector(SUBMIT_BUTTON).click();
233 }
234 }
235 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
236 clearInterval(waitForUnsureInterval);
237 return selectImages();
238 }
239
240 },3000);
241 }
242
243
244 function getImageList(){
245 var imageList = [];
246 for(var i=0;i<9;i++){
247 var urlString =qSelectorAll(IMAGE)[i].style.background;
248 var urlMatch = urlString.match(/(?<=\(\").+?(?=\"\))/g);
249 var imageUrl = urlMatch[0];
250 imageList[i] = imageUrl;
251 }
252 return imageList;
253
254 }
255
256 function waitUntilImageSelection(){
257 var imageIntervalCount = 0;
258 var imageInterval = setInterval(function(){
259 imageIntervalCount = imageIntervalCount + 1;
260 if(selectedImageCount == 9){
261 clearInterval(imageInterval);
262 if(qSelector(SUBMIT_BUTTON)){
263 qSelector(SUBMIT_BUTTON).click();
264 }
265 return selectImagesAfterDelay(5);
266 } else if( imageIntervalCount > 8){
267 clearInterval(imageInterval);
268 return selectImages();
269
270 }else{
271
272 }
273 },3000);
274 }
275
276 function waitForImagesToAppear(){
277 var checkImagesSelectedCount = 0;
278 var waitForImagesInterval = setInterval(function(){
279 checkImagesSelectedCount = checkImagesSelectedCount + 1;
280
281 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
282 clearInterval(waitForImagesInterval);
283 return selectImages();
284 }else if(checkImagesSelectedCount > 20 ){
285 clearInterval(waitForImagesInterval);
286 }else {
287 var targetNodeList = ["Photo is clean, no watermarks, logos or text overlays","An interior photo of room","Unsure","Photo is sharp"];
288 for(var j = 0; j < targetNodeList.length; j++) {
289 var targetNode = Array.from(qSelectorAll('div'))
290 .find(el => el.textContent === targetNodeList[j]);
291 if(targetNode){
292 //console.log("Target Node Found");
293 clearInterval(waitForImagesInterval);
294 return unsure(targetNodeList[j]);
295 }
296 }
297
298 }
299
300 },3000);
301
302 }
303
304 function selectImages(){
305 if(qSelectorAll(IMAGE) && qSelectorAll(IMAGE).length == 9){
306 selectedImageCount =0;
307 try {
308 var word = qSelector(PROMPT_TEXT).innerText;
309 if(word && word.includes("Please click each image")) {
310 word = word.replace('Please click each image containing a ','');
311 word = word.replace('Please click each image containing an ','');
312 } else{
313 //TODO: Select images from example and identify the word for other languages
314
315 }
316 }catch(err) {
317 console.log(err.message);
318 return selectImagesAfterDelay(5);
319 }
320
321 var imageList =[];
322
323 try {
324 imageList = getImageList();
325 }catch(err) {
326 console.log(err.message);
327 return selectImagesAfterDelay(5);
328 }
329
330 for(var i=0;i<9;i++){
331 matchImages(imageList[i],word,i);
332 }
333 waitUntilImageSelection();
334
335 }else{
336 waitForImagesToAppear();
337 }
338 }
339
340 selectImages();
341
342})();