mirror of
https://github.com/BushlanovDev/max-bot-api-client-php.git
synced 2026-08-28 02:57:27 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4516db5ffd | |||
| a35e1a22ad | |||
| caecb3f444 | |||
| 10a7ef1ef8 | |||
| f5d545715f | |||
| 865eb56aca | |||
| f788038189 | |||
| 22b328b0c3 | |||
| daa3d297da | |||
| a40e47ebc0 | |||
| 99f66483f3 |
@@ -45,6 +45,55 @@ composer require bushlanov-dev/max-bot-api-client-php
|
|||||||
|
|
||||||
### Использование
|
### Использование
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> С 19 июля 2026 основной домен api изменится с platform-api.max.ru на platform-api2.max.ru и начнет использовать чебурнетовский сертификат!
|
||||||
|
> Вам необходимо либо установить сертификат, либо отключить его проверку, оба варианта описаны ниже.
|
||||||
|
|
||||||
|
Установка сертификата на примере ОС Ubuntu
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# корневой сертификат
|
||||||
|
curl -k -O "https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer"
|
||||||
|
# промежуточный сертификат
|
||||||
|
curl -k -O "https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer"
|
||||||
|
|
||||||
|
sudo cp russian_trusted_root_ca.cer /usr/local/share/ca-certificates/russian_trusted_root_ca.crt
|
||||||
|
sudo cp russian_trusted_sub_ca.cer /usr/local/share/ca-certificates/russian_trusted_sub_ca.crt
|
||||||
|
|
||||||
|
sudo update-ca-certificates
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> **Гибкая настройка Guzzle**
|
||||||
|
> Мах часто меняют домен API а теперь еще и сертификат.
|
||||||
|
> Если вы не хотите или не можете установить сертификат на прямую в систему, можно собрать объект API с кастомным Guzzle клиентом и отключить проверку сертификата.
|
||||||
|
> Во всех остальных случаях достаточно минимального $api = new Api('YOUR_BOT_API_TOKEN');
|
||||||
|
|
||||||
|
```php
|
||||||
|
$guzzle = new \GuzzleHttp\Client([
|
||||||
|
'timeout' => 10,
|
||||||
|
'connect_timeout' => 5,
|
||||||
|
'read_timeout' => 10,
|
||||||
|
'headers' => ['User-Agent' => 'max-bot-api-client-php'],
|
||||||
|
'verify' => false, // Отключить проверку либо путь до сертификата '/path/to/cert.pem'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$httpFactory = new \GuzzleHttp\Psr7\HttpFactory();
|
||||||
|
|
||||||
|
$client = new \BushlanovDev\MaxMessengerBot\Client(
|
||||||
|
accessToken: 'YOUR_BOT_API_TOKEN',
|
||||||
|
httpClient: $guzzle,
|
||||||
|
requestFactory: $httpFactory,
|
||||||
|
streamFactory: $httpFactory,
|
||||||
|
baseUrl: BushlanovDev\MaxMessengerBot\Api::API_BASE_URL,
|
||||||
|
);
|
||||||
|
|
||||||
|
$api = new BushlanovDev\MaxMessengerBot\Api(
|
||||||
|
client: $client,
|
||||||
|
modelFactory: new BushlanovDev\MaxMessengerBot\ModelFactory(),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
Отправка сообщения с клавиатурой
|
Отправка сообщения с клавиатурой
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@@ -136,7 +185,7 @@ $handler->handle();
|
|||||||
|
|
||||||
#### Chats
|
#### Chats
|
||||||
|
|
||||||
- [x] `GET /chats` (`getChats`) - [*Получение списка всех чатов бота.*](./docs/README.md#Получение-списка-всех-чатов-бота)
|
- [x] ~~`GET /chats` (`getChats`) - [*Получение списка всех чатов бота.*](./docs/README.md#Получение-списка-всех-чатов-бота-deprecated)~~ (deprecated)
|
||||||
- [x] `GET /chats/{chatLink}` (`getChatByLink`) - [*Получение информации о чате по ссылке.*](./docs/README.md#Получение-информации-о-чате-по-ссылке)
|
- [x] `GET /chats/{chatLink}` (`getChatByLink`) - [*Получение информации о чате по ссылке.*](./docs/README.md#Получение-информации-о-чате-по-ссылке)
|
||||||
- [x] `GET /chats/{chatId}` (`getChat`) - [*Получение информации о чате по ID.*](./docs/README.md#Получение-информации-о-чате-по-ID)
|
- [x] `GET /chats/{chatId}` (`getChat`) - [*Получение информации о чате по ID.*](./docs/README.md#Получение-информации-о-чате-по-ID)
|
||||||
- [x] `PATCH /chats/{chatId}` (`editChat`) - [*Редактирование информации о чате.*](./docs/README.md#Редактирование-информации-о-чате)
|
- [x] `PATCH /chats/{chatId}` (`editChat`) - [*Редактирование информации о чате.*](./docs/README.md#Редактирование-информации-о-чате)
|
||||||
|
|||||||
+12
-12
@@ -6,7 +6,7 @@
|
|||||||
- `GET /me` (`getBotInfo`) - [*Получение информации о боте.*](#Получение-информации-о-боте)
|
- `GET /me` (`getBotInfo`) - [*Получение информации о боте.*](#Получение-информации-о-боте)
|
||||||
- `PATCH /me` (`editBotInfo`) - [*Редактирование информации о боте.*](#Редактирование-информации-о-боте)
|
- `PATCH /me` (`editBotInfo`) - [*Редактирование информации о боте.*](#Редактирование-информации-о-боте)
|
||||||
- [Чаты](#Чаты)
|
- [Чаты](#Чаты)
|
||||||
- `GET /chats` (`getChats`) - [*Получение списка всех чатов бота.*](#Получение-списка-всех-чатов-бота)
|
- ~~`GET /chats` (`getChats`)~~ - [*Получение списка всех чатов бота.*](#Получение-списка-всех-чатов-бота-deprecated) (deprecated)
|
||||||
- `GET /chats/{chatLink}` (`getChatByLink`) - [*Получение информации о чате по ссылке.*](#Получение-информации-о-чате-по-ссылке)
|
- `GET /chats/{chatLink}` (`getChatByLink`) - [*Получение информации о чате по ссылке.*](#Получение-информации-о-чате-по-ссылке)
|
||||||
- `GET /chats/{chatId}` (`getChat`) - [*Получение информации о чате по ID.*](#Получение-информации-о-чате-по-ID)
|
- `GET /chats/{chatId}` (`getChat`) - [*Получение информации о чате по ID.*](#Получение-информации-о-чате-по-ID)
|
||||||
- `PATCH /chats/{chatId}` (`editChat`) - [*Редактирование информации о чате.*](#Редактирование-информации-о-чате)
|
- `PATCH /chats/{chatId}` (`editChat`) - [*Редактирование информации о чате.*](#Редактирование-информации-о-чате)
|
||||||
@@ -89,22 +89,22 @@ $guzzle = new \GuzzleHttp\Client([
|
|||||||
'connect_timeout' => 5,
|
'connect_timeout' => 5,
|
||||||
'read_timeout' => 10,
|
'read_timeout' => 10,
|
||||||
'headers' => ['User-Agent' => 'max-bot-api-client-php'],
|
'headers' => ['User-Agent' => 'max-bot-api-client-php'],
|
||||||
// 'verify' => false, либо путь до сертификата '/path/to/cert.pem'
|
// 'verify' => false, // Отключить проверку либо путь до сертификата '/path/to/cert.pem'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$httpFactory = new \GuzzleHttp\Psr7\HttpFactory();
|
$httpFactory = new \GuzzleHttp\Psr7\HttpFactory();
|
||||||
|
|
||||||
$client = new \BushlanovDev\MaxMessengerBot\Client(
|
$client = new \BushlanovDev\MaxMessengerBot\Client(
|
||||||
$accessToken,
|
accessToken: 'YOUR_BOT_API_TOKEN',
|
||||||
$guzzle,
|
httpClient: $guzzle,
|
||||||
$httpFactory,
|
requestFactory: $httpFactory,
|
||||||
$httpFactory,
|
streamFactory: $httpFactory,
|
||||||
'https://platform-api2.max.ru',
|
baseUrl: BushlanovDev\MaxMessengerBot\Api::API_BASE_URL,
|
||||||
);
|
);
|
||||||
|
|
||||||
$api = new Api(
|
$api = new BushlanovDev\MaxMessengerBot\Api(
|
||||||
accessToken: 'YOUR_BOT_API_TOKEN',
|
|
||||||
client: $client,
|
client: $client,
|
||||||
modelFactory: new ModelFactory(),
|
modelFactory: new BushlanovDev\MaxMessengerBot\ModelFactory(),
|
||||||
logger: new YourPsrLogger(),
|
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ $botInfo = $api->editBotInfo(
|
|||||||
|
|
||||||
## Чаты
|
## Чаты
|
||||||
|
|
||||||
### Получение списка всех чатов бота
|
### Получение списка всех чатов бота (deprecated)
|
||||||
|
|
||||||
Возвращает информацию о чатах, в которых участвовал бот.
|
Возвращает информацию о чатах, в которых участвовал бот.
|
||||||
Результат включает список чатов и маркер для перехода к следующей странице.
|
Результат включает список чатов и маркер для перехода к следующей странице.
|
||||||
|
|||||||
+3
-3
@@ -48,12 +48,12 @@ use RuntimeException;
|
|||||||
*/
|
*/
|
||||||
class Api
|
class Api
|
||||||
{
|
{
|
||||||
public const string LIBRARY_VERSION = '1.6.4';
|
public const string API_BASE_URL = 'https://platform-api2.max.ru';
|
||||||
|
|
||||||
|
public const string LIBRARY_VERSION = '1.6.6';
|
||||||
|
|
||||||
public const string API_VERSION = '1.2.5';
|
public const string API_VERSION = '1.2.5';
|
||||||
|
|
||||||
private const string API_BASE_URL = 'https://platform-api2.max.ru';
|
|
||||||
|
|
||||||
private const string METHOD_GET = 'GET';
|
private const string METHOD_GET = 'GET';
|
||||||
private const string METHOD_POST = 'POST';
|
private const string METHOD_POST = 'POST';
|
||||||
private const string METHOD_DELETE = 'DELETE';
|
private const string METHOD_DELETE = 'DELETE';
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ enum ChatAdminPermission: string
|
|||||||
case Write = 'write';
|
case Write = 'write';
|
||||||
case CanCall = 'can_call';
|
case CanCall = 'can_call';
|
||||||
case EditLink = 'edit_link';
|
case EditLink = 'edit_link';
|
||||||
case PostEditDeleteMessage = 'post_edit_delete_message';
|
case PostEditDeleteMessage = 'post_edit_delete_message'; // @deprecated use write
|
||||||
case EditMessage = 'edit_message';
|
case EditMessage = 'edit_message'; // @deprecated use edit
|
||||||
case DeleteMessage = 'delete_message';
|
case DeleteMessage = 'delete_message';
|
||||||
|
case Delete = 'delete';
|
||||||
|
case Edit = 'edit';
|
||||||
|
case ViewStats = 'view_stats';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ class MaxBotServiceProvider extends ServiceProvider
|
|||||||
$guzzle,
|
$guzzle,
|
||||||
$httpFactory,
|
$httpFactory,
|
||||||
$httpFactory,
|
$httpFactory,
|
||||||
$config->get('maxbot.base_url', 'https://platform-api.max.ru'),
|
empty($config->get('maxbot.base_url')) ? Api::API_BASE_URL : $config->get('maxbot.base_url'),
|
||||||
$config->get('maxbot.api_version'),
|
$config->get('maxbot.api_version'),
|
||||||
$logger,
|
$logger,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ return [
|
|||||||
| Configuration for the Max Bot API connection.
|
| Configuration for the Max Bot API connection.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
'base_url' => env('MAXBOT_BASE_URL', 'https://botapi.max.ru'),
|
'base_url' => env('MAXBOT_BASE_URL', \BushlanovDev\MaxMessengerBot\Api::API_BASE_URL),
|
||||||
'api_version' => env('MAXBOT_API_VERSION'),
|
'api_version' => env('MAXBOT_API_VERSION'),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ use Psr\Log\LoggerInterface;
|
|||||||
final class ClientTest extends TestCase
|
final class ClientTest extends TestCase
|
||||||
{
|
{
|
||||||
private const string FAKE_TOKEN = '12345:abcdef';
|
private const string FAKE_TOKEN = '12345:abcdef';
|
||||||
private const string API_VERSION = '0.0.6';
|
private const string API_VERSION = '1.2.5';
|
||||||
private const string API_BASE_URL = 'https://platform-api.max.ru';
|
private const string API_BASE_URL = 'https://platform-api2.max.ru';
|
||||||
|
|
||||||
private MockObject&ClientInterface $httpClientMock;
|
private MockObject&ClientInterface $httpClientMock;
|
||||||
private MockObject&RequestFactoryInterface $requestFactoryMock;
|
private MockObject&RequestFactoryInterface $requestFactoryMock;
|
||||||
|
|||||||
@@ -182,6 +182,30 @@ final class MaxBotServiceProviderTest extends TestCase
|
|||||||
$this->assertSame('test-version', $apiVersionProp->getValue($client));
|
$this->assertSame('test-version', $apiVersionProp->getValue($client));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, array{0: mixed}>
|
||||||
|
*/
|
||||||
|
public static function falsyBaseUrlProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'null (MAXBOT_BASE_URL unset)' => [null],
|
||||||
|
'empty string' => [''],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Test]
|
||||||
|
#[DataProvider('falsyBaseUrlProvider')]
|
||||||
|
public function clientFallsBackToApiBaseUrlConstantWhenBaseUrlIsFalsy(mixed $falsyBaseUrl): void
|
||||||
|
{
|
||||||
|
$this->app['config']->set('maxbot.base_url', $falsyBaseUrl);
|
||||||
|
|
||||||
|
/** @var Client $client */
|
||||||
|
$client = $this->app->make(ClientApiInterface::class);
|
||||||
|
|
||||||
|
$baseUrlProp = (new ReflectionClass($client))->getProperty('baseUrl');
|
||||||
|
$this->assertSame(Api::API_BASE_URL, $baseUrlProp->getValue($client));
|
||||||
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function clientIsConfiguredWithApplicationLoggerWhenLoggingIsEnabled(): void
|
public function clientIsConfiguredWithApplicationLoggerWhenLoggingIsEnabled(): void
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user