Как отправить сообщение в Telegram из PHP скрипта

Вступление

Сегодня telegram является активно развивающейся платформой, а потому актуально будет осветить для широкой аудитории тему создания собственных ботов для этого мессенджера. Хотя-бы поверхностно. Для полноценного освящения этой темы я планирую написать две статьи, первая для php вторая для c#. Почему две? Дело в том, что правила телеграма(защищенность) задают для ботов очень жесткие правила размещения. В частности бот должен находиться на https домене. Сегодня мы будем рассматривать именно такой вариант бота, как наиболее очевидный. К сожалению, разрабатывать бота вам придется прямиком на сервере, то есть я предполагаю что у читателя уже есть свой домен и собственно уже налажен ftp доступ к этому домену. На дэнвере php боты работать не будут. Ну ладно не буду врать — можно сделать чтобы оно и на дэнвере работало, но давайте не будем писать такие велосипеды в этой статье и подождем до следующей, в которой я как раз опишу данный способ на примере с c#(а нахрена нам php с дэнвером когда есть такой замечательный инструмент). В этой статье мы общаемся с telegram api через webhook, это для особо прошаренных. Читающий статью человек должен уметь пользоваться: ftp, ssh(консоль сервера).

Шаг первый. Домен и https

Начнем пожалуй с домена, на котором будет размещаться наш будущий бот. Я беру свой старый домен — вебача. Как вы видите там нет https и я не покупал для этого домена https сертификат. Но тем не менее сертификат нужен иначе бота там не разместить. К счастью, есть cloudflare, который, в числе прочих преимуществ, дает нам возможность использовать эмулированный https. Переносим наш домен туда, это делается очень быстро бесплатно и автоматически. Зарегистрируйтесь, нажмите addsite поменяйте ns адреса у домена и все будет установлено. Если этого краткого описания вам не достаточно — можете нагуглить в сети мануал по подключению cloudflare, моя статья этому не посвящена.

И так мы подключили домен. Теперь надо перейти на панель своего сайта:

vybor-sayta-na-cloudfalre.png

После чего выбрать вкладку Crypto и пункт SSL установить в flexible.

nastraivaem-ssl.png

Что делает этот пункт? Он эмулирует безопасное соединение до вашего сайта. Проверяем — https://2webach.ru/

Как вы видите — все работает. У вас должно быть абсолютно так-же, без этого, бота вы запустить не сможете! Будет выдаваться ошибка «HTTP Version Not Supported», так что если вы пришли на эту страницу в поисках решения — перечитайте данный пункт внимательно и повторите все то я описал.

Шаг второй. Знакомство с Botfather.

Botfather — это такой бот, через которого регистрируют все остальные боты. Без него нам никак не обойтись, поэтому давайте откроем telegram и перейдем по ссылке — BotFather

Там все крайне просто, вбиваем /help и смотрим на список доступных команд:

собственно сейчас нас интересует команда /newbot, пишем ее и создаем бота указывая его название. В данном случае я назову своего бота — Рев.ком.стих и будет он у нас выдавать стихи о Маяковского и Есенина (когда я его доделаю, однако весь процесс в эту статью я включать не буду).

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

Далее можно задать оформление для бота. Например картинку — логотип. Для этого используем команду /setuserpic после чего загружаем картинку. Так-же задаются описание бота и прочие вещи до которых вы допрете и без моего участия.

Ну и чтобы проверить установилась картинка или нет переходим на бота вбивая его имя через собачку в поиск

Теперь надо сделать боту доступ к сообщениям пользователей, то есть выключить нахер приватный режим. Если мы планируем добавлять бота в группы или конфы, назовите как хотите, в любом случае приватность нам нахер не нужна. Чтобы ее выключить вбиваем команду /setprivacy после чего выбираем пункт — disabled. Обязательно выполните этот шаг, если вы хотите сделать действительно интерактивного бота.

Теперь самое время заняться backend частью, а именно написанием кода для команд нашего бота, но сначала настроим среду разработки.

Шаг третий. Среда для разработки.

