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

РеФ система

Не могли бы
Вы сделать наглядный пример простейшего
Бота с реф системой, а то не понятно
Как достать данные start=1234 как его задать в case

Ответы


  • iMakeBots [09.11.2019 в 11:45 → my Profit]
    Пример самый простой

    <?php
            // получаем объект от Telegram API 
    	$data = json_decode(file_get_contents('php://input'));
            // Берем значение как для объекта Message
    	$text = $data->message->text;
            // Делаем проверки
    	if($text == "/start") {
    		// Выводим приветствие это простой старт бота
    	} elseif(preg_match("~^\/start ([\d]+)$~", $text, $matches)) {
    		// здесь отработает когда прилетит значение равное /start ЗДЕСЬ_ЛЮБОЕ_ЧИСЛО
    		// например /start 123456 или /start 12
    		// в $matches[1] будет лежать число из $text 
    		// если из примера то это 123456 или 12
    	} else {
    		// здесь любое другое значение $text даже пустое
    		// Выводим здесь например предупрежденние
    	}
  • my Profit [09.11.2019 в 13:22 → iMakeBots]
    Спасибо вам с работы приду попробую
  • my Profit [09.11.2019 в 18:00 → iMakeBots]
    я правильно понял это условие должно быть так?

    case '/start':
    	// получаем объект от Telegram API 
    	$data = json_decode(file_get_contents('php://input'));
            // Берем значение как для объекта Message
    	$text = $data->message->text;
            // Делаем проверки
    	if($text == "/start") {
    		$dataSend = array(
                        'text' => "hi",
                        'chat_id' => $chat_id,
                        'reply_markup' => $justKeyboard,
                    );
            $this->requestToTelegram($dataSend, "sendMessage");
    	} elseif(preg_match("~^/start 123", $text, $matches)) {
    		$dataSend = array(
                        'text' =>  $matches[1],
                        'chat_id' => $chat_id,
                        'reply_markup' => $justKeyboard,
                    );
            $this->requestToTelegram($dataSend, "sendMessage");
    		// здесь отработает когда прилетит значение равное /start ЗДЕСЬ_ЛЮБОЕ_ЧИСЛО
    		// например /start 123456 или /start 12
    		// в $matches[1] будет лежать число из $text 
    		// если из примера то это 123456 или 12
    	} else {
    		// здесь любое другое значение $text даже пустое
    		// Выводим здесь например предупрежденние
    	}
            break;
  • iMakeBots [09.11.2019 в 18:09 → my Profit]
    Нет, не так.
    Вы просили простой пример бота, который получает значение при переходе в него по ссылке с подстановкой значения в параметр /start

    Я вам привел самодостаточную логику, а вы ее вставили в свое решение - получился код бота в одном из условии другого бота (бот в боте)

    Вы может просто взять проверку на нужное вам условие из примера и подставить его в свой код

    case preg_match("~^\/start ([\d]+)$~", $text, $matches):
        // здесь нужное вам значение
        $id_ref = $matches[1];
        // далее вы что-то делаете с $id_ref
        break;
    
  • my Profit [09.11.2019 в 18:19 → iMakeBots]
    спасибо
  • my Profit [09.11.2019 в 19:21 → iMakeBots]
    Когда я делаю так то пустота а когда $id_ref = "kfkfkf"; то все ок

    case preg_match("~^\/start ([\d]+)$~", $text, $matches):
        // здесь нужное вам значение
        $id_ref = $matches[1];
        // далее вы что-то делаете с $id_ref
    	$dataSend = array(
                        'text' => $id_ref,
                        'chat_id' => $chat_id,
                        'reply_markup' => $justKeyboard,
                      
                    );
    	$this->requestToTelegram($dataSend, "sendMessage");
        break;
  • iMakeBots [09.11.2019 в 19:40 → my Profit]
    Ссылка у вас для перехода в бот какая?
  • my Profit [09.11.2019 в 19:42 → iMakeBots]
    http://t.me/myprofit_bot?start=123
  • iMakeBots [09.11.2019 в 19:51 → my Profit]
    Все нормально, если ваш бот выполняет условие, то шаблон в preg_match() должен поймать значение.
    Пример шаблона

    Покажите switch (ЧТО_У_ВАС_ЗДЕСЬ)
  • my Profit [09.11.2019 в 19:55 → iMakeBots]
    <?
    switch ($message) {
        case '/start':
            $dataSend = array(
                'text' => $startinfo,
                'chat_id' => $chat_id,
                'reply_markup' => $justKeyboard,
            );
            $this->requestToTelegram($dataSend, "sendMessage");
    	break;
    
        case 'Рефералы '.hex2bin('F09F91A5'):
    	$reftitle = "Ваша реферальная ссылка: http://t.me/myprofit_bot?start=123";
    	$dataSend = array(
                'text' => $reftitle,
                'chat_id' => $chat_id,
             );
             $this->requestToTelegram($dataSend, "sendMessage");
             break;
    				
        case preg_match("~^/start ([d] ) ~", $text, $matches):
    	// здесь нужное вам значение
    	$id_ref = $matches[1];
    	// далее вы что-то делаете с $id_ref
    	$dataSend = array(
                'text' => $id_ref,
                'chat_id' => $chat_id,
                'reply_markup' => $justKeyboard,
    	);
    	$this->requestToTelegram($dataSend, "sendMessage");
    	break;
    }
    
    ?>
  • iMakeBots [09.11.2019 в 20:01 → my Profit]
    У вас значение для проверки в условиях лежит не в $text (в моем примере да, значение лежит в этой переменной), а в $message

    case preg_match("~^\/start ([\d]+)$~", $text, $matches):
    Надо заменить на

    case preg_match("~^\/start ([\d]+)$~", $message, $matches):
  • my Profit [09.11.2019 в 20:08 → iMakeBots]
    Не запланированная реакция.

    [moder_update]
    Получается ни одно из условий не проходит.
    Проверьте еще раз условия с preg_match()
  • my Profit [10.11.2019 в 12:29 → iMakeBots]
    помогите мне починить я зарплату получу оплачу помощь
  • iMakeBots [10.11.2019 в 12:30 → iMakeBots]
    Покажите ваш код
  • my Profit [10.11.2019 в 12:42 → iMakeBots]
    погуглив я нашел вот это $url = 'https://t.me/brobotmebot?start=ref403295577';
    $queryParams = [];

    $query = parse_url($url, PHP_URL_QUERY);
    parse_str($query, $queryParams);

    if (isset($queryParams['start'])) {
    echo $queryParams['start'];
    }
  • iMakeBots [10.11.2019 в 12:46 → iMakeBots]
    по ссылке https://t.me/brobotmebot?start=ref403295577

    Вам в бот прилетит объект message со значением по ключу text, которое будет равно:
    /start ref403295577

    А ваш пример просто разбор ссылки при помощи встроенной функции php parse-url
  • my Profit [10.11.2019 в 13:00 → iMakeBots]
    тогда я все равно не могу понять почему у меня не работает


    case preg_match("~^/start ([d] )$~", $text, $matches):
    // здесь нужное вам значение
    $id_ref = $matches[1];
    // далее вы что-то делаете с $id_ref
    $dataSend = array(
    'text' => $id_ref,
    'chat_id' => $chat_id,
    'reply_markup' => $justKeyboard,

    );
    $this->requestToTelegram($dataSend, "sendMessage");
    break;
  • iMakeBots [10.11.2019 в 13:01 → my Profit]
    case preg_match("~^\/start ([\d]+)$~", $text, $matches):
  • my Profit [10.11.2019 в 13:15 → iMakeBots]
    Так вы же написали тоже самое
  • iMakeBots [10.11.2019 в 13:16 → iMakeBots]
    шаблон в preg_match() у нас с вами разный

    Я не вижу весь ваш код, мне сложно вам помочь урывками.
    Можете прислать мне в бот обратной связи ваш код в архиве.
  • my Profit [10.11.2019 в 13:30 → iMakeBots]
    <?php
    // определяем кодировку
    header('Content-type: text/html; charset=utf-8');
    // Создаем объект бота
    $bot = new Bot();
    // Обрабатываем пришедшие данные
    $bot->init('php://input');
    $data = json_decode(file_get_contents('php://input'));
            // Берем значение как для объекта Message
    	$text = $data->message->text;
    /**
     * Class Bot
     */
    class Bot
    {
        // <bot_token> - созданный токен для нашего бота от @BotFather
        private $botToken = "ВАШ-ТОКЕН";
        // адрес для запросов к API Telegram
        private $apiUrl = "https://api.telegram.org/bot";
    
        public function init($data)
        {
            // создаем массив из пришедших данных от API Telegram
            $arrData = $this->getData($data);
    
            // лог
            // $this->setFileLog($arrData);
    
            if (array_key_exists('message', $arrData)) {
                $chat_id = $arrData['message']['chat']['id'];
                $message = $arrData['message']['text'];
    
            } elseif (array_key_exists('callback_query', $arrData)) {
                $chat_id = $arrData['callback_query']['message']['chat']['id'];
                $message = $arrData['callback_query']['data'];
            }
    
            $justKeyboard = $this->getKeyBoard([[["text" => "Голосовать"], ["text" => "Рефералы"]]]);
    
            $inlineKeyboard = $this->getInlineKeyBoard([[
                ['text' => hex2bin('F09F918D') . ' 0', 'callback_data' => 'vote_1_0_0'],
                ['text' => hex2bin('F09F918E') . ' 0', 'callback_data' => 'vote_0_0_0']
            ]]);
    
            switch ($message) {
                case '/start':
                    $dataSend = array(
                        'text' => "Приветствую, давайте начнем нашу практику. Нажмите на кнопку Голосовать.",
                        'chat_id' => $chat_id,
                        'reply_markup' => $justKeyboard,
                    );
                    $this->requestToTelegram($dataSend, "sendMessage");
                    break;
                case 'Голосовать':
                    $dataSend = array(
                        'text' => "Выберите один из вариантов",
                        'chat_id' => $chat_id,
                        'reply_markup' => $inlineKeyboard,
                    );
                    $this->requestToTelegram($dataSend, "sendMessage");
                    break;
                case 'Рефералы':
    			$reftitle = "Ваша реферальная ссылка: http://t.me/mybot?start=123";
                    $dataSend = array(
                        'text' => $reftitle,
                        'chat_id' => $chat_id,
                    );
                    $this->requestToTelegram($dataSend, "sendMessage");
                    break;
    				case preg_match("~^/start ([d] )$~", $text, $matches):
        // здесь нужное вам значение
        $ref = $matches[1];
        // далее вы что-то делаете с $id_ref
        $dataSend = array(
            'text' => $ref,
            'chat_id' => $chat_id,
            'reply_markup' => $justKeyboard,
        );
        $this->requestToTelegram($dataSend, "sendMessage");
        break;
                case (preg_match('/^vote/', $message) ? true : false):
                    $params = $this->setParams($message);
                    $dataSend = array(
                        'reply_markup' => $params[0],
                        'message_id' => $arrData['callback_query']['message']['message_id'],
                        'chat_id' => $chat_id,
                    );
                    $this->changeVote($dataSend, $params[1], $arrData['callback_query']['id']);
                    break;
                default:
                    $dataSend = array(
                        'text' => "Не запланированная реакция, может просто нажмете на кнопку Голосовать.",
                        'chat_id' => $chat_id,
                    );
                    $this->requestToTelegram($dataSend, "sendMessage");
                    break;
            }
        }
    
        /** Меняем клавиатуру Vote
         * @param $data
         * @param $emogi
         * @param $callback_query_id
         */
        private function changeVote($data, $emoji, $callback_query_id)
        {
            $text = $this->requestToTelegram($data, "editMessageReplyMarkup")
                ? "Вы проголосовали " . hex2bin($emoji)
                : "Непредвиденная ошибка, попробуйте позже.";
    
            $this->requestToTelegram([
                'callback_query_id' => $callback_query_id,
                'text' => $text,
                'cache_time' => 30,
            ], "answerCallbackQuery");
        }
    
        /** Устанавливаем новые значения Vote
         * @param $data
         * @return string
         */
        private function setParams($data)
        {
            $params = explode("_", $data);
            $params[1] ? $params[2]   : $params[3]  ;
            $arr[] = $this->getInlineKeyBoard([[
                ['text' => hex2bin('F09F918D') . ' ' . $params[2], 'callback_data' => 'vote_1_' . $params[2] . '_' . $params[3]],
                ['text' => hex2bin('F09F918E') . ' ' . $params[3], 'callback_data' => 'vote_0_' . $params[2] . '_' . $params[3]]
            ]]);
            $arr[] = $params[1] ? 'F09F918D' : 'F09F918E';
            return $arr;
        }
    
        /**
         * создаем inline клавиатуру
         * @return string
         */
        private function getInlineKeyBoard($data)
        {
            $inlineKeyboard = array(
                "inline_keyboard" => $data,
            );
            return json_encode($inlineKeyboard);
        }
    
        /**
         * создаем клавиатуру
         * @return string
         */
        private function getKeyBoard($data)
        {
            $keyboard = array(
                "keyboard" => $data,
                "one_time_keyboard" => false,
                "resize_keyboard" => true
            );
            return json_encode($keyboard);
        }
    
        private function setFileLog($data)
        {
            $fh = fopen('log.txt', 'a') or die('can't open file');
            ((is_array($data)) || (is_object($data))) ? fwrite($fh, print_r($data, TRUE) . "n") : fwrite($fh, $data . "n");
            fclose($fh);
        }
    
        /**
         * Парсим что приходит преобразуем в массив
         * @param $data
         * @return mixed
         */
        private function getData($data)
        {
            return json_decode(file_get_contents($data), TRUE);
        }
    
        /** Отправляем запрос в Телеграмм
         * @param $data
         * @param string $type
         * @return mixed
         */
        private function requestToTelegram($data, $type)
        {
            $result = null;
    
            if (is_array($data)) {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $this->apiUrl . $this->botToken . '/' . $type);
                curl_setopt($ch, CURLOPT_POST, count($data));
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                $result = curl_exec($ch);
                curl_close($ch);
            }
            return $result;
        }
    }
  • my Profit [10.11.2019 в 13:34 → iMakeBots]
    а если так if (preg_match("~(?<=start=)d $~", 'http://t.me/mybot?start=123', $matches)) {
    $ref = $matches[0];
    }
  • iMakeBots [10.11.2019 в 13:35 → iMakeBots]
    У вас идет проверка в case по переменной $text а значение у вас лежит в $message

    case (preg_match("~^\/start ([\d]+)$~", $message, $matches) ? true : false):

  • Вадим [24.05.2020 в 11:03 → iMakeBots]
    а если слова вместо цифр?
  • iMakeBots [24.05.2020 в 19:20 → Вадим]
    Из техдокументации Телегарам:

    У каждого бота есть ссылка, которая открывает с ним разговор в Telegram - https://t.me/<bot username>. 
    К этой ссылке можно добавить параметры start или startgroup со значениями длиной до 64 символов. Например:
    
    https://t.me/triviabot?startgroup=test
    Разрешены: A-Z, a-z, 0-9, _, -
    Телеграм рекомендует использовать base64url для кодирования параметров с двоичным и другим типами контента.