Skip to content

luzrain/telegram-bot-bundle

Repository files navigation

Symfony bundle for Telegram Bot API

PHP >=8.2 Symfony ^7.0 Tests Status

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