Безопасность Телеграм бота на php

Предполагаю, что вы уже зарегистрировали бот через BotFather..

Botman — это по инстрмент для удобной и быстрой разработки ботов под любые платформы. Представляет из себя компонент для фреймворка Laravel. Однако если вы не знакомы с Laravel, то это не будет большой проблемой, так как экосистема Botman достаточно изолирована и самодостаточна. Вам хватит знаний PHP.

Установить Botman starter kit командой

composer create-project —prefer-dist botman/studio

После этого возможно появится ошибка, если установлен Composer 2. Тогда нужно выполнить команду

composer update

Еще одна необходимая команда после установки

php artisan key:generate

Затем нужно подгрузить модуль для работы с Телеграм

composer require botman/driver-telegram
php artisan serve

Как вести разработку чат-бота Telegram на локальном домене? Использовать Ngrok!

Если вы ведете разработку на локальной машине без внешнего IP, то возникнет трудность с регистрацией вэб Хука для обработки сообщений телеграм. Но проблема эта легко решается сервисом ngrok.com, от даст возможность связать локальный домен с доменом вида https://99328bcc9109.ngrok.io/ , доступным в интернете. Еще очень удобно, что этот сервис сам генерирует https, даже если исходный домен без SSL.

Как создать телеграм бота на PHP за 10 минут

Настройки Ngrok (бесплатный аккаунт)

Для начала нужно скачать эту программу себе на компьютер, разархивировать, запустить и ввести команду

authtoken [Ваш токен]

php artisan serve + Ngrok

Если вы используете команду php artisan serve для реализации веб-сервера, то скорее всего вам будет достаточно будет ввести команду (запустите ngrok.exe и там введите эту команду)

ngrok http 127.0.0.1:8000

Увидите примерно это:

Настройка Ngrok для OpenServer, Botman

Теперь ваш локальный http://127.0.0.1:8000 доступен по адресу https://df4c2ff466f6.ngrok.io . Класс!

OpenServer + Ngrok

OpenServer — это комплект утилит для реализации локального сервера, в том числе локальных доменов.

Если просто ввести команду ngrok http cb.test (cb.test — локальный домен) , почему-то при заходе на поддомен Ngrok возникает синий экран с надписью «Как вы здесь оказались? Для перенаправления IP на нужный домен создайте алиас в настройках.»

Поэтому следует указывать немного другую команду чтобы Ngrok работал корректно в связке с OpenServer:

ngrok http —host-header=cb.test 80

Важный нюанс про бесплатный аккаунт Ngrok

При каждом вызове команды ngrok http . будет генерироваться новый поддомен. Это не очень здорово, но совсем не критично, просто нужно заново установить Вэб-хук для вашего бота.

Установка Вэб-хука для бота Telegram в Botman

Перед установкой вэб-хука нужно

Создать бота через BotFather

Добавить в ваш .env файл строчку с токеном из BotFather

TELEGRAM_TOKEN=’Ваш_токен’

Установка Вэб-хука для бота Telegram в Botman

php artisan botman:telegram:register —output

В ответ на вопрос What is the target url for the telegram bot? Вводим https адрес, полученный из Ngrok, с прибавленным путем /botman , например вот такой:

https://df4c2ff466f6.ngrok.io/botman

Настройка завершена! Ваш локальный домен теперь используется в качестве веб-кука для бота!

Построение бота в Botman

Обработка входящих сообщений

В файле routesbotman.php прописываются команды, на которые будет реагировать ваш бот

Еще по теме:  Как в Телеграме посмотреть по каким группам переходил

Обработать входящее сообщение можно прямо тут же, хотя лучше использовать контроллер

Разные варианты вопроса

Пример с использованием контроллера

Означает, что команда /start будет обработана методом start в контроллере BotManController . В этот метод будет передан объект класса BotMan

namespace AppHttpControllers; use BotManBotManBotMan; class BotManController extends Controller < public function start(BotMan $bot)< $bot->reply(«Bot started»); > >

Составить диалог

По-настоящему раскрывает свой потенциал Botman именно в обслуживании диалогов. Вы можете создавать достаточно сложные диалоги, при этом их структура будет упорядоченной и лаконичной. Документация на английском

Для создания файла с диалогом введите команду. Появится новый файл в appConversations .

php artisan botman:make:conversation SimpleConversation

В этом методе сначала есть только метод run() . Но давайте постепенно добавим туда пару вопросов.

Пример диалога (Conversation) в Botman