Собственно в качестве библиотеки для обращения к API я буду использовать данный проект — TelegramBotApi у которого нифига нет документации, зато код довольно просто читается. В любом случае в этой статье я постараюсь описать максимально подробно все варианты работы с этой библиотекой, так что документация вам не понадобится вообще.

Но сначала давайте ее установим. Для этого будем использовать composer. Короче говоря будем делать все по «правилам», если этот термин вообще применим к php. Хороший язык, гибкий, не вгоняет в рамки, я знаете ли люблю его за эту вот гибкость. Но любителям «сапога в жопе» конечно всегда больше подходят ruby или какой-нибудь go в котором даже нормально библиотеку в своей папке не разместить, только в gopath. Однако так уж вышло, что данную библиотеку руками ставить будет геморойнее, чем через composer, я тут непричем, просто экономия времени. Для начала нам понадобится ssh соединение с вашим сервером. Для таких дел я предпочитаю ZOC terminal т.к. работаю из под windows. Скачать этот продукт можно на торрентах, сами найдете короче. Далее запускаем ваш терминал и заходим на сервер, после чего переходим к директории нашего домена(команда cd).

Я не хочу размешать наш проект в корне директории, потому что там может быть например… форум. А вот в подпапке — запросто. Так что давайте эту самую подпапку и создадим через команду mkdir

В данном случае подпапка называется ‘revcom_bot’.

Теперь в эту папку надо засунуть composer, собственно делается это тремя командами:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"  php composer-setup.php  php -r "unlink('composer-setup.php');"

Просто вставляете их в ssh консоль по очереди и все.

Отлично, если вы справились с этой задачей, то далее нам следует установить компонент telegram-bot/api, для этого просто пишем в консоли:

php composer.phar require telegram-bot/api

После чего проверяем создались ли новые файлы в нашей директории. Вклчаем FTP менеджер, у меня это WinScp (бесплатное приложение, советую вам использовать его вместо глючной файлзиллы), переходим в папку проекта и смотрим что там есть:

Отлично. Вот теперь можно начинать писать код.

Шаг четвертый. Кодинг

Минимальная версия PHP

Для использования кода, который я демонстрирую, у вас должен стоять минимум php-5.6

Собственно создаем в директории файл index.php в котором мы и будем писать код нашего проекта. Внимание: кодировка файла — utf-8 без bom! Вообще описание кода по шагам это не моя сильная сторона, поэтому я просто буду вставлять код с комментариями в статью, а вы читайте и повторяйте.

header('Content-Type: text/html; charset=utf-8');  // подрубаем API  require_once("vendor/autoload.php");    // создаем переменную бота  $token = "ваш токен, мы его выше сохраняли в текстовый файл";  $bot = new TelegramBotApiClient($token);

После того как переменная бота создана мы можем обращаться к api, но сначала нам надо зарегистрировать webhook. Что такое webhook? Это такой механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в телеграме вводит команду ее надо как-то передать в на сервер и получить ответ. Webhook как раз это и делает — указывает телеграму куда передавать команду пользователя. Но так как изначально телеграм НЕ ЗНАЕТ где мы разместили нашего бота, то надо ему об этом обязательно сообщить. Для этого у нас есть команда: $bot->setWebhook

// если бот еще не зарегистрирован - регистрируем  if(!file_exists("registered.trigger")){   /**   * файл registered.trigger будет создаваться после регистрации бота.    * если этого файла нет значит бот не зарегистрирован    */     // URl текущей страницы  $page_url = "https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];  $result = $bot->setWebhook($page_url);  if($result){  file_put_contents("registered.trigger",time()); // создаем файл дабы прекратить повторные регистрации  }  }

Отлично, можно запустить наш бот и проверить, перейдя к нему из браузера. Если в папке бота создался файл registered.trigger значит телеграм теперь знает о том, где находится наш бот.

Приготовления пройдены, самое время зарегистрировать первые команды для бота. В спецификации телеграма сказано, что каждый бот должен отвечать на две обязательные команды. Первая команда — /start и вторая — /help, создадим их.

