innocenzi / bluesky-notification-channel
Laravel 框架的 Bluesky 通知通道
Requires
- php: ^8.1
- illuminate/contracts: ^10.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.49
- guzzlehttp/guzzle: ^7.8.1
- nunomaduro/collision: ^7.8
- orchestra/testbench: ^8.8
- pestphp/pest: ^2.20
- pestphp/pest-plugin-arch: ^2.5
- pestphp/pest-plugin-laravel: ^2.0
- spatie/laravel-ray: ^1.26
README
使用 Laravel 创建 Bluesky 帖子的通知通道实现
composer require innocenzi/bluesky-notification-channel
配置凭证
为了与 API 交互,Bluesky 建议创建一个特定的应用程序密码,而不是使用您账户的主要密码。您可以在您的账户设置中生成一个。创建后,根据需要填写您的 .env
文件
BLUESKY_USERNAME=your-handle BLUESKY_PASSWORD=your-app-password
将这些值添加到 config/services.php
return [ // ... 'bluesky' => [ 'username' => env('BLUESKY_USERNAME'), 'password' => env('BLUESKY_PASSWORD'), ] ];
发布帖子
要创建帖子,您需要指导您选择的 通知 使用 BlueskyChannel
通道,并实现相应的 toBluesky
方法。
此方法可能返回一个 BlueskyPost
实例或一个简单的 string
。
final class CreateBlueskyPost extends Notification { public function via(object $notifiable): array { return [ BlueskyChannel::class ]; } public function toBluesky(object $notifiable): BlueskyPost { return BlueskyPost::make() ->text('Test from Laravel'); } }
然后您可以派发该通知
// Without a notifiable (new AnonymousNotifiable())->notify(new CreateBlueskyPost); // With a notifiable $post->notify(new CreateBlueskyPost);
会话
Bluesky 不提供使用经典 API 令牌进行请求认证的方法。相反,他们只提供基于 JWT 的认证系统,包括访问令牌和刷新令牌。
由于这些令牌会过期,因此它们不能存储在环境中。它们通过创建和刷新会话动态生成,并需要尽可能长时间保持。
此通知通道实现使用基于 Laravel 缓存的会话管理器和身份仓库。这可以通过在容器中替换 NotificationChannels\Bluesky\IdentityRepository\IdentityRepository
来覆盖。
此外,基于缓存的身份仓库使用的密钥可以通过设置 services.bluesky.identity_cache_key
选项进行配置。
嵌入
对于 Bluesky,嵌入是客户端的责任,这意味着我们必须自己生成网站的嵌入。
此通知通道实现使用 Bluesky 自己的私有 API,cardyb.bsky.app
,来获取网站的元数据,包括其缩略图的 URL。然而,该缩略图仍然需要作为 blob 上传到 Bluesky,以便将其引用添加到帖子的嵌入中。
您可以通过在 BlueskyPost
实例上调用 withoutAutomaticEmbeds
来禁用自动嵌入生成,或通过在容器中替换 NotificationChannels\Bluesky\Embeds\EmbedResolver
来完全替换实现。