Zum Hauptinhalt springen

Überblick

Diese Seite ist die Laravel-Fassung des offiziellen AT-Protocol-Bot-Tutorials. Sie zeigt, wie Sie die für TypeScript ausgelegten Inhalte mit dem Paket laravel-bluesky in PHP/Laravel umsetzen. Im offiziellen Tutorial werden die Lexicon-Dateien jeweils mit dem lex-Kommando heruntergeladen. Bei laravel-bluesky sind über atproto-lexicon-contracts bereits alle Lexicons vorab eingebunden, dieser Schritt entfällt daher. Mit Artisan-Kommandos und den Methoden des Traits HasShortHand lassen sich nahezu alle Operationen umsetzen.

Voraussetzungen

  • Das Paket laravel-bluesky ist installiert.
  • Ein Bluesky-Account und ein App Password sind vorbereitet.
Installationshinweise finden Sie unter Laravel Bluesky.
BLUESKY_IDENTIFIER=yourbot.bsky.social
BLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx

Teil 1: Basis-Bot (Posten)

Artisan-Kommando erstellen

Erstellen Sie mit php artisan make:command ein Kommando für den Bot.
php artisan make:command BotPostCommand
Bearbeiten Sie die generierte Datei app/Console/Commands/BotPostCommand.php.
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Revolution\Bluesky\Facades\Bluesky;

class BotPostCommand extends Command
{
    protected $signature = 'bot:post';

    protected $description = 'Post to Bluesky';

    public function handle(): void
    {
        Bluesky::login(
            identifier: config('bluesky.identifier'),
            password: config('bluesky.password'),
        )->post('🙂');

        $this->info('Posted successfully.');
    }
}

Manuelle Ausführung

php artisan bot:post

Automatische Ausführung per Task-Scheduling

Fügen Sie in routes/console.php eine periodische Ausführung hinzu.
use Illuminate\Support\Facades\Schedule;

// Alle 3 Stunden posten
Schedule::command('bot:post')->everyThreeHours();
Aktivieren Sie den Scheduler, indem Sie folgenden Eintrag in der Crontab setzen.
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Automatische Ausführung mit GitHub Actions

Ohne eigenen Server können Sie GitHub Actions für die automatische Ausführung verwenden.
# .github/workflows/bot.yml
name: Bot Post

on:
  schedule:
    - cron: '0 */3 * * *'  # alle 3 Stunden
  workflow_dispatch:

jobs:
  post:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.4'
      - run: composer install --no-dev --optimize-autoloader
      - run: php artisan bot:post
        env:
          BLUESKY_IDENTIFIER: ${{ secrets.BLUESKY_IDENTIFIER }}
          BLUESKY_APP_PASSWORD: ${{ secrets.BLUESKY_APP_PASSWORD }}
Registrieren Sie BLUESKY_IDENTIFIER und BLUESKY_APP_PASSWORD als Secrets in GitHub Actions.

Teil 2: Reply-Bot (Mentions überwachen)

Wir erstellen einen Bot, der automatisch auf Mentions antwortet. Als Erweiterung zeigen wir auch, wie sich Antworten per KI generieren lassen.

Benachrichtigungen abrufen und auf Mentions antworten

php artisan make:command BotReplyCommand
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\Types\ReplyRef;
use Revolution\Bluesky\Types\StrongRef;

class BotReplyCommand extends Command
{
    protected $signature = 'bot:reply';

    protected $description = 'Reply to mentions on Bluesky';

    public function handle(): void
    {
        Bluesky::login(
            identifier: config('bluesky.identifier'),
            password: config('bluesky.password'),
        );

        $notifications = Bluesky::listNotifications(limit: 20)->json('notifications', []);

        foreach ($notifications as $notification) {
            // Nur Mention-Benachrichtigungen verarbeiten
            if (data_get($notification, 'reason') !== 'mention') {
                continue;
            }

            // Bereits gelesene Benachrichtigungen überspringen (isRead == true bedeutet: schon verarbeitet)
            if (data_get($notification, 'isRead')) {
                continue;
            }

            $uri = data_get($notification, 'uri');
            $cid = data_get($notification, 'cid');

            if (! $uri || ! $cid) {
                continue;
            }

            $ref = StrongRef::to(uri: $uri, cid: $cid);
            $reply = ReplyRef::to(root: $ref, parent: $ref);

            $post = Post::create('Hallo! Vielen Dank für die Erwähnung. 🙂')
                ->reply($reply);

            Bluesky::post($post);

            $this->info("Replied to: {$uri}");
        }

        // Benachrichtigungen als gelesen markieren
        Bluesky::updateSeenNotifications(now()->toISOString());
    }
}
Wenn die Root des Threads eine andere ist, rufen Sie über app.bsky.feed.getPostThread die Thread-Informationen ab und setzen Sie diese als root. Diese vereinfachte Implementierung verwendet den Elternpost als Root.