// обязательное. Запуск бота  $bot->command('start', function ($message) use ($bot) {      $answer = 'Добро пожаловать!';      $bot->sendMessage($message->getChat()->getId(), $answer);  });    // помощ  $bot->command('help', function ($message) use ($bot) {      $answer = 'Команды:  /help - помощ';      $bot->sendMessage($message->getChat()->getId(), $answer);  });    // запускаем обработку  $bot->run();

Теперь протестируем:

Отлично! А теперь давайте разберемся немного с API нашей библиотеки.

Команды задаются блоком:

$bot->command('start', function ($message) use ($bot) {  });

Где $message — объект Message, все его поля можно посмотреть тут — Types/Message.php

Отправка сообщения выполняется командой:

$bot->sendMessage(ид пользователя которому отправляем, текст сообщения);

Отправка картинок

Отправка картинок пользователю выполняется через передачу телеграму ссылки на эту картинку. Телеграм САМ скачивает изображение и отдает пользователю, нам ничего качать не надо! В качестве демонстрации я загружу сейчас на свой блог изображение и отошлю его пользователю на команду /getpic.

картинка

// передаем картинку  $bot->command('getpic', function ($message) use ($bot) {  $pic = "http://aftamat4ik.ru/wp-content/uploads/2017/03/photo_2016-12-13_23-21-07.jpg";        $bot->sendPhoto($message->getChat()->getId(), $pic);  });

Как вы видите — все работает.

Отправка документа

После чего добавить такую команду:

// передаем документ  $bot->command('getdoc', function ($message) use ($bot) {  $document = new CURLFile('shtirner.txt');        $bot->sendDocument($message->getChat()->getId(), $document);  });

Результат выполнения:

Точно так-же можно передать войсы:

// передаем войс  $bot->command('getvoice', function ($message) use ($bot) {  $voice = new CURLFile('путь_до_файла_в_папке_бота_.mp3');  $bot->sendVoice(          $message->getChat()->getId(),          $voice,          //$duration,          //$replyToMessageId,          //$replyMarkup,          //$disableNotification      );  });

Получение сообщений из чата

Теперь осталось только добавить чуточку интерактивности, например заставить бота в чате постить что-нибудь с определенным шансом.

Дабы сделать это у API есть очень годная команда .on() ее мы и будем использовать в самой простой из форм.

// говорильник  $bot->on(function($Update) use ($bot){  $message = $Update->getMessage();  $mtext = $message->getText();  $cid = $message->getChat()->getId();    if(mb_stripos($mtext,"власть советам") !== false){  $bot->sendMessage($message->getChat()->getId(), "Смерть богатым!");  }  }, function($message) use ($name){  return true; // когда тут true - команда проходит  });

Результат работы:

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

Задаем список команд

Теперь команды работают а значит настало время сообщить о том что они у нас есть в Botfather’а. Идем туда и вбиваем /setcommands

И к стати если вы где-то опечатались можете заново вбить /setcommands и переопределить команды.

Смотрим добавились команды на страницу бота или нет:

Заключение

Думаю этого будет достаточно. Статья получилась полной, я разве что не осветил методы отправки аудио файлов, но думаю вы и сами сможете на них посмотреть без моего в этом участия — тут, я ведь разобрался, хоть и не нашел ни документации нормальной ни освещения данных вопросов в интернете. Зато теперь в этой статье я рассказал вам все что сам знаю о создании ботов к telegram на php. Однако, как я говорил выше эта статья всего лишь часть всех возможностей. Советую вам прочитать вторую статью уже про C# и работу с telegram api БЕЗ webhook, https и прочих геморроев. Проще говоря хостинг не понадобится.

Надеюсь, дорогой читатель, что я не зря писал эту статью. Ах да.

Скачать исходники

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

исходники бота telegram на phpСкачано: 4561, размер: 578.6 KB, дата: 24.Май.2017

  • Tutorial

Шукюров Заур, разработчик @KinomanBot и @GaidarForum_bot, написал руководство по созданию простого чат-бота на PHP. 24 июня 2015 года разработчики Telegram открыли платформу для создания ботов (программ, которые выполняют определенные действия по заданному алгоритму). За полтора года работы платформы набралось много интересных чат-ботов, решающих множество проблем и позволяющих с пользой провести время в мессенджере.

