get31 Posted August 24 Author Report Share Posted August 24 В 19.08.2024 в 12:30, founder сказал: Подскажите, пожалуйста, где ошибка? Почему не работает рассылка? Попробуйте пакетами так рассылать: public function sendBroadcast($message) { $url = "https://api.telegram.org/bot" . $this->token . "/sendMessage"; // Получаем всех подписчиков из базы данных $subscribers = $this->getSubscribers(); $batchSize = 10; // Размер пакета (за 1 раз скольким подписчикам отправляем сообщение) $delay = 3; // Пауза между пакетами в секундах // Разбиваем подписчиков на пакеты $totalSubscribers = count($subscribers); for ($i = 0; $i < $totalSubscribers; $i += $batchSize) { $batch = array_slice($subscribers, $i, $batchSize); foreach ($batch as $subscriber) { $chat_id = $subscriber->telegram_id; $postFields = [ 'chat_id' => $chat_id, 'text' => $message ]; // Отправляем сообщение $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($postFields), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => 10 ]); $response = curl_exec($ch); if (curl_errno($ch)) { echo 'Ошибка: ' . curl_error($ch); } else { $responseData = json_decode($response); if (!$responseData->ok) { echo 'Ошибка отправки сообщения для chat_id ' . $chat_id . ': ' . $responseData->description; } } curl_close($ch); } // Пауза между пакетами sleep($delay); } } private function getSubscribers() { $query = $this->db->placehold("SELECT * FROM __subscribe_mailing"); $this->db->query($query); return $this->db->results(); } Quote Link to post Share on other sites
founder Posted August 25 Report Share Posted August 25 17 часов назад, get31 сказал: Попробуйте пакетами так рассылать: public function sendBroadcast($message) { $url = "https://api.telegram.org/bot" . $this->token . "/sendMessage"; // Получаем всех подписчиков из базы данных $subscribers = $this->getSubscribers(); $batchSize = 10; // Размер пакета (за 1 раз скольким подписчикам отправляем сообщение) $delay = 3; // Пауза между пакетами в секундах // Разбиваем подписчиков на пакеты $totalSubscribers = count($subscribers); for ($i = 0; $i < $totalSubscribers; $i += $batchSize) { $batch = array_slice($subscribers, $i, $batchSize); foreach ($batch as $subscriber) { $chat_id = $subscriber->telegram_id; $postFields = [ 'chat_id' => $chat_id, 'text' => $message ]; // Отправляем сообщение $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($postFields), CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => 10 ]); $response = curl_exec($ch); if (curl_errno($ch)) { echo 'Ошибка: ' . curl_error($ch); } else { $responseData = json_decode($response); if (!$responseData->ok) { echo 'Ошибка отправки сообщения для chat_id ' . $chat_id . ': ' . $responseData->description; } } curl_close($ch); } // Пауза между пакетами sleep($delay); } } private function getSubscribers() { $query = $this->db->placehold("SELECT * FROM __subscribe_mailing"); $this->db->query($query); return $this->db->results(); } Не работает именно сама рассылка через админку. Ваш или мой код по сути можно вставить в самый низ не в api/UsersTelegram.php а в simpla/SubscribeMailingAdmin.php в шаблоне админки добавляю форму <form method="post" action="{url module=SubscribeMailingAdmin}"> <textarea name="message" placeholder="Введите сообщение для рассылки" rows="5" cols="50"></textarea><br> <button type="submit" name="action" value="send_message">Отправить рассылку</button> </form> и не работает. Подскажите, почему не работает? Quote Link to post Share on other sites
founder Posted August 25 Report Share Posted August 25 В 03.08.2024 в 16:49, alexivchenko сказал: Все верно, ключ нужен только для проверки, что пользователь есть в базе и авторизовать его. Alexivchenko, подскажите, пожалуйста, по рассылке. нужно дописать код в api/UsersTelegram.php или можно обойтись только simpla/SubscribeMailingAdmin.php? Quote Link to post Share on other sites
sergeevizh Posted August 25 Report Share Posted August 25 (edited) 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); Обратитесь к нему и отталкивайтесь от ошибок, если будут. Edited August 25 by alexivchenko Quote Link to post Share on other sites
founder Posted August 25 Report Share Posted August 25 2 часа назад, sergeevizh сказал: Я сейчас сделал проще, на основе 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); Обратитесь к нему и отталкивайтесь от ошибок, если будут. Спасибо! Ошибок нет. Теперь хочу сделать отправку через форму в админке В 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> Но тогда сообщения не отправляются Quote Link to post Share on other sites
sergeevizh Posted August 25 Report Share Posted August 25 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> Но тогда сообщения не отправляются Скиньте все файлы мне в ТГ в профиле есть Quote Link to post Share on other sites
sergeevizh Posted August 27 Report Share Posted August 27 Вопрос решили, дело было в форме которая не отправляла токен. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.