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.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Ошибка с кодом 400: CHAT_ADMIN_REQUIRED
Для этого в указанном чате требуются права администратора чата (например, чтобы отправить сообщение в канале, который не принадлежит вам), или используются недопустимые разрешения для канала или группы.
Решение проблемы:
Если Вы работаете с Вашим аккаунтом и Вашей группой (пабликом), выдайте Вашему аккаунту в этой группе права администратора!
Выше предоставлено описание и возможное решение ошибки Телеграм с кодом 400 «CHAT_ADMIN_REQUIRED».
Вам, как пользователю программы стоит понимать, что данная ошибка может возникнуть как внезапно (например, если Ваш аккаунт уткнется в лимит Телеграм) так и прогнозируемо (например, если Вы не добавите аккаунт в Телеграм, или если Вы забыли добавить текст сообщения).
Однако, Вам стоить помнить что предложенный способ решения проблемы может не всегда быть подходящим для Вас. Но вы всегда можете найти эту ошибку в интернете. Возможно, там вы найдете более точный способ решения Вашей проблемы.
Так же, Вам нужно понимать что автор программы Telegram-Spam-Master может не знать, как решить вашу ошибку. Так что если в процессе поисков Вы найдете решение самостоятельно, было бы очень хорошо, если бы Вы поделились с ним этим решением!
Пора делать нормальных телеграм-ботов
Вы создаёте ботов в телеграме? Даже если нет, полезно будет знать о некоторых моментах, касающихся разработки телеграм-ботов. Никакого кода не будет, только картинки и описание 5 распространённых ошибок, которые меня — заядлого педанта в области разработки простых интерфейсов — раздражают
Ботов, которых я буду рассматривать, я нашёл в поиске по vc.ru.
1. Кнопки, которые крепятся к сообщениям, и кнопки, которые крепятся к клавиатуре, должны выполнять те функции, для которых предназначены (негласно).
Суть кнопок, которые крепятся к клавиатуре (как на скриншоте) — быстрый ввод. Вместо того, чтобы заставлять пользователя вводить определённую фразу или слово, можно сделать специальную кнопку как раз в том месте, где располагается клавиатура. Из-за того, что во многих ботах ввод пользователя проверяется по точному совпадению отправленного им сообщения, такие кнопки сильно упрощают взаимодействие с ботом, организовывая эффективный диалог, который можно будет перечитать. Если же получающийся диалог не несёт смысла, значит кнопки используются неправильно — как в боте на скриншоте: в нём эти кнопки используются для организации навигации по боту. Одну часть этих кнопок можно заменить на команды, другую часть — на кнопки, крепящиеся к сообщению. Например, как организовано в официальном боте:
2. Кнопки, крепящиеся к сообщению, засоряют чат не меньше встраиваемых в клавиатуру кнопок из предыдущего пункта.
Эти кнопки нужны как раз для визуального взаимодействия с ботом. Суть их в том, чтобы предоставить возможность взаимодействовать с ботом как с приложением. По нажатии на кнопку ожидаешь, что текст в сообщении обновится, меню перестроится, и будет хорошо, но внезапно становится больно от когнитивного диссонанса, возникающего после появления нового сообщения с новыми кнопками вместо обновления предыдущего. Иногда кнопки предыдущего сообщения удаляются, и присылаются новые, а предыдущее сообщение так и висит полуполоманное с двоеточием на конце и без продолжения в виде клавиатуры. Удалять предыдущее сообщение — тоже не вариант. Сообщение и клавиатуру нужно обновлять, и никак иначе.
Единственный случай, когда сообщение нельзя обновить таким образом — когда после нажатия на кнопку нужно отправить картинку и наоборот. В этом случае придётся сообщение удалить. Но технологическое описание решений не для этой статьи. Если хотите знать, как решить ту или иную проблему в реализации какой-то интерфейсной идеи — спрашивайте.
3. Нажатие на кнопки, крепящиеся к сообщению, нельзя оставлять без ответа.
В документации так и написано:
NOTE: After the user presses a callback button, Telegram clients will display a progress bar until you call answerCallbackQuery. It is, therefore, necessary to react by calling answerCallbackQuery even if no notification to the user is needed (e.g., without specifying any of the optional parameters).
В течение 30 секунд будет висеть индикатор ожидания реакции от бота на нажатие. В некоторых случаях серверы телеграма повторно отправляют запрос, если ответа не последовало. Это, наверное, самая часто встречающаяся проблема из тех, которые сильно бросаются в глаза. Об этом явно указано в документации, но почему-то разработчики усердно продолжают игнорировать эту пометку и раздражают пользователей индикаторами ожидания.
4. Сообщения, предполагающие ожидание, не должны оставаться на виду после отправки результата пользователю.
Сообщения легко обновлять. Насколько я знаю, сообщение для редактирования и удаления доступно в течение 48 часов (для ботов), а значит в случае, если ответ явно требует долгого ожидания, лучше не оставлять сообщение, которое всем своим видом показывает, что обновится по получении ответа. Во-первых, если оно обновится, пользователь не получит уведомление. Во-вторых, если срок обновления и удаления истечёт, то сообщение останется висеть в чате, и ничего с ним не сделать. Поэтому не стоит отправлять сообщения, которые собираетесь обновлять через долгий срок. Но если срок предполагается короткий, то сообщение нужно, разумеется, обновить, а не присылать следующее, как на скриншоте выше. Либо (ради уведомлений конечно) написать такой текст, в котором не подразумевается, что он будет изменён («По окончании обработки мы пришлём результат в ответном сообщении», ну или типа того).
5. Не плените пользователей, не становитесь спамерами.
Раньше я делал в своих ботах отдельную команду, чтобы пользователи могли удалять свои данные из базы во избежание возможных массовых рассылок активным пользователям. Правда, командой пользовались редко, и проще было отслеживать пользователей, которые заблокировали бота. Поэтому уважайте своих пользователей и не делайте подозрительных действий для телеграма типа массовых рассылок. Тех, кто заблокировал бота, помечайте флагом в базе как недоступных. Если хотите сделать рассылку, отправляйте сообщения не всем пользователям, а только активным за последние n часов или суток (если их не так много). Максимум можно отправить 30 сообщений в секунду (про каналы точно не могу сказать, я делаю только диалоговых ботов, но там сильно меньше). Если превысить лимит, бот перестанет получать запросы — попадёт в стоп-лист на некоторое время. Ограничение можно увеличить через техподдержку в случае необходимости (или свой сервер поднять).
Было трудно найти ботов, в которых именно описанные ошибки, потому что почти в каждом встречаются все сразу, и акцентировать внимание на чём-то определённом не получилось бы. Я буду продолжать эту и подобные темы в следующих статьях, поэтому если есть боты на проверку, предлагайте — так будет даже проще.
Делаем бот для обратной связи в 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 мы сможем посмотреть его профиль;