Шаг 1: регистрация бота у @BotFather

Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов: 1) Открываете чат с @BotFather; 2) Вводите или выбираете из списка команду /newbot; 3) Отправляете желаемое название для бота; 4) Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot; 5) По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s. Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token».

Шаг 2: выбираем способ обработки запросов

Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту: 1) проверять «вручную», используя «Long Polling»; 2) доверить всё Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер. Мы остановимся на втором варианте, но у него есть ограничение: у вас на сайте обязательно должен быть установлен SSL-сертификат, чтобы все запросы проходили через безопасный протокол HTTPS. Самоподписанные и бесплатные сертификаты «Let’s Encrypt», которые поддерживает большинство хостингов, также подходят. Пример настройки самоподписанного сертификата из официальной документации Telegram.

Шаг 3: пишем код

Писать код бота будем на PHP, но чтобы не изобретать заново колесо, воспользуемся уже готовой и очень удобной библиотекой. Перво-наперво привязываем через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку:https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// yoursitehere .ru/directory/bot.php, где375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен,https:// yousitehere. ru/directory/bot.php — ссылка на файл-обработчик на нашем сайте. Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Переходим к самому главному — обработке этих самых запросов и написанию функционала бота. Ниже представлен полный листинг файла-обработчика:

     include('vendor/autoload.php'); //Подключаем библиотеку     use TelegramBotApi;       $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather     $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя          $text = $result["message"]["text"]; //Текст сообщения     $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя     $name = $result["message"]["from"]["username"]; //Юзернейм пользователя     $keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура      if($text){          if ($text == "/start") {             $reply = "Добро пожаловать в бота!";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);         }elseif ($text == "/help") {             $reply = "Информация с помощью.";             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]);         }elseif ($text == "Картинка") {             $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg";             $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Гифка") {             $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif";             $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Последние статьи") {             $html=simplexml_load_file('http://netology.ru/blog/rss.xml');             foreach ($html->channel->item as $item) {      $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n";         }             $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]);         }else{         $reply = "По запросу "".$text."" ничего не найдено.";         $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode'=> 'HTML', 'text' => $reply ]);         }     }else{     $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]);     } 

Разберем всё по порядку. 1. Сначала мы подключаем скачанную библиотеку, указав путь (лучше полный) до файла автозагрузчика.

include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi;

2. Создаем экземпляр класса в переменной $telegram и передаем в него наш токен. В переменной $result получаем информацию о сообщении, которое пришлет нам Telegram.

$telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя

3. Затем определяем главные переменные: текстовое сообщение, уникальный идентификатор пользователя и его юзернейм. Если предстоит работа с БД, то не забывайте про фильтрацию (или лучше используйте PDO).

$text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя

4. Создаем нашу клавиатуру, состоящую из трех кнопок.

$keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура

5. Теперь, когда мы обозначили все переменные, можно перейти к обработке полученного сообщения. Для этого можно использовать конструкцию switch-case либо if-else. Так как принципиальной разницы между ними нет, остановимся на втором варианте, как наиболее привычном. В самом начале проверяем, заполнена ли переменная $text и является ли сообщение пользователя текстовым.

if($text){          …          //код          ... }else{          $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }

Если нет, то отправляем пользователю с помощью метода sendMessage сообщение с просьбой ввести текстовое сообщение.6. Рассмотрим вариант, когда пользователь прислал сообщение с командами /start или /help

if ($text == "/start") {             $reply = "Добро пожаловать в бота!";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);  }elseif ($text == "/help") {             $reply = "Информация с помощью.";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);   }

В этом случае помимо текста из переменной $reply будет подгружаться клавиатура, состоящая из трёх кнопок: «Последние статьи», «Картинка» и «Гифка». Реализуется это с помощью метода replyKeyboardMarkup, параметрами которого являются:

  • ‘keyboard’ => $keyboard, передаем нашу клавиатуру
  • ‘resize_keyboard’ => true, клавиатура будет сжата в размерах.
  • ‘one_time_keyboard’ => false, клавиатура не исчезнет после нажатия на какую-то кнопку.

