imagetyperz-api
Version:
ImagetyperzAPI is a super easy to use bypass captcha API wrapper for imagetyperz.com captcha service
604 lines (556 loc) • 18.1 kB
JavaScript
const requests = require('./requests');
const endpoints = require('./endpoints'); // endpoints of API
const fs = require('fs');
const Q = require('q');
const HEADERS = {
'User-Agent': 'nodeAPIv1.0'
};
// private variables
var _access_key = undefined, _username = undefined, _password = undefined,
_affiliate_id = undefined;
/**
* Set access key
* @param access_key
*/
exports.set_access_key = function (access_key) {
_access_key = access_key;
};
/**
* Set username and password
* @param user
* @param password
*/
exports.set_user_password = function (user, password) {
_username = user;
_password = password;
};
/**
* Set affiliate id
* @param aff_id
*/
exports.set_affiliate_id = function (aff_id) {
_affiliate_id = aff_id;
};
/**
* Get account balance
* @returns {*}
*/
exports.account_balance = function () {
var deferred = Q.defer();
var data = {}, url = undefined;
if (_username && _password) {
url = endpoints.BALANCE_ENDPOINT;
// legacy auth
data['username'] = _username;
data['password'] = _password;
}
else {
url = endpoints.BALANCE_ENDPOINT_TOKEN;
data['token'] = _access_key; // token auth
}
// add rest of params
data['action'] = 'REQUESTBALANCE';
data['submit'] = 'Submit';
var params = serialize_dict(data);
// submit to server
requests.get(url + "?" + params, {headers: HEADERS}).then(function (resp) {
deferred.resolve(resp);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_image = function (image, optional_parameters) {
var deferred = Q.defer();
var data = {}, url = undefined, img_data = undefined;
if (_username && _password) {
// legacy auth
data['username'] = _username;
data['password'] = _password;
url = endpoints.CAPTCHA_ENDPOINT;
if (!fs.existsSync(image)) {
// image does not exist
deferred.reject(new Error('image does not exist: ' + image));
return deferred.promise;
}
// get b64 of image
img_data = base64_encode(image);
}
else {
// given image is URL (works only for token based auth currently)
if (image.startsWith('http')) {
url = endpoints.CAPTCHA_ENDPOINT_URL_TOKEN;
img_data = image;
}
else {
// token based auth and file image
url = endpoints.CAPTCHA_ENDPOINT_CONTENT_TOKEN;
if (!fs.existsSync(image)) {
// image does not exist
deferred.reject(new Error('image does not exist: ' + image));
return deferred.promise;
}
img_data = base64_encode(image);
}
data['token'] = _access_key;
}
// add rest of params
data['action'] = 'UPLOADCAPTCHA';
data['file'] = img_data;
// optional parameters
let optional_keys = Object.keys(optional_parameters);
// check if any given
if(optional_keys.length > 0){
let i = 0;
for(i = 0; i < optional_keys.length; i++){
let key = optional_keys[i];
data[key] = optional_parameters[key];
}
}
// check for affiliate id
if (_affiliate_id) data['affiliateid'] = _affiliate_id;
// submit to server
requests.post(url, data).then(function (resp) {
var s = resp.split('|');
deferred.resolve(s[0]);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_recaptcha = function (d) {
var page_url = d.page_url;
var sitekey = d.sitekey;
var proxy = d.proxy;
var deferred = Q.defer();
var data = {}, url = undefined;
if (_username && _password) {
// legacy auth
data['username'] = _username;
data['password'] = _password;
url = endpoints.RECAPTCHA_SUBMIT_ENDPOINT;
}
else {
// token auth
data['token'] = _access_key;
url = endpoints.RECAPTCHA_SUBMIT_ENDPOINT_TOKEN;
}
// check for proxy
if (proxy) {
data['proxy'] = proxy;
data['proxytype'] = 'HTTP';
}
// add rest of params
data['action'] = 'UPLOADCAPTCHA';
data['pageurl'] = page_url;
data['googlekey'] = sitekey;
// check for affiliate id
if (_affiliate_id) data['affiliateid'] = _affiliate_id;
// user agent
if (d.user_agent) data.useragent = d.user_agent;
// custom domain for loading reCAPTCHA interface
if (d.domain) data.domain = d.domain;
// type / enterprise
if (d.type) {
data.recaptchatype = d['type'];
const ts = d['type'].toString()
if (ts === '4' || ts === '5') url = endpoints.RECAPTCHA_ENTERPRISE_SUBMIT_ENDPOINT
if (ts === '5') data.enterprise_type = 'v3'
}
if (d.v3_action) data.captchaaction = d['v3_action'];
if (d.v3_min_score) data.score = d['v3_min_score'];
if (d.data_s) data['data-s'] = d.data_s;
if (d.cookie_input) data['cookie_input'] = d.cookie_input;
// submit to server
requests.post(url, data).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(ss);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_geetest = function (d) {
var deferred = Q.defer();
var url = undefined;
// check for required fields
if(!d.domain) deferred.reject('domain is missing');
if(!d.challenge) deferred.reject('challenge is missing');
if(!d.gt) deferred.reject('gt is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
url = endpoints.GEETEST_SUBMIT_ENDPOINT
}
else {
// token auth
d['token'] = _access_key;
url = endpoints.GEETEST_SUBMIT_ENDPOINT_TOKEN;
}
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
url = url + "?" + serialize_dict(d);
// submit to server
requests.get(url).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(ss);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_geetest_v4 = function (d) {
var deferred = Q.defer();
var url = undefined;
// check for required fields
if(!d.domain) deferred.reject('domain is missing');
if(!d.geetestid) deferred.reject('geetestid is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
url = endpoints.GEETEST_V4_SUBMIT_ENDPOINT
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
url = url + "?" + serialize_dict(d);
// submit to server
requests.get(url).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(ss);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_capy = function (d) {
var deferred = Q.defer();
var url = undefined;
// check for required fields
if(!d.page_url) deferred.reject('page_url is missing');
if(!d.sitekey) deferred.reject('sitekey is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
d['captchatype'] = 12
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
// submit to server
requests.post(endpoints.CAPY_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_hcaptcha = function (d) {
var deferred = Q.defer();
// check for required fields
if(!d.page_url) deferred.reject('page_url is missing');
if(!d.sitekey) deferred.reject('sitekey is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
d['captchatype'] = 11
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
if (d.HcaptchaEnterprise) d.HcaptchaEnterprise = JSON.stringify(d.HcaptchaEnterprise)
if (d.domain) {
d.apiEndpoint = d.domain
delete d.domain
}
// submit to server
requests.post(endpoints.HCAPTCHA_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_tiktok = function (d) {
var deferred = Q.defer();
var url = undefined;
// check for required fields
if(!d.page_url) deferred.reject('page_url is missing');
if(!d.cookie_input) deferred.reject('cookie_input is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
d['captchatype'] = 12
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
// submit to server
requests.post(endpoints.TIKTOK_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_funcaptcha = function (d) {
var deferred = Q.defer();
// check for required fields
if(!d.page_url) deferred.reject('page_url is missing');
if(!d.sitekey) deferred.reject('sitekey is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
if (d.s_url) d['surl'] = d['s_url'];
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
d['captchatype'] = 13
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
// submit to server
requests.post(endpoints.FUNCAPTCHA_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_turnstile = function (d) {
var deferred = Q.defer();
var url = undefined;
// check for required fields
if(!d.page_url) deferred.reject('page_url is missing');
if(!d.sitekey) deferred.reject('sitekey is missing');
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
if (d.domain) {
d.apiEndpoint = d.domain
delete d.domain
}
if (d.action) {
d.taction = d.action
delete d.action
}
if (d.cdata) {
d.data = d.cdata
delete d.cdata
}
d['action'] = 'UPLOADCAPTCHA';
// submit to server
requests.post(endpoints.TURNSTILE_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.submit_task = function (d) {
var deferred = Q.defer();
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
// server needs it like this, but our convention was page_url at 1st
d['pageurl'] = d['page_url']
// add rest of params
d['action'] = 'UPLOADCAPTCHA';
d['captchatype'] = 16
if (d.variables) {
d.variables = JSON.stringify(d.variables)
}
// check for affiliate id
if (_affiliate_id) d['affiliateid'] = _affiliate_id;
// submit to server
requests.post(endpoints.TASK_ENDPOINT, d).then(function (resp) {
var s = resp.split('|');
var ss = s.length >= 2 ? s[1] : s[0];
deferred.resolve(JSON.parse(ss)[0].CaptchaId)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.task_push_variables = function (captchaID, variables) {
var deferred = Q.defer();
const d = {}
if (_username && _password) {
// legacy auth
d['username'] = _username;
d['password'] = _password;
}
else {
// token auth
d['token'] = _access_key;
}
d['action'] = 'GETTEXT';
d['captchaid'] = captchaID
d.pushVariables = JSON.stringify(variables)
// submit to server
requests.post(endpoints.TASK_PUSH_ENDPOINT, d).then(function (resp) {
if (resp.includes('Error'))
return deferred.reject(Error(resp.split('Error:')[1].trim()))
deferred.resolve(resp)
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
/**
* Set captcha bad
* @param captcha_id
* @returns {*}
*/
exports.set_captcha_bad = function (captcha_id) {
var deferred = Q.defer();
var data = {}, url = undefined;
if (_username && _password) {
url = endpoints.BAD_IMAGE_ENDPOINT;
// legacy auth
data['username'] = _username;
data['password'] = _password;
}
else {
url = endpoints.BAD_IMAGE_ENDPOINT_TOKEN;
data['token'] = _access_key; // token auth
}
// add rest of params
data['action'] = 'SETBADIMAGE';
data['imageid'] = captcha_id;
data['submit'] = 'Submissssst';
// submit to server
requests.post(url, data, {headers: HEADERS}).then(function (resp) {
deferred.resolve(resp);
}).catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
exports.retrieve_response = async function (captcha_id) {
var data = {}, url = undefined;
if (_username && _password) {
// legacy auth
data['username'] = _username;
data['password'] = _password;
}
else {
data['token'] = _access_key; // token auth
}
// add rest of params
data['action'] = 'GETTEXT';
data['captchaid'] = captcha_id;
const deferred = Q.defer()
// submit to server
async function _checkResponse () {
let req_resp
try {
req_resp = await requests.post(endpoints.RETRIEVE_JSON_ENDPOINT, data, {headers: HEADERS})
} catch (err) {
// give the best possible error output
try {
deferred.resolve(JSON.parse(err.message))
} catch (err2) {
try {
deferred.resolve(JSON.parse(err))
} catch (err3) {
deferred.resolve(err.message || err)
}
}
return deferred.promise
}
const resp = JSON.parse(req_resp)[0]
if (resp.Status !== 'Pending') {
deferred.resolve(resp)
return deferred.promise;
}
// if still pending, recheck in 10 secs
setTimeout(_checkResponse, 10000)
return deferred.promise
}
return await _checkResponse()
}
/**
* Utils
*/
function serialize_dict(obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
}
// function to encode file data to base64 encoded string
function base64_encode(file) {
// read binary data
var bitmap = fs.readFileSync(file);
// convert binary data to base64 encoded string
return new Buffer(bitmap).toString('base64');
}