Files
crm.clientright.ru/modules/SMSNotifier/providers/vesms/VESMS.class.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

567 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Класс для работы с сервисом vesms.ru
*
* Функции:
* - сообщения: отправка SMS, получение статусов, история
* - аккаунт: проверка баланса
* - контакты: добавление, обновление, удаление, список
* - теги: добавление, обновление, удаление, список
* - рассылки: добавление, обновление, удаление, список рассылок, отправка, история
* - задания: добавление, обновление, удаление, список
*
*
* @author Рустам Миниахметов <pycmam@gmail.com>
*/
class VESMS
{
const REQUEST_SUCCESS = 'success';
const REQUEST_ERROR = 'error';
protected
$user = null,
$key = null,
$testMode = false,
$url = 'api.vesms.ru',
$useSSL = false,
$response = null;
/**
* Конструктор
*
* @param string $user
* @param string $key
* @param integer $testMode
*/
public function __construct($user, $key, $useSSL = false, $testMode = false)
{
$this->user = $user;
$this->key = $key;
$this->useSSL = $useSSL;
$this->testMode = $testMode;
}
/**
* Отправить SMS
*
* @param string|array $recipients
* @param string $message
* @param string $sender
* @param boolean $flash
*
* @return boolean|integer
* @deprecated
*/
public function sendSMS($recipients, $message, $sender = null)
{
return $this->messageSend($recipients, $message, $sender);
}
/**
* Проверить статус доставки сообщений
*
* @param string|array $messagesId
*
* @return boolean|array
* @deprecated
*/
public function checkStatus($messagesId)
{
return $this->messageStatus($messagesId);
}
/**
* Отправить SMS
*
* @param string|array $recipients
* @param string $message
* @param string $sender
* @param boolean $flash
*
* @return boolean|integer
*/
public function messageSend($recipients, $message, $sender = null)
{
$params = array(
'recipients' => $recipients,
'message' => $message,
'sender' => $sender,
);
if ($this->testMode) {
$params['test'] = 1;
}
$response = $this->makeRequest('message/send', $params);
return $response['status'] == self::REQUEST_SUCCESS;
}
/**
* Проверить статус доставки сообщений
*
* @param string|array $messagesId
*
* @return boolean|array
*/
public function messageStatus($messagesId)
{
if (! is_array($messagesId)) {
$messagesId = array($messagesId);
}
$response = $this->makeRequest('message/status', array(
'messages_id' => join(',', $messagesId),
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['messages'] : false;
}
/**
* Запрос стоимости сообщения
*
* @param string|array $recipients
* @param string $message
*
* @return boolean|decimal
*/
public function messagePrice($recipients, $message)
{
$response = $this->makeRequest('message/price', array(
'recipients' => $recipients,
'message' => $message,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['price'] : false;
}
/**
* История сообщений
*
* @param array $params
*
* @return boolean|array
*/
public function messageHistory($params = array())
{
$response = $this->makeRequest('message/history', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['history'] : false;
}
/**
* Запросить баланс
*
* @return boolean|float
*/
public function userBalance()
{
$response = $this->makeRequest('user/balance');
return $response['status'] == self::REQUEST_SUCCESS ? (float) $response['balance'] : false;
}
/**
* Запросить баланс
*
* @return boolean|float
* @deprecated
*/
public function getBalance()
{
return $this->userBalance();
}
/**
* Контакты: список контактов
*
* @param array $params
*
* @return boolean|array
*/
public function contactList($params = array())
{
$response = $this->makeRequest('contact/list', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['contacts'] : false;
}
/**
* Контакты: создать
*
* @param array $params
*
* @return boolean|integer
*/
public function contactCreate(array $params) // $phone, $name = null, $description = null, $tags = array())
{
$response = $this->makeRequest('contact/create', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Контакты: обновить
*
* @param integer $id
* @param array $params
*
* @return boolean|integer
*/
public function contactUpdate($id, array $params)
{
$response = $this->makeRequest('contact/update', array_merge($params, array(
'id' => $id,
)));
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Контакты: удалить
*
* @param integer $id
*
* @return boolean|integer
*/
public function contactDelete($id)
{
$response = $this->makeRequest('contact/delete', array(
'id' => is_array($id) ? join(',', $id) : $id,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['count'] : false;
}
/**
* Теги: список тегов
*
* @param array $params
*
* @return boolean|array
*/
public function tagList($params = array())
{
$response = $this->makeRequest('tag/list', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['tags'] : false;
}
/**
* Теги: создать
*
* @param array $params
*
* @return boolean|integer
*/
public function tagCreate(array $params)
{
$response = $this->makeRequest('tag/create', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Теги: обновить
*
* @param integer $id
* @param array $params
*
* @return boolean|integer
*/
public function tagUpdate($id, array $params)
{
$response = $this->makeRequest('tag/update', array_merge($params, array(
'id' => $id,
)));
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Теги: удалить
*
* @param integer $id
*
* @return boolean|integer
*/
public function tagDelete($id)
{
$response = $this->makeRequest('tag/delete', array(
'id' => is_array($id) ? join(',', $id) : $id,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['count'] : false;
}
/**
* Задания: список заданий
*
* @param array $params
*
* @return boolean|array
*/
public function taskList($params = array())
{
$response = $this->makeRequest('task/list', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['tasks'] : false;
}
/**
* Задания: создать
*
* @param array $params
*
* @return boolean|integer
*/
public function taskCreate(array $params)
{
$response = $this->makeRequest('task/create', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Задания: обновить
*
* @param integer $id
* @param array $params
*
* @return boolean|integer
*/
public function taskUpdate($id, array $params)
{
$response = $this->makeRequest('task/update', array_merge($params, array(
'id' => $id,
)));
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Задания: удалить
*
* @param integer $id
*
* @return boolean|integer
*/
public function taskDelete($id)
{
$response = $this->makeRequest('task/delete', array(
'id' => is_array($id) ? join(',', $id) : $id,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['count'] : false;
}
/**
* Рассылки: список рассылок
*
* @param array $params
*
* @return boolean|array
*/
public function bulkList($params = array())
{
$response = $this->makeRequest('bulk/list', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['bulks'] : false;
}
/**
* Рассылки: создать
*
* @param array $params
*
* @return boolean|integer
*/
public function bulkCreate(array $params)
{
$response = $this->makeRequest('bulk/create', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Рассылки: обновить
*
* @param integer $id
* @param array $params
*
* @return boolean|integer
*/
public function bulkUpdate($id, array $params)
{
$response = $this->makeRequest('bulk/update', array_merge($params, array(
'id' => $id,
)));
return $response['status'] == self::REQUEST_SUCCESS ? $response['id'] : false;
}
/**
* Рассылки: удалить
*
* @param array|integer $id
* @param array $params
*
* @return boolean|integer
*/
public function bulkDelete($id)
{
$response = $this->makeRequest('bulk/delete', array(
'id' => is_array($id) ? join(',', $id) : $id,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['count'] : false;
}
/**
* Рассылки: отправить
*
* @param integer $id
*
* @return boolean|integer
*/
public function bulkSend($id)
{
$response = $this->makeRequest('bulk/send', array(
'id' => $id,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['history_id'] : false;
}
/**
* Рассылки: отменить
*
* @param integer $historyId
*
* @return boolean|integer
*/
public function bulkCancel($historyId)
{
$response = $this->makeRequest('bulk/cancel', array(
'hostory_id' => $historyId,
));
return $response['status'] == self::REQUEST_SUCCESS ? $response['history_id'] : false;
}
/**
* Рассылки: история
*
* @param array $params
*
* @return boolean|array
*/
public function bulkHistory($params = array())
{
$response = $this->makeRequest('bulk/history', $params);
return $response['status'] == self::REQUEST_SUCCESS ? $response['history'] : false;
}
/**
* Отправить запрос
*
* @param string $function
* @param array $params
*
* @return stdClass
*/
protected function makeRequest($function, array $params = array())
{
$params = $this->joinArrayValues($params);
$sign = $this->generateSign($params);
$params = array_merge(array('user' => $this->user), $params);
$url = ($this->useSSL ? 'https://' : 'http://') . $this->url .'/'. $function;
$post = http_build_query(array_merge($params, array('sign' => $sign)), '', '&');
if (function_exists('curl_init')) {
$ch = curl_init($url);
if ($this->useSSL) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
} else {
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => $post,
'timeout' => 10,
),
));
$response = file_get_contents($url, false, $context);
}
return $this->response = json_decode($response, true);
}
/**
* Возвращает ответ сервера последнего запроса
*
* @return array
*/
public function getResponse()
{
return $this->response;
}
/**
* Установить адрес шлюза
*
* @param string $url
* @return void
*/
public function setUrl($url)
{
$this->url = $url;
}
/**
* Получить адрес сервера
*
* @return string
*/
public function getUrl()
{
return $this->url;
}
protected function joinArrayValues($params)
{
$result = array();
foreach ($params as $name => $value) {
$result[$name] = is_array($value) ? join(',', $value) : $value;
}
return $result;
}
/**
* Сгенерировать подпись
*
* @param array $params
* @return string
*/
protected function generateSign(array $params)
{
ksort($params);
return md5(sha1($this->user . join('', $params) . $this->key));
}
}