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

Удаление предыдущего приветственного сообщения.

Ребята у меня бот стандартный приветсвенный на РНР но постояльцев чата бесит что очень много приветсвенных сообщений. я хочу чтобы мой бот каждое отправленно приветсвенно сообщение фиксировал в pid.txt и когда приходил новый человек перед тем как отправить ему приветсвие он удалял из чата свое последнее приветсвие.
Таким образом если разом вступит 10 человек то не будет на 5 экранов висеть 10 приветсвенных текстов а будет лишь один.
Сейчас код выглядит так, но не удаление ни даже запись в файл не проходит(

 / Стартуем  бота
     * @return bool
     */
    public function init()
    {
        // получаем данные от АПИ и преобразуем их в ассоциативный массив
        $rawData = json_decode(file_get_contents('php://input'), true);
        // направляем данные из бота в метод
        // для определения дальнейшего выбора действий
        $this->router($rawData);
        // в любом случае вернем true для бот апи
        return true;
    }

    / Роутер - Определяем что делать с данными от АПИ
     * @param $data
     * @return bool
     */
    private function router($data)
    {
        // проверяем массив данных на нужный нам ключ
        if (array_key_exists("new_chat_participant", $data['message'])) {
            // достаем имя нового пользователя
            $name = trim($data['message']['new_chat_participant']['first_name']
                . ' ' . $data['message']['new_chat_participant']['last_name']);
            // отправляем приветствие в чат
            $pid_del_id = $this->botApiQuery("sendMessage", $data_send);
file_put_contents('pid.txt',$pid_del_id);
$data_send['message_id'] = $pid_del_id;
$this->botApiQuery("deleteMessage", $data_send);

$pid_del_id =  $this->botApiQuery("sendMessage", [
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => str_replace("{%username%}", $name, $this->helloText),
'disable_web_page_preview' => true,
 'parse_mode' => 'HTML'
                ]
            );

        }
        return true;
    }

Ответы


  • iMakeBots [11.09.2019 в 10:28 → Грачик Абдулошвили]
    Привет, у тебя логика неверная:

    1. отправляешь сообщение с пустыми данными ($data_send) - записываешь в переменную $pid_del_id массив[] ответа после результата отправки - будет массив с ошибкой
    2. записываешь массив[] ответа $pid_del_id в файл
    3. $data_send['message_id'] присваиваешь массив[] ответа
    4. удаляешь сообщение с неправильными данными (во-впервых в message_id дожнен быть int, во-вторых $data_send - не полный - отсутствует chat_id) - будет ошибка

    Попробуйте вот этот код, правда его не тестировал

    
    header("HTTP/1.1 200 OK");
    header('Content-type: text/html; charset=utf-8');
    $newBot = new HelloBot();
    $newBot->init();
    
    class HelloBot
    {
        private $token = "TOKEN";
        private $helloText = "Hola, {%username%}! рады видеть вас в нашем чате.";
    
       public function init()
        {
            $rawData = json_decode(file_get_contents('php://input'), true);
            $this->router($rawData);
            return true;
        }
    
        private function router($data)
        {
            if (array_key_exists("new_chat_participant", $data['message'])) {
                $name = trim($data['message']['new_chat_participant']['first_name']
                    . ' ' . $data['message']['new_chat_participant']['last_name']);
                $messageHello = $this->sendHello($data['message']['chat']['id'], $name);
                $this->delOld();
                $this->recData($data['message']['chat']['id'], $messageHello['result']['message_id']);
            }
            // удаление служебных сообщений в чате Телеграм
            if(array_key_exists("new_chat_participant", $data['message']) || array_key_exists("left_chat_participant", $data['message'])) {
            	$this->botApiQuery("deleteMessage", [
                        'chat_id' => $data['message']['chat']['id'],
                        'message_id' => $data['message']['message_id']
                    ]);
            }
            return true;
        }
    
        private function sendHello($chat_id, $name) 
        {
            return $this->botApiQuery("sendMessage", [
                    'chat_id' => $chat_id,
                    'text' => str_replace("{%username%}", $name, $this->helloText),
                    'disable_web_page_preview' => true,
                    'parse_mode' => 'HTML'
                ]);
        }
    
        private function recData($chat_id, $message_id) {
                $handler = fopen("pid.txt", "w");
                fwrite($handler, $chat_id . "||" .$message_id);
                fclose($handler);
        }
    
        private function delOld() {
        	if(file_exists("pid.txt")) {
                $data = file_get_contents("pid.txt");
                $data_ = explode("||", $data);
                $this->botApiQuery("deleteMessage", [
                        'chat_id' => $data_[0],
                        'message_id' => $data_[1]
                    ]);
        	}
        }
    
        private function botApiQuery($method, $fields = array())
        {
            $ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);
            curl_setopt_array($ch, array(
                CURLOPT_POST => count($fields),
                CURLOPT_POSTFIELDS => http_build_query($fields),
                CURLOPT_SSL_VERIFYPEER => 0,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_TIMEOUT => 10
            ));
            $r = json_decode(curl_exec($ch), true);
            curl_close($ch);
            return $r;
        }
    }
  • Грачик Абдулошвили [11.09.2019 в 15:12 → iMakeBots]
    ооо супер! То что нужно! Всем советую пользоваться.