Ü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
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());
}
}
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
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.
Weiterführende Links
Zuletzt geändert am 13. Juli 2026