Zum Hauptinhalt springen

Überblick

laravel-bluesky lässt sich in das Notification-System von Laravel integrieren. Mit BlueskyChannel können Sie normale Posts absetzen, mit BlueskyPrivateChannel Direct Messages (DMs) versenden.

Verfügbare Kanäle

KanalVerwendung
BlueskyChannelAls normaler öffentlicher Post benachrichtigen
BlueskyPrivateChannelAls DM (privater Chat) an den Empfänger benachrichtigen

Notification-Klasse

BlueskyChannel

Geben Sie in via() BlueskyChannel::class an und geben Sie in toBluesky() den Sendeinhalt zurück.
use Illuminate\Notifications\Notification;
use Revolution\Bluesky\Notifications\BlueskyChannel;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\RichText\TextBuilder;
use Revolution\Bluesky\Embed\External;

class TestNotification extends Notification
{
    public function via(object $notifiable): array
    {
        return [
            BlueskyChannel::class
        ];
    }

    public function toBluesky(object $notifiable): Post
    {
        $external = External::create(title: 'Title', description: 'test', uri: 'https://');

        return Post::build(function (TextBuilder $builder) {
                   $builder->text('test')
                           ->newLine()
                           ->tag('#Laravel');
        })->embed($external);
    }
}
Die Verwendung von Post entspricht der unter Basic client. TextBuilder, Embed usw. lassen sich gleichermaßen einsetzen.

BlueskyPrivateChannel

BlueskyPrivateMessage verhält sich fast wie Post, unterstützt aber nur text, facets und embed. Als embed wird nur QuoteRecord unterstützt.
use Illuminate\Notifications\Notification;
use Revolution\Bluesky\Notifications\BlueskyPrivateChannel;
use Revolution\Bluesky\Notifications\BlueskyPrivateMessage;
use Revolution\Bluesky\RichText\TextBuilder;
use Revolution\Bluesky\Embed\QuoteRecord;
use Revolution\Bluesky\Types\StrongRef;

class TestNotification extends Notification
{
    public function via(object $notifiable): array
    {
        return [
            BlueskyPrivateChannel::class
        ];
    }

    public function toBlueskyPrivate(object $notifiable): BlueskyPrivateMessage
    {
        $quote = QuoteRecord::create(StrongRef::to(uri: 'at://', cid: 'cid'));

        return BlueskyPrivateMessage::build(function (TextBuilder $builder) {
                   $builder->text('test')
                           ->newLine()
                           ->tag('#Laravel');
        })->embed($quote);
    }
}

On-Demand-Benachrichtigungen

Wenn Sie das Notification-Ziel ohne Modell direkt angeben möchten, verwenden Sie Notification::route().

BlueskyChannel

use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
use App\Models\User;

// App Password
Notification::route('bluesky', BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password')))
            ->notify(new TestNotification());

// OAuth
$user = User::find(1);
$session = OAuthSession::create([
    'did' => $user->did,
    'iss' => $user->iss,
    'refresh_token' => $user->refresh_token,
]);
Notification::route('bluesky', BlueskyRoute::to(oauth: $session))
            ->notify(new TestNotification());

BlueskyPrivateChannel

Für DMs ist die Angabe des receiver (DID oder Handle des Empfängers) erforderlich. Außerdem muss der Empfänger den DM-Empfang aktiviert haben.
  • Bei App Password wird die Berechtigung zum Senden von DMs benötigt.
  • Bei OAuth wird der Scope transition:chat.bsky benötigt.
use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;
use App\Models\User;

// App Password
Notification::route('bluesky-private', BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password'), receiver: 'did or handle'))
            ->notify(new TestNotification());

// OAuth
$user = User::find(1);
$session = OAuthSession::create([
    'did' => $user->did,
    'iss' => $user->iss,
    'refresh_token' => $user->refresh_token,
]);
Notification::route('bluesky-private', BlueskyRoute::to(oauth: $session, receiver: 'did or handle'))
            ->notify(new TestNotification());
Auf Bluesky können Sie sich selbst keine DM senden. Wenn Sie sich selbst benachrichtigen möchten, richten Sie einen separaten Sende-Account ein.
// Wenn Sie sich selbst eine DM senden möchten

use Illuminate\Support\Facades\Notification;
use Revolution\Bluesky\Notifications\BlueskyRoute;

Notification::route('bluesky-private', BlueskyRoute::to(identifier: 'sender identifier', password: 'sender password', receiver: 'your did or handle'))
            ->notify(new TestNotification());
Für private Verwendung mit immer gleichem Sender/Empfänger können Sie die Werte in .env konfigurieren. Legen Sie dafür einen Account nur zum Senden an.
BLUESKY_SENDER_IDENTIFIER=sender did or handle
BLUESKY_SENDER_APP_PASSWORD=sender password
BLUESKY_RECEIVER=your did or handle
Notification::route('bluesky-private', BlueskyRoute::to(
    identifier: config('bluesky.notification.private.sender.identifier'),
    password: config('bluesky.notification.private.sender.password'),
    receiver: config('bluesky.notification.private.receiver'),
))->notify(new TestNotification());

Benachrichtigung an Benutzer

Definieren Sie das Notification-Routing in einem Modell, das den Notifiable-Trait nutzt.

BlueskyChannel

use Illuminate\Notifications\Notifiable;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;

class User
{
    use Notifiable;

    public function routeNotificationForBluesky($notification): BlueskyRoute
    {
        // App Password
        return BlueskyRoute::to(identifier: $this->bluesky_identifier, password: $this->bluesky_password);

        // OAuth
        $session = OAuthSession::create([
            'did' => $this->did,
            'iss' => $this->iss,
            'refresh_token' => $this->refresh_token,
        ]);
        return BlueskyRoute::to(oauth: $session);
    }
}

$user->notify(new TestNotification());

BlueskyPrivateChannel

use Illuminate\Notifications\Notifiable;
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;

class User
{
    use Notifiable;

    public function routeNotificationForBlueskyPrivate($notification): BlueskyRoute
    {
        // App Password
        return BlueskyRoute::to(identifier: $this->bluesky_identifier, password: $this->bluesky_password, receiver: $this->receiver);

        // OAuth
        $session = OAuthSession::create([
            'did' => $this->did,
            'iss' => $this->iss,
            'refresh_token' => $this->refresh_token,
        ]);
        return BlueskyRoute::to(oauth: $session, receiver: $this->receiver);
    }
}

$user->notify(new TestNotification());
Der Benutzer selbst kann auch als Empfänger fungieren.
public function routeNotificationForBlueskyPrivate($notification): BlueskyRoute
{
    // App Password
    return BlueskyRoute::to(identifier: 'sender identifier', password: 'sender password', receiver: $this->did);
}

BlueskyRoute

Je nach Authentifizierungsmethode (App Password oder OAuth) unterscheidet sich die Angabe. Verwenden Sie am besten benannte Argumente.
use Revolution\Bluesky\Notifications\BlueskyRoute;
use Revolution\Bluesky\Session\OAuthSession;

// App Password
BlueskyRoute::to(identifier: config('bluesky.identifier'), password: config('bluesky.password'))

// OAuth
$session = OAuthSession::create([
    'did' => '...',
    'iss' => '...',
    'refresh_token' => '...',
]);
BlueskyRoute::to(oauth: $session);
Wenn Sie nur an Ihren eigenen Account benachrichtigen, ist App Password am einfachsten. Sie müssen sich nicht um die Erneuerung des refresh_token kümmern und benötigen nur die Einträge in .env.
BLUESKY_IDENTIFIER=
BLUESKY_APP_PASSWORD=

Ergebnis der Benachrichtigung prüfen

Wie sonst in Laravel können Sie über das Event NotificationSent die Antwort nach dem Versand prüfen.
use Illuminate\Notifications\Events\NotificationSent;
use Illuminate\Http\Client\Response;

class Listener
{
    public function handle(NotificationSent $event): void
    {
        // $event->channel  BlueskyChannel
        // $event->notifiable
        // $event->notification
        // $event->response  null|Response
    }
}
Zuletzt geändert am 13. Juli 2026