discord.js-selfbot-v13/src/rest/CaptchaSolver.js
2023-10-29 13:32:56 +07:00

140 lines
4.5 KiB
JavaScript

'use strict';
const proxyParser = proxy => {
const protocolSplit = proxy.split('://');
const protocol = protocolSplit.length === 1 ? null : protocolSplit[0];
const rest = protocolSplit.length === 1 ? protocolSplit[0] : protocolSplit[1];
const authSplit = rest.split('@');
if (authSplit.length === 1) {
const host = authSplit[0].split(':')[0];
const port = Number(authSplit[0].split(':')[1]);
const proxyConfig = {
host,
port,
};
if (protocol != null) {
proxyConfig.protocol = protocol;
}
return proxyConfig;
}
const host = authSplit[1].split(':')[0];
const port = Number(authSplit[1].split(':')[1]);
const [username, password] = authSplit[0].split(':');
const proxyConfig = {
host,
port,
auth: {
username,
password,
},
};
if (protocol != null) {
proxyConfig.protocol = protocol;
}
return proxyConfig;
};
module.exports = class CaptchaSolver {
constructor(service, key, defaultCaptchaSolver, proxyString = '') {
this.service = 'custom';
this.solver = undefined;
this.defaultCaptchaSolver = defaultCaptchaSolver;
this.key = null;
this.proxy = proxyString.length ? proxyParser(proxyString) : null;
this._setup(service, key);
}
_missingModule(name) {
return new Error(`${name} module not found, please install it with \`npm i ${name}\``);
}
_setup(service, key) {
switch (service) {
case '2captcha': {
if (!key || typeof key !== 'string') throw new Error('2captcha key is not provided');
try {
const lib = require('2captcha');
this.service = '2captcha';
this.key = key;
this.solver = new lib.Solver(key);
this.solve = (data, userAgent) =>
new Promise((resolve, reject) => {
const siteKey = data.captcha_sitekey;
let postD = {
invisible: 1,
userAgent,
};
if (this.proxy !== null) {
postD = {
...postD,
proxytype: this.proxy.protocol?.toUpperCase(),
proxy: `${'auth' in this.proxy ? `${this.proxy.auth.username}:${this.proxy.auth.password}@` : ''}${
this.proxy.host
}:${this.proxy.port}`,
};
}
if (data.captcha_rqdata) {
postD = {
...postD,
data: data.captcha_rqdata,
};
}
this.solver
.hcaptcha(siteKey, 'discord.com', postD)
.then(res => {
if (typeof res.data == 'string') {
resolve(res.data);
} else {
reject(new Error('Unknown Response'));
}
})
.catch(reject);
});
break;
} catch (e) {
throw this._missingModule('2captcha');
}
}
case 'capmonster': {
if (!key || typeof key !== 'string') throw new Error('Capmonster key is not provided');
try {
const { HCaptchaTask } = require('node-capmonster');
this.service = 'capmonster';
this.key = key;
const client = new HCaptchaTask(this.key);
this.solve = (captchaData, userAgent) =>
new Promise((resolve, reject) => {
if (userAgent) client.setUserAgent(userAgent);
if (this.proxy !== null) {
client.setGlobalProxy(
this.proxy.protocol,
this.proxy.host,
this.proxy.port,
'auth' in this.proxy ? this.proxy.auth.username : undefined,
'auth' in this.proxy ? this.proxy.auth.password : undefined,
);
}
client
.createWithTask(
client.task({
websiteURL: 'https://discord.com/channels/@me',
websiteKey: captchaData.captcha_sitekey,
isInvisible: !!captchaData.captcha_rqdata,
data: captchaData.captcha_rqdata,
}),
)
.then(id => client.joinTaskResult(id))
.then(result => resolve(result.gRecaptchaResponse))
.catch(reject);
});
} catch (e) {
throw this._missingModule('node-capmonster');
}
break;
}
default: {
this.solve = this.defaultCaptchaSolver;
}
}
}
solve() {}
};