Как решить api telegram проблему с блокировкой users?

109
05 августа 2019, 18:00

написал бота который должен блокировать абсолютно всех ново вступивших в чат (исключая тех username которых есть в базе)

Вот мой код:

$data = json_decode(file_get_contents('php://input'));
if (isset($data->{'message'}->{'chat'}->{'type'}) && $data->{'message'}->{'chat'}->{'type'} == 'supergroup')
{
  $id_user = $data->{'message'}->{'new_chat_members'}->{'id'};
  $id_chat = $data->{'message'}->{'chat'}->{'id'};
  $username_chat = $data->{'message'}->{'chat'}->{'username'};
  $username_user = $data->{'message'}->{'new_chat_members'}->{'username'};
  $query_count = mysqli_query($connect, "SELECT * FROM `telegram` WHERE `chat_username` = '".$username_chat."' AND `username` = '".$username_user."'");
  $query_count = mysqli_num_rows($query_count);
  if (!($query_count))
    file_get_contents("https://api.telegram.org/botHASH/restrictChatMember?chat_id=".$id_chat."&user_id=".$id_user);
}

Проблема в том что она не понятно работает, тех кто есть в базе он не банит четко, а вот обычных юзеров через раз, то забанит, то нет.

В чем тут проблема ?

Заранее спасибо!

Answer 1

Это потому, что вы берете только один invite, а вы должны принимать более 1 invite одновременно.

$data->message->new_chat_members - массив, в этом массиве все users которые были приглашены.

Исправил ваш код:

    if (isset($data->message->chat->type) && $data->message->chat->type === 'supergroup')
    {
        $id_chat = $data->message->chat->id;
        $username_chat = $data->message->chat->username;
        foreach ($data->message->new_chat_members as $value)
        {
            $query_count = mysqli_query($connect, "SELECT * FROM `tm` WHERE `chat_username` = '".$username_chat."' AND `username` = '".$value->username."'");
            $query_count = mysqli_num_rows($query_count);
            if (!($query_count))
                file_get_contents("https://api.telegram.org/botHASH/restrictChatMember?chat_id=".$id_chat."&user_id=".$value->id);
        }
    }
Answer 2

Достаточно сложно ответить причину без логирования в данном случае.

Я бы действовал следующим образом:

  1. нашел зайча который проскочил и смог проехать в в чат и не быть забаненым.
  2. сделать запрос в базу с этими данными пользователя и чата.
  3. Проверил что присылает база на этот запрос. может статься что вы не все знаете о данных которые хранятся у вас базе :-)

    $username_user = 'тут имя пользователя которого не забанили хотя должны были';
    $username_chat = 'тут соответственно чат пользователя имя которого написали выше';
    
    $query_count = mysqli_query($connect, "SELECT * FROM `telegram` WHERE `chat_username` = '".$username_chat."' AND `username` = '".$username_user."'");
    // и дальше смотрим что нам приезжает из базы. если Ваш if не отрабатывает значит база шлет какие-то данные, надо понять что там, следовательно var_dump в помощь.
    var_dump($query_count);
    
READ ALSO
Алгоритм заливки треугольника

Алгоритм заливки треугольника

Вот тут по сути алгоритм один и тот жеПодключил библиотеку, которая работает с изображениями

108
Массив с потокобезопасными объектами C++

Массив с потокобезопасными объектами C++

Допустим, у меня есть класс Foo

86
Как обратится к тексту на textEdit в qt?

Как обратится к тексту на textEdit в qt?

Мне нужно програмно изменить текст в QTextEditИ не знаю как к нему обратится, точнее к его тексту

114