7. После появления клавиатуры пользователь явно захочет попробовать потыкать на расположенные на ней кнопки, и вот что у нас «под капотом» в этом случае:

}elseif ($text == "Картинка") {             $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg";             $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Гифка") {             $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif";             $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Последние статьи") {             $html=simplexml_load_file('http://netology.ru/blog/rss.xml');             foreach ($html->channel->item as $item) {      $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n";             }             $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]);         }

8. Для отправки картинки используется метод sendPhoto, для отправки гифки – sendDocument. В обоих случаях Telegram позволяет передавать прямую ссылку на файл, что безусловно очень удобно, но не так быстро, как если бы мы передавали file_id уже отправленной на сервера Telegram картинки или гифки.9. Для получения последних статей используется простой парсинг RSS ленты Нетологии при помощи встроенной в PHP функции simplexml_load_file. В параметрах метода sendMessage можно заметить два новых значения: 1) 'parse_mode' => 'HTML', чтобы в сообщение можно было вставить HTML-теги

, ,>, или 

2)

'disable_web_page_preview' => true

чтобы к сообщению со ссылкой не подгружалось превью.10. В качестве смайла (стрелка вправо) используются символы xE2x9ExA1. Список всех смайлов в таком виде можно найти на специальном сайте.11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение. Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.

От редакции

PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!</pre>Кодинг

Сегодня поговорим о том, как написать бота для Телеграм на php. Материал рассчитан на программистов начального уровня, владеющих азами php. Итак, начнем.

Подготовка к написанию бота

Прежде чем мы приступим к созданию бота, убедимся в том, что в нашем распоряжении имеются хостинг, домен и SSL-сертификат для него (т.е URL начинается с https).

BotFather. Получение API токена

