Задать вопрос
avgustov
@avgustov

Как получить список всех участников телеграм группы?

Всем добрый день, пробую получить список участников группы но в файл записывается только 200 штук, при щапуске скрипта идет просто бесконечно одна и таже строчка
[2024-11-20T19:00:26.495] [INFO] - [Sleeping for 9s on flood wait (Caused by channels.GetFullChannel)]

всю голову уже сломал просьба подсказать в каком направлении копать что бы решить задачку

Код скрипта

const { TelegramClient } = require("telegram");
const { StringSession } = require("telegram/sessions");
const input = require("input"); 
const fs = require("fs");

const apiId = 00000000; 
const apiHash = "ххххххххххххххххххххххххххххх"; 
const channelId = -100000000000;
const sessionFile = "session.txt"; 
const outputFile = "output.txt";

const sessionString = fs.existsSync(sessionFile) ? fs.readFileSync(sessionFile).toString() : "";

const client = new TelegramClient(new StringSession(sessionString), apiId, apiHash, {
  connectionRetries: 5,
});

(async () => {
  console.log("Запуск клиента...");
  // Авторизация пользователя
  await client.start({
    phoneNumber: async () => await input.text("Введите номер телефона (с кодом страны): "),
    password: async () => await input.text("Введите пароль от двухэтапной аутентификации (если есть): "),
    phoneCode: async () => await input.text("Введите код подтверждения из Telegram: "),
    onError: (err) => console.error("Ошибка авторизации:", err),
  });

  console.log("Авторизация завершена.");
  fs.writeFileSync(sessionFile, client.session.save());

  console.log("Получение участников канала...");

  let allParticipants = [];
  let offset = 0;
  let limit = 200; 
  let finished = false;

  while (!finished) {
    try {
      const participants = await client.getParticipants(channelId, { offset_id: offset, limit });
      if (participants.length === 0) {
        finished = true; 
      } else {
        allParticipants = allParticipants.concat(participants);
        offset = participants[participants.length - 1].id; 
      }
    } catch (error) {
      if (error.message.includes("Flood wait")) {
        const waitTime = parseInt(error.message.split(" ")[5], 10); 
        console.log(`Flood wait detected. Sleeping for ${waitTime} seconds.`);
        await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
      } else {
        console.error("Ошибка при получении участников:", error);
        break;
      }
    }
  }

  console.log(`Найдено ${allParticipants.length} участников.`);

  const participantData = allParticipants.map((user) => {
    return `${user.id} | ${user.firstName} | ${user.lastName || ''} | ${user.username || ''} | ${user.phone || ''}`;
  }).join("\n");

  fs.writeFileSync(outputFile, participantData);

  console.log(`Список участников сохранён в файл: ${outputFile}`);
  await client.disconnect();
  console.log("Клиент отключён.");
})();

  • Вопрос задан
  • 214 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@Vadiar
для получения списка всех участников надо будет использовать тулзу Pyrogram(Видел нечто подобное на ноде) и использовать свой акк, который должен быть админом в группе.
пример кода
from pyrogram import Client, filters
chat_id = -1234 #указываем айдишник чата. 
def main():
    app.start() #запускаем пирограм, погугли сам как авторизоваться и получить токен АПИ 
     for member in app.get_chat_members(chat_id):
          print(member.user.first_name)    #здесь творим чо хотим с объектом мембер, хотим сохраняем полностью) хотим дергаем нужные данные) 
    app.stop() #останавливаем пирограм) 
main()
print("finish")


Очень часто этой фичей пользоваться не рекомендуется, могут влепить временный бан)
в очень больших группах тоже не рекомендую использовать)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы