Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
tristamoff
8 лет назад

Создать своего бота в Telegram. Просто как дважды два

Всем привет. О ботах телеграма тут вроде бы ещё не писали. Возьмусь восполнить этот пробел.
Сразу ссылочка на второй урок
Если кто не в курсе, то вкратце о телеграм.

Telegram - это мессенджер(типа Viber или WatsApp) от Павла Дурова. В телеграме есть множество ботов, которые знают погоду, могут найти картинку, подсказать курсы валют и множество всего другого.

В данном уроке я объясню как создать своего собственного бота и научить его здороваться.
Для начала установите на компьютер приложение Telegram или воспользуйтесь web-версией

Если вы ещё не зарегистрировались в телеграме - регистрируйтесь.

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

Кликайте на имя бота и затем нажмите “Start”

Бот сразу же покажет вам список доступных команд.

Нам нужна команда /newbot Можно нажать на неё или написать её вручную в окне чата.
BotFather срезу предложит нам ввести имя бота. Я напишу GolosHelper

Теперь необходимо указать машинное имя бота, оно должно заканчиваться на bot. Пусть это будет golos_helper_bot

Готово. Теперь наш бот физически существует и у нас есть токен для управления им.

После строчки Use this token to access the HTTP API отображен токен для работы с ботом. На этом начальная настройка бота закончена и можно приступать к программированию бота.
Для управления ботом нам потребуется хостинг, можно самый слабенький, ресурсов нам нужен самый минимум. Если хостинг доступен по IP или техническому домену от хостера - это подойдёт, если есть домен - ещё лучше.
Теперь давайте откроем корневую директорию сайта, на котором мы будем делать бота и создадим там несколько файлов.

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

Если вы используете среду разработки - то она сама умеет сохранять файлы на сервере. Если нет - то можно создавать их хоть в блокноте, например Notepad++ и потом любым FTP клиентов копировать на сервер. Я рекомендую WinSCP.

В корне сайта создаём папку telegram

Теперь поместим в неё файл bot.php - это будет единственный файл, к которому будет обращаться бот. Наша задача научить его принимать запросы от бота и отправлять ответ.
Выглядеть этот файл будет так:

// листинг bot.php
//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '261641349:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');

//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];

При объявлении константы 'BOT_TOKEN' вы конечно-же указываете свой токен, полученный при регистрации бота.
Теперь нужно сказать боту, что его логика находится на таком-то сервере и в таком-то файле, у телеграма это называется указать Webhook URL.
Загружаем файл на сервер

У меня есть домен https://www.autozap50.ru/ - на нём и работает мой бот. Поэтому путь для Webhook URL у меня будет https://www.autozap50.ru/telegram/bot.php
Теперь мне нужно обратиться по адресу <путь к апи><мой токен>/setWebhook?url=<мой bot.php>
То есть https://api.telegram.org/bot281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk/setWebhook?url=https://www.autozap50.ru/telegram/bot.php
Просто один раз открываем эту ссылку в браузере.

Важно - домен обязательно должен работать по https

Если у вас всё сделано верно - вы получите следующее сообщение.

Всё, теперь попробуем добавить себе в контакт лист нашего бота и написать ему что-нибудь.
Вот он наш бот. Жмём “Start”

Наш бот молчит и никак нам не отвечает, что в принципе логично.

Можно открыть access логи сайта и убедиться, что запросы доходят до bot.php

В логах я вижу, что телеграм с IP 149.154.167.206 отправлял POST запрос на мой bot.php и получал в ответ 200 код ответа, что есть хорошо.
Что именно он отправлял - из этого лога я не вижу. Логирование POST запросов как правило выключено, так как это очень большой объём данных.
Мы напишем свой логгер, только для своего бота.
Создадим для этого функцию с именем teleToLog
Поместим её в файл function.php (который так-же создадим и положим рядом с bot.php)
Листинг функции teleToLog

function teleToLog($log) {
  $myFile = 'log.txt';
  $fh = fopen($myFile, 'a') or die('can\'t open file');
  if ((is_array($log)) || (is_object($log))) {
    $updateArray = print_r($log, TRUE);
    fwrite($fh, $updateArray."\n");
  } else {
    fwrite($fh, $log . "\n");
  }
  fclose($fh);
}

Теперь в bot.php проинклудим этот файл в начале файла

include_once './functions.php';

Передавать в функцию будем переменную $update
Допишем это в bot.php
Полный листинг:

//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');

include_once './functions.php';

//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];

//запись в лог
teleToLog($update);

Кладём файл function.php на сервер

Пишем что-нибудь боту

Теперь у нас появился файл log.txt

Если у вас этого файла нет - значит у скрипта недостаточно прав на запись в папку. Пользователь, от имени которого выполняется запрос должен иметь права на запись в папку.


В нём будет примерно следующее

Array
(
    [update_id] => 652027113
    [message] => Array
        (
            [message_id] => 12
            [from] => Array
                (
                    [id] => 261166341
                    [first_name] => Evgeny
                    [last_name] => 
                )
            [chat] => Array
                (
                    [id] => 261166341
                    [first_name] => Evgeny
                    [last_name] => 
                    [type] => private
                )
            [date] => 1487053292
            [text] => тест
        )
)

В ключе массива [message][text] текст нашего сообщения боту.

Давайте научим бота здороваться.

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

Создадим функцию getUserRequest - в которую будем передавать запрос от пользователя и id чата. Поместим её в functions.php

function getUserRequest($text, $chat_id) {
  //список приветствий, который понимает бот
  $hello = array();
  $hello[] = 'привет';
  $hello[] = 'хай';
  $hello[] = 'здорова';
  $hello[] = 'здравствуйте';
  $hello[] = 'здрасьте';
  $hello[] = 'йо';

  // варианты ответов бота
  $bot_hello = array();
  $bot_hello[] = 'И тебе привет';
  $bot_hello[] = 'Привет от голоса';
  $bot_hello[] = 'Доброго времени суток';
  $bot_hello[] = 'Привет привет';

  if (in_array(mb_strtolower($text), $hello)) {
    //пользователь поздоровался.
    //случайная фраза привет от бота
    $bot_resp = $bot_hello[rand(0, (count($bot_hello) - 1))];
    $data = array(
      'text' => $bot_resp,
      'chat_id' => $chat_id,
    );
    requestToTelegram($data);
  }
}

Массив $data формируется исходя из документации Telegram

Я намеренно обернул переменную $text в функцию mb_strtolower, чтобы заглавная(и все остальные) буква "опустилась" в нижний реестр и стала строчной.

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

Чтобы телеграм понял, кому именно нужно отправить ответ - как раз нужна переменная $chat_id
function requestToTelegram($data, $type = 'sendMessage') {
  if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, API_URL . $type);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_exec($curl);
    curl_close($curl);
  }
}

Так-же обновим bot.php

//задаём наш токен, полученный при создании бота и указываем путь к API телеграма
define('BOT_TOKEN', '281913351:CCccwsdCsdnt4SWd8OsdD1-GWavQCrgZGHk');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');

include_once './functions.php';

//принимаем запрос от бота(то что напишет в чате пользователь)
$content = file_get_contents('php://input');
//превращаем из json в массив
$update = json_decode($content, TRUE);
//получаем id чата
$chat_id = $update['message']['chat']['id'];

//получаем текст запроса
$text = $update['message']['text'];

//запись в лог
teleToLog($update);

//обработка запроса
getUserRequest($text, $chat_id);

И пробуем поздороваться с ботом

Таки работает!

Можете сами добавиться к боту golos_helper_bot и попробовать поздороваться с ним.

Код на pasterbin

bot.php http://pastebin.com/JwtVH70z
functions.php http://pastebin.com/K5aTJJYh

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

Если пост вам понравился - дайте мне знать своими голосами или комментариями и я постараюсь поскорее написать продолжение.

Урок 2

946
267.495 GOLOS
На Golos с January 2017
Комментарии (5)
Сортировать по:
Сначала старые