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

# ページネーション

> Python で X API の結果をページ処理します。XDK のイテレータで next_token を自動的に扱ったり、独自のページングロジックのために pagination_token を手動で管理したりできます。

X API では、複数ページの結果を返すエンドポイント（タイムライン、検索など）でページネーションを使います。各 API 呼び出しのレスポンスには、`result_count`、`previous_token`、`next_token` を含む `meta` オブジェクトが含まれます。XDK は `next_token` を使った複数の API 呼び出しを裏で処理するため、開発者は欲しいデータ量を指定するだけで、自分で複数回呼び出す必要はありません。
SDK では次の機能でこれをシンプルにします:

* **組み込みイテレータ**: ジェネレータ関数で複数ページの取得をシームレスに行えます。
* **明示的なトークンハンドリング**: 必要に応じて `pagination_token` を渡すことで、柔軟に手動制御できます。
* **最大結果数の適用**: 呼び出しごとの `max_results` を尊重します（API の上限まで。検索は 100 など）。

## 自動ページネーション（推奨）

ページネーション付きレスポンスに対して `iterate()` メソッドを使い、すべての結果を遅延的に取得します。
**例: ページネーション付き検索**

```python title="Example" lines wrap icon="python" theme={null}
from xdk import Client
client = Client(bearer_token="your_bearer_token")
# Search with automatic pagination
all_posts = []
for page in client.posts.search_recent(
    query="python",
    max_results=100,  # Per page
    tweet_fields=["created_at", "author_id"]  # Optional expansions
):
    all_posts.extend(page.data)
    print(f"Fetched {len(page.data)} Posts (total: {len(all_posts)})")
print(f"Total tweets: {len(all_posts)}")
```

* イテレータは `next_token` を自動的に扱います。
* `next_token` がなくなると停止します。
* 429 エラーを避けるためのレート制限バックオフをサポートします。

## 手動ページネーション

何らかのカスタムロジック（例: ページごとの処理）で結果を制御する必要がある場合は、次のように `next_token` を使って手動でページ処理することもできます:

```python title="Example" lines wrap icon="python" theme={null}
# Get first page - search_recent returns an Iterator
first_page = next(client.posts.search_recent(
    query="xdk python sdk",
    max_results=100,
    pagination_token=None  # First page
))
print(f"First page: {len(first_page.data) if first_page.data else 0} Posts")
# Extract next_token from meta
next_token = None
if hasattr(first_page, 'meta') and first_page.meta:
    if hasattr(first_page.meta, 'next_token'):
        next_token = first_page.meta.next_token
    elif isinstance(first_page.meta, dict):
        next_token = first_page.meta.get('next_token')
if next_token:
    second_page = next(client.posts.search_recent(
        query="xdk python sdk",
        max_results=100,
        pagination_token=next_token
    ))
    print(f"Second page: {len(second_page.data) if second_page.data else 0} Posts")
```

**ヒント**:

* 最適化のために常に `max_results` を指定してください（デフォルトはエンドポイントごとに異なります）。
* デバッグには `meta.result_count` を確認してください。
* 非常に大規模なクエリでは、ブロッキングを避けるために非同期イテレーションの利用を検討してください。
  Python XDK を使った詳細なコードサンプルは、[コードサンプル GitHub リポジトリ](https://github.com/xdevplatform/samples/tree/main/python)を参照してください。
