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

# Basic client - Laravel Bluesky

> Laravel Bluesky의 기본 클라이언트 조작. 인증, 게시, 미디어, 리플라이, 인용, 피드 취득, 검색을 확인합니다.

## 인증

Bluesky의 인증은 App Password와 OAuth 두 가지입니다. 신규 구현에서는 OAuth 채택도 검토해 주세요.

### App Password

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

$profile = Bluesky::login(
    identifier: config('bluesky.identifier'),
    password: config('bluesky.password'),
)->getProfile();
```

세션을 재사용하는 경우에는 `LegacySession`을 사용합니다.

```php theme={null}
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\LegacySession;

Bluesky::login(identifier: config('bluesky.identifier'), password: config('bluesky.password'));

cache()->put('bluesky_legacy_session', Bluesky::agent()->session()->toArray(), now()->addDay());

Bluesky::withToken(LegacySession::create(cache('bluesky_legacy_session', [])));

if (! Bluesky::check()) {
    Bluesky::refreshSession();
}
```

### OAuth

Socialite로 취득한 토큰을 `OAuthSession`으로 변환해서 사용합니다.

```php theme={null}
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\OAuthSession;

$session = OAuthSession::create(session('bluesky_session'));

$timeline = Bluesky::withToken($session)->getTimeline();
```

OAuth 흐름 전체는 [Socialite](/ko/packages/laravel-bluesky/socialite)를 참조하세요.

## 게시 작성

### 단순한 텍스트 게시

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

$response = Bluesky::withToken()->post('test');
```

### TextBuilder로 게시 조립

링크·태그·멘션을 올바르게 처리하려면 `TextBuilder`를 사용합니다.

```php theme={null}
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\RichText\TextBuilder;

$post = TextBuilder::make(text: 'test')
    ->newLine()
    ->mention('@example.bsky.social')
    ->newLine()
    ->link('https://bsky.app/')
    ->newLine()
    ->tag('#Laravel')
    ->toPost();

$response = Bluesky::withToken()->post($post);
```

## 미디어 첨부

### 이미지 첨부

```php theme={null}
use Illuminate\Support\Facades\Storage;
use Revolution\Bluesky\Embed\Images;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;

Bluesky::withToken();

$images = Images::create()->add(
    alt: 'App screenshot',
    blob: fn (): array => Bluesky::uploadBlob(
        Storage::get('test.png'),
        Storage::mimeType('test.png')
    )->json('blob')
);

$post = Post::create(text: 'image post')->embed($images);

$response = Bluesky::post($post);
```

### 외부 링크 카드

```php theme={null}
use Revolution\Bluesky\Embed\External;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;

$external = External::create(
    title: 'Title',
    description: 'Description',
    uri: 'https://example.com'
);

$post = Post::create(text: 'external card')->embed($external);

$response = Bluesky::withToken()->post($post);
```

## 리플라이·인용

### 리플라이

```php theme={null}
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\Types\ReplyRef;
use Revolution\Bluesky\Types\StrongRef;

$reply = ReplyRef::to(
    root: StrongRef::to(uri: 'at://', cid: 'cid'),
    parent: StrongRef::to(uri: 'at://', cid: 'cid')
);

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

$response = Bluesky::withToken()->post($post);
```

### 인용 게시

```php theme={null}
use Revolution\Bluesky\Embed\QuoteRecord;
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Record\Post;
use Revolution\Bluesky\Types\StrongRef;

$quote = QuoteRecord::create(StrongRef::to(uri: 'at://', cid: 'cid'));

$post = Post::create(text: 'quote')->embed($quote);

$response = Bluesky::withToken()->post($post);
```

## 피드 취득

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

$response = Bluesky::withToken()->getTimeline();

$items = $response->collect('feed');
```

공개 게시를 취득하기만 한다면 인증 없이 사용할 수 있는 메서드도 있습니다.

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

$feed = Bluesky::getAuthorFeed(actor: 'alice.bsky.social')->json('feed');
```

## 검색

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

$response = Bluesky::withToken()->searchPosts(q: '#bluesky', limit: 10);
```

<Warning>
  `searchPosts()`는 API 측의 일시적인 제한으로 인해, 미인증 액세스에서는 현재 이용할 수 없습니다.
</Warning>

<Info>
  Source: [docs/basic-client.md](https://github.com/invokable/laravel-bluesky/blob/main/docs/basic-client.md)
</Info>


## Related topics

- [Laravel Bluesky](/ko/packages/laravel-bluesky/index.md)
- [인증 방식 비교 - Laravel Bluesky](/ko/packages/laravel-bluesky/authentication.md)
- [알림 채널 - Laravel Bluesky](/ko/packages/laravel-bluesky/notification.md)
- [BlueskyManager와 HasShortHand](/ko/packages/laravel-bluesky/bluesky-manager.md)
- [Socialite - Laravel Bluesky](/ko/packages/laravel-bluesky/socialite.md)
