Jump to content

Добавление/Регистрация пользователя из Telegram Bot


Recommended Posts

В 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();
}
 

 

Link to post
Share on other sites
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>

и не работает.

Подскажите, почему не работает?

Link to post
Share on other sites
В 03.08.2024 в 16:49, alexivchenko сказал:

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

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

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

Link to post
Share on other sites
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 by alexivchenko
Link to post
Share on other sites
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>

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

Link to post
Share on other sites
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>

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...