solvecaptcha-javascript
Version:
Node.js wrapper for SolveCaptcha.com API. Bypass recaptcha, hcaptcha, cloudflare capthca and more.
166 lines (165 loc) • 7.55 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// Captcha methods for which parameter checking is available
const supportedMethods = ["userrecaptcha", "hcaptcha", "geetest", "geetest_v4", "yandex", "funcaptcha", "lemin", "amazon_waf",
"turnstile", "base64", "capy", "datadome", "cybersiara", "mt_captcha", "bounding_box", 'friendly_captcha', 'grid',
'textcaptcha', 'canvas', 'rotatecaptcha', 'keycaptcha', 'cutcaptcha', 'tencent', 'atb_captcha', 'audio'];
// Names of required fields that must be contained in the parameters captcha
const recaptchaRequiredFields = ['pageurl', 'googlekey'];
const hcaptchaRequiredFields = ['pageurl', 'sitekey'];
const geetestRequiredFields = ['pageurl', 'gt', 'challenge'];
const geetestV4RequiredFields = ['pageurl', 'captcha_id'];
const yandexSmartRequiredFields = ['pageurl', 'sitekey'];
const funCaptchaRequiredFields = ['pageurl', 'publickey'];
const leminRequiredFields = ['pageurl', 'div_id', 'captcha_id'];
const amazonWafRequiredFields = ['pageurl', 'context', 'iv', 'sitekey'];
const turnstileRequiredFields = ['pageurl', 'sitekey'];
// `base64RequiredFields` for Normal Captcha and Coordinates captcha
const base64RequiredFields = ['body'];
const capyPuzzleRequiredFields = ['captchakey'];
const dataDomeRequiredFields = ['pageurl', 'captcha_url', 'userAgent', 'proxy', 'proxytype'];
const cyberSiARARequiredFields = ['pageurl', 'master_url_id', 'userAgent'];
const mtCaptchaRequiredFields = ['pageurl', 'sitekey'];
const boundingBoxRequiredFields = ['image']; // and textinstructions or imginstructions
const friendlyCaptchaFields = ['pageurl', 'sitekey'];
const gridRequiredFields = ['body']; // and textinstructions or imginstructions
const textCaptchaRequiredFields = ['textcaptcha'];
const canvasRequiredFields = ['body']; // and textinstructions or imginstructions
const rotateRequiredFields = ['body'];
const keycaptchaRequiredFields = ['pageurl', 's_s_c_user_id', 's_s_c_session_id', 's_s_c_web_server_sign', 's_s_c_web_server_sign2'];
const cutcaptchaRequiredFields = ['pageurl', 'misery_key', 'api_key'];
const tencentRequiredFields = ['pageurl', 'app_id'];
const atbCaptchaRequiredFields = ['pageurl', 'app_id', 'api_server'];
const audioRequiredFields = ['body', 'lang'];
/**
* Getting required arguments for a captcha.
*
* @param {string} method method for solving captcha.
* @returns {Array} An array containing the required arguments for this captcha
*/
const getRequiredFildsArr = (method) => {
let requiredFieldsArr = ['pageurl'];
switch (method) {
case "userrecaptcha":
requiredFieldsArr = recaptchaRequiredFields;
break;
case "hcaptcha":
requiredFieldsArr = hcaptchaRequiredFields;
break;
case "geetest":
requiredFieldsArr = geetestRequiredFields;
break;
case "geetest_v4":
requiredFieldsArr = geetestV4RequiredFields;
break;
case "yandex":
requiredFieldsArr = yandexSmartRequiredFields;
break;
case "funcaptcha":
requiredFieldsArr = funCaptchaRequiredFields;
break;
case "lemin":
requiredFieldsArr = leminRequiredFields;
break;
case "amazon_waf":
requiredFieldsArr = amazonWafRequiredFields;
break;
case "turnstile":
requiredFieldsArr = turnstileRequiredFields;
break;
case "base64":
requiredFieldsArr = base64RequiredFields;
break;
case "grid":
requiredFieldsArr = gridRequiredFields;
break;
case "capy":
requiredFieldsArr = capyPuzzleRequiredFields;
break;
case "datadome":
requiredFieldsArr = dataDomeRequiredFields;
break;
case "cybersiara":
requiredFieldsArr = cyberSiARARequiredFields;
break;
case "mt_captcha":
requiredFieldsArr = mtCaptchaRequiredFields;
break;
case "bounding_box":
requiredFieldsArr = boundingBoxRequiredFields;
break;
case "friendly_captcha":
requiredFieldsArr = friendlyCaptchaFields;
break;
case "textcaptcha":
requiredFieldsArr = textCaptchaRequiredFields;
break;
case "canvas":
requiredFieldsArr = canvasRequiredFields;
break;
case "rotatecaptcha":
requiredFieldsArr = rotateRequiredFields;
break;
case "keycaptcha":
requiredFieldsArr = keycaptchaRequiredFields;
break;
case "cutcaptcha":
requiredFieldsArr = cutcaptchaRequiredFields;
break;
case "tencent":
requiredFieldsArr = tencentRequiredFields;
break;
case "atb_captcha":
requiredFieldsArr = atbCaptchaRequiredFields;
break;
case "audio":
requiredFieldsArr = audioRequiredFields;
break;
}
return requiredFieldsArr;
};
/**
* ### Captcha Required Parameters Check.
*
* Checking required captcha parameters before sending.
* This function checks for required fields in the provided captcha parameters.
* Throws an error if the specified method is not supported or if required fields are missing.
*
* Note: The `checkCaptchaParams()` function should be called after `renameParams()`, if function `renameParams()` is used.
*
* @param { Object } params Captcha parameters that need to be checked.
* @returns true | false | Error
* @example
* checkCaptchaParams(params, 'userrecaptcha')
*/
function checkCaptchaParams(params, method) {
let isCorrectCaptchaParams;
const isIncorrectCaptchaMethod = !supportedMethods.includes(method);
if (isIncorrectCaptchaMethod) {
isCorrectCaptchaParams = false;
throw new Error(`Error when check params captcha. \nNot found "${method}" method in the "supportedMethods" array. \nCheck if the method is written correctly `);
}
const requiredFields = getRequiredFildsArr(method);
requiredFields.forEach(fieldName => {
const isThisFieldNotAvailable = !params.hasOwnProperty(fieldName);
if (isThisFieldNotAvailable) {
isCorrectCaptchaParams = false;
throw new Error(`Error when check params captcha.\nNot found "${fieldName}" field in the Object. Field "${fieldName}" is required for "${method}" method. Please add field "${fieldName}" in object and try again.\nPlease correct your code for the "${method}" method according to the code examples`);
}
else {
isCorrectCaptchaParams = true;
}
});
//The parameters `textinstructions` and `imginstructions` are mandatory for the methods `bounding_box`, `grid`, and `canvas`.
if (method === "bounding_box" || method === "grid" || method === "canvas") {
if (params.hasOwnProperty('textinstructions') || params.hasOwnProperty('imginstructions')) {
isCorrectCaptchaParams = true;
}
else {
isCorrectCaptchaParams = false;
throw new Error(`Error when check params captcha.\nNot found "textinstructions" or "imginstructions" field in the Object. One of this field is required for "${method}" method. Please add field "textinstructions" or "imginstructions" to captcha parameters.`);
}
}
return isCorrectCaptchaParams;
}
exports.default = checkCaptchaParams;