Ошибка с кодом 400: CHAT_ADMIN_REQUIRED
Для этого в указанном чате требуются права администратора чата (например, чтобы отправить сообщение в канале, который не принадлежит вам), или используются недопустимые разрешения для канала или группы.
Решение проблемы:
Если Вы работаете с Вашим аккаунтом и Вашей группой (пабликом), выдайте Вашему аккаунту в этой группе права администратора!
Выше предоставлено описание и возможное решение ошибки Телеграм с кодом 400 «CHAT_ADMIN_REQUIRED».
Вам, как пользователю программы стоит понимать, что данная ошибка может возникнуть как внезапно (например, если Ваш аккаунт уткнется в лимит Телеграм) так и прогнозируемо (например, если Вы не добавите аккаунт в Телеграм, или если Вы забыли добавить текст сообщения).
Однако, Вам стоить помнить что предложенный способ решения проблемы может не всегда быть подходящим для Вас. Но вы всегда можете найти эту ошибку в интернете. Возможно, там вы найдете более точный способ решения Вашей проблемы.
Так же, Вам нужно понимать что автор программы Telegram-Spam-Master может не знать, как решить вашу ошибку. Так что если в процессе поисков Вы найдете решение самостоятельно, было бы очень хорошо, если бы Вы поделились с ним этим решением!
Telegram Bot API возвращает CHAT_ADMIN_REQUIRED, хотя бот имеет все права
Я пишу telegram-бота (библиотека tgbot-cpp), и при вызове promoteChatMember я получаю исключение Bad Request: CHAT_ADMIN_REQUIRED , хотя бот имеет все права так и в группе, так и в настройках через BotFather:
Я отправлял такой запрос через https, не используя никаких библиотек, но проблема та же. Что могло пойти не так? Вот сам код:
static void revokeAdmin(BotInfo& botInfo, const TgBot::Message::Ptr& message) < // spdlog::debug("Promoting admin. "); // Я являюсь владельцем группы, поэтому необязательно меня продвигать. // botInfo.bot.getApi().promoteChatMember(message->chat->id, message->from->id, true); botInfo.bot.getApi().promoteChatMember(message->chat->id, message->replyToMessage->from->id); >
( botInfo содержит самого бота и прочую информацию о нём, все параметры передаются правильно. Его поле bot имеет тип TgBot::Bot ).
Отслеживать
user570514
задан 20 окт 2023 в 16:17
user570514 user570514
1 2 2 бронзовых знака
Покажите ваш код.
20 окт 2023 в 16:18
Я изменил вопрос, добавил код.
20 окт 2023 в 16:26
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Ответ прост: бот не может повышать/понижать администраторов, создателей.
Отслеживать
ответ дан 27 окт 2023 в 14:35
user570514 user570514
1 2 2 бронзовых знака
- telegram-bot
- telegram
- бот
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951
Сбор информации о подписчиках Telegram-канала
На 2021 год боты в Telegram так и не имеют метода, позволяющего получать информацию о подписчиках канала. Тем не менее, существует достаточно сложное в освоении Telegram API и построенная на нём библиотека Telethon. Сегодня мы посмотрим, как при помощи библиотеки выгрузить информацию о подписчиках своего канала.
Создание приложения
Для начала необходимо создать приложение, через которое будут отправляться запросы к API. Перейдите на https://my.telegram.org и авторизуйтесь в Telegram-аккаунте:

После успешной авторизации перейдите на страницу API development tools:

Заполните все поля и жмите на создание приложения:

Из полученной конфигурации нам необходим app api_id и app api_hash:

Запрос к API
Импортируем telethon — он поможет сформировать запрос, и pandas — полученный ответ мы запишем в DataFrame.
from telethon import TelegramClient import pandas as pd
Вводим api_id, api_hash, наш номер телефона и ссылку на канал, информацию о подписчиках которого хотим получить. Доступ к информации о подписчиках есть только у администраторов канала.
api_id = 1234567 api_hash = '1b42hj25kd8jw42b234kwj242c' phone = '+71234567890' channel_href = 'https://t.me/leftjoin'
Создаём новую сессию — вместо session_name можно подставить любое другое название. Методы в библиотеке работают асинхронно, поэтому ответа от них требуется ожидать:
client = TelegramClient('session_name', api_id, api_hash) client = await client.start() dialogs = await client.get_dialogs()
Собираем все каналы текущего пользователя. Из ссылки забираем часть с именем канала и вытаскиваем из словаря нужный:
channels = my_channel = channel_href.split('/')[-1] channel = channels[my_channel]
Подписчиков, доступ к которым не ограничен приватностью, можно получить методом get_participants. С 20 июля 2018 года Telegram установил ограничение в 200 подписчиков для вызова метода, и установка параметра aggressive на True поможет получить всех подписчиков за раз.
members_telethon_list = await client.get_participants(channel, aggressive=True)
Из полученных библиотечных структур извлекаем информацию о пользователях — их имена и телефоны:
username_list = [member.username for member in members_telethon_list] first_name_list = [member.first_name for member in members_telethon_list] last_name_list = [member.last_name for member in members_telethon_list] phone_list = [member.phone for member in members_telethon_list]
Из четырёх списков собираем DataFrame и пишем его в csv-таблицу:
df = pd.DataFrame() df['username'] = username_list df['first_name'] = first_name_list df['last_name'] = last_name_list df['phone'] = phone_list df.to_csv('subscribers.csv', index=False)
Результат работы — такая таблица:

Для запуска в Jupyter Notebook описанный ниже код можно просто вставить в ячейку, но при запуске из Python-файла будет такая ошибка:
SyntaxError: 'await' outside function
Устранить проблему можно, записав весь код в асинхронную функцию. Целиком выглядеть код будет так:
from telethon import TelegramClient import pandas as pd import asyncio async def main(): api_id = 1234567 api_hash = '1b42hj25kd8jw42b234kwj242c' phone = '+71234567890' channel_href = 'https://t.me/leftjoin' client = TelegramClient('session_name', api_id, api_hash) client = await client.start() dialogs = await client.get_dialogs() channels = my_channel = channel_href.split('/')[-1] channel = channels[my_channel] members_telethon_list = await client.get_participants(channel, aggressive=True) username_list = [member.username for member in members_telethon_list] first_name_list = [member.first_name for member in members_telethon_list] last_name_list = [member.last_name for member in members_telethon_list] phone_list = [member.phone for member in members_telethon_list] df = pd.DataFrame() df['username'] = username_list df['first_name'] = first_name_list df['last_name'] = last_name_list df['phone'] = phone_list df.to_csv('subscribers.csv', index=False) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Поделиться
Поделиться
28 комментариев
Что-то не работает. Ругается: SyntaxError: ’await’ outside function

Николай Валиотти 2021
Добрый день! Проверили способ прямо сейчас — у нас всё работает. Пришлите, пожалуйста, свой код (можно через gist.github.com) и версию Python.
Да я вообще не очень разбираюсь в Python’е. Только начал учить буквально на днях. Парсер чатов-то сделал, но там попроще было (на другом сайте), а сейчас понадобился для дела свой канал собрать, а там такие камни подводные 🙂

Николай Валиотти 2021
В Python вовсе необязательно разделять отдельные участки кода на функции, как, например, в C 🙂 Попробуйте написать без них, просто записывая последовательно все команды из материала в файл — должно получиться вот так: https://gist.github.com/Elisejj/aec7867e5da55e295d148882ae41488c
Если так делать, то он снова на await ругается: SyntaxError: ’await’ outside function
Я ж с такой «атаки в лоб» и начинал 🙂 В общем, вот такое решение у меня работает (всё парсит и файл сохраняет): https://gist.github.com/Mnsrff/9cba7a3231034fac900dd00b692d7c0f
Но хотелось бы разобраться, почему так 🙂 Почему у вас без функций всё работает, а я вынужден был всё в них заворачивать и вызывать 🙂 Python 3.7 у меня. Библиотеки установлены.
Marsel Kh 2021
Добрый день. Спасибо за код.
А с чем может быть связано несовпадение количества участников группы и количество выгруженных? Подписчики могут где-то ограничить приватность и не светиться в группах?
А то у меня из 574 юзеров выгружается только 470, хотя последний элемент в members_telethon_list total равняется 574.

Николай Валиотти 2021
Да, я подозреваю, что дело в настройках приватности у ряда пользователей, которые не дают свои данные выгрузить. У меня была аналогичная ситуация с экспортом собственных подписчиков.
Максим Игоревич 2021
Добрый день.
Подскажите пожалуйста, как вытащить ID юзеров.
Максим Игоревич 2021
Михаил Артемьев 2021
Подскажите, есть ли способ получить список подписчиков канала, которые были удалены?

