diff --git a/discord.js-selfbot.js b/discord.js-selfbot.js new file mode 100644 index 0000000..61bf4a1 --- /dev/null +++ b/discord.js-selfbot.js @@ -0,0 +1,342 @@ +const axios = require('axios'); +const { cp } = require('fs'); +const WebSocket = require('ws'); + +class EventEmitter { + constructor() { + this.events = {}; + } + + on(event, listener) { + if (!this.events[event]) { + this.events[event] = []; + } + this.events[event].push(listener); + } + + emit(event, ...args) { + if (this.events[event]) { + this.events[event].forEach(listener => { + listener(...args); + }); + } + } +} + +class Client extends EventEmitter { + constructor() { + super(); + this.baseUrl = 'https://discord.com/api/v10'; + } + + async login(token) { + try { + this.token = token; + const user = await this.getUser(); + this.user = user; + this.emit('ready'); + this.initWebSocket(); + } catch (error) { + console.error('Erreur lors de l\'initialisation :', error); + } + } + + initWebSocket() { + // Simplified example to open a WebSocket connection + this.ws = new WebSocket('wss://gateway.discord.gg/?v=10&encoding=json') + + this.ws.on('open', () => { + + // Envoyer un payload pour identifier et initialiser la session + this.ws.send(JSON.stringify({ + op: 2, + d: { + token: this.token, + intents: 3276799, // Intents pour avoir tous les événements + properties: { + $os: 'linux', + $browser: 'my_library', + $device: 'my_library' + } + } + })); + }); + + this.ws.on('message', (data) => { + const payload = JSON.parse(data); + + // Vérifier le type de l'événement reçu + switch (payload.op) { + case 10: // Hello + // Répondre avec le heartbeat + const interval = payload.d.heartbeat_interval; + setInterval(() => { + this.ws.send(JSON.stringify({ + op: 1, + d: null + })); + }, interval); + break; + case 0: // Dispatch + const { t, d } = payload; + switch (t) { + case 'APPLICATION_COMMAND_PERMISSIONS_UPDATE': + this.emit('applicationCommandPermissionsUpdate', d); + break; + case 'AUTO_MODERATION_ACTION_EXECUTION': + this.emit('autoModerationActionExecution', d); + break; + case 'AUTO_MODERATION_RULE_CREATE': + this.emit('autoModerationRuleCreate', d); + break; + case 'AUTO_MODERATION_RULE_DELETE': + this.emit('autoModerationRuleDelete', d); + break; + case 'AUTO_MODERATION_RULE_UPDATE': + this.emit('autoModerationRuleUpdate', d); + break; + case 'CHANNEL_CREATE': + this.emit('channelCreate', d); + break; + case 'CHANNEL_DELETE': + this.emit('channelDelete', d); + break; + case 'CHANNEL_PINS_UPDATE': + this.emit('channelPinsUpdate', d); + break; + case 'CHANNEL_UPDATE': + this.emit('channelUpdate', d); + break; + case 'DEBUG': + this.emit('debug', d); + break; + case 'EMOJI_CREATE': + this.emit('emojiCreate', d); + break; + case 'EMOJI_DELETE': + this.emit('emojiDelete', d); + break; + case 'EMOJI_UPDATE': + this.emit('emojiUpdate', d); + break; + case 'ENTITLEMENT_CREATE': + this.emit('entitlementCreate', d); + break; + case 'ENTITLEMENT_DELETE': + this.emit('entitlementDelete', d); + break; + case 'ENTITLEMENT_UPDATE': + this.emit('entitlementUpdate', d); + break; + case 'ERROR': + this.emit('error', d); + break; + case 'GUILD_AUDIT_LOG_ENTRY_CREATE': + this.emit('guildAuditLogEntryCreate', d); + break; + case 'GUILD_AVAILABLE': + this.emit('guildAvailable', d); + break; + case 'GUILD_BAN_ADD': + this.emit('guildBanAdd', d); + break; + case 'GUILD_BAN_REMOVE': + this.emit('guildBanRemove', d); + break; + case 'GUILD_CREATE': + this.emit('guildCreate', d); + break; + case 'GUILD_DELETE': + this.emit('guildDelete', d); + break; + case 'GUILD_INTEGRATIONS_UPDATE': + this.emit('guildIntegrationsUpdate', d); + break; + case 'GUILD_MEMBER_ADD': + this.emit('guildMemberAdd', d); + break; + case 'GUILD_MEMBER_AVAILABLE': + this.emit('guildMemberAvailable', d); + break; + case 'GUILD_MEMBER_REMOVE': + this.emit('guildMemberRemove', d); + break; + case 'GUILD_MEMBERS_CHUNK': + this.emit('guildMembersChunk', d); + break; + case 'GUILD_MEMBER_UPDATE': + this.emit('guildMemberUpdate', d); + break; + case 'GUILD_SCHEDULED_EVENT_CREATE': + this.emit('guildScheduledEventCreate', d); + break; + case 'GUILD_SCHEDULED_EVENT_DELETE': + this.emit('guildScheduledEventDelete', d); + break; + case 'GUILD_SCHEDULED_EVENT_UPDATE': + this.emit('guildScheduledEventUpdate', d); + break; + case 'GUILD_SCHEDULED_EVENT_USER_ADD': + this.emit('guildScheduledEventUserAdd', d); + break; + case 'GUILD_SCHEDULED_EVENT_USER_REMOVE': + this.emit('guildScheduledEventUserRemove', d); + break; + case 'GUILD_UNAVAILABLE': + this.emit('guildUnavailable', d); + break; + case 'GUILD_UPDATE': + this.emit('guildUpdate', d); + break; + case 'INTERACTION_CREATE': + this.emit('interactionCreate', d); + break; + case 'INVITE_CREATE': + this.emit('inviteCreate', d); + break; + case 'INVITE_DELETE': + this.emit('inviteDelete', d); + break; + case 'MESSAGE_CREATE': + this.emit('messageCreate', d); + break; + case 'MESSAGE_DELETE': + this.emit('messageDelete', d); + break; + case 'MESSAGE_DELETE_BULK': + this.emit('messageDeleteBulk', d); + break; + case 'MESSAGE_POLL_VOTE_ADD': + this.emit('messagePollVoteAdd', d); + break; + case 'MESSAGE_POLL_VOTE_REMOVE': + this.emit('messagePollVoteRemove', d); + break; + case 'MESSAGE_REACTION_ADD': + this.emit('messageReactionAdd', d); + break; + case 'MESSAGE_REACTION_REMOVE': + this.emit('messageReactionRemove', d); + break; + case 'MESSAGE_REACTION_REMOVE_ALL': + this.emit('messageReactionRemoveAll', d); + break; + case 'MESSAGE_REACTION_REMOVE_EMOJI': + this.emit('messageReactionRemoveEmoji', d); + break; + case 'MESSAGE_UPDATE': + this.emit('messageUpdate', d); + break; + case 'PRESENCE_UPDATE': + this.emit('presenceUpdate', d); + break; + //case 'READY': + // this.emit('ready', d); + // break; + case 'ROLE_CREATE': + this.emit('roleCreate', d); + break; + case 'ROLE_DELETE': + this.emit('roleDelete', d); + break; + case 'ROLE_UPDATE': + this.emit('roleUpdate', d); + break; + case 'SHARD_DISCONNECT': + this.emit('shardDisconnect', d); + break; + case 'SHARD_ERROR': + this.emit('shardError', d); + break; + case 'SHARD_READY': + this.emit('shardReady', d); + break; + case 'SHARD_RECONNECTING': + this.emit('shardReconnecting', d); + break; + case 'SHARD_RESUME': + this.emit('shardResume', d); + break; + case 'STAGE_INSTANCE_CREATE': + this.emit('stageInstanceCreate', d); + break; + case 'STAGE_INSTANCE_DELETE': + this.emit('stageInstanceDelete', d); + break; + case 'STAGE_INSTANCE_UPDATE': + this.emit('stageInstanceUpdate', d); + break; + case 'STICKER_CREATE': + this.emit('stickerCreate', d); + break; + case 'STICKER_DELETE': + this.emit('stickerDelete', d); + break; + case 'STICKER_UPDATE': + this.emit('stickerUpdate', d); + break; + case 'THREAD_CREATE': + this.emit('threadCreate', d); + break; + case 'THREAD_DELETE': + this.emit('threadDelete', d); + break; + case 'THREAD_LIST_SYNC': + this.emit('threadListSync', d); + break; + case 'THREAD_MEMBERS_UPDATE': + this.emit('threadMembersUpdate', d); + break; + case 'THREAD_MEMBER_UPDATE': + this.emit('threadMemberUpdate', d); + break; + case 'THREAD_UPDATE': + this.emit('threadUpdate', d); + break; + case 'TYPING_START': + this.emit('typingStart', d); + break; + case 'USER_UPDATE': + this.emit('userUpdate', d); + break; + case 'VOICE_STATE_UPDATE': + this.emit('voiceStateUpdate', d); + break; + case 'WARN': + this.emit('warn', d); + break; + case 'WEBHOOKS_UPDATE': + this.emit('webhooksUpdate', d); + break; + case 'WEBHOOK_UPDATE': + this.emit('webhookUpdate', d); + break; + default: + break; + } + break; + default: + break; + } + }); + } + + async getUser() { + const url = `${this.baseUrl}/users/@me`; + try { + const response = await axios.get(url, { + headers: { + 'Authorization': this.token + } + }); + return response.data; + } catch (error) { + console.error(`Error: ${error.response ? error.response.data.message : error.message}`); + throw new Error(`Error: ${error.response ? error.response.data.message : error.message}`); + } + } + +} + + +module.exports = { Client }; \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..99680a3 --- /dev/null +++ b/main.js @@ -0,0 +1,14 @@ +require('dotenv').config() +const { Client } = require('./discord.js-selfbot'); + +const client = new Client(); + +client.on('ready', () => { + console.log(`Connecté en tant que ${client.user.username}`); +}); + +client.on('messageCreate', (message) => { + console.log(`Nouveau message de ${message.author.username} : ${message.content}`); +}); + +client.login(process.env.TOKEN); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7fa234f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,146 @@ +{ + "name": "ma bibliotheque discord", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "axios": "^1.7.2", + "dotenv": "^16.4.5", + "ws": "^8.17.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d852bb1 --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "axios": "^1.7.2", + "dotenv": "^16.4.5", + "ws": "^8.17.1" + } +}