Polling einplanen

// routes/console.php
use Illuminate\Support\Facades\Schedule;

Schedule::command('bot:reply')->everyFiveMinutes();

Antworten mit KI erzeugen

In Kombination mit dem Paket laravel/ai und dem Treiber laravel-amazon-bedrock können Sie KI-generierte Antworten passend zum Mention-Inhalt erzeugen.
composer require laravel/ai revolution/laravel-amazon-bedrock
Erstellen Sie einen KI-Agent.
<?php

namespace App\Ai\Agents;

use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Promptable;

class BotReplyAgent implements Agent
{
    use Promptable;

    public function instructions(): string
    {
        return 'Sie sind ein freundlicher Bot, der auf Bluesky aktiv ist. '
            . 'Erzeugen Sie zu der Nachricht des Nutzers eine kurze und freundliche Antwort auf Deutsch. '
            . 'Halten Sie die Antwort unter 200 Zeichen.';
    }
}
Verwenden Sie die KI-Antwort im Kommando.
<?php

namespace App\Console\Commands;

use App\Ai\Agents\BotReplyAgent;
use Illuminate\Console\Command;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\Types\ReplyRef;
use Revolution\Bluesky\Types\StrongRef;

class BotReplyCommand extends Command
{
    protected $signature = 'bot:reply';

    protected $description = 'Reply to mentions on Bluesky using AI';

    public function handle(): void
    {
        Bluesky::login(
            identifier: config('bluesky.identifier'),
            password: config('bluesky.password'),
        );

        $notifications = Bluesky::listNotifications(limit: 20)->json('notifications', []);

        foreach ($notifications as $notification) {
            if (data_get($notification, 'reason') !== 'mention') {
                continue;
            }

            if (data_get($notification, 'isRead')) {
                continue;
            }

            $uri = data_get($notification, 'uri');
            $cid = data_get($notification, 'cid');
            $mentionText = data_get($notification, 'record.text', '');

            if (! $uri || ! $cid) {
                continue;
            }

            // Antwort per KI erzeugen
            $replyText = (new BotReplyAgent)->prompt($mentionText)->text;

            $ref = StrongRef::to(uri: $uri, cid: $cid);
            $reply = ReplyRef::to(root: $ref, parent: $ref);

            $post = Post::create($replyText)->reply($reply);

            Bluesky::post($post);

            $this->info("AI replied to: {$uri}");
        }

        Bluesky::updateSeenNotifications(now()->toISOString());
    }
}
Die Konfiguration von laravel-amazon-bedrock finden Sie unter Amazon-Bedrock-Treiber.

Teil 3: Label-Bot

Dies entspricht der Funktion labelAsBot aus dem offiziellen Tutorial. Es setzt am Profil des Bot-Accounts ein Self-Label, um explizit als automatisierter Account gekennzeichnet zu sein.
Das Setzen des Labels erfolgt nur einmal beim initialen Setup. Implementieren Sie es als separates Kommando unabhängig von den Kommandos aus Teil 1 und 2.

Label-Bot-Kommando erstellen

php artisan make:command BotLabelCommand
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Profile;
use Revolution\Bluesky\Types\SelfLabels;

class BotLabelCommand extends Command
{
    protected $signature = 'bot:label';

    protected $description = 'Add bot self-label to the Bluesky profile';

    public function handle(): void
    {
        Bluesky::login(
            identifier: config('bluesky.identifier'),
            password: config('bluesky.password'),
        )->upsertProfile(function (Profile $profile) {
            // Label !bot setzen
            $profile->labels(SelfLabels::make(['!bot']));
        });

        $this->info('Bot label applied successfully.');
    }
}

Ausführen

php artisan bot:label
Führen Sie dieses Kommando nur einmal beim initialen Setup des Bots aus. Das Label bleibt dauerhaft am Profil gespeichert.
!bot ist ein Standard-Self-Label von Bluesky. Es wird empfohlen, es für Bot-Accounts unbedingt zu setzen.

Zu weiteren offiziellen Tutorials

Das offizielle AT-Protocol-Tutorial deckt weitere Themen ab. Der Stand der Unterstützung in laravel-bluesky ist:

Custom-Feed

Unter Feed Generator finden Sie eine ausführliche Anleitung zur Implementierung eines Custom-Feed-Generators mit Laravel.

OAuth-Authentifizierung

Unter Socialite wird die OAuth-Authentifizierung mit Laravel Socialite beschrieben. Die Umsetzung ist einfacher als im offiziellen Tutorial.

Soziale App (statusphere)

Eine Laravel-Fassung von statusphere ist unter invokable/statusphere veröffentlicht. Sie basiert auf einer älteren statusphere-Version, die die Kommandos lex und tap nicht verwendet, und weicht dadurch in einigen Punkten vom aktuellen offiziellen Tutorial ab.
Zuletzt geändert am 13. Juli 2026