sergeevizh
-
Content Count
378 -
Joined
Posts posted by sergeevizh
-
-
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 часа назад, 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);
Обратитесь к нему и отталкивайтесь от ошибок, если будут.
-
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 -
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
-
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; } } ?>
-
1 час назад, get31 сказал:
Спасибо.
Я вот не понял для чего KEY? Он мне не нужен получается, поскольку я не авторизую пользователя, а добавляю в БД нужные данные, верно?
Все верно, ключ нужен только для проверки, что пользователь есть в базе и авторизовать его.
-
В 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
больше ничего не нужно.
-
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 нужен для фильтрации данных, проверки и записи данных пользователя из Телеграмм. -
4 минуты назад, get31 сказал:
ага, то есть вебхук нужен.
Его нужно отдельно в файл или подключить в api/UserTelegram.php?
Если я не буду отправлять сообщения пользователю, типа "спасибо, ваши данные добавлены" и пр текст, то вебхук все равно нужен?
Конечно, вебхук нужен обязательно.
Логика должна быть такая:1. Вебхук получает данные из бота
2. Отправляет данные в api/UsersTelegram.php
3. В api/UsersTelegram.php проверяем, что была нажата кнопка «/start», если что-то другое, то молчим.
После фильтра берем из ответа Id пользователя и проверяем есть ли запись о нем. Если есть, отправляем пользователю сообщение «Ваши данные уже есть в базе», а если записи нет, то записываем в базу и отправляем сообщение «Спасибо, ваши данные добавлены». -
6 часов назад, shooroop сказал:
откуда в коде у вас взялся email если телега хук передает имя и id .....
Откуда взялся, понятное дело, скопирован класс api/Users.php без изменения кода под задачу.
Я вот спрашиваю код вебхука у ТС, чтобы понять, есть у него проверка ответа бота на нажатие кнопки «/start» или по барабану, чтобы пользователь не прислал будет новая запись в базу. -
10 минут назад, get31 сказал:
Мне не нужна авторизация через https://core.telegram.org/widgets/login
Мне нужно просто добавить в БД. вебхук добавить не проблема (https://api.telegram.org/botТОКЕН/setWebhook?url=https://site.com/bot.php), проблема стала в коде....
Код вебхука какой?
-
Для авторизации и регистрации есть официальный виджет от Telegram https://core.telegram.org/widgets/login
На счет кода, нужен webhook который будет получать команды от бота и в зависимости от пришедших данных решать, что ему делать. Записать данные пользователя: имя, аватар, телефон. И в ответ отправить ссылку для авторизации с записью кук в браузер.
-
23 часа назад, get31 сказал:
Да, можно так, но при каждом сохранении будет меняться урл
$product->url = uniqid('') . substr(md5(time()), 0, 10);
а смена урла тоже плохо
вью трогать не нужно, выше код для api/Products.php раздел add_product.
url нужно создавать только в момент добавления товара, то есть в модели, а во вью нужно его только выводить. В случае, если нужно для товара задать уникальный url в модели есть проверка, если url пустой задать уникальный url, а если мы задали свой, то его и присвоить. -
if(empty($product['url'])) { $product['url'] = substr(md5(time()), 0, 10); } else { $product['url'] = $product['url']; }
-
Ну или на край сделать добавление Id товара к url
supersite.com/products/1234-kakoito-tovar
-
Тогда на форте будет выводить товар и по его id по его url
1. supersite.com/products/1234
2. supersite.com/products/e47d1ce09e
будет один товар -
А вообще, зачем ID товара впихивать в url товара, когда проще генерировать от времени хеш md5
будет так:
supersite.com/products/e47d1ce09eeea6783300addf49551aeeb
или урезать до 10 знаков
supersite.com/products/e47d1ce09e
-
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 -
Кто-то вам бяку подложил, стандартно backend/uploader/* такого пути нет в simpla.
-
Вопрос решился
-
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] -
Пришлите сюда файл .htaccess
-
4 часа назад, yulio сказал:
Пожалуйста, но советую в ближайшее время подправить БД
-
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";
Добавление/Регистрация пользователя из Telegram Bot
in Общие вопросы по функционалу и дизайну
Posted
Вопрос решили, дело было в форме которая не отправляла токен.