В файле routesbotman.php добавляем строчку с активацией диалога:

$botman->hears(‘/simple’, function($bot)< $bot->startConversation(new AppConversationsSimpleConversation()); >);

И заполним диалог. Пока все очень просто. Сначала бот спросит имя, затем email. Ответы на вопросы будут сохраняться.

namespace AppConversations; use BotManBotManMessagesConversationsConversation; use BotManBotManMessagesIncomingAnswer; class SimpleConversation extends Conversation < public $user = []; public function askEmail() < $this->ask(‘Напиши свой E-mail, плз’, function (Answer $answer) < $this->user[’email’] = $answer->getText(); $this->say(‘Спасибо ‘.$this->user[‘name’].’, теперь оправлю тебе тонну спама на ‘ . $this->user[’email’]); //return $this->askGender(); >); > public function askName() < $this->ask(‘Привет, как тебя зовут?’, function (Answer $answer) < // Сохраняем результат, и он будет доступен и в других вопросах/ответах $this->user[‘name’] = $answer->getText(); $this->say(‘Приятно познакомиться, ‘ . $this->user[‘name’]); // переход к следующему вопросу $this->askEmail(); >); > // Этот метод запускается при создании диалога public function run() < return $this->askName(); > >

Добавим кнопки в диалог

добавьте метод askGender() , и раскомментируйте return $this->askGender(); в методе askEmail() .

public function askGender() < $question = Question::create(‘Ваш гендер’) ->addButtons([ Button::create(‘Женский’)->value(‘woman’), Button::create(‘Мужской’)->value(‘man’), Button::create(‘Другое’)->value(‘other’), ]); $this->ask($question, function (Answer $answer) < // Если кликнули по кнопке if ($answer->isInteractiveMessageReply()) < switch($answer->getValue())< case «woman»: $this->bot->reply($this->user[‘name’].», ты прекрасна!»); break; case «man»: $this->bot->reply($this->user[‘name’].», твой дух силен!»); break; case «other»: $this->bot->reply($this->user[‘name’].», ты загадка!»); break; > >else< // Если ввели тект, то задаем вопрос заново $this->bot->reply(«Вы ввели текстом «. $answer->getText(). «, но надо нажать на кнопку..»); return $this->askGender(); > >); >

Дебаг в Botman

Первое, что нужно знать — это сброс кэша во время диалогов. Чтобы заново начать общение выполните команду

php artisan cache:clear

Логирование и дебаг вашего приложение по-умолчанию достаточно скудный. Если ошибка на сервере, то вы просто получаете 500 ошибку в своем Ngrok.exe. Неприятным дополнением является то, что ошибка зацикливается, так как Telegram повторяет запросы к серверу. Чтобы их остановить нужно чтобы ваше приложение дало хоть какой-то ответ. А потом уже ищите в чем проблема по коду. В Laravel (Botman — это пакет/расширение для Laravel) ошибки записываются в файл storagelogslaravel.log .

Функция для логирования в Laravel:

info(‘some string’, $some_array);

Чтобы избежать зацикливания ошибки можно настроить приложение чтобы оно возвращало JSON при 500 ошибке. Telegram не будет опрашивать ваш сервер в надежде получить какой-то ответ. Он увидит, что какая-то «шляпа», и успокоится.

Для этого в файле appExceptionsHandler.php метод render()

Теперь вы можете отслеживать ошибки тут http://127.0.0.1:4040, если пользуетесь Ngrok.

public function render($request, Exception $exception) < return response()->json([ ‘type’ => get_class($exception), ‘message’ => $exception->getMessage(), ‘file’ => $exception->getFile(), ‘line’ => $exception->getLine(), ‘trace’ => $exception->getTrace(), ‘previous’ => $exception->getPrevious(), ]); >

Хорошо бы еще отслеживать исходящие данные. Для этого я использовал костыль. Наверняка есть способы лучше, но.

В файле vendorbotmandriver-telegramsrcTelegramDriver.php

В методе sendPayload перед return добавляем:

info(‘TG p’, $payload);

В методе sendRequest перед return добавляем:

info(‘TG r’, $parameters);

Теперь в файл логирования storagelogslaravel.log будут попадать дынные ответа

Еще по теме:  Как записан у других в Телеграм

Как отправить свой запрос, используя API Телеграма в обход оберток Botman

Пример из routesbotman.php

Документация Telegram — https://core.telegram.org/bots/api#sendmessage

$botman->hears(‘yo’, function (BotMan $bot) < $bot->sendRequest(‘sendMessage’, [‘text’ => ‘text..’, ‘reply_markup’ => json_encode([ ‘inline_keyboard’ => [ [ [‘text’ => ’11’, ‘callback_data’ => «1-1»], [‘text’ => ‘yo’, ‘callback_data’ => «YO»] ], [ [‘text’ => ‘yo’, ‘callback_data’ => «YO»] ], [ [‘text’ => ‘yo’, ‘callback_data’ => «YO»] ], ] ], 256)]); >);

Источник: webstool.ru

Авторизация через Telegram бота

Всем привет. Давно ничего не писал, так как не было никаких идей, но недавно, 31 мая 2019 года, Telegram выпустил новое обновление, в котором добавил новый тип данных — LoginUrl. Итак, попробую объяснить идею авторизации с помощью Telegram бота. Для начала, чтобы бот мог писать пользователю, пользователь должен отправить сообщение /start. Бот может как угодно ответить на это сообщение, например обычным приветствием или набором кнопок для взаимодействия с ботом. Именно кнопками мы и будем пользоваться для авторизации, но об этом чуть позже. Пользователь жмет на нашу кнопку, после чего перед ним появляется окошко с подтверждением действия. Если пользователь подтверждает свое действие, то он переходит на указанный в параметрах url с данными своего аккаунта, в том числе и уникальный id для пользователя.

  • chat_id — в данном случае id пользователю, которому мы отправляем сообщение. Получаем от Telegram в методе getUpdates или с помощью Webhook.
  • text — текст сообщения. В данном случае он нам не нужен, так как мы будем использовать кнопку. Но если хотите объясниться перед пользователем, то это идеальный момент.
  • parse_mode — Указывает формат отправляемого сообщения. Поддерживаются Markdown и HTML.
  • disable_web_page_preview — Отключает превью для ссылки в данном сообщении.
  • disable_notification — Отправка сообщение без уведомления для юзера.
  • reply_to_message_id — Указывает на id сообщения, которое мы цитируем.
  • reply_markup — Добавляет кнопки.

Как можно было догадаться, нам необходимы chat_id и reply_markup. reply_markup принимает параметры в виде json массива с указанием типа кнопок и их параметров. Мы будем использовать inline_keyboard, так как они поддерживают LoginUrl. Ну давайте создадим простую кнопку:

$keyboard = Array( ‘inline_keyboard’ => [ [ [‘text’ => ‘Нажми меня’, ‘login_url’ => [ ‘url’ => ‘https://web-wost.ru’ ] ] ] ] );

Не забываем перевести данную кнопку в json:

$keyboard_json = json_encode($keyboard);

Ну и отправляем:

file_get_contents(‘https://api.telegram.org/bot’ . $token . ‘/sendMessage?chat_id=’ . $id . ‘reply_markup=’ . $keyboard_json);

Не забываем так же создать переменные $token с токеном бота и $id с указанием id пользователя. Если всё сделано верно, то после выполнения данного php скрипта, бот отправит пользователю сообщение с кнопкой ‘Нажми меня’. После нажатия на кнопку, пользователя спросят разрешение об отправке данных и переходе по ссылке. Получаем данные от пользователя с помощью REQUEST:

$user_id = $_REQUEST[‘id’]; $username = $_REQUEST[‘username’]; $hash = $_REQUEST[‘hash’];

В принципе так мы получаем необходимые данные о пользователе, но их можно легко подменить. Для безопасности передачи данных Telegram отправляет нам hash. Для его проверки воспользуемся следующим кодом:

$data = $_REQUEST; $hash = $data[‘hash’]; unset($data[‘hash’]); $new_data = []; foreach($data as $key => $value) $new_data[] = $key . ‘=’ . $value; sort($new_data); $data_string = implode(‘n’, $new_data); $secret_hash = hash(‘sha256’, $token, true); $new_hash = hash_hmac(‘sha256’, $data_string, $secret_hash); if(strcmp($hash, $new_hash) !== 0) exit(‘Подмена данных. ‘); echo ‘Привет ‘ . $data[‘username’];

Попробую разобрать данный код. Сначала мы записываем все полученные данные в переменную $data, далее сохраняем hash в специальную переменную($hash) и удаляем его из массива данных $data. Создаем новый пустой массив($new_data) для наших данных. Используя foreach, мы проходим через все полученные данные, записывая их в наш новый массив($new_data), сохраняя ключ=значение. Сортируем по алфавиту, превращаем в строку $data_string, записывая элементы через n. Хешируем наш токен($secret_hash), а дальше и все наши данные($new_hash). И последним шагом является проверка подлинности хэша.

Еще по теме:  Боты в Телеграмме которые изменяют голосовые сообщения в голос знаменитостей

Ну и осталось лишь осмотреть все параметры объекта LoginUrl:

  • url — указывает url, куда будет отправлен пользователь после нажатия на ссылку.
  • forward_text — текст кнопки в пересылаемых сообщениях.
  • bot_username — имя бота, через которого будет происходить авторизация.
  • request_write_access — запрос на возможность ботом писать пользователю сообщения.

На этом я заканчиваю, надеюсь эта запись будет полезна 🙂

1 комментариий

Татьяна 2023-07-28 20:21:43 Ничего, к сожалению, не поняла

Новый комментарий

  • О проекте
  • Отправить публикацию
  • Реклама на сайте
  • Условия пользования

Источник: web-wost.ru

Телеграм бот на PHP отправляющий сообщения с сайта

telegram-3475679

Что если сообщения с сайта будут приходить не только на ваш e-mail, но и моментально в мессенджер телеграм. Удобно же! Нужно было реализовать такой функционал, ну как и всегда все оказалось довольно просто.

Так же стояла задача отправлять сообщения не только владельцу сайта, но и дублировать их в группу сотрудников компании.

Было решено создать телеграм бота, который будет принимать данные с помощью API и отправлять их пользователям.

Шаг 1. Создание телеграм бота

Для создания нового бота отправляем следующую команду /newbot. После чего бот запросит имя вашего нового бота, оно обязательно должно заканчиваться на Bot. В случае успеха в ответ получаем уникальный токен бота, который понадобится для дальнейшей работы. И не забудьте добавить вновь созданного бота в ваши контакты отправив ему команду /start

jbxa_5wecdy-595x1024-1089729

Шаг 2. Получить токен и chat id бота

Чтобы отправить сообщение пользователю через бота достаточно вызвать определенный URL из PHP скрипта содержащий токен бота и внутренний ID чата chat id.

Токен бота у нас уже есть, а chat id можно получить 2 способами:

umfr_h8devq-594x1024-9582816

Шаг 3. Разработка PHP скрипта для отправки сообщений в Telegram

Чтобы бот отправил сообщение, нужно сделать запрос к определенному URL содержащему токен бота, ваш chat id и значение text — текст, который бот выведет пользователю. Проверить работоспособность можно и напрямую через адресную строку браузера. Пример строки:

https://api.telegram.org/bot/sendMessage?chat_id= // ваш внутренний ID define(‘TELEGRAM_CHATID’, ‘123456789’); $message = ‘Сообщение’; $ch = curl_init(‘https://api.telegram.org/bot’.TELEGRAM_TOKEN.’/sendMessage?chat_id=’.TELEGRAM_CHATID.’ // URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Не возвращать ответ curl_exec($ch); // Делаем запрос curl_close($ch); // Завершаем сеанс cURL

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

Прокси для телеграм бота

В связи с блокировкой телеграм возможно сообщения не будут отправляться, так как скрипт не сможет запросить нужный URL. Для этого можно воспользоваться прокси сервером.

Прокси сервера можно найти на сайтах-списках прокси или купить. Чтобы соединиться через прокси-сервер в параметрах вызова cURL добавляем несколько строк

curl_setopt ($ch, CURLOPT_PROXY, «127.0.03.1:8080»); curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

Где 127.0.03.1:8080 — это адрес и порт прокси-сервера и CURLPROXY_SOCKS5 — это тип соединения, в данном случае SOCKS5

Добавить бота в группу телеграм

Чтобы бот мог отправлять сообщения в группу, необходимо его туда добавить. Сделать это можно в настройках группы в разделе Добавить участника. В поиске необходимо ввести имя вашего бота и нажать OK.

Теперь в настройках скрипта нужно изменить chat id пользователя, на chat id нужной группы. Для этого предварительно нужно написать любое сообщение в чат, а затем в адресной строке ввести https://api.telegram.org/bot/getUpdates где — это ранее полученный токен вашего бота. После находим объект chat и в нем id — это и будет chat id группы.

Заключение

Как видите отправлять сообщения в телеграм не так уж и сложно. А пример PHP скрипта приведенный здесь, можно модернизировать под любые нужны.

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

Источник: teslawatch.ru

Рейтинг
( Пока оценок нет )
Загрузка ...