codewiser / telegram-subscriber
Telegram Subscriber for Laravel
Requires
- php: ^8.0
- irazasyed/telegram-bot-sdk: ^3.0
- laravel/framework: >=10.0
Requires (Dev)
- codewiser/laravel-notifications: ^1.1
- phpunit/phpunit: ^11.1
Suggests
- codewiser/laravel-notifications: Unified contract for notificaion messages of any type
- laravel-notification-channels/telegram: Telegram Notifications Channel for Laravel
README
The package provides a solution for retrieving chat ID.
Installation and setup
Package uses irazasyed/telegram-bot-sdk
. So above all follow
Telegram Bot SDK
instructions
and set up your first Telegram Bot. Most likely you need to run:
php artisan vendor:publish --tag="telegram-config"
In config/telegram.php
configuration file add bot name
parameter and
register DeeplinkCommand
. You may not define webhook_url
as it will be
reconfigured on a fly.
# config/telegram.php 'bots' => [ 'my_bot' => [ 'name' => env('TELEGRAM_BOT_NAME'), 'token' => env('TELEGRAM_BOT_TOKEN'), 'certificate_path' => env('TELEGRAM_CERTIFICATE_PATH'), //'webhook_url' => env('TELEGRAM_WEBHOOK_URL'), 'commands' => [ \Codewiser\Telegram\Commands\DeeplinkCommand::class ], ], ]
Retrieving chat ID
Implement \Codewiser\Telegram\Contracts\TelegramNotifiable
to a
User
model. You might need to write a migration...
use \Illuminate\Notifications\Notifiable; use \Illuminate\Database\Eloquent\Model; use \Codewiser\Telegram\Contracts\TelegramNotifiable; class User extends Model implements TelegramNotifiable { use Notifiable; public function routeNotificationForTelegram($notification = null): mixed { return $this->telegram_user_id; } public function setRouteForTelegram($route): void { $this->telegram_user_id = $route; $this->save(); } }
Now, create service to implement
\Codewiser\Telegram\Contracts\TelegramNotifiableProvider
. This is an
example of implementation, your may implement it however you like.
use \Codewiser\Telegram\Contracts\TelegramNotifiableProvider; class TelegramUserProvider implements TelegramNotifiableProvider { /** * Issue and remember new token for a given notifiable. */ public function generateToken(TelegramNotifiable $notifiable): string { $token = Str::random(40); cache()->set( $token, [ 'key' => $notifiable->getKey(), 'model' => get_class($notifiable), ], now()->addMinutes(5) ); return $token; } /** * Find notifiable associated with a given token. */ public function resolveToken(string $token): ?TelegramNotifiable { $notifiable = cache()->pull($token); if ($notifiable) { $key = $notifiable['key']; $model = $notifiable['model']; return $model::find($key); } return null; } }
At last, register this service in AppServiceProvider
of your application
public function register() { $this->app->singleton(TelegramNotifiableProvider::class, fn() => new TelegramUserProvider); }
We are ready to go.
Getting updates
Register webhook
If you are properly configure bot in config/telegram.php
this is enough
to use telegram:webhook
command provided by Telegram Bot SDK
package. We recommend to read help:
php artisan help telegram:webhook
This package provides webhook controller to deal with incoming messages.
For example DeeplinkCommand
, that was
mentioned above, used to handle /start
command with deeplink token.
You are free to add any other command handlers to config/telegram.php
.
Read more about Bot Commands.
Long polling
This package brings telegram:poll
command to get updates without
registering webhook. Just call a command.
Usage
Subscribe user
First, we need to issue a deeplink for a user.
use \Illuminate\Http\Request; use \Codewiser\Telegram\TelegramService; class DeeplinkController extends Controller { public function __invoke(Request $request, TelegramService $service) { return $service->getDeeplink($request->user()); } }
User follows deeplink, opens telegram client and presses Start button.
Codewiser\Telegram\Commands\DeeplinkCommand
handles incoming update,
resolves deeplink token and update User
with chat_id
.
For now, this user has telegram route and may be notified via Telegram.