scrapshot.php の仕様

役割

scrapshot.php は、指定されたURLのスレッドを取得・更新するための中心的なスクリプトです。主な役割は以下の通りです。

  1. ユーザーによる手動でのスレッド取得・更新: ユーザーがブラウザ経由で直接スレッドのURLを指定して実行します。
  2. 親FTBucketからの更新要求の受付: 親子関係にある別のFTBucketインスタンスから、特定のスレッドを更新するよう要求を受け付けます。

1. ユーザーによる手動更新時の挙動

これは scrapshot.php の最も基本的な使われ方です。

  1. URLの指定: ユーザーはブラウザのブックマークレットやフォームから、ふたばのスレッドURL(例: http://.../res/12345.htm)を指定して scrapshot.php にアクセスします。
  2. 各種チェック:
    • ブラックリスト: アクセス元のIPがブラックリストに登録されていないか確認します。
    • URL形式: 指定されたURLが config.phpURLREGX で許可された形式か検証します。
    • 手動更新設定: config.phpMANUALUPDATEfalse の場合、新規取得は許可されますが、既存スレッドの更新は行われません(cronでの自動更新を想定)。
    • クールタイム: COOLTIME で設定された秒数が経過していない場合、連続更新とみなされ処理を中断します。
  3. スレッドの取得・更新:
    • phplib/crawl.phpexecDownload() 関数を呼び出し、スレッドのHTMLと関連ファイル(画像など)をダウンロードします。
    • ダウンロードに失敗した場合、config.phpSUBSCRIBES に設定された他のFTBucketインスタンスからの取得を試みます。
  4. メタ情報の更新:
    • updateInfo() 関数が呼び出され、以下の情報が更新されます。
      • user_update: ユーザーが手動更新した時刻を記録します。
      • alluserid: STOCKLIST 機能が有効な場合、スレッドを「ストック」したユーザーのIDを記録します。
    • saveInfo() でメタ情報が保存されます。
  5. 後処理:
    • 上限超過の削除 (removeSurplus): 保存スレッド数が LIMITCAP を超えた場合や、ディスク空き容量が DISKFREELIMIT を下回った場合、最も古いスレッドから順に削除します。
    • 自動タグ付け (getAutotag): 板名などのタグを自動で付与します。
    • インデックス更新: 全文検索、画像検索、ファイルハッシュなどのデータベースを更新します。
  6. 結果表示: 処理結果(成功またはエラー)を示すHTMLページをユーザーに返します。

2. 親FTBucketからの更新要求時の挙動

親子関係にあるFTBucketでは、親が子に対してスレッドの更新を要求することがあります。この際の挙動は少し特殊です。

  1. 特殊なURL形式でのアクセス: 親FTBucketは、子FTBucketに対して以下のような形式のURLでアクセスします。 http://[子のURL]/scrapshot.php?rooturl=http://[子のURL]/cont/may.2chan.net_b_res_12345.htm

    rooturl パラメータに、ふたばのURLではなく、子FTBucket内のコンテンツへのパスが含まれているのが特徴です。

  2. URLの正規化: scrapshot.php は、このような特殊なURLを検知すると、それを元のふたばのURL(http://may.2chan.net/b/res/12345.htm)に変換します。これにより、内部的には通常の手動更新と同じように扱えるようになります。

    // /home/ui/oldhome/ui/git/ftbucket/src/scrapshot.php
    foreach( $subscribes as $surety ){
      if(strpos( $GETURL, $surety ) === 0){
        $dst = preg_replace("/\/[^\/]*$/i","",$GETURL);        //dirname
        $dst = preg_replace("/^.*\//i","",$dst);               //basename
        $dst = "http://" . str_replace("_","/",$dst) . ".htm"; //tourl
        $GETURL = $dst;
        break;
      }
    }
    
  3. スレッドの取得・更新: 正規化されたURLを使って、親FTBucketから差分を取得します。この処理は phplib/crawl.phpgetFromRemoteSub() 関数内で実行され、最終的に phplib/crawl/pullthread.php_remote_root_pull()_try_remote_zip_pull() によって、必要なファイルのみが親から子へ転送されます。

  4. メタ情報の更新と後処理: この後の流れは、ユーザーによる手動更新とほぼ同じです。メタ情報が更新され、各種インデックスが再構築されます。

まとめ

scrapshot.php は、ユーザーからのリクエストと、他のFTBucketからのリクエストの両方を処理する多機能なエンドポイントです。

どちらのケースでも、処理の最後にはメタ情報の更新、上限管理、インデックスの再構築といった共通の後処理が実行され、システム全体の一貫性を保つ設計になっています。