diff --git a/src/client/Client.js b/src/client/Client.js index 5255e59..c006e34 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -1038,6 +1038,12 @@ class Client extends BaseClient { throw new TypeError('CLIENT_INVALID_OPTION', 'captchaKey', 'a 32 character string'); } break; + case 'nopecha': { + if (options.captchaKey.length !== 16) { + throw new TypeError('CLIENT_INVALID_OPTION', 'captchaKey', 'a 16 character string'); + } + break; + } } } if (typeof options.captchaRetryLimit !== 'number' || isNaN(options.captchaRetryLimit)) { diff --git a/src/rest/CaptchaSolver.js b/src/rest/CaptchaSolver.js index 169445e..604dc44 100644 --- a/src/rest/CaptchaSolver.js +++ b/src/rest/CaptchaSolver.js @@ -91,6 +91,33 @@ module.exports = class CaptchaSolver { }); break; } + case 'nopecha': { + if (!key || typeof key !== 'string') throw new Error('nopecha key is not provided'); + try { + const { Configuration, NopeCHAApi } = require('nopecha'); + this.service = 'nopecha'; + this.key = key; + const configuration = new Configuration({ + apiKey: key, + }); + this.solver = new NopeCHAApi(configuration); + this.solve = (data, userAgent) => + new Promise((resolve, reject) => { + if (data.captcha_rqdata) reject(new Error('nopecha does not support invisible captcha')); + this.solver + .solveToken({ + type: 'hcaptcha', + sitekey: data.captcha_sitekey, + url: 'https://discord.com/channels/@me', + useragent: userAgent, + }) + .then(console.log); + }); + break; + } catch (e) { + throw this._missingModule('nopecha'); + } + } default: { this.solve = this.defaultCaptchaSolver; } diff --git a/src/util/Constants.js b/src/util/Constants.js index 183965c..5ae1aaa 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -18,9 +18,10 @@ exports.MaxBulkDeletableMessageAge = 1_209_600_000; * API captcha solver * * `2captcha` - 2captcha.com * * `capmonster` - capmonster.cloud + * * `nopecha` - nopecha.com * @typedef {string[]} captchaServices */ -exports.captchaServices = ['2captcha', 'capmonster', 'custom']; +exports.captchaServices = ['2captcha', 'capmonster', 'nopecha', 'custom']; /** * Automatically scan and delete direct messages you receive that contain explicit media content. diff --git a/typings/index.d.ts b/typings/index.d.ts index 3075d20..ba84486 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -5057,7 +5057,7 @@ export interface ClientOptions { usingNewAttachmentAPI?: boolean; } -export type captchaServices = '2captcha' | 'capmonster'; +export type captchaServices = '2captcha' | 'capmonster' | 'nopecha'; // end copy