TradingAgents/docs/008_Reddit_Praw_Client_Impl...

4.2 KiB
Raw Blame History

チケット #008: Reddit prawクライアント実装

概要

Reddit API (praw) を使用してデータを取得するクライアントラッパーの段階的実装

目的

  • Reddit APIへの認証と接続管理
  • レート制限の適切な処理
  • エラーハンドリングとリトライ機構
  • 既存システムとの互換性維持
  • オプショナル機能としての実装(既存システムと並行動作)

実装要件

1. 段階的実装アプローチ

# tradingagents/config.py に追加
USE_PRAW_API = os.getenv("USE_PRAW_API", "false").lower() == "true"

2. クラス設計

class RedditPrawClient:
    def __init__(self, config: dict):
        """
        Args:
            config: Reddit API設定
                - client_id: Reddit App ID
                - client_secret: Reddit App Secret
                - user_agent: User Agent文字列
                - rate_limit_pause: レート制限時の待機秒数
        """
        pass
    
    def authenticate(self) -> bool:
        """
        Reddit APIへの認証
        
        Returns:
            成功時True、失敗時False
        """
        pass
    
    def get_subreddit_posts(self, 
                          subreddit: str,
                          sort: str = "hot",
                          limit: int = 100,
                          time_filter: str = "day") -> List[dict]:
        """
        特定のsubredditから投稿を取得
        
        Args:
            subreddit: subreddit名
            sort: ソート方法 (hot/top/new)
            limit: 取得件数 (最大100)
            time_filter: 期間フィルタ (day/week/month/year/all)
            
        Returns:
            投稿データのリスト
        """
        pass
    
    def search_posts(self,
                    query: str,
                    subreddit: str = None,
                    limit: int = 100,
                    sort: str = "relevance") -> List[dict]:
        """
        キーワード検索で投稿を取得
        
        Args:
            query: 検索クエリ
            subreddit: 特定のsubredditに限定オプション
            limit: 取得件数
            sort: ソート方法
            
        Returns:
            検索結果の投稿リスト
        """
        pass

2. レート制限管理

class RateLimiter:
    def __init__(self, requests_per_minute: int = 80):
        """
        Args:
            requests_per_minute: 1分あたりの最大リクエスト数
        """
        self.request_times = deque(maxlen=requests_per_minute)
        self.requests_per_minute = requests_per_minute
        
    def wait_if_needed(self):
        """必要に応じて待機"""
        pass

3. エラーハンドリング

  • 認証エラー: RedditAuthenticationErrorを発生
  • レート制限エラー: 自動リトライ with exponential backoff
  • ネットワークエラー: 最大3回リトライ
  • 不正なsubreddit: SubredditNotFoundErrorを発生

4. 設定管理

REDDIT_CLIENT_CONFIG = {
    "user_agent": "TradingAgents/1.0 (by /u/your_username)",
    "rate_limit_pause": 1.0,
    "max_retries": 3,
    "timeout": 30,
    "requests_per_minute": 80  # 安全マージン20%
}

受け入れ条件

  • prawライブラリを使用した認証が成功する
  • 投稿データの取得が正しく動作する
  • レート制限に違反しない
  • エラー時の適切な例外処理
  • 取得データが既存のJSONL形式と互換性がある
  • 既存システムとの並行動作確認
  • 単体テストの実装(モック使用)
  • 環境変数での機能切り替えが動作

依存関係

  • praw (Python Reddit API Wrapper)
  • python-dotenv環境変数管理
  • 既存のreddit_utils.pyとの連携

タスク

  • 単体テストの作成TDD
  • RedditPrawClientクラスの基本実装
  • 認証機能の実装
  • subreddit投稿取得機能
  • 検索機能の実装
  • レート制限管理の実装
  • エラーハンドリング実装
  • 環境変数による機能切り替え
  • 設定ファイルの作成
  • 統合テスト作成
  • ドキュメント作成