Тема: Пример реализации бота для приложения NambaOne
Привет всем, немного не по теме нашего портала, но хотел выложить для тех, кому понадобиться.
Пример создания бота для приложения NambaOne.
Без использования автозагрузчика и библиотеки Guzzle.
Базовый класс бота. (файл NambaOneBot.php)
<?php
class NambaOneBot
{
/**
* URL основного API.
* @var String
*/
protected $api_url = 'https://api.namba1.co';
/**
* URL API для работы с файлами.
* @var String
*/
protected $api_url_files = 'https://files.namba1.co';
/**
* Токен выдаваемый в https://dashboard.namba1.co.
* @var String
*/
protected $api_token = '';
/**
* Максимальное время подключения к серверу (сек).
* @var Integer
*/
protected $curl_connect_timeout = 5;
/**
* Максимальное время передачи данных (сек).
* @var Integer
*/
protected $curl_timeout = 3;
/**
* URL Максимальное количество переадресаций.
* @var Integer
*/
protected $curl_max_redirs = 10;
/**
* Включить режим отладки.
* @var Bool
*/
protected $debug_enabled = true;
/**
* Наименование файла журнала отладки.
* @var String
*/
protected $debug_file = 'log.html';
/**
* Конструктор.
* @param Bool $autoStart - Автозапуск событий.
*/
public function __construct($autoStart = false)
{
if ($autoStart) $this->run();
}
/**
* Функция выполняет запрос.
* @param String $url - Полный URL запроса.
* @param Object $data - Данные, которые необходимо передать.
* @return Array - Массив полученных данных.
*/
protected function request($url, $data)
{
$json = json_encode($data);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->curl_connect_timeout);
curl_setopt($curl, CURLOPT_TIMEOUT, $this->curl_timeout);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, $this->curl_max_redirs);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'POST NambaOneBot HTTP/1.0',
'Accept: application/json',
'Content-Type: application/json; charset=UTF-8',
'X-Namba-Auth-Token: '.$this->api_token]);
$result = curl_exec($curl);
curl_close($curl);
if ($this->debug_enabled)
{
file_put_contents($this->debug_file, sprintf('%s<br>%s<br>%s<br><br>', $url, $json, $result), FILE_APPEND | LOCK_EX);
}
return json_decode($result);
}
/**
* Функция создает новый чат с пользователями.
* @param Array $members - Массив пользователей.
* @param String $name - Наименование чата.
* @param String $image - Картинка чата (токен).
* @return Array - Массив полученных данных.
*/
public function chatsCreate($members, $name = '', $image = '')
{
return $this->request(sprintf('%s/chats/create', $this->api_url), compact('members', 'name', 'image'));
}
/**
* Функция отправляет сообщение в чат.
* @param Integer $chat_id - Номер чата.
* @param String $content - Сообщение.
* @param String $type - Тип сообщения [по умолчанию, текстовое].
* @return Array - Массив полученных данных.
*/
public function chatsWrite($chat_id, $content, $type = 'text/plain')
{
return $this->request(sprintf('%s/chats/%d/write', $this->api_url, $chat_id), compact('content', 'type'));
}
/**
* Событие получения нового сообщения.
* @param Array $message - Сообщение.
*/
public function messageNew($message)
{
// Переопределите событие в своем классе...
}
/**
* Событие при обновлении статуса сообщения (например, пользователь прочел сообщение).
* @param Array $message - Сообщение.
*/
public function messageUpdate($message)
{
// Переопределите событие в своем классе...
}
/**
* Событие при подключении нового пользователя.
* @param Array $user - Пользователь.
*/
public function userFollow($user)
{
// Переопределите событие в своем классе...
}
/**
* Событие при отключении пользователя.
* @param Array $user - Пользователь.
*/
public function userUnfollow($user)
{
// Переопределите событие в своем классе...
}
/**
* Событие при создании нового чата.
* @param Integer $chat_id - Номер чата.
* @param Array $user - Пользователь.
*/
public function chatNew($chat_id, $user)
{
// Переопределите событие в своем классе...
}
/**
* Обработка сообщений.
*/
protected function run()
{
// Получение POST данных.
$data = file_get_contents('php://input');
// Сохранение данных в файл журнала.
if ($this->debug_enabled)
{
file_put_contents($this->debug_file, sprintf('%s<br><br>', $data), FILE_APPEND | LOCK_EX);
}
// Выполнение события.
$json = json_decode($data);
if (empty($json)) return;
switch ($json->event)
{
case 'message/new':
$this->messageNew($json->data);
break;
case 'message/update':
$this->messageUpdate($json->data);
break;
case 'user/follow':
$this->userFollow($json->data);
break;
case 'user/unfollow':
$this->userUnfollow($json->data);
break;
case 'chat/new':
$this->chatNew($json->data->chat_id, $json->data->user);
break;
}
// Информируем намбу что все хорошо.
header('Content-type: application/json');
echo '{"success":true}';
}
}
?>
Пример использования. (файл index.php)
Бот Эхо. Приветствует пользователя при подключении и отправляет обратно все полученные сообщения.
<?php
// Пример Эхо бота.
// Подключаем класс.
require_once('NambaOneBot.php');
// Создаем свой класс на основе базового класса.
class EchoBot extends NambaOneBot
{
// Переопределяем токен на свой.
protected $api_token = 'Ваш токен';
// Переопределяем событие нового пользователя.
public function userFollow($user)
{
$json = $this->chatsCreate([$user->id]);
if ($json && $json->success)
{
$this->chatsWrite($json->data->id, 'Welcome, '.$json->data->name);
}
}
// Переопределяем событие нового сообщения.
public function messageNew($message)
{
$this->chatsWrite($message->chat_id, $message->content, $message->type);
}
// Переопределение события создания нового чата.
public function chatNew($chat_id, $user)
{
$this->chatsWrite($chat_id, 'Welcome back '.$user->name);
}
}
// Запуск и выполнение бота.
$bot = new EchoBot(true);
?>