Compare commits

..

11 Commits

Author SHA1 Message Date
Alex 4516db5ffd Refactoring base url #38 2026-07-26 12:56:32 +03:00
Alex a35e1a22ad Merge pull request #40 from alexeipanov/fix/permissions
Add new chat admin permission constants
2026-07-25 22:46:21 +03:00
Alexei Panov caecb3f444 add new chat admin permission constants 2026-07-22 23:08:31 +04:00
Alex 10a7ef1ef8 tag 1.6.5 2026-07-19 09:29:19 +03:00
Alex f5d545715f Merge pull request #39 from yakoffka/patch-1
Change url address
2026-07-19 09:26:25 +03:00
yakoffKa 865eb56aca Change url address 2026-07-17 09:49:59 +03:00
Alex f788038189 Update doc 2026-07-05 13:57:03 +03:00
Alex 22b328b0c3 Update doc 2026-07-02 22:32:39 +03:00
Alex daa3d297da Update doc 2026-07-02 22:19:34 +03:00
Alex a40e47ebc0 Update doc 2026-07-02 22:17:38 +03:00
Alex 99f66483f3 Update doc 2026-07-02 22:13:24 +03:00
8 changed files with 98 additions and 22 deletions
+50 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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';
+5 -2
View File
@@ -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';
} }
+1 -1
View File
@@ -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,
); );
+1 -1
View File
@@ -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'),
/* /*
+2 -2
View File
@@ -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
{ {