Untitled

 avatar
unknown
javascript
2 months ago
8.2 kB
9
Indexable
const { Telegraf } = require('telegraf');
const { TelegramClient } = require('telegram');
const { StringSession } = require('telegram/sessions');
const { Api } = require('telegram/tl');
const fs = require('fs');
const input = require('input');

// Telegram Bot Token
const BOT_TOKEN = 'YOUR_BOT_TOKEN_HERE';

// Initialize Telegraf Bot
const bot = new Telegraf(BOT_TOKEN);

// Session file for Telegram Client
const sessionFile = 'session.txt';
let stringSession = fs.existsSync(sessionFile) ? fs.readFileSync(sessionFile, 'utf-8') : '';

let client; // Telegram Client instance
let userSessions = {}; // Store user-specific session data

// Function to start Telegram client
async function startTelegramClient(userId) {
    const { apiId, apiHash, phoneNumber } = userSessions[userId];

    if (!client) {
        client = new TelegramClient(new StringSession(stringSession), apiId, apiHash, {
            connectionRetries: 1,
            useWSS: true,
            baseDC: 2,
        });

        await client.start({
            phoneNumber: async () => phoneNumber,
            password: async () => await input.text('Enter your password (if 2FA is enabled): '),
            phoneCode: async () => await input.text('Enter the code you received: '),
            onError: (err) => console.log(err),
        });

        fs.writeFileSync(sessionFile, client.session.save());
        console.log('Telegram client connected.');
    }

    return client;
}

// Command: /start
bot.command('start', (ctx) => {
    ctx.reply('Welcome! Use the following commands:\n\n' +
        '/scrap_channel - Scrape members from a channel\n' +
        '/scrap_group - Scrape members from a group');
});

// Command: /scrap_channel
bot.command('scrap_channel', async (ctx) => {
    const userId = ctx.from.id;
    userSessions[userId] = {};

    ctx.reply('Enter your API ID:');
    bot.on('text', async (ctx) => {
        userSessions[userId].apiId = Number(ctx.message.text);
        ctx.reply('Enter your API Hash:');

        bot.on('text', async (ctx) => {
            userSessions[userId].apiHash = ctx.message.text;
            ctx.reply('Enter your phone number (with country code):');

            bot.on('text', async (ctx) => {
                userSessions[userId].phoneNumber = ctx.message.text;
                await startTelegramClient(userId);

                ctx.reply('Fetching channels...');

                const result = await client.invoke(
                    new Api.messages.GetDialogs({
                        offsetDate: 0,
                        offsetId: 0,
                        offsetPeer: new Api.InputPeerEmpty(),
                        limit: 2000,
                        hash: 0,
                    })
                );

                const channels = result.chats.filter(chat => chat instanceof Api.Channel && !chat.megagroup);
                userSessions[userId].channels = channels;

                if (channels.length === 0) {
                    ctx.reply('No channels found.');
                    return;
                }

                const buttons = channels.map((channel, index) => [{ 
                    text: `${channel.title} (ID: ${channel.id})`, 
                    callback_data: `channel_${index}` 
                }]);

                ctx.reply('Choose a channel to scrape members from:', {
                    reply_markup: { inline_keyboard: buttons },
                });
            });
        });
    });
});

// Handle channel selection
bot.action(/channel_(\d+)/, async (ctx) => {
    const userId = ctx.from.id;
    const index = parseInt(ctx.match[1]);
    const targetChannel = userSessions[userId].channels[index];

    ctx.reply(`Fetching members from ${targetChannel.title}...`);
    const participants = await client.getParticipants(targetChannel);

    ctx.reply(`Found ${participants.length} members in ${targetChannel.title}.\nEnter the target group ID to add them:`);

    bot.on('text', async (ctx) => {
        const targetGroupId = ctx.message.text;
        const targetGroupObj = await client.getEntity(targetGroupId);

        const usersToAdd = participants.map(user => user.id);
        const chunkSize = 10; // Avoid mass adding to prevent bans

        for (let i = 0; i < usersToAdd.length; i += chunkSize) {
            const chunk = usersToAdd.slice(i, i + chunkSize);
            try {
                await client.invoke(
                    new Api.channels.InviteToChannel({
                        channel: targetGroupObj,
                        users: chunk.map(userId => new Api.InputUser({ userId })),
                    })
                );
                ctx.reply(`Added ${chunk.length} users.`);
            } catch (error) {
                ctx.reply(`Failed to add some users. Error: ${error.message}`);
            }

            await new Promise(resolve => setTimeout(resolve, 3000)); // Rate-limit to avoid bans
        }

        ctx.reply('Finished adding members.');
    });
});

// Command: /scrap_group
bot.command('scrap_group', async (ctx) => {
    const userId = ctx.from.id;
    userSessions[userId] = {};

    ctx.reply('Enter your API ID:');
    bot.on('text', async (ctx) => {
        userSessions[userId].apiId = Number(ctx.message.text);
        ctx.reply('Enter your API Hash:');

        bot.on('text', async (ctx) => {
            userSessions[userId].apiHash = ctx.message.text;
            ctx.reply('Enter your phone number (with country code):');

            bot.on('text', async (ctx) => {
                userSessions[userId].phoneNumber = ctx.message.text;
                await startTelegramClient(userId);

                ctx.reply('Fetching groups...');

                const result = await client.invoke(
                    new Api.messages.GetDialogs({
                        offsetDate: 0,
                        offsetId: 0,
                        offsetPeer: new Api.InputPeerEmpty(),
                        limit: 2000,
                        hash: 0,
                    })
                );

                const groups = result.chats.filter(chat => chat instanceof Api.Channel && chat.megagroup);
                userSessions[userId].groups = groups;

                if (groups.length === 0) {
                    ctx.reply('No groups found.');
                    return;
                }

                const buttons = groups.map((group, index) => [{ 
                    text: `${group.title} (ID: ${group.id})`, 
                    callback_data: `group_${index}` 
                }]);

                ctx.reply('Choose a group to scrape members from:', {
                    reply_markup: { inline_keyboard: buttons },
                });
            });
        });
    });
});

// Handle group selection
bot.action(/group_(\d+)/, async (ctx) => {
    const userId = ctx.from.id;
    const index = parseInt(ctx.match[1]);
    const targetGroup = userSessions[userId].groups[index];

    ctx.reply(`Fetching members from ${targetGroup.title}...`);
    const participants = await client.getParticipants(targetGroup);

    ctx.reply(`Found ${participants.length} members in ${targetGroup.title}.\nEnter the target group ID to add them:`);

    bot.on('text', async (ctx) => {
        const targetGroupId = ctx.message.text;
        const targetGroupObj = await client.getEntity(targetGroupId);

        const usersToAdd = participants.map(user => user.id);
        const chunkSize = 10;

        for (let i = 0; i < usersToAdd.length; i += chunkSize) {
            const chunk = usersToAdd.slice(i, i + chunkSize);
            try {
                await client.invoke(
                    new Api.channels.InviteToChannel({
                        channel: targetGroupObj,
                        users: chunk.map(userId => new Api.InputUser({ userId })),
                    })
                );
                ctx.reply(`Added ${chunk.length} users.`);
            } catch (error) {
                ctx.reply(`Failed to add some users. Error: ${error.message}`);
            }

            await new Promise(resolve => setTimeout(resolve, 3000)); 
        }

        ctx.reply('Finished adding members.');
    });
});

// Start the bot
bot.launch();
console.log('Bot started...');
Editor is loading...
Leave a Comment