luzrain / telegram-bot-bundle
Symfony bundle for Telegram Bot API
Installs: 10 895
Dependents: 0
Suggesters: 0
Security: 0
Stars: 8
Watchers: 2
Forks: 4
Open Issues: 0
Requires
- php: >=8.2
- luzrain/telegram-bot-api: ^3.0
- symfony/config: ^7.0
- symfony/console: ^7.0
- symfony/dependency-injection: ^7.0
- symfony/http-kernel: ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.50
- phpunit/phpunit: ^10.5
- symfony/framework-bundle: ^7.0
- vimeo/psalm: ^5.22
README
A symfony bundle for luzrain/telegram-bot-api library.
Getting started
Install composer packages
$ composer require luzrain/telegram-bot-bundle symfony/http-client nyholm/psr7
Enable the Bundle
<?php // config/bundles.php return [ // ... Luzrain\TelegramBotBundle\TelegramBotBundle::class => ['all' => true], ];
Configure bundle
# config/packages/telegram_bot.yaml telegram_bot: api_token: API_TOKEN # webhook: # url: https://localhost/tg-webhook
Optional. Configure webhook route
# config/routes.yaml # ... telegram_webhook: path: /tg-webhook controller: telegram_bot.webhook_controller
Note that symfony/http-client and nyholm/psr7 are not necessary. You can use any PSR-18 client and PSR-17 factories.
Set custom services in http_client, request_factory, stream_factory options in telegram_bot.yaml configuration file.
Here is an example how to use guzzle http client:
# config/services.yaml psr18.guzzle_client: class: GuzzleHttp\Client arguments: - http_errors: false psr17.guzzle_factory: class: GuzzleHttp\Psr7\HttpFactory
# config/packages/telegram_bot.yaml telegram_bot: http_client: psr18.guzzle_client request_factory: psr17.guzzle_factory stream_factory: psr17.guzzle_factory api_token: API_TOKEN
For a complete list of available options with documentation, see the command output.
$ bin/console config:dump-reference telegram_bot
Getting messages from telegram
There are two ways to receive messages from Telegram.
Webhook. Recommended way.
You must configure the webhook route and make it available from the Internet.
Configure webhook.url option in telegram_bot.yaml configuration file;
Update the webhook configuration in telegram bot with the command.
$ bin/console telegram:webhook:update
Note that each time you change webhook and allowed_updates options in configuration files you should run this command for update telegram bot settings.
Polling daemon.
Use it in a development environment or if you can't provide public access to the webhook url.
Run the polling daemon with the command.
$ bin/console telegram:polling:start
Examples
Command controller
use Luzrain\TelegramBotApi\Method; use Luzrain\TelegramBotApi\Type; use Luzrain\TelegramBotBundle\Attribute\OnCommand; use Luzrain\TelegramBotBundle\TelegramCommand; final class StartCommandController extends TelegramCommand { // You can pass command arguments next to $message. // Be aware to set default values for arguments as they won't necessarily will be passed #[OnCommand('/start')] public function __invoke(Type\Message $message, string $arg1 = '', string $arg2 = ''): Method { return $this->reply('Hello from symfony bot'); } }
Any event controller
use Luzrain\TelegramBotApi\Event; use Luzrain\TelegramBotApi\Method; use Luzrain\TelegramBotApi\Type; use Luzrain\TelegramBotBundle\Attribute\OnEvent; // It's not necessary to extend TelegramCommand final class OnMessageController { // Listen any available event from Event namespace #[OnEvent(Event\Message::class)] public function __invoke(Type\Message $message): Method { return new Method\SendMessage( chatId: $message->chat->id, text: 'You wrote: ' . $message->text, ); } }
Publish command list as bot button
It's possible to publish all your commands, which will be shown as a list of available commands in the bot's menu button. To do this, fill in the description field and the publish flag in the OnCommand attribute.
#[OnCommand(command: '/command1', description: 'Test command 1', publish: true)]
Run the command for publish.
$ bin/console telegram:button:update
For button delete.
$ bin/console telegram:button:delete