1. Авторизуемся в Телеграмм. Через поиск находим BotFather (https://web.telegram.org/#/im?p=@BotFather), добавляемся к нему нажав «Start»; 2. Вводим /start 3. Появится список команд, доступных для работы с этим ботом. Введём /newbot 4. Придумываем уникальное имя для нашего бота. Например arch_wood 5. Вводим уникальное имя пользователя для бота, которое обязательно должно оканчиваться на _bot. В примере выше я придумал arch_wood_bot. Если имя уже занято, вы получите сообщение «Sorry, this username is already taken. Please try something different.» Тогда придется придумать что-то другое. 6. После того как уникальное имя боту будет задано мы получим сообщение с ключем (токеном), который будет выделен красным либо синим цветом (зависит от активной цветовой схемы месенджера). Например: 314548665:AAtttG4r4OF_QzMsaZjTpvN9Mb04ttYi6GA 7. Копируем ключ. Переходим к кодингу.

Работа с TelegramBotApi

Дабы облегчить себе жизнь, взаимодействовать с API Телеграма будем при помощи TelegramBotApi. Для начала нам нужно будет клонировать проект с Гитхаба при помощи Composer. Важный момент. Composer, как правило, не устанавливается без файла php.exe. Самый простой способ это исправить — установить Open Server на ПК.

Клонирование проекта с Гитхаба

В командной строке, при помощи команды cd открываем папку, в которой планируем разместить файлы с нашим ботом и последовательно прописываем команды: php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php php -r "unlink('composer-setup.php');"

Устанавливаем telegram-bot/api php composer.phar require telegram-bot/api

Откроем в бразуере папку с проектом и убедимся, что все файл установились.

Далее нам нужно скопировать их на хостинг, в папку, в которой будет располагаться наш бот. Наконец можно приступить к непосредственному кодингу бота.

Кодинг Telegram бота на php

В папке с ботом создаем файл index.php.

Важно! Кодировка индексного php-файла должна быть utf-8 без bom!

Пропишем заголовки и подключим АПИ.

header('Content-Type: text/html; charset=utf-8'); // подключаемся к API require_once("vendor/autoload.php"); // создаем переменную бота $token = "токен, который выдал BotFather"; $bot = new TelegramBotApiClient($token);

Переменная бота $bot создана. С этого момента, мы можем обращаться к api, однако, сначала необходимо зарегистрировать webhook.

Что такое webhook?

WebHook — это механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в вводит команду, ее надо каким-то образом передавать на сервер и получать ответ. Webhook служит как раз для этих целей. Он сообщает телеграму куда передавать команды. Поскольку сейчас Телеграм НЕ ЗНАЕТ, где именно расположен код нашего бота, то нам нужно это исправить.

// если Телеграм-бот не зарегистрирован - регистрируем if(!file_exists("registered.trigger")){ /** * файл registered.trigger будет создаваться после регистрации бота. * если этого файла не существует, значит бот не * зарегистрирован в Телеграмм */ // URl текущей страницы $page_url = "https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; $result = $bot->setWebhook($page_url); if($result){ file_put_contents("registered.trigger",time()); // создаем файл дабы остановить повторные регистрации } } Сохраняем индексный файл в том виде, в каком он есть сейчас, а после обратимся к этому файлу по прямому URL. После первого такого обращения в папке с ботом должен появиться registered.trigger – файл, наличие которого подтверждает, что Телеграм знает, где лежит наш бот.

Обязательные команды для Телеграм-ботов

По правилам Телеграм – все боты должны уметь работать с двумя обязательными командами /start и /help. Займемся этим:

// обязательное. Запуск бота $bot->command('start', function ($message) use ($bot) { $answer = 'Добро пожаловать!'; $bot->sendMessage($message->getChat()->getId(), $answer); }); // помощь $bot->command('help', function ($message) use ($bot) { $answer = 'Команды: /help - помощь'; $bot->sendMessage($message->getChat()->getId(), $answer); }); // запускаем обработку $bot->run();

Cохраняем индексный файл и тестировать нашего бота! Ура! Все прекрасно работает! Дальнейший кодинг зависит исключительно от стоящих перед Вами задач. Мне лишь остается ознакомить вас с общим принципом работы библиотеки TelegramBotApi.

Как работает библиотека TelegramBotApi

Все команды TelegramBotApi задаются блоком:

$bot->command('start', function ($message) use ($bot) { });

Где $message — объект Message. Советую ознакомиться со всми возможными полями здесь — Types/Message.php

Второй момент. Команды перечисляются до вызова $bot->run();, если прописать какую-то из команд ниже $bot->run(); – она не будет выполняться. Т.е. $bot->run();должен замыкать наш код.

Отправка сообщения в TelegramBot API

Отправка сообщения выполняется командой: $bot->sendMessage(id пользователя которому отправляем, текст сообщения);

Отправка картинок в TelegramBot API

Чтобы переслать пользователю картинку – достаточно передать ее URL. Мессенджер самостоятельно скачает, сконвертирует, а затем перешлет изображение пользователю. В качестве примера запрограммируем команду /getpic.

// передаем картинку $bot->command('getpic', function ($message) use ($bot) { $pic = "https://icopydoc.ru/wp-content/uploads/fortelegrambot.jpg"; $bot->sendPhoto($message->getChat()->getId(), $pic); });

Отправка документов и голосовых сообщений

Документы, в отличие от картинок необходимо оправлять в виде POST. К счастью, библиотека  TelegramBotApi сделает все что нужно без нашего с вами участия. Для начала загрузим документ в папку с ботом.

Отправлять документ будем так:

// передаем документ $bot->command('getdoc', function ($message) use ($bot) { $document = new CURLFile('sendfrombot.txt'); $bot->sendDocument($message->getChat()->getId(), $document); });

Обратите внимание, что строчка

$document = new CURLFile('sendfrombot.txt');

предполагает размещение txt-файла sendfrombot в в корневой папке бота. Однако, можно передавать в переменную и обычный урл. Передачей войсов (голосовых сообщения) осуществляется точно также:

// передаем войс $bot->command('getvoice', function ($message) use ($bot) { $voice = "https://icopydoc.ru/wp-content/uploads/maxim_glazunov-prividenie.mp3"; $bot->sendVoice( $message->getChat()->getId(), $voice //, //$duration, //$replyToMessageId, //$replyMarkup, //$disableNotification ); });

Получение сообщений из чата

Для получения данных из чата в API используется команда .on():

// болталка $bot->on(function($Update) use ($bot){ $message = $Update->getMessage(); $mtext = $message->getText(); $cid = $message->getChat()->getId(); if(mb_stripos($mtext,"привет") !== false){ $bot->sendMessage($message->getChat()->getId(), "Привет, чувак!"); } }, function($message) use ($name){ return true; // когда тут true - команда проходит });

Теперь, если написать “привет”, то бот ответит “Привет, чувак!”.

Сообщаем Botfather-у список наших команд

После того, как все необходимые команды написаны – сообщим об их существовании в Botfather.  Данный шаг не обязательный, но лучше сделать. Все просто. Открываем чат с Botfather, вводим /setcommands . Если про вводе команд совершим опечатку – повторно введем /setcommands и переопределим все команды по новой.

Протестируем получившегося бота.

Наш бот работает! Надеюсь, что смог объяснить как создать своего бота на php для телеграмма. Успехов в разработке!

Скачать исходники php-бота.

Рейтинг:2019-04-012019-04-01 | Максим | 1 Комментарий | php, создать бота

Бот для телеграм на php.

На данный момент telegram развивается очень активно и является одним из популярных мессенджеров, охватывающих огромную аудиторию. Одной из особенностей данного приложения является наличие ботов, выполняющих различные функции. К таким функциям относятся онлайн-чаты, информирование пользователя (например, о новой записи в блоге), различные игры или помощь пользователю в различных аспектах.

В этой статье будет рассказано о том, как создать самого простого бота на языке php.

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

0. Подготовка

Самым первым делом необходимо отметить, что Телеграм позволяет размещать ботов только на доменах, защищенных сертификатом SSL. Если у вас еще нет такого сертификата, вам необходимо его приобрести. Возможно, вам также понадобится хостинг для размещения файлов бота. Для этих целей прекрасно подойдет хостинг от компании Бегет, предоставляющий бесплатные сертификаты. О его преимуществах подробно я расписал в этой статье.

1. Регистрация бота

Первым пунктом, с которого начинается разработка бота — это регистрация его у специального корневого бота — @BotFather. Находим его в списке, жмем кнопку старт, бот приветствует нас, выводя список всех доступных команд.

Вводим команду /newbot, далее вписываем имя для своего бота и его username — адрес бота для доступа других пользователей. После этого вашему боту будет присвоен уникальный токен, запишите и сохраните его, он еще пригодится.Обратите вниманиеUsername вашего бота должен заканчиваться символами bot или _bot2018-02-15_15-29-17.png

Все! Ваш бот создан и зарегистрирован в системе. Теперь можно настроить его описание, задать картинку профиля и другое в разделе Edit Bots.

2. Установка библиотеки

Для разработки бота воспользуемся готовой библиотекой telegram-bot-sdk. Установим ее с помощью composer:

composer require irazasyed/telegram-bot-sdk ^2.0

Здесь же можно настроить соединение по ftp с вашим сервером, где находится сайт из пункта 0. Я разместил своего бота в папке /bot/ своего сайта, имейте это ввиду при дальнейшем изучении статьи. Теперь настраиваем webhook для того, чтобы дать понять телеграму, где брать информацию о теле бота. Самый простой способ — веб запрос:

https://api.telegram.org/botздесь_вставляем_токен/setWebhook?url=https://anton-mironov.ru/bot/index.php

Соответственно вписываем свои данные на месте сайта и токена и отправляем данный запрос через любой браузер. В ответ должен прийти JSON файл:

{"ok":true,"result":true,"description":"Webhook was set"}

Это означает, что webhook установлен, и все запросы приходящие к боту будут обрабатываться файлом — обработчиком, указанным в параметре url.

3. Написание кода

Наш файл index.php в папке /bot/ является главным обработчиком запросов бота. Рассмотрим его возможный вид: 1) Прежде всего подключаем библиотеку и инициализируем бота при помощи токена