Николай Валиотти 2021
насколько мне известно, нет, увы, их уже не получить
Ольга Телюкова 2021
Мы пробрасываем лиды из ФБ в телегу и гугл таблицы через Webjack. Сервис работает как часы.
Можно получить месяц халявы и бесплатную настройку по промокоду semen21, напишите его в чат техподдержки на сайте
Александр 2021
Здравствуйте! Подскажите пожалуйста, возможно ли узнать, кто-нибудь мог таким образом спарсить подписчиков с моего канала?

Николай Валиотти 2021
вся статья об этом, вы ее читали?
Александр 2021
Читал, но ничего не понял)))
У меня есть канал, и ощущение что один из админов спарсил моих подписчиков. Могу ли я как-то это проверить.
П.С.: Извиняюсь, если мой вопрос для Вас совсем тупой. Я чукча)
Роман Лыжов 2022
Добрый день
У меня почему-то выдает ошибку:
KeyError Traceback (most recent call last)
C:\Users\Public\Documents\Wondershare\CreatorTemp/ipykernel_7648/3941792516.py in
15 if d.is_channel>
16 my_channel = channel_href.split(’/’)[-1]
—-> 17 channel = channels[my_channel]
18
19 members_telethon_list = await client.get_participants(channel, aggressive=True)
Хотя канал существует, при выполнении даже был запрос на авторизацию с подтверждением через телеграм.
Канал @TestChannelRomanLyzhov свежесозданный, для теста.
Сможете помочь?

Николай Валиотти 2022
А у меня не находит ваш канал: TestChannelRomanLyzhov. Он доступен в паблике?
Давид 2022
Привет, у меня выскакивает вот такая ошибка DeprecationWarning: There is no current event loop
loop = asyncio.get_event_loop() в чём дело и как сделать чтобы ко работал
Абдуллаев Тимур 2022
Здравствуйте. Можно ли парсить телеграм каналы в которых я состою в свой личный?
Допустим у меня будут два моих канала в 1ый- будут рассылаться сообщения, картины которые парсит бот, чтобы я там мог редактировать(к примеру парсит картину и цену товара и мне нужно в своем 1ом канале иметь доступ к редактированию) и во 2ой канал уже будет рассылаться готовый контент.
Заране спасибо за ответ)
Ник Бул 2022
Добрый день!
Выскакивает ошибка :
telethon.errors.rpcerrorlist.BotMethodInvalidError: The API access for bot users is restricted. The method you tried to invoke cannot be executed as a bot (caused by GetDialogsRequest)
Как я понял, не возможно добавить бота в канал. Есть ли хук или другой метод, что бы получить информацию о пользователях группы, в которую бот не добавлен как участник?

Николай Валиотти 2022
А что мешает добавить бота в свой канал?
Ник Бул 2022
В этом и суть, канал не мой)

Николай Валиотти 2022
Тогда у вас ничего не выйдет. Это метод для работы с собственным каналом
Алексей 2022
Здравствуйте, смогу ли я спарсить подписчиков с канала, в котором я администратор, а не владелец?
Руслан Трифонов 2022
Добрый день! Не могу получить данные на этапе создания нового приложения, ничего не происходит https://prnt.sc/_bby94Pk7OR3 нажимаю ок и все, дальше ничего нет.

Николай Валиотти 2022
Ну, это вам в суппорт Телеграмма
Ivan Mashtalov 2022
Такую ошибку выдает:
line 11
client = TelegramClient(’session_name’, api_id, api_hash)
TabError: inconsistent use of tabs and spaces in indentation

Николай Валиотти 2022
Очевидно, что у вас что-то не так с индентацией?
Доценко Даниил 2022
Здравствуйте, уже который месяц пытаюсь решить проблему которые вы описываете в этом посте. Но однако ваш метод не является рабочим в данный момент. Список участников канала как был ограничен 200 сотнями так и остается, если я конечно же все правильно понимаю.

Николай Валиотти 2022
Не понял, что за ограничение в 2 сотни? у меня ограничения на выгрузку не было.
Доценко Даниил 2022
Это снова я, пытаюсь достать списко своих подписчиков которых сейчас 500. Если добавляюАГРЕССИВ = true вылазит такая ошибка.
telethon.errors.common.MultiError: ([None, None, FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), None, FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), FloodWaitError(’A wait of 30 seconds is required (caused by GetParticipantsRequest)’), F[, , None, , None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None], [, , ,
Александр Ко 2022
Николай, благодарю за статью, код работает!
Но агрессив не получается применить на группе, у меня там 14к человек, он пишет, что слишком много попыток, и дропает парсинг.
Можете проверить, как это работает сейчас?
Буду признателен, если подскажете, как это обойти.
Делаем бот для обратной связи в Telegram
Очень полезный помощник для администратора канал в Telegram. Позволяет общаться с подписчиками канала. Все диалоги в одном окне. Возможность использовать весь функционал Телеграм для получения обратной связи.
Вариант бота на Node.js описан в отдельной статье
Немаловажная часть работы администратора Телеграм канала — это конечно же работа с обратной связью. Многое приходит из общения с подписчиками, ведь они и оценивают ваш труд, и подсказывают где у вас недочеты, бывает даже подкинут новую идею. Они всегда будут вам благодарны если вы открыты для общения, и у вас налажена обратная связь, которой удобно и легко пользоваться. В этой статье я хочу поделиться своим ботом для взаимодействия с подписчиками, который я уже использую. Для начала нам в качестве необходимых параметров нам нужно знать наш личный ID Telegram (через бот @userinfobot) и Token API нашего бота. * * *
Начинаем работать
Данные от Bot API приходят в формате application/json, поэтому доступа к ним через массив $_POST нет, и брать их будем в «сыром», необработанном виде через ‘php://input’ используя встроенную функцию PHP file_get_contents(). В работе мы будем использовать кодировку UTF-8, это требование Telegram Bot API. Определим ее в начале скрипта index.php. Создадим класс Bot, для начала добавим ему два приватных свойства и один публичный метод. Очень часто я в коде буду использовать в качестве условного оператора тернарный оператор.
init('php://input'); // Класс Bot class Bot < // токен API private $botToken = "34069ХХХХ:XXXXXXXXXXXX-XXXXXXXXXXXXKVW3qILFpY"; // Ваш ID Telegram private $adminId = 123456789; // инициализируем объект класса public function init($data) < >> ?>
Создадим еще один метод, сделаем его приватным т.к. он нужен нам только внутри класса, вызываться из вне как публичный метод init() он не будет. Его задача будет преобразовывать через функцию json_decode() преданные ему данные из JSON в ассоциативный массив, назовем его getData() .
Для отладки можно создать метод, который будет записывать в файл все результаты работы метода getData(). Это очень удобно, ведь можно посмотреть какую информацию отправляет нам Bot API. На входе он принимает результат метода getData(). Вызывать метод можно вот так: $this->setFileLog($data);
Находим наш бот в Telegram и запускаем его. Бот примет нашу команду Strat/Старт, обработает и запишет результат в файл. Теперь мы можем рассмотреть содержимое файла.
Array ( [update_id] => 22918823 [message] => Array ( [message_id] => 1 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => Name [last_name] => Surname [language_code] => ru ) [chat] => Array ( [id] => 123456789 [first_name] => Name [last_name] => Surname [type] => private ) [date] => 1512554545 [text] => /start [entities] => Array ( [0] => Array ( [offset] => 0 [length] => 6 [type] => bot_command ) ) ) )
Как видно из содержимого, приходит много служебной информации. Сейчас нас интересует элемент массива $data[‘message’] , который тоже является массивом и содержит в себе информацию, с которой предстоит работать. Проверяя наличие нужных нам ключей в массиве, мы можем определить какой тип данных был отправлен боту. Для данного бота важно определить кто написал, ведь от этого зависит куда направлять сообщение. У нас предусмотрено две роли: администратор и пользователь. Есть еще один участник — это сам бот. Мы его будет определять по специальному флагу, но это чуть позже. * * *
Мои первые ошибки
В начале, когда я делал этого бота, то потратил время на написание лишней логики. Бот принимал сообщения от пользователя проверял тип и направлял его админу как новое сообщение с вложенной кнопкой «Ответить», при нажатии на которую происходила временная запись в файл id пользователя, и бот следующим действием ждал сообщение от админа для ответа пользователю. Получилось много ненужного кода, каких-то проверок и вообще пользоваться было не удобно. Также если админ начал писать ответ, то написать ему еще одно сообщение, даже другому пользователю было нельзя пока админ не закончит. Еще ограничение было если у пользователя не задан @userName, то просмотреть его профиль было никак. Конечно придумать хаки для достижения полной работоспособности этой логики можно было, но все оказалось намного проще.
После создания этого бота в Телеграм добавлена возможность отключения пользователям пересылки, в этом случае бот не может работать в предложенном варианте. Решение этой проблемы не сложное. Обновление скоро будет на сайте.
Решение пришло из официальной документации
Когда сообщение переслано, то в нем видно кто написал, и даже если у пользователя нет @userName мы сможем посмотреть его профиль;