> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook / Bot - LINE SDK for Laravel

> Envoi et réception de messages via l'API Messaging de LINE avec le contrôleur Webhook et la Facade Bot.

## Webhook

Le package fournit le routage et le contrôleur du Webhook.

```mermaid theme={null}
flowchart TD
    A["L'utilisateur envoie un message"] --> B["LINE envoie via le Webhook"]
    B --> C["Réception sur la route line.webhook"]
    C --> D["Vérification par le middleware ValidateSignature"]
    D --> E["WebhookController"]
    E --> F["Dispatch d'événements Laravel<br>depuis WebhookEventDispatcher"]
    F --> G["Réponse via un listener d'événement"]
```

### URL du Webhook

L'URL du Webhook par défaut est la suivante :

```
https://example.com/line/webhook
```

Vous pouvez modifier le chemin via `.env`.

```dotenv theme={null}
LINE_BOT_WEBHOOK_PATH=webhook
```

### Intégration avec le système d'événements de Laravel

Lorsqu'un événement Webhook est reçu, un événement Laravel est dispatché. La découverte d'événements est activée par défaut.

<Info>
  En production, exécutez `php artisan event:cache`.
</Info>

### Publier les listeners par défaut

```shell theme={null}
php artisan vendor:publish --tag=line-listeners
```

Un `MessageListener` est généré dans `app/Listeners/Line/`.

```php theme={null}
namespace App\Listeners\Line;

use LINE\Clients\MessagingApi\ApiException;
use LINE\Webhook\Model\MessageEvent;
use LINE\Webhook\Model\StickerMessageContent;
use LINE\Webhook\Model\TextMessageContent;
use Revolution\Line\Facades\Bot;

class MessageListener
{
    protected string $token;

    public function handle(MessageEvent $event): void
    {
        $message = $event->getMessage();
        $this->token = $event->getReplyToken();

        match ($message::class) {
            TextMessageContent::class => $this->text($message),
            StickerMessageContent::class => $this->sticker($message),
        };
    }

    protected function text(TextMessageContent $message): void
    {
        Bot::reply($this->token)->text($message->getText());
    }

    protected function sticker(StickerMessageContent $message): void
    {
        Bot::reply($this->token)->sticker(
            $message->getPackageId(),
            $message->getStickerId()
        );
    }
}
```

## Facade Bot

`Revolution\Line\Facades\Bot` délègue à toutes les méthodes de la classe `MessagingApiApi` du SDK officiel.

```php theme={null}
use Revolution\Line\Facades\Bot;

Bot::replyMessage();
Bot::pushMessage();
```

### Méthode reply

`Bot::reply()` permet de répondre à un message en passant le reply token.

<Info>
  Les envois push via `Bot::pushMessage()` sont limités en nombre selon votre plan tarifaire. En revanche, les réponses aux messages des utilisateurs (`Bot::reply()`) sont illimitées et gratuites.
</Info>

```php theme={null}
use Revolution\Line\Facades\Bot;

// Répondre par un texte
Bot::reply($token)->text('text');

// Répondre par plusieurs textes en changeant le nom de l'expéditeur
Bot::reply($token)->withSender('alt-name')->text('text1', 'text2');

// Répondre par un sticker
Bot::reply($token)->sticker(package: 1, sticker: 1);
```

## Personnalisation

### Macros Bot

`Bot` implémente `Macroable`, vous pouvez donc lui ajouter n'importe quelle méthode.

Enregistrez-la dans `AppServiceProvider@boot`.

```php theme={null}
use Revolution\Line\Facades\Bot;

public function boot(): void
{
    Bot::macro('foo', function () {
        return $this->bot()->...;
    });
}
```

```php theme={null}
$foo = Bot::foo();
```

### Remplacer l'instance de MessagingApiApi

`Bot::bot()` renvoie une instance de `MessagingApiApi`. Vous pouvez remplacer cette instance avec `Bot::botUsing()`.

```php theme={null}
$bot = new MyBot();

Bot::botUsing($bot);
```

Un callable est également accepté.

```php theme={null}
Bot::botUsing(function () {
    return new MyBot();
});
```

### Remplacer le WebhookHandler

Si vous souhaitez écrire votre propre traitement du Webhook sans passer par le système d'événements de Laravel, implémentez l'interface `WebhookHandler` et remplacez le handler.

Créez `app/Actions/LineWebhook.php`.

```php theme={null}
<?php

namespace App\Actions;

use Illuminate\Http\Request;
use LINE\Webhook\Model\MessageEvent;
use Revolution\Line\Contracts\WebhookHandler;
use Revolution\Line\Facades\Bot;

class LineWebhook implements WebhookHandler
{
    public function __invoke(Request $request): mixed
    {
        Bot::parseEvent($request)->each(function ($event) {
            if ($event instanceof MessageEvent) {
                //
            }
        });

        return response('OK');
    }
}
```

Enregistrez-le dans `AppServiceProvider@register`.

```php theme={null}
use App\Actions\LineWebhook;
use Revolution\Line\Contracts\WebhookHandler;

public function register(): void
{
    $this->app->scoped(WebhookHandler::class, LineWebhook::class);
}
```

### Middleware de la route par défaut

Le middleware `throttle` est activé par défaut. Vous pouvez le modifier via `.env`.

```dotenv theme={null}
# Désactiver
LINE_BOT_WEBHOOK_MIDDLEWARE=null

# Modifier la configuration de throttle
LINE_BOT_WEBHOOK_MIDDLEWARE=throttle:120,1
```

### Http::line()

Le package étend la classe `Http`, vous pouvez donc également envoyer directement des requêtes API sans passer par la Facade `Bot`.

```php theme={null}
use Illuminate\Support\Facades\Http;

$response = Http::line()->post('/v2/bot/channel/webhook/test', [
    'endpoint' => '',
]);
```

<Info>
  Pour les dernières informations, consultez le [dépôt GitHub](https://github.com/invokable/laravel-line-sdk).
</Info>


## Related topics

- [LINE SDK for Laravel](/fr/packages/laravel-line-sdk/index.md)
- [Canal de notification - LINE SDK for Laravel](/fr/packages/laravel-line-sdk/notification.md)
- [Socialite (LINE Login) - LINE SDK for Laravel](/fr/packages/laravel-line-sdk/socialite.md)
- [Laravel Notification for Discord (Webhook)](/fr/packages/laravel-notification-discord-webhook.md)
- [Tutoriel bot - Laravel Bluesky](/fr/packages/laravel-bluesky/bot-tutorial.md)
