Jump to content

sergeevizh

Пользователь
  • Content Count

    378
  • Joined

Posts posted by sergeevizh

  1. 1 минуту назад, founder сказал:

     

    Спасибо! Ошибок нет.

    Теперь хочу сделать отправку через форму в админке

    В simpla/SubscribeMailingAdmin.php добавляю:

    
            if ($this->request->method('post') && $this->request->post('send_message')) {
                $message = $this->request->post('message');
                if (!empty($message)) {
                    $this->telegram->sendBroadcast($message);
                    $this->design->assign('message_success', 'Сообщение успешно отправлено.');
                } else {
                    $this->design->assign('message_error', 'Сообщение не может быть пустым.');
                }
            }

    в а шаблоне форма:

    
    <form method="post">
        <label for="message">Сообщение:</label><br>
        <textarea id="message" name="message" rows="4" cols="50" required></textarea><br>
        <input type="submit" name="send_message" value="Отправить">
    </form>

    Но тогда сообщения не отправляются

    Скиньте все файлы мне в ТГ в профиле есть 

  2. 2 часа назад, founder сказал:

    Alexivchenko, подскажите, пожалуйста, по рассылке.

    нужно дописать код в api/UsersTelegram.php или можно обойтись только simpla/SubscribeMailingAdmin.php?

    Я сейчас сделал проще, на основе api/UsersTelegram.php
    Добавил в api/Simpla.php класс

    'telegram' => 'UsersTelegram'

    Потом в api/UsersTelegram.php после функции addUser дбавил

    	//SEND
    	public function sendBroadcast($message) {
    		
    		// Получаем всех подписчиков из базы данных
    		$subscribers = $this->getSubscribers();
    	
    		foreach ($subscribers as $subscriber) {
    			$chatId = $subscriber->telegram_id;
    			$postFields = [
    				'chat_id' => $chatId,
    				'text' => $message
    			];
    	
    			// Отправляем сообщение пользователю
    			$this->botApiQuery("sendMessage", $postFields);
    		}
    	}
    
    
    	private function getSubscribers() {
    		$query = $this->db->placehold("SELECT * FROM __users");
    		$this->db->query($query);
    		return $this->db->results();
    	}	
    	//SEND END

    Потом в функцию sendBroadcast отправляем любое сообщение, функция в getSubscribers собирает всех в таблице БД и отправляет им указанное сообщение.

    Сообщения по базе отправляются.

    Для проверки, создайте в корне сайта файл, TgTest.php с кодом 

    <?
    require_once('api/Simpla.php');
    $simpla = new Simpla();
    
    $message = "Какой-то текст";
    
    $simpla->telegram->sendBroadcast($message);

     Обратитесь к нему и отталкивайтесь от ошибок, если будут.

  3. 4 часа назад, get31 сказал:

    а как наоборот добавить слеш в конце site.com/simpla?

    Думаю многие сталкивались заходом в админку https://site.com/simpla где нужно ввести почту админа, приходилось ставить "/" в адрес чтобы нормально зайти
     

    
    
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    не помогло

    Чтобы правильно ответить, нужно понять какие правила у вас уже указаны. Правило которое вы указали выше можно сократить в 2 строчки. 
    Приложите свой файл .htaccess

     

  4. 1 час назад, get31 сказал:

    Я хочу разрешить в textarea использовать <b>, <i> но запретить <a> <ul> и тд

    Добавляю в Smarty/libs/plugins/ файл с названием modifier.strip_tags.php

    
    <?php
    
    function smarty_modifier_strip_tags($input, $allowed_tags = '<b><i>') {
        return strip_tags($input, $allowed_tags);
    }
    
    ?>

    в шаблоне вывожу |strip_tags:'<b><i>' но не работает, что сделал не так?

    так не работает, нужно не создавать плагин в Smarty, а прописать функцию в api/Design.php по аналогии time_modifier

  5. 21 час назад, get31 сказал:

    нам нужно 2 файла

    в корень кидаем webHook.php без изменений

    
    <?php
    // определим кодировку UTF-8
    header("HTTP/1.1 200 OK");
    header('Content-type: text/html; charset=utf-8');
    // подключаем класс авторизации
    require_once("api/UsersTelegram.php");
    // создаем объект авторизации
    $auth = new Auth();
    // запускаем
    $auth->init();
    ?>



    в api/UsersTelegram.php пишу вот так:

    
    <?php
    
    require_once('Simpla.php');
    
    class UsersTelegram extends Simpla
    {
        // Токен API BOT
        private $token = "___TYT___TOKEN____";
        
        public function __construct()
        {
            parent::__construct(); // Вызов конструктора родительского класса, если он есть
        }
    
        /** Инициализируем работу класса
         * @return bool
         */
        public function init()
        {
            // Получаем данные от API и преобразуем их в ассоциативный массив
            $rawData = json_decode(file_get_contents('php://input'), true);
            // Направляем данные из бота в метод для определения дальнейших действий
            $this->router($rawData);
            // В любом случае возвращаем true для API Bot
            return true;
        }
    
        /** Роутер
         * @param $data array
         * @return bool
         */
        private function router($data)
        {
            // Проверяем на объект Message
            if (array_key_exists("message", $data)) {
                // Получаем чат
                $chat_id = $data['message']['chat']['id'];
                // Проверяем на наличие объекта Text
                if (array_key_exists("text", $data['message'])) {
                    // Получаем значение отправленных данных
                    $text = $data['message']['text'];
                    // Если это просто старт бота
                    if ($text == "/start") {
                        // Отправляем сообщение
                        $this->botApiQuery("sendMessage", [
                            'chat_id' => $chat_id,
                            'text' => 'Бот авторизации'
                        ]);
                        // Передаем данные пользователя в метод для добавления в БД
                        $this->addUserToDatabase($data['message']);
                    } else {
                        // Просто пишем чего-нибудь в чат
                        $this->botApiQuery("sendMessage", [
                            'chat_id' => $chat_id,
                            'text' => 'Неизвестная команда'
                        ]);
                    }
                } else {
                    // Просто пишем чего-нибудь в чат
                    $this->botApiQuery("sendMessage", [
                        'chat_id' => $chat_id,
                        'text' => 'Неизвестный формат сообщения'
                    ]);
                }
            }
            // Другие объекты не рассматриваем
            return true;
        }
    
        /** Добавление пользователя в БД
         * @param $message array
         */
    private function addUserToDatabase($message)
    {
        // Инициализация класса Users для работы с БД
        $users = new Users();
        
        // Подготовка данных пользователя
        $user = [
            'telegram_id' => $message['chat']['id'],
            'username' => $message['chat']['username']
        ];
    
        // Проверяем, существует ли пользователь с таким telegram_id
        $existingUser = $users->get_user($user['telegram_id']);
        if ($existingUser) {
            // Если пользователь существует, можно обновить данные или просто проигнорировать
            $text = "Вы уже зарегистрированы.";
        } else {
            // Если пользователь не существует, добавляем нового
            $userId = $users->add_user($user);
            if ($userId) {
                $text = "Вы успешно зарегистрированы.";
            } else {
                $text = "Произошла ошибка при регистрации.";
            }
        }
    
        // Отправляем сообщение пользователю
        $this->botApiQuery("sendMessage", [
            'chat_id' => $message['chat']['id'],
            'text' => $text
        ]);
    }
    
    
        /** Работаем с API BOT
         * @param $method
         * @param array $fields
         * @return mixed
         */
        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;
        }
    }
    ?>

    в боте нажимаю /start и данные не добавляются в БД((((

    Ну как-то так: 

    1. в корень кидаем webHook.php

    <?php
    // определим кодировку UTF-8
    header("HTTP/1.1 200 OK");
    header('Content-type: text/html; charset=utf-8');
    // подключаем класс авторизации
    require_once("api/UsersTelegram.php");
    // создаем объект авторизации
    $auth = new UsersTelegram();
    // запускаем
    $auth->init();
    ?>

    2. Нужно зарегистрировать WebHook

    https://api.telegram.org/botВАШ_ТОКЕН/setwebhook?url=https://ВАШ_ДОМЕН/webHook.php

    3. в api/UsersTelegram.php

    <?php
    
    require_once('Simpla.php');
    
    class UsersTelegram extends Simpla
    {
        // Токен API BOT
        private $token = "___TYT___TOKEN____";
        
        public function __construct()
        {
            parent::__construct(); // Вызов конструктора родительского класса, если он есть
        }
    
        /** Инициализируем работу класса
         * @return bool
         */
        public function init()
        {
            // Получаем данные от API и преобразуем их в ассоциативный массив
            $rawData = json_decode(file_get_contents('php://input'), true);
    		
            // Направляем данные из бота в метод для определения дальнейших действий
            $this->router($rawData);
    		
            // В любом случае возвращаем true для API Bot
            return true;
        }
    
        /** Роутер
         * @param $data array
         * @return bool
         */
        private function router($data)
        {
            // Проверяем на объект Message
            if (array_key_exists("message", $data)) {
                
    			// Получаем чат
                $chat_id = $data['message']['chat']['id'];
                
    			// Проверяем на наличие объекта Text
                if (array_key_exists("text", $data['message'])) {
                    
                  	// Получаем значение отправленных данных
                    $text = $data['message']['text'];
                    
    				// Если это просто старт бота
                    if ($text == "/start") {
                        
    					// Отправляем сообщение
                        $this->botApiQuery("sendMessage", [
                            'chat_id' => $chat_id,
                            'text' => 'Бот авторизации'
                        ]);
                        
    					// Передаем данные пользователя в метод для добавления в БД
                        $this->addUserToDatabase($data['message']);
                      
                    } else {
                        
                      // Просто пишем чего-нибудь в чат
                        $this->botApiQuery("sendMessage", [
                            'chat_id' => $chat_id,
                            'text' => 'Неизвестная команда'
                        ]);
                    }
                } else {
                    
                  	// Просто пишем чего-нибудь в чат
                    $this->botApiQuery("sendMessage", [
                        'chat_id' => $chat_id,
                        'text' => 'Неизвестный формат сообщения'
                    ]);
                }
            }
            // Другие объекты не рассматриваем
            return true;
        }
    
        /** Добавление пользователя в БД
         * @param $message array
         */
    private function addUserToDatabase($message)
    {
    	// Подготовка данных пользователя
        $user = [
            'telegram_id' => $message['chat']['id'],
            'username' => $message['chat']['username']
        ];
    
        // Проверяем, существует ли пользователь с таким telegram_id
        $existingUser = $this->getUser($user['telegram_id']);
    	
        if ($existingUser) {
            // Если пользователь существует, можно обновить данные или просто проигнорировать
            $text = "Вы уже зарегистрированы.";
        } else {
            // Если пользователь не существует, добавляем нового
            $userId = $this->addUser($user);
            if ($userId) {
                $text = "Вы успешно зарегистрированы.";
            } else {
                $text = "Произошла ошибка при регистрации.";
            }
        }
    
        // Отправляем сообщение пользователю
        $this->botApiQuery("sendMessage", [
            'chat_id' => $message['chat']['id'],
            'text' => $text
        ]);
    }
    	
    	private function getUser($id)
        {
            // Выбираем пользователя
            $query = $this->db->placehold("SELECT * FROM __users WHERE telegram_id=? LIMIT 1", $id);
            $this->db->query($query);
            $user = $this->db->result();
         
    		if (empty($user)) {
                return false;
    		}
            
    		return $user;
        }
    	
        private function addUser($user)
        {
            $user = (array)$user;
            $query = $this->db->placehold("INSERT INTO __users SET ?%", $user);
            $this->db->query($query);
            return $this->db->insert_id();
        }	
    	
        /** Работаем с API BOT
         * @param $method
         * @param array $fields
         * @return mixed
         */
        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;
        }	
    }
    ?>

     

  6. 1 час назад, get31 сказал:

     

    Спасибо.

    Я вот не понял для чего KEY? Он мне не нужен получается, поскольку я не авторизую пользователя, а добавляю в БД нужные данные, верно?

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

  7. В 01.08.2024 в 15:41, get31 сказал:

    Сегодня снова сел делать, создал вебхук...но все равно почему-то не добавляет пользователя в БД

    Вот новый код api/UsersTelegram.php:
     

    
    
    
    <?php
    
    require_once('Simpla.php');
    require_once('Users.php');
    
    class UsersTelegram extends Simpla
    {
        private $botToken = 'ТУТ_TOKEN_TELEGRAM';
        private $webhookUrl;
        private $users;
    
        public function __construct()
        {
            parent::__construct();
            $this->users = new Users();
            $this->setWebhookUrl();
            $this->setWebhook();
            $this->handleRequest();
        }
    
        private function setWebhookUrl()
        {
            // Определяем полный URL вебхука
            $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
            $host = $_SERVER['HTTP_HOST'];
            $scriptName = $_SERVER['SCRIPT_NAME'];
            
            $this->webhookUrl = "$protocol://$host$scriptName";
        }
    
        private function sendRequest($method, $data)
        {
            $url = "https://api.telegram.org/bot" . $this->botToken . "/" . $method;
            
            $options = [
                'http' => [
                    'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                    'method'  => 'POST',
                    'content' => http_build_query($data),
                ],
            ];
            
            $context  = stream_context_create($options);
            $response = file_get_contents($url, false, $context);
            
            return json_decode($response, true);
        }
    
        private function setWebhook()
        {
            // Проверяем наличие текущего вебхука
            $webhookInfo = $this->sendRequest('getWebhookInfo', []);
            if ($webhookInfo['ok']) {
                $currentUrl = $webhookInfo['result']['url'];
                
                if ($currentUrl !== $this->webhookUrl) {
                    // Если URL вебхука не совпадает с требуемым, устанавливаем новый
                    $response = $this->sendRequest('setWebhook', ['url' => $this->webhookUrl]);
                    
                    if ($response['ok']) {
                        echo "Вебхук успешно установлен.";
                    } else {
                        echo "Ошибка установки вебхука: " . $response['description'];
                    }
                } else {
                    echo "Вебхук уже установлен и корректен.";
                }
            } else {
                echo "Ошибка получения информации о вебхуке: " . $webhookInfo['description'];
            }
        }
    
        private function handleRequest()
        {
            $input = file_get_contents('php://input');
            $update = json_decode($input, true);
    
            if (isset($update['message']['text']) && $update['message']['text'] === '/start') {
                $telegram_id = $update['message']['from']['id'];
                $username = $update['message']['from']['username'];
                
                // Определяем IP пользователя
                $ip = !empty($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] :
                      (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] :
                      $_SERVER['REMOTE_ADDR']);
    
                // Проверяем, существует ли пользователь
                $existing_user = $this->users->get_user_by_telegram_id($telegram_id);
    
                if ($existing_user) {
                    // Пользователь уже есть в базе данных
                    $response = 'Ваши данные уже есть в базе';
                } else {
                    // Добавляем нового пользователя в базу данных
                    $userData = [
                        'id' => $telegram_id,
                        'email' => $telegram_id,
                        'password' => $telegram_id,
                        'name' => $username, // Используем имя пользователя в Telegram
                        'group_id' => '0',
                        'enabled' => '1',
                        'created' => date('Y-m-d H:i:s'),
                      
                        'telegram_id' => $telegram_id,
                        'username' => $username
                    ];
    
                    $user_id = $this->users->add_user($userData);
                    if ($user_id) {
                        $response = 'Спасибо, ваши данные добавлены';
                    } else {
                        $response = 'Ошибка добавления данных в базу';
                    }
                }
    
                // Отправляем ответ пользователю
                $url = "https://api.telegram.org/bot" . $this->botToken . "/sendMessage";
                $data = [
                    'chat_id' => $telegram_id,
                    'text' => $response
                ];
    
                $options = [
                    'http' => [
                        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                        'method'  => 'POST',
                        'content' => http_build_query($data),
                    ],
                ];
    
                $context  = stream_context_create($options);
                file_get_contents($url, false, $context);
            }
        }
    }
    
    // Создаем экземпляр класса
    new UsersTelegram();
    ?>

    Хз на сколько правильно и нужно ли подключать к api/Users.php, но думал подключить чтобы проще было может добавлять пользователя, хотя по факту добавляю все равно через api/UsersTelegram.php

     

    В api/Users.php делаем проверку на telegram_id

    
    
    
    public function get_user_by_telegram_id($telegram_id)
    {
        $query = $this->db->placehold("SELECT * FROM __users WHERE telegram_id=? LIMIT 1", $telegram_id);
        $this->db->query($query);
        return $this->db->result();
    }

     

    в api/Simpla..php подключаем

    
    
    
    'userstelegram' => 'UsersTelegram',

    на счет него тоже хз, поскольку нигде не задействую userstelegram

    В api/Users.php нужно добавить только новые поля где будут данные из Телеграмм, для вывода их пользователю и больше эту модель трогать не нужно. 
    Для реализации вашей идеи вот ссылка https://imakebots.ru/article/avtorizaciya-na-sayt-cherez-telegram-bez-ispolzovaniya-oficialnogo-vidzheta

    Сделайте для начала как написано, потом по аналогии для Simpla. 
    Сразу напишу, для вхождения у вас должно быть:

    1. site.ru/bot.php - webhook

    2. site.ru/api/UsersTelegram.php - данные из webhook

    больше ничего не нужно. 

  8. 17 минут назад, get31 сказал:

    Да, я потом заметил и уже заменил у себя в коде

    
    
    $query = $this->db->placehold("SELECT count(*) as count FROM __users WHERE telegram_id=?", $user['telegram_id']);

    Спасибо.

    Я теперь завис на вебхуке.....типа отдельный файл нужен? Получается тогда код в api/UsersTelegram.php полностью менять нужно? А по логике Алекса тогда изменения в api/Users.php вообще не нужны.....шото бошка уже не варит....

    api/Users.php нужен только для вывода данный в профиле пользователя или в админке. 
    api/UsersTelegram.php нужен для фильтрации данных, проверки и записи данных пользователя из Телеграмм. 

  9. 4 минуты назад, get31 сказал:

    ага, то есть вебхук нужен.

    Его нужно отдельно в файл или подключить в api/UserTelegram.php?

    Если я не буду отправлять сообщения пользователю, типа "спасибо, ваши данные добавлены" и пр текст, то вебхук все равно нужен?

     

    Конечно, вебхук нужен обязательно. 
    Логика должна быть такая:

    1. Вебхук получает данные из бота

    2. Отправляет данные в api/UsersTelegram.php

    3. В api/UsersTelegram.php проверяем, что была нажата кнопка «/start», если что-то другое, то молчим. 
    После фильтра берем из ответа Id пользователя и проверяем есть ли запись о нем. Если есть, отправляем пользователю сообщение «Ваши данные уже есть в базе», а если записи нет, то записываем в базу и отправляем сообщение «Спасибо, ваши данные добавлены». 

  10. 6 часов назад, shooroop сказал:

    откуда в коде у вас взялся email если телега хук передает имя и id .....

    Откуда взялся, понятное дело, скопирован класс api/Users.php без изменения кода под задачу.
    Я вот спрашиваю код вебхука у ТС, чтобы понять, есть у него проверка ответа бота на нажатие кнопки «/start» или по барабану, чтобы пользователь не прислал будет новая запись в базу. 

  11. 10 минут назад, get31 сказал:

    Мне не нужна авторизация через https://core.telegram.org/widgets/login

    Мне нужно просто добавить в БД. вебхук добавить не проблема (https://api.telegram.org/botТОКЕН/setWebhook?url=https://site.com/bot.php), проблема стала в коде....

    Код вебхука какой? 

  12. Для авторизации и регистрации есть официальный виджет от Telegram https://core.telegram.org/widgets/login

    На счет кода, нужен webhook который будет получать команды от бота и в зависимости от пришедших данных решать, что ему делать. Записать данные пользователя: имя, аватар, телефон. И в ответ отправить ссылку для авторизации с записью кук в браузер. 

  13. 23 часа назад, get31 сказал:

    Да, можно так, но при каждом сохранении будет меняться урл

    $product->url = uniqid('') . substr(md5(time()), 0, 10);

    а смена урла тоже плохо

    вью трогать не нужно, выше код для api/Products.php раздел add_product. 

    url нужно создавать только в момент добавления товара, то есть в модели, а во вью нужно его только выводить. В случае, если нужно для товара задать уникальный url в модели есть проверка, если url пустой задать уникальный url, а если мы задали свой, то его и присвоить. 

  14. 6 часов назад, get31 сказал:

    Не работает. а в update_product вообще нет "аналогичного".

    И к тому же, чтобы в url был ID, нужно в ProductAdmin.php:

    заменить $product->url = trim($this->request->post('url', 'string'));

    на $product->url = $this->request->post('id', 'integer');

    НО даже и тогда код:

            if(empty($product['url']))

            {

                $product['url'] = $product['id'];

            }
    не видит ID товара и ставит его как 0 и делает УРЛ 0_1, 0_2, 0_3....

    Получение ID нового товара происходит на строке                         $id = $this->db->insert_id();

    после нее идет присваивания позиции товара как ее id путем update. 
    по аналогии можно сделать update у товара url как id

  15. 3 минуты назад, Alex000 сказал:

    RewriteCond %{HTTP_HOST} ^www.tbiliso.by [NC] RewriteRule ^(.*)$ http://tbiliso.by/$1 [R=301,L]

    Вот этот кусок замените на 

    # Redirect to HTTPS:
    RewriteCond %{HTTPS} =off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    # Redirect from www to without www:
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

  16. 5 часов назад, yulio сказал:

    Добрый день! Помогите плз, хоть советом хоть платной помощью.

    После смены хостинга перестали создаваться заказы на сайте интернет-магазина.

    на 2х интернет магазинах.

    Что может быть? хостинг смотрит и ничего не видит...

     

    В 12.11.2021 в 18:00, alexivchenko сказал:

    В файле config/config.php

    заменить 

    
    ;Режим SQL
    db_sql_mode =;

    на

    
    ;Режим SQL
    db_sql_mode = "NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

     

     

×
×
  • Create New...