← Вернуться к списку тем

Бот одобрил заявку на вступление но все еще не может писать в личку

Бот админ группы. Юзер кидает заявку на вступление. Бот её принимает методом approveChatJoinRequest.

После этого пытаюсь ботом написать этому пользователю сообщение методом SendMessage, но получаю сообщение с forbitten от api. Почему? Бот же должен уметь писать первым, если ранее одобрял заявку на вступление

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.

  • iMakeBots [1 год назад]

    Только сейчас удалось организовать ситуацию для теста. У меня получилось, удалял-останавливал бота (в том числе и из черного списка) - запускал повторно заявку - все проходило как и запланировано.

    <?php
        $bot_token = "TOKEN_BOT";
        
        $data = json_decode(file_get_contents("php://input"));
        
        $query = function ($method, $fields = []) use ($bot_token) {
            $ch = curl_init("https://api.telegram.org/bot" . $bot_token . "/" . $method);
            curl_setopt_array($ch, [
                CURLOPT_POST => count($fields),
                CURLOPT_POSTFIELDS => http_build_query($fields),
                CURLOPT_SSL_VERIFYPEER => 0,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_TIMEOUT => 10
            ]);
            $result = json_decode(curl_exec($ch), true);
            curl_close($ch);
            return $result;
        };
        
        $sendMessage = function($chat_id, $text) use ($query) {
            return $query("sendMessage", [
                "chat_id" => $chat_id,
                "text" => $text
            ]);
        };
        
        $approveChatJoinRequest = function($chat_id, $user_id) use ($query) {
            return $query("approveChatJoinRequest", [
                "chat_id" => $chat_id,
                "user_id" => $user_id
            ]);
        };
        
        if (isset($data->message)) {
            if (isset($data->message->text)) {
                if ($data->message->text == "/start") {
                    $sendMessage(
                        $data->message->from->id, 
                        "Start Test"
                    );
                }
            }
        } elseif(isset($data->chat_join_request)) {
            $approveChatJoinRequest(
                $data->chat_join_request->chat->id, 
                $data->chat_join_request->from->id
            );
            $sendMessage(
                $data->chat_join_request->from->id, 
                "Approve Test"
            );
        }
  • Vitaliy Monashenkov [1 год назад → iMakeBots]

    Ваш пользователь точно до этого с ботом не общался?

    Если ранее общался, то и у меня сообщение доходит. Важно, чтобы пользователь до этого в диалог с ботом не вступал. 

  • iMakeBots [1 год назад → Vitaliy Monashenkov]

    Создал нового бота, проверил - не пишет. Ошибка как у вас:

    {
      "ok":false,
      "error_code":403,
      "description":"Forbidden: bot can't initiate conversation with a user"
    }

    Скорее всего удаленные и остановленные боты, все равно имеют право писать первыми. 

    Возникает вопрос: как тогда устроено у некоторых каналов, где после подтверждения заявки бот пишет пользователю первым? 

    Возможно это уже сделано на уровне Telegram Core Api?

  • Vitaliy Monashenkov [1 год назад → iMakeBots]

    В ченджлоге бот апи от 7 декабря 2021 написано:

    Bots are now allowed to contact users who sent a join request to a chat where the bot is an administrator with the can_invite_users administrator right – even if the user never interacted with the bot before.

    То есть реализовать через бот апи можно, но где-то ошибка в логике. 

  • iMakeBots [1 год назад → Vitaliy Monashenkov]

    Нашел инфу где была такая же проблема, указано, что решение такое: В канале или группе до бота, которому разрешено подтверждать\отклонять заявки - не должно быть других ботов ранее.

    Создал новый канал, добавил бота админом. Запустил бот - подал заявку с аккаунта , который с ботом не общался. Все получилось. Проверил на другом аккаунте. Также все получилось.

  • Vitaliy Monashenkov [1 год назад → iMakeBots]

    К сожалению, мне не помогло.

    Для чистоты эксперимента создал новую группу для себя и бота. Назначил его админом. Изменил настройки группы, чтобы были заявки на вступление.

    Другим пользователем подаю заявку, бот её одобряет, но на попытку написать этому пользователю в личку всё ещё форбидден ((

  • iMakeBots [1 год назад → Vitaliy Monashenkov]

    Последний раз я на канале тестировал

  • Vitaliy Monashenkov [1 год назад → iMakeBots]

    Попробовал с каналом, работает.

    Жаль что не работает с группой, толку тогда от этой функции ((