include('vendor/autoload.php'); use TelegramBotApi;  $telegram = new Api('здесь_вставляем_токен');

2) Далее получаем информацию о полученном от пользователя сообщении методом getWebhookUpdates() :

$message = $telegram->getWebhookUpdates()->getMessage();

В объекте $message будет содержаться вся информация о присланном сообщении и пользователе, который его прислал. Ниже описаны основные методы данного объекта. Подробную информацию можно найти в документации.

getMessageId() // уникальное id сообщения getFrom()                   // Информация о пользователе getDate()                   // Дата сообщения getChat()                   // Информация о чате, из которого отправлено сообщение getText()                   // Если прислан текстовый файл, текст сообщения getAudio()                  // Если прислан аудиофайл, информация о нем getDocument()               // Если прислан документ, информация о нем getPhoto()                  // Если прислано фото, информация о нем getSticker()                // Если прислан стикер, информация о нем getVideo()                  // Если прислано видео, информация о нем

Основные методы

Возвращает объект User, содержащий следующие методы:

getId()         // id пользователя getFirstName()  // Имя пользователя getLastName()   // Фамилия пользователя getUsername()   // Username пользователя

методы getFrom()

Возвращает объект Chat:

getId()        // id чата, из которого пришло сообщение getType()      // Тип чата - 'private', 'group', 'supergroup' или 'channel' getTitle()     // Заголовок чата (если групповой или канал) getUsername()  // Username (если приватный чат)

методы getChat()

Теперь мы можем проанализировать, что прислал нам пользователь

$text = $message->getText(); // Текст присланный пользователем $chat = $message->getChat()->getId(); // id чата с пользователем
Для сведенияКак уже говорилось, в данной статье мы рассмотрим только самые простейшие примеры. О том, как сделать отдельные сложные комманды я расскажу в следующий раз.

3) Теперь мы можем определить какой тип сообщения прислал пользователь. Для простоты, ограничим возможность присылать нам только текстовые сообщения:

if(!empty($text)){  } else{     $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Для работы с ботом пришлите текстовое сообщение!' ]); }

Все дальнейшие команды будем записывать внутри блока if().

4) Каждый бот должен обязательно отвечать на две команды — /start и /help. Это — обязательное условие. Все остальные команды необязательны и могут иметь произвольное название. Опишем эти команды:

switch($text){ case '/start': $message = 'Вас приветствует бот anton-mironov.ru! Для вывода списка доступных команд введите /help'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; case '/help': $message = 'Список доступных команд: /start - начало работы с ботом /help - выводит данный список'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; default: $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Команда не распознана. Для помощи введите /help' ]); break; }

5) Добавим команду, позволяющую получать последние записи из RSS ленты сайта (не забываем добавлять команду в /help !). Обычно RSS лента представляет собой простой xml файл. На моем сайте вы можете увидеть его, открыв ссылку https://anton-mironov.ru/feed/.

Для чтения данного файла на PHP воспользуемся функцией simplexml_load_file, которая превращает xml файл в объект:

case '/rss': $url = 'https://anton-mironov.ru/feed/'; $rss = simplexml_load_file($url); $message = ''; foreach ($rss->channel->item as $item) { $message .= "xE2x9Cx85 " . date('d.m.Y', strtotime($item->pubDate)) . " " . $item->title . " link."'>читатьn"; } $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message,'parse_mode' => 'HTML', 'disable_web_page_preview' => true ]); break;

Чтение RSS ленты

Обратите внимание, в строке 6 символы xE2x9Cx85 обозначают смайлик с галочкой в байтовом представлении. Полный список таких смайликов.

В строке 8, в методе sendMessage мы используем дополнительные опции: 'parse_mode' => 'HTML' позволяет передавать внутри сообщения html теги (в данном случае ), а disable_web_page_preview указывает, что не надо загружать картинку-превью.

Результат работы после выполнения данных операций

2018-02-16-10-40-16-576x1024.png

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

Используемые источники:

  • https://aftamat4ik.ru/pishem-bota-dlya-telegram-na-php/
  • https://habr.com/ru/company/netologyru/blog/326174/
  • https://icopydoc.ru/kak-sozdat-telegram-bot-na-php-instruktsiya/
  • https://anton-mironov.ru/telegram/bot-dlya-telegram-